《操作系统课程设计》
- 格式:doc
- 大小:485.50 KB
- 文档页数:31
辽宁科技大学操作系统课程设计指导书一、课程设计目的和要求本设计是专业基础课《操作系统》的课程设计。
由于操作系统课的学时有限,没有安排实验。
为了理论联系实际,加强分析问题、解决问题能力的培养,加强创新能力与探索精神、科学作风与综合素质的培养,加深理解和更好地掌握操作系统的基本概念、原理、技术和方法。
特安排操作系统课程设计。
它是操作系统课程的实践环节。
由于具体的操作系统相当复杂,在短短的一周之内,不可能对所有管理系统进行详细地分析。
因此,选择了操作系统中最重要的管理之一进程管理,作为本设计的任务。
另外,为了使学生在使用系统调用的同时,进一步了解系统内部是如何实现系统调用的全过程,使学生在更深层次上对操作系统有所了解。
目的:(1)加深对进程概念的理解,明确进程和程序的区别。
(2)进一步认识并发执行的实质。
(3)分析进程争用资源的现象,学习解决互斥的方法。
(4)了解Linux系统中进程通信的基本原理。
(5)弄清进程管理在操作系统中的地位和作用。
(6)初步揭开Linux内核的神秘“面纱”,为今后深入学习内核原理打下基础。
(7)弄清系统调用原理,以及操作系统在处理每个系统调用的时候,用户态怎样切入核心态?又怎样从核心态返回到用户态的?要求:在具有自主版权的Linux环境下,用c语言或c++,以及相关的系统调用,编程实现进程的创建、控制、软中断通信、管道通信等功能。
通过自己下载较新版本的Linux内核源码,并解压缩、编译该内核源码,用编译出的内核重新引导系统。
对于成功编译和引导新内核成功的同学,添加一个新的系统调用,经重新编译和运行内核,使新的系统调用可用。
在用户态的程序中使用增加的系统调用,以证明它确实可用。
二、课程设计内容及时间安排(一)设计内容:1、设计题目:进程管理及理解和增加Linux系统调用2、具体实现:(1)进程的创建编写一段程序,使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
目录第一章功能需求描述 (2)1.1功能列表与说明 (2)1.2操作界面和操作方法 (2)第二章设计描述 (3)2.1任务分解说明 (3)2.2主要数据结构设计说明 (3)2.3主要函数接口设计说明 (3)第三章算法描述 (5)第四章开发过程描述 (14)4.1程序代码 (14)4.2设计中的问题和解决方法 (23)4.3测试用例和测试方法 (24)第五章设计心得体会 (32)计算机科学与技术学院课程设计任务书第一章功能需求描述1.1功能列表与说明(1)添加进程:规定现在操作系统中运行的进程数。
(2)添加资源:规定当前需要资源的种类数和各种类资源的数目。
(3)分配资源:给各进程分配资源。
(4)安全性检查:检查资源分配后是否会发生死锁,若发生则不这样进行分配。
(5)资源释放:当一个进程结束后释放其所占有的各类资源。
(6)得到安全序列:当资源分配能够保证各进程顺利结束,则得到进程的安全序列。
(7)删除资源:即取消某资源1.2操作界面和操作方法*************银行家算法演示****************请首先输入系统可供资源种类的数量:资源*的名称:资源的数量:请输入作业的数量:请输入各进程的最大需求量:请输入各进程已经申请的资源量:系统目前可用资源:系统是否安全?分配的序列:********银行家算法演示***********1:增加资源2:删除资源3:修改资源4:分配资源5:增加作业0:离开在如上的操作界面中分别按照提示进行输入,按回车键表示当前输入完毕,然后进行下个步骤的输入或者得到最终结果。
第二章设计描述2.1任务分解说明银行家算法的实现过程主要分为以下几个部分:为实现银行家算法,系统中必须设置若干数据结构。
其中有allocation,记录已经分配的系统资源;max,记录每个进程的资源最大需求;available,记录剩余资源;need用来记录现在每个进程需要多少资源,need=max-allocation;request 请求资源;temp,记录路径,即输出的顺序;finish,用来实现循环,以判断是否安全,这也就是安全性检查。
操作系统课程设计报告概述:本课程设计旨在使学生熟悉文件管理系统的设计方法,加深对所学各种文件操作的了解及其操作方法的特点。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
主要任务:本课程设计的主要任务是设计和实现一个简单的文件系统,包括建立文件存储介质的管理机制、建立目录(采用一级目录结构)、文件系统功能(显示目录、创建、删除、打开、关闭、读、写)和文件操作接口(显示目录、创建、删除、打开、关闭、读、写)。
系统设计:本系统模拟一个文件管理系统,要完成对文件的基本操作,包括文件、文件夹的打开、新建、删除和读取写入文件,创建更改目录,列出目录内容等信息。
系统建立了文件目录树,存储文件系统中的所有文件。
对于用户名下的文件,用文件目录树的分支来存储。
采用命令行操作界面很直观,也方便用户进行操作,用户只要按照操作界面所显示的命令来操作即可。
整体设计框架:系统初始化界面由创建用户存储空间、管理文件、退出系统三个模块组成。
用户创建由创建用户存储空间、进入目录、删除用户存储空间、显示所有用户存储空间等模块组成。
然后各个模块再由一些小模块组成。
其中创建文件、打开关闭文件、读写文件等文件操作模块包括在进入目录模块里面。
系统实现:以下是本课程设计的主要内容的实现程序代码:cincludeincludeincludetypedef struct file{ char name[10];struct file *next; File;typedef struct content{ char name[10];File *file;int f_num;struct content *next; Content;typedef struct user{ char name[10];char psw[10]; Content *con;struct user *next; User;char cur_user[20];XXX;int user_num=0;添加文件:在该函数中,我们首先需要获取文件名,然后检查是否已经存在该文件。
课程设计报告课程名称操作系统课题名称生产、消费面包问题一、设计内容与设计要求1.设计内容:[问题描述] 面包房有五个盘子,生产者生产面包放入其中。
生产时不能消费。
盘子中有面包才能消费。
五只盘子全满时不能生产。
[基本功能](1)生产者进程(2)消费者进程2.设计要求:课程设计报告规范1)需求分析a.程序的功能。
b.输入输出的要求。
2)概要设计a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。
b.课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。
3)详细设计a.采用C++语言定义相关的数据类型。
b.写出各模块的类C码算法。
c.画出各函数的调用关系图、主要函数的流程图。
4)调试分析以及设计体会a.测试数据:准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果。
b.程序调试中遇到的问题以及解决问题的方法。
c.课程设计过程经验教训、心得体会。
5)使用说明用户使用手册:说明如何使用你编写的程序,详细列出每一步的操作步骤。
6)书写格式a.设计报告要求用A4纸打印成册:b.标题为:黑体二号(加粗):正文为:宋体5号。
行间距为固定值22。
c. 封面格式如第1页。
7)附录a.参考书目b.源程序清单(带注释)●考核方式指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。
具体考核标准包含以下几个部分:1、平时出勤(占10%)2、系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)3、程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)4、设计报告(占30%)注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
5、独立完成情况(占10%)。
●课程验收要求①运行所设计的系统。
操作系统课程设计pintos一、教学目标本课程的目标是让学生了解和掌握操作系统的基本原理和概念,通过学习Pintos操作系统,使学生能够理解操作系统的核心机制,包括进程管理、内存管理、文件系统和输入/输出系统等。
在技能方面,学生应能够使用Pintos进行简单的操作系统设计和实现,提升编程能力和系统分析能力。
在情感态度价值观方面,学生应培养对计算机科学和操作系统的兴趣,增强解决实际问题的责任感和使命感。
二、教学内容教学内容将按照Pintos操作系统的结构和功能进行,包括:1. 操作系统的概述和基本概念;2. 进程管理,包括进程的创建、调度和同步;3. 内存管理,包括物理内存管理和虚拟内存管理;4. 文件系统,包括文件和目录的、文件系统的实现;5. 输入/输出系统,包括设备驱动程序和中断处理。
三、教学方法为了激发学生的学习兴趣和主动性,将采用多种教学方法,包括:1. 讲授法,用于讲解操作系统的原理和概念;2. 讨论法,用于讨论操作系统的实现和应用;3. 案例分析法,通过分析具体的操作系统案例,让学生理解操作系统的实际应用;4. 实验法,通过实验操作,让学生亲手实现操作系统的核心机制。
四、教学资源教学资源包括:1. Pintos操作系统的教材和相关参考书;2. 多媒体资料,包括操作系统的教学视频和PPT;3. 实验设备,包括计算机和相关的硬件设备。
这些教学资源将用于支持教学内容和教学方法的实施,丰富学生的学习体验。
五、教学评估教学评估将采用多种方式进行,以全面、客观、公正地评价学生的学习成果。
评估方式包括:1. 平时表现,包括课堂参与、提问和讨论等,占总评的20%;2.作业,包括理论和实践作业,占总评的30%;3. 考试,包括期中考试和期末考试,占总评的50%。
考试内容将涵盖操作系统的原理、概念和实验操作。
六、教学安排教学安排将根据课程内容和学生的实际情况进行设计。
本课程计划在一个学期内完成,每周安排2次课时,每次课时1小时。
操作系统课程设计报告1. 引言操作系统是计算机系统中最核心的软件之一,它负责管理和优化计算机资源的分配和调度,为用户和应用程序提供一个可靠、高效的执行环境。
在操作系统课程设计中,我们通过设计一个简单的操作系统,深入理解操作系统的原理和功能,提升对操作系统的理解和实践能力。
本报告将详细介绍我们小组在操作系统课程设计过程中所完成的工作和实现的目标。
2. 设计目标在本次操作系统课程设计中,我们的设计目标包括:•实现一个基本的中断处理、进程调度和内存管理机制;•设计一个简单的文件系统;•确保操作系统的稳定性和可靠性;•实现用户命令解析和执行功能。
3. 系统架构我们的操作系统设计采用了经典的分层结构,主要由硬件抽象层、内核和用户接口层组成。
1.硬件抽象层:负责与硬件进行交互,提供基本的底层硬件接口,如处理器管理、中断处理、设备控制等。
2.内核:实现操作系统的核心功能,包括进程管理、内存管理、文件系统管理等。
这一层是操作系统的核心,负责管理和调度系统资源。
3.用户接口层:为用户提供简单友好的界面,解析用户输入的命令并调用内核功能进行处理。
用户可以通过命令行或图形界面与操作系统进行交互。
4. 功能实现4.1 中断处理中断是操作系统与外部设备通信的重要机制,我们的操作系统设计中实现了基本的中断处理功能。
通过在硬件抽象层中捕获和处理硬件的中断信号,内核可以对中断进行相应的处理,保证系统的响应能力和稳定性。
4.2 进程调度进程调度是操作系统中的重要任务之一,它决定了系统如何分配和调度上下文切换。
我们的操作系统设计中实现了一个简单的进程调度算法,通过时间片轮转算法和优先级调度算法来管理多个进程的执行顺序,以提高系统的吞吐量和响应性能。
4.3 内存管理内存管理是操作系统中必不可少的功能,它负责对系统内存的分配和回收。
我们的操作系统设计中实现了基本的内存管理功能,包括内存分区、内存空闲管理和地址映射等。
通过合理的内存管理,可以提高系统的内存利用率和性能。
《操作系统》课程设计教学大纲英文名称: Operating System课程编码:C047101计划周数:1周课程设计学分:1学分先修课程:计算机导论,高级语言程序设计,数据结构,汇编语言程序设计适用专业:计算机科学与技术(专升本)开课单位:计算机科学与技术系撰写人:何爱华审核人:姚保峰制定时间:2014年8月一、本课程设计的性质与目的《操作系统》是计算机科学与技术(专升本)专业的核心专业课,“操作系统课程设计”是理解和巩固操作系统基本理论、原理和方法的重要的实践环节。
《操作系统》课程主要讲述的内容是计算机操作系统的基本原理及组成,操作系统中常用的设计技巧和方法。
它与计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。
本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法;在算法基础上,解决实际问题,提高学生实际应用、编程的能力。
二、本课程设计的主要内容实验的内容侧重于对操作系统原理的模拟实现,主要包括对进程管理、内存管理、文件系统和设备管理的实践内容。
主要任务是实现操作系统和相关系统软件的设计,其中涉及进程创建,同步,进程间的通信,存储管理,文件系统等操作系统概念。
,主要内容如表1所示:表1 课程设计内容序号内容1 进程的管道通讯;编制一个程序,程序中创建一个子进程。
然后父子进程各自独立运行,父进程不断地在标准输入设备上读入小写字母,写入管道。
子进程不断地从管道中读取字符,转换为大写字母后输出到标准输出设备上。
当读到x时,结束。
2 信号量实现的同步互斥机制:编制一个程序,程序中创建5个子进程,代表五位哲学家,然后父进程结束。
使用信号量机制解决哲学家进餐问题。
3 页面置换算法:请求页式管理是一种常用的虚拟存储管理技术。
本设计通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。
操作系统课程设计报告1、概述一、设计目的1.对死锁避免中的银行家算法作进一步理解。
2.加深理解死锁的概念。
3.加深理解安全序列和安全状态的概念。
4.通过编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁地发生。
二、开发环境操作系统Windows xp编译环境VC++6.0生成文件银行家算法.cpp2、需求分析一、死锁概念:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了死锁。
二、关于死锁的一些结论:1.参与死锁的进程最少是两个(两个以上进程才会出现死锁)2.参与死锁的进程至少有两个已经占有资源3.参与死锁的所有进程都在等待资源4.参与死锁的进程是当前系统中所有进程的子集如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。
三、资源分类:永久性资源:可以被多个进程多次使用(可再用资源)1)可抢占资源2)不可抢占资源临时性资源:只可使用一次的资源;如信号量,中断信号,同步信号等(可消耗性资源)“申请--分配--使用--释放”模式四、产生死锁的四个必要条件:1、互斥使用(资源独占)一个资源每次只能给一个进程使用2、不可强占(不可剥夺)资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放3、请求和保持(部分分配,占有申请)一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配)4、循环等待存在一个进程等待队列{P1 , P2 , … , Pn}, 其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路。
题目一模拟操作系统设计设计一个模拟操作系统管理程序,实现以下管理功能:1.内存管理功能2.文件管理功能3.磁盘管理功能题目二虚拟存储器各页面置换算法的实现与比较内容:设计一个虚拟存储区和内存工作区,通过产生一个随机数的方法得到一个页面序列,假设内存给定的页面数由键盘输入,分别计算使用下述各方法时的内存命中率:先进先出算法〔FIFO〕、最近最少使用算法〔LRU〕、最正确淘汰算法〔OPT〕、最少页面算法〔LFU〕等。
题目三文件系统设计通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。
内容:为Linu*系统设计一个简单的二级文件系统,以实现以下功能:1.可以实现以下几条命令(1)login 用户登录(2)dir 文件目录列表(3)creat 创立文件(4)delete 删除文件(5)open 翻开文件(6)close 关闭文件(7)read 读文件(8)write 写文件2.实验提示〔1〕首先确定文件系统的数据构造:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放在磁盘,这样便于查找和修改。
〔2〕用户创立的文件,可以编号存储于磁盘上。
如file0、file1、file2……等,并以编号作为物理地址,在目录中进展登记。
[清华大学?操作系统教程? *丽芬编著题目四设计一个按时间片轮转法进程CPU调度的程序。
提示:〔1〕假设系统有5个进程,每个进程用一个进程控制块PCB来代表,PCB中包含进程名、指针、到达时间、估计运行时间、进程状态表。
其中,进程名即为进程进标识。
〔2〕为每一个进程设计一个要示运行时间和到达时间。
〔3〕按照进程到达的先后顺序排成一个循环队列,再设一个队首指针指向第一个到达的进程首址。
〔4〕执行处理机调度时,开场选择队首的第一个进程运行。
另外再设一个当前运行进程指针,指向当前正运行的进程。
〔5〕由于本实验是模拟实验,所以对被选中进程并不实际启运运行,只是执行:a.估计驼行时间减1b.输出当前运行进程的名字。
操作系统课程设计报告学院:班级:姓名:指导教师:2011年6月24日目录1.需求分析....................22.功能设计....................23.开发平台及源程序主要部分...154.程序测试...................165.自我评价及总结.............171.需求分析1.1设计目的1.阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。
2.掌握一种计算机高级语言的使用。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.2设计要求1.能够选择不同的调度算法(要求中给出的调度算法);2.能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;3.根据选择的调度算法显示进程调度队列;4.根据选择的调度算法计算平均周转时间和平均带权周转时间。
2. 功能设计2.1数据结构1.进程的结构定义:struct process{char name[10]; //进程名int no; //进程序号double arriveTime; //进程到达时间double needTime; //进程运行时间int state; //进程状态int priority; //进程优先级double startTime; //进程开始执行时间double endTime; //进程执行完毕时间process *next;};2.使用链表储存进程并按照到达时间排列顺序void insert(process *current){if(head!=NULL){//如果只有一个节点if(head->next==NULL){//如果比链头到达时间早,则插入链头if(current->arriveTime<head->arriveTime){current->next=head;head=current;}else{current->next=NULL;head->next=current;}}//如果至少有两个结点else{process *p1=head;if(head->arriveTime>current->arriveTime){current->next=head;head=current;}else{int flag=1;while(p1->next!=NULL){//如果在两个结点之间则插入if(p1->arriveTime<current->arriveTime&&p1->next->arriveTime>current->arriveTime) {current->next=p1->next;p1->next=current;flag=0;break;}else p1=p1->next;}//如果到达时间最大,则插入到最后if(flag=1){p1->next=current;current->next=NULL;}}}}else head=current;}2.2先来先服务算法设计2.2.1创建进程void createFCFS(){process *q1=new process;cout<<"请输入进程总数目";cin>>count;cout<<endl;int number=1;while(number<=count){q1=new process;q1->no=number;cout<<"进程序号"<<number<<endl;cout<<"进程名称";cin>>q1->name;cout<<"进程到达时间";cin>>q1->arriveTime;cout<<"进程运行时间";cin>>q1->needTime;q1->next=NULL;insert(q1);number++;cout<<endl<<endl;}}2.2.2进程调度及输出结果void printFCFS(){process *p=new process;double sysTime=0;//记录系统时间double turn=0;//平均周转时间double turnw=0;//平均带权周转时间if(head==NULL) cout<<"没有进程调度"<<endl;//处理第一个else if(head!=NULL){head->startTime=head->arriveTime;head->endTime=head->arriveTime+head->needTime;sysTime=head->endTime;turn=turn+(head->endTime-head->arriveTime);turnw=turnw+(head->endTime-head->arriveTime)/head->needTime;p=head->next;while(p!=NULL){//如果前一个结束后一个还没到达if(p->arriveTime>sysTime){p->startTime=p->arriveTime;p->endTime=p->startTime+p->needTime;sysTime=p->endTime;turn=turn+(p->endTime-p->arriveTime);turnw=turnw+(p->endTime-p->arriveTime)/p->needTime;p=p->next;}else{p->startTime=sysTime;p->endTime=p->startTime+p->needTime;sysTime=p->endTime;turn=turn+(p->endTime-p->arriveTime);turnw=turnw+(p->endTime-p->arriveTime)/p->needTime;p=p->next;}}}cout.setf(ios::left);cout<<setw(10)<<"进程序号"<<setw(10)<<"进程名"<<setw(10)<<"到达时间"<<setw(10)<<"开始时间"<<setw(10)<<"执行时间"<<setw(10)<<"结束时间"<<endl;process *temp=head;while(temp!=NULL){cout.setf(ios::left);cout<<setw(10)<<temp->no<<setw(10)<<temp->name<<setw(10)<<temp->arriveTime<<se tw(10)<<temp->startTime<<setw(10)<<temp->needTime<<setw(10)<<temp->endTime<<endl;temp=temp->next;}cout<<"平均周转时间"<<turn/count<<endl<<"平均带权周转时间"<<turnw/count<<endl;//清空链表while(head->next!=NULL){process *t=new process;t=head->next;head->next=t->next;delete t;}head=NULL;}2.3优先级算法设计2.3.1创建进程void createPRIO(){process *q1=new process;cout<<"请输入进程总数目";cin>>count;cout<<endl;int number=1;while(number<=count){q1=new process;q1->no=number;cout<<"进程序号"<<number<<endl;cout<<"进程名称";cin>>q1->name;cout<<"进程到达时间";cin>>q1->arriveTime;cout<<"进程运行时间";cin>>q1->needTime;q1->next=NULL;insert(q1);number++;cout<<endl<<endl;}}2.3.2按优先级大小重新排序,把最先到达的进程排在链头void changePRIO(){/*把最先到达的放到链头,然后后面的结点按照优先级来排序排序的前提是结点数至少是3个从第二个开始和后面的比较*/if(count>2){process *n0=head;process *n1=n0->next;process *n2=n1->next;for(int i=0;i<count-1;i++){while(n1!=NULL&&n2!=NULL){//如果前面的优先级大于后面的优先级,则交换if(n1->priority<n2->priority){n1->next=n2->next;n0->next=n2;n2->next=n1;n1=n0->next;n2=n0->next->next;}n0=n1;n1=n2;n2=n2->next;}}}}2.3.3输出调度结果void printPRIO(){process *p=new process;double sysTime=0;//记录系统时间double turn=0;//平均周转时间double turnw=0;//平均带权周转时间if(head==NULL) cout<<"没有进程调度!"<<endl;{//先把最先到达的输出,然后再根据系统时间和优先级判断后续的进程head->startTime=head->arriveTime;head->endTime=head->arriveTime+head->needTime;head->state=1;sysTime=head->endTime;turn=turn+(head->endTime-head->arriveTime);turnw=turnw+(head->endTime-head->arriveTime)/head->needTime;//判断后面的for(int i=0;i<count-1;i++){p=head->next;while(p!=NULL){//如果优先级最大的进程已经到达,则执行if(p->arriveTime<=sysTime&&p->state==0){p->startTime=sysTime;p->endTime=p->startTime+p->needTime;sysTime=p->endTime;p->state=1;turn=turn+(p->endTime-p->arriveTime);turnw=turnw+(p->endTime-p->arriveTime)/p->needTime;p=p->next;}else p=p->next;}}process *temp=head;cout.setf(ios::left);cout<<setw(10)<<"进程序号"<<setw(10)<<"进程名"<<setw(10)<<"优先级"<<setw(10)<<"到达时间"<<setw(10)<<"开始时间"<<setw(10)<<"执行时间"<<setw(10)<<"结束时间"<<endl;while(temp!=NULL){cout<<setw(10)<<temp->no<<setw(10)<<temp->name<<setw(10)<<temp->priority<<setw( 10)<<temp->arriveTime<<setw(10)<<temp->startTime<<setw(10)<<temp->needTime<<setw(1 0)<<temp->endTime<<endl;temp=temp->next;}cout<<"平均周转时间:"<<turn/count<<endl<<"平均带权周转时间:"<<turnw/count<<endl;while(head->next!=NULL){process *t=new process;t=head->next;head->next=t->next;delete t;}head=NULL;}3.开发平台及源程序的主要部分3.1开发平台Windows操作系统Microsoft visual c++ 6.0环境C++高级语言3.2源程序主要部分int main(){int choice;int go=1;while(go){cout<<endl<<endl<<"------------"<<"进程调度模拟设计"<<"------------"<<endl<<endl;cout<<"1、先来先服务算法"<<endl<<"2、优先级法"<<endl<<"3、退出"<<endl<<endl;cout<<"请选择:";cin>>choice;switch(choice){case 1: FCFS();break; //调用先来先服务算法求解case 2: PRIO();break; //调用优先级法求解case 3: cout<<"退出"<<endl;go=0;break;//返回首页default: cout<<"选择有误,请重新输入选择!"<<endl;break;}}system("pause");return 0;}void FCFS(){createFCFS();printFCFS();}void PRIO(){createPRIO();changePRIO();printPRIO();}4程序测试4.1先来先服务测试用例4.2先来先服务运行结果4.3优先级算法测试用例4.4优先级算法运行结果5.自我评价与总结本次课程设计应用链表结构进行储存并排序,条理清晰,易于理解,程序编写完成以后,实现了预期的结果。
设计2 读者写者问题一、设计目的通过对操作系统内核实现代码的阅读、修改、设计,理解和掌握复杂的操作系统的工作原理。
理解进程及信号量的概念。
二、设计要求1、为每个读者/写者产生一个线程,设计正确的同步算法2、每个读者/写者对该存储区进行操作后,即时显示该存储区的全部内容、当前指针位置和读者/写者线程的自定义标识符。
3、读者应有3个以上,写者应有有两个以上。
4、多个读者/写者之间须共享对存储区进行操作的函数代码。
三、设计说明所谓读者写着问题,是指保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题。
读者写者问题可以这样的描述,有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是,只能有一个写者在写书,并且,读者必写者优先,也就是说,读者和写者同时提出请求时,读者优先。
当读者提出请求时需要有一个互斥操作,另外,需要有一个信号量S来当前是否可操作。
信号量机制是支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的重要机制,而读者写者则是这一机制的一个经典范例。
主要设计流程图读者优先主程序()读者() 写者() 主控()写者优先流程图测试数据文件包括n 行测试数据,分别描述创建的n 个线程是读者还是写者,以及读写操作的开始时间和持续时间。
每行测试数据包括四个字段,各字段间用空格分隔。
第一字段为一个正整数,表示线程序号。
第二字段表示相应线程角色,R 表示读者是,W 表示写者。
第三字段为一个正数,表示读写操作的开始时间。
线程创建后,延时相应时间(单位为秒)后发出对共享资源的读写申请。
第四字段为一个正数,表示读写操作的持续时间。
当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。
下面是一个测试数据文件的例子:1, W,4, 5,2, W, 16, 4,3, R, 5, 2,4, W, 6, 5,5, R, 4, 3,在读者写者同时在队列中等待申请资时,读者优先调用资源。
而且如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作,即读读允许。
进程1是W操作,在时间4时进入队列,运行时间是5,在它进入时没有进程占用资源,它既占用资源;直到它释放资源,等候的进程有3,4,5;结束界面五、总结这一次课程设计,我完成了题目“读者-写者问题的实现”,更加系统地理解和掌握C语言的基本概念、语言特点和编程技巧,在应用C语言在程序设计方面得到系统锻炼,为将来用C进行软件开发打下良好基础。
对程序设计思想也有了比较清晰的印象,为今后的程序设计奠定了一定的心理和技术上的准备。
总的感觉,学到了很多知识,特别对于linux有了全面的接触和了解,也开始对linux产生了兴趣,它所开放的源码的确为学计算机的同志们提供了很好的平台。
读者-写者问题经典的线程同步问题的一个模型。
经过读者写者问题的编写,我对同步机构应用有了深入的了解。
懂得了运用信号量实现进程间的互斥。
实现了不让共享资源同时修改。
用信号量上的原语操作使临界段问题的解决比较简单明了了。
读者写者问题的编写,花的时间很多,也学到很多东西。
了解支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的信号量机制。
几天的试验,虽然难度有点大,但只要自己花时间去学习,还是会攻克困难的。
课程设计提高了我对所学知识的综合应用能力,全面检查并掌握所学的内容,培养独立思考、刻苦钻研的精神,在分析问题、解决问题的过程中,更是获得一种成功的喜悦,进而增加学习和应用的兴趣。
同时也要督促自己在学习的过程中不断的完善自我,加强自己的动手操作能力,培养我的独立思考的那种思维方式。
总之,每一次课程设计不仅是我们学习的好机会,而且是我们锻炼实际动手能力的平台,虽然有难度的东西总会让人很抵触,比如在课设过程中有很多郁闷的时候,一个小小的错误一不小心就花去了自己一上午的时间,所以在这个过程中能够磨练人的意志与耐心,最后感谢老师的指导与监督附:主要源代码#include "windows.h"#include <conio.h>#include <stdlib.h>#include <fstream.h>#include <io.h>#include <string.h>#include <stdio.h>#define READER 'R' //读者#define WRITER 'W' //写者#define INTE_PER_SEC 1000 //每秒时钟中断的数目#define MAX_THREAD_NUM 64 //最大线程数#define MAX_FILE_NUM 32 //最大文件数目数#define MAX_STR_LEN 32 //字符串的长度int readcount=0; //读者数目int writecount=0; //写者数目CRITICAL_SECTION RP_Write; //临界资源CRITICAL_SECTION cs_Write;CRITICAL_SECTION cs_Read;struct ThreadInfo{int serial; //线程序号char entity; //线程类别(判断是读者还是写者线程)double delay; //线程延迟时间double persist; //线程读写操作时间};//////////////////////////////////////////////////////////////// ///////////// 读者优先---读者线程//P:读者线程信息void RP_ReaderThread(void *p){//互斥变量HANDLE h_Mutex;h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_readcount");DWORD wait_for_mutex; //等待互斥变量所有权DWORD m_delay; //延迟时间DWORD m_persist; //读文件持续时间int m_serial; //线程序号// 从参数中获得信息m_serial=((ThreadInfo*)(p))->serial ;m_delay=(DWORD)(((ThreadInfo*)(p))->delay *INTE_PER_SEC); m_persist=(DWORD)(((ThreadInfo*)(p))->persist*INTE_PER_SEC);Sleep(m_delay); //延迟等待printf("Reader thread %d sents the reading require./n",m_serial);//等待互斥信号,保证对ReadCount 的访问,修改互斥 wait_for_mutex=WaitForSingleObject(h_Mutex,-1); //读者数目增加readcount++;if(readcount==1){//第一个读者,等待资源EnterCriticalSection(&RP_Write);}ReleaseMutex(h_Mutex); //释放互斥信号//读文件printf("Reader thread %d begins to read file./n",m_serial); Sleep(m_persist);//退出线程printf("Reader thread %d finished readingfile./n",m_serial);//等待互斥信号,保证对ReadCount的访问,修改互斥wait_for_mutex=WaitForSingleObject(h_Mutex,-1);//读者数目减少readcount--;if(readcount==0){//如果所有的读者读完,唤醒写者LeaveCriticalSection(&RP_Write);}ReleaseMutex(h_Mutex); //释放互斥信号}////////////////////////////////////////////////////////////// //P:写者线程信息void RP_WriterThread(void *p){DWORD m_delay; //延迟时间DWORD m_persist; //写文件持续时间int m_serial; //线程序号// 从参数中获得信息m_serial=((ThreadInfo*)(p))->serial ;m_delay=(DWORD)(((ThreadInfo*)(p))->delay *INTE_PER_SEC); m_persist=(DWORD)(((ThreadInfo*)(p))->persist*INTE_PER_SEC);Sleep(m_delay);//延迟等待printf("Write thread %d sents the writingrequire./n",m_serial);//等待资源EnterCriticalSection(&RP_Write);//写文件printf("Writer thread %d begins to write to thefile./n",m_serial);Sleep(m_persist);//退出线程printf("Write thread %d finished writing to the file./n",m_serial); //释放资源LeaveCriticalSection(&RP_Write);}////////////////////////////////////////////////////////////// //读者优先处理函数//file:文件名void ReaderPriority(char *file){DWORD n_thread=0; //线程数目DWORD thread_ID; //线程IDDWORD wait_for_all; //等待所有线程结束//互斥对象HANDLE h_Mutex;h_Mutex=CreateMutex(NULL,FALSE,"mutex_for_readcount");//线程对象的数组HANDLE h_Thread[MAX_THREAD_NUM];ThreadInfo thread_info[MAX_THREAD_NUM];readcount=0; //初始化readcountInitializeCriticalSection(&RP_Write); //初始化临界区ifstream inFile;inFile.open (file);printf("Reader Priority:/n/n");while(inFile){//读入每一个读者,写者的信息inFile>>thread_info[n_thread].serial;inFile>>thread_info[n_thread].entity;inFile>>thread_info[n_thread].delay;inFile>>thread_info[n_thread++].persist;inFile.get();}for(int i=0;i<(int)(n_thread);i++){if(thread_info[i].entity==READER||thread_info[i].entity =='r'){//创建读者线程h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_Read erThread),&thread_info[i],0,&thread_ID);}else{//创建写者线程h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_Writ erThread),&thread_info[i],0,&thread_ID);}}//等待所有的线程结束wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1); printf("All reader and writer have finished operating./n"); }//////////////////////////////////////////////////////////写者优先---读者线程//P:读者线程信息void WP_ReaderThread(void *p){//互斥变量HANDLE h_Mutex1;h_Mutex1=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex1"); HANDLE h_Mutex2;h_Mutex2=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex2");DWORD wait_for_mutex1; //等待互斥变量所有权 DWORD wait_for_mutex2;DWORD m_delay; //延迟时间DWORD m_persist; //读文件持续时间int m_serial; //线程的序号//从参数中得到信息m_serial=((ThreadInfo*)(p))->serial ;m_delay=(DWORD)(((ThreadInfo*)(p))->delay *INTE_PER_SEC); m_persist=(DWORD)(((ThreadInfo*)(p))->persist*INTE_PER_SEC);Sleep(m_delay); //延迟等待printf("Reader thread %d sents the readingrequire./n",m_serial);wait_for_mutex1=WaitForSingleObject(h_Mutex1,-1);//读者进去临界区EnterCriticalSection(&cs_Read);//阻塞互斥对象Mutex2,保证对readCount的访问和修改互斥wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);//修改读者的数目readcount++;if(readcount==1){// 如果是第1个读者,等待写者写完EnterCriticalSection(&cs_Write);}ReleaseMutex(h_Mutex2);// 释放互斥信号 Mutex2//让其他读者进去临界区LeaveCriticalSection(&cs_Read);ReleaseMutex(h_Mutex1);//读文件printf("Reader thread %d begins to read file./n",m_serial); Sleep(m_persist);//退出线程printf("Reader thread %d finished reading file./n",m_serial); //阻塞互斥对象Mutex2,保证对readcount的访问,修改互斥wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1); readcount--;if(readcount==0){//最后一个读者,唤醒写者LeaveCriticalSection(&cs_Write);}ReleaseMutex(h_Mutex2); //释放互斥信号}/////////////////////////////////////////////写者优先---写者线程//P:写者线程信息void WP_WriterThread(void *p){DWORD wait_for_mutex3; //互斥变量DWORD m_delay; //延迟时间DWORD m_persist; //读文件持续时间int m_serial; //线程序号HANDLE h_Mutex3;h_Mutex3=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex3");//从参数中获得信息m_serial=((ThreadInfo*)(p))->serial ;m_delay=(DWORD)(((ThreadInfo*)(p))->delay *INTE_PER_SEC); m_persist=(DWORD)(((ThreadInfo*)(p))->persist*INTE_PER_SEC);Sleep(m_delay); //延迟等待printf("Writer thread %d sents the readingrequire./n",m_serial);//阻塞互斥对象mutex3,保证对writecount的访问wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);writecount++; //修改写者数目if(writecount==1){//第一个写者,等待读者读完EnterCriticalSection(&cs_Read);}ReleaseMutex(h_Mutex3);//进入写者临界区EnterCriticalSection(&cs_Write);//写文件printf("Writer thread %d begins to write to thefile./n",m_serial);Sleep(m_persist);//退出线程printf("Writer thread %d finished writing to thefile./n",m_serial);//离开临界区LeaveCriticalSection(&cs_Write);//阻塞互斥对象mutex3,保证对writecount的访问、修改互斥wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1); writecount--;if(writecount==0){//写者写完,读者可以读LeaveCriticalSection(&cs_Read);}ReleaseMutex(h_Mutex3);}///////////////////////////////////////////////写者优先处理函数// file:文件名void WriterPriority(char * file){DWORD n_thread=0;//线程数目DWORD thread_ID;//线程IDDWORD wait_for_all;//等待所有线程结束//互斥对象HANDLE h_Mutex1;h_Mutex1=CreateMutex(NULL,FALSE,"mutex1");HANDLE h_Mutex2;h_Mutex2=CreateMutex(NULL,FALSE,"mutex2");HANDLE h_Mutex3;h_Mutex3=CreateMutex(NULL,FALSE,"mutex3");//线程对象HANDLE h_Thread[MAX_THREAD_NUM];ThreadInfo thread_info[MAX_THREAD_NUM];readcount=0;//初始化readcountwritecount=0;//初始化writecountInitializeCriticalSection(&cs_Write);//初始化临界区 InitializeCriticalSection(&cs_Read);ifstream inFile;inFile.open (file);//打开文件printf("Writer priority:/n/n");while(inFile){//读入每一个读者、写者信息inFile>>thread_info[n_thread].serial;inFile>>thread_info[n_thread].entity;inFile>>thread_info[n_thread].delay;inFile>>thread_info[n_thread++].persist;inFile.get();}for(int i=0;i<(int)(n_thread);i++){if(thread_info[i].entity==READER||thread_info[i].entity =='r') {//创建读者进程h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_Read erThread),&thread_info[i],0,&thread_ID);}else{//创建写线程h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_Writ erThread),&thread_info[i],0,&thread_ID);}}//等待所有的线程结束wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1); printf("All reader and writer have finished operating./n"); }///////////////////////////////////////////////////////主函数int main(int argc,char *argv[]){char ch;while(true){//打印提示信息printf("*************************************\n"); printf(" 1.Reader Priority\n");printf(" 2.Writer Priority\n");printf(" 3.Exit to Windows\n");printf("*************************************\n"); printf("Enter your choice(1,2,3): ");//如果输入信息不正确,继续输入do{ch=(char)_getch();}while(ch!='1'&&ch!='2'&&ch!='3');system("cls");if(ch=='3')//选择3,返回return 0;//选择1,读者优先else if(ch=='1')山东科技大学学生课程设计ReaderPriority("thread.dat");//选择2,写者优先elseWriterPriority("thread.dat");//结束printf("/nPress Any Key to Coutinue:"); _getch();system("cls");}return 0;}31。