2011180021_Linux操作系统_课程设计报告_基于Linux的进程调度模拟程序

合集下载

操作系统课程设计说明书-基于Linux的进程之间通信

操作系统课程设计说明书-基于Linux的进程之间通信

操作系统课程设计说明书-基于Linux的进程之间通信中北大学操作系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名:学号:设计题目:基于Linux的进程之间通信实现信号量通信机制(哲学家进餐)起迄日期: 2015年12月28日- 2016年1月8日指导教师:何志英2015 年12月25日1需求分析1.1小组的拿到的任务是:设计内容:(1) 实现管道通信,要求见P183习题(3)。

(2) 实现信号量通信机制,要求见P191习题(3)。

(3) 实现消息缓冲通信机制,要求见P197习题。

(4) 实现共享内存区通信机制,要求见P201习题(2)。

要求:(1) 用Linux中进程控制系统调用函数来创建进程(线程)。

(2) 输出进程通信时同步的说明信息。

1.2小组分工我拿到的题目是:(2) 实现信号量通信机制,要求见P191习题(3)。

1.3题目的要求如下:1.3.1.哲学家进餐问题描述:设有5个哲学家,共享一张放有5把椅子和5把叉子的圆桌,每人分得一把椅子。

哲学家们在肚子饥饿时才试图分两次从两边捡起两把叉子就餐。

条件:1.每个人只有拿到两把叉子时,哲学家才能吃饭2.如果叉子已在他人手上,则哲学家必须等到他人吃完后才能拿起叉子3.任性的哲学家在自己未拿到两把叉子吃饭之前,绝不放下自己手中的叉子1.3.2问题:1.什么情况下5个哲学家全部都吃不上饭?答:当5个哲学家每人手中都拿到了1把叉子(共5把),即不肯放下自己手中的叉子又想要得到左右邻居的叉子时,每个哲学家永远拿不到两把叉子,所有哲学家都在等待另一把叉子,就会导致这5个哲学家谁都吃不上饭。

也就是产生死锁后的情况。

2.编程实现没有人饿死(永远拿不到两个叉子)的算法。

答:程序请看代码实现。

分析:没有人饿死,就是不允许出现死锁的情况(5个哲学家每人1把叉子)1.3.3解决死锁的方法有三种:1.至多允许四位哲学家同时去拿左边的叉子,最终保证至少有一位哲学家能够进餐,并且在用毕时能释放出他用过的两只叉子,从而使更多哲学家能够进餐;2.规定当哲学家的左右两只叉子均可用时,才允许他拿起叉子进餐;3.规定奇数号的哲学家先拿他左边的叉子,然后再去拿他右边的叉子,而偶数号哲学家则相反。

操作系统课程设计实验报告(以Linux为例)

操作系统课程设计实验报告(以Linux为例)

目录目录 0一、实验环境 (1)二、实验报告总体要求 (1)实验一编译L INUX内核 (2)实验二观察L INUX行为 (6)实验三进程间通信 (13)一、实验环境Linux平台◆硬件平台:普通PC机硬件环境。

◆操作系统:Linux环境,例如,红旗Linux或Red Hat Linux;启动管理器使用GRUB。

◆编译环境:伴随着操作系统的默认gcc环境。

◆工作源码环境:一个调试的内核源码,版本不低于2.4.20。

二、实验报告总体要求在2013年11月25日前提交实验报告。

实验报告至少要求包含以下内容:1.引言:概述本次实验所讨论的问题,工作步骤,结果,以及发现的意义。

2.问题提出:叙述本篇报告要解决什么问题。

注意不可以抄写实验要求中的表述,要用自己的话重新组织我们这里所提出的问题。

3.解决方案:叙述如何解决自己上面提出的问题,可以用小标题 3.1,3.2…等分开。

这是实验报告的关键部分,请尽量展开来写。

注意,这部分是最终课程设计的基本分的部分。

这部分不完成,本课程设计不会及格。

4.实验结果:按照自己的解决方案,有哪些结果。

结果有异常吗?能解释一下这些结果吗?同别人的结果比较过吗?注意,这部分是实验报告出彩的地方。

本课程设计要得高分,应该在这部分下功夫。

5.结束语:小结并叙述本次课程设计的经验、教训、体会、难点、收获、为解决的问题、新的疑惑等。

6.附录:加了注释的程序清单,注释行数目至少同源程序行数目比1:2,即10行源程序,至少要给出5行注释。

操作系统课程设计实验报告实验一编译Linux内核实验时间6小时实验目的认识Linux内核的组成,掌握配置、编译、安装Linux内核的步骤。

实验目标下载2.6.19或更新的Linux内核,配置该内核使其支持NTFS,并在新的内核中修改其版本为Linux NameTestKernel x.x.x,其中,Name是你的名字(汉语拼音);x.x.x是新内核的版本号,最后在你的机器上编译安装这个新内核。

《操作系统原理与Linux》课程设计报告

《操作系统原理与Linux》课程设计报告

《操作系统原理与Linux》课程设计报告专业班级学号姓名指导教师完成时间成绩进程调度算法一、设计题目:进程调度算法 二、设计目的通过对进程调度算法的编写加强对操作系统的加深了解,从而进一步的让我们清楚个进程之间的运行情况,对优先权算法与轮转调度算法的模拟加强对进程概念和进程的调度过程的理解,掌握进程状态之间的切换,同时掌握进程调度算法的实现方法和技巧。

三、设计要求要求实现先来先服务,短作业优先,时间片轮转,优先权调度算法四种算法并进行对比分析. 四、设计思想说明1、先来先服务算法:按照进程进入就绪队列的先后次序,分派CPU ,当前进程占用CPU ,直到执行完或阻塞,才出让CPU (非抢占方式)。

在进程唤醒后(如I/O 完成),并不立即恢复执行,通常等到当前进程让出CPU 。

进入选中进程的程序入口先来先服务算法的实现过程如图所示。

设置信号量:就绪队列互斥信号量s ,初值为1; 就绪队列中进程个数n ,初值为0。

2、短作业优先:选择就绪队列中估计运行时间最短的进程投入运行。

通常后来的短作业不抢先正在执行的作业。

比FCFS改善平均周转时间和平均带权周转时间,缩短作业的等待时间提高系统的吞吐量。

3、时间片轮转调度算法:通过时间片轮转,提高进程并发性和响应时间特性,从而提高资源利用率。

将系统中所有的就绪进程按照FCFS原则,排成一个队列。

每次调度时将CPU分派给队首进程,让其执行一个时间片。

时间片的长度从几个ms到几百ms。

在一个时间片结束时,发生时钟中断。

调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过CPU现场切换执行当前的队首进程。

进程可以未使用完一个时间片,就出让CPU(如阻塞)。

4、优先权调度算法:优先选择就绪队列中优先级最高的进程投入运行。

分为:非抢占式优先级算法:仅发生在进程放弃CPU。

抢占式优先级算法:可剥夺当前运行进程CPU。

五、系统结构的说明六、数据结构的说明用C语言或C++语言来实现对N个进程采用优先算法以及轮转算法的调度。

操作系统课程设计Linux

操作系统课程设计Linux

操作系统课程设计Linux一、教学目标本课程的教学目标是使学生掌握Linux操作系统的核心概念、原理和应用技能。

通过本课程的学习,学生将能够:1.理解操作系统的基本原理,包括进程管理、内存管理、文件系统和输入/输出系统。

2.掌握Linux操作系统的安装、配置和管理方法。

3.熟练使用Linux命令行界面,进行日常操作和系统管理。

4.掌握Linux常用命令、 shell脚本编写和系统监控工具的使用。

5.了解Linux操作系统在服务器、嵌入式设备和云计算等领域的应用。

二、教学内容本课程的教学内容分为五个部分:1.操作系统概述:介绍操作系统的定义、功能和分类,以及Linux操作系统的历史和发展。

2.进程管理:讲解进程的基本概念、进程控制、进程同步和互斥、死锁及其解决方法。

3.内存管理:介绍内存分配与回收策略、内存保护、虚拟内存和分页分段机制。

4.文件系统:讲解文件和目录结构、文件访问控制、文件系统性能优化和磁盘空间分配策略。

5.输入/输出系统:介绍I/O设备管理、中断和DMA机制、设备驱动程序和I/O调度策略。

三、教学方法本课程采用多种教学方法相结合的方式,以提高学生的学习兴趣和主动性:1.讲授法:教师讲解操作系统的核心概念和原理,引导学生掌握基本知识。

2.讨论法:学生针对实际案例和问题进行讨论,培养学生的思考和分析能力。

3.案例分析法:分析Linux操作系统的实际应用案例,使学生了解操作系统的应用场景。

4.实验法:安排实验室课时,让学生亲自动手进行系统安装、配置和调试,提高学生的实践能力。

四、教学资源本课程的教学资源包括:1.教材:选用权威、实用的Linux操作系统教材,如《Linux操作系统原理与应用》。

2.参考书:提供相关的学术论文、技术博客和在线文档,供学生拓展阅读。

3.多媒体资料:制作课件、教学视频和演示文稿,辅助学生理解和记忆。

4.实验设备:提供Linux服务器、虚拟机和实验室环境,让学生进行实际操作。

Linux课程设计报告

Linux课程设计报告

内核模块编程一、相关原理介绍分析1. 1内核模块编程简介Linux操作系统的内核是单一体系结构(Monolithic kernel)的, 也就是说, Linux内核是一个单独的非常大的程序。

这种体系结构导致了Linux内核的可扩展性和可维护性比较差, 为了弥补单一内核的缺陷, Linux采用了一种全新的机制——模块(Module)编程[1]。

模块具有十分突出的优点:模块本身不被编译入内核映像, 这控制了内核的大小;模块一旦被加载, 它就和内核中的其它部分完全一样。

Linux采用了内核模块编程之后, 编写设备驱动和修改系统内核变得易于实现。

因为用户可以根据需要, 在不需要对内核进行重新编译的情况下, 内核模块可以动态的载入内核或从内核移出改变内核, 极大缩短了驱动编写和内核开发的时间。

1. 2 Linux内核模块程序结构(1) 一个Linux内核模块主要由如下几个部分组成:(2) 模块加载函数(3) 通过insmod或modprobe命令加载内核模块时, 模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。

(4) 模块卸载函数(5) 当通过rmmod命令卸载某模块时, 模块的卸载函数会自动被内核执行, 完成与模块加载函数相反的功能。

(6) 模块许可证声明(7) 许可证(LICENSE)声明描述内核模块的许可权限, 这一部分是必须声明的, 如果不声明LICENSE, 模块被加载时, 将收到内核被污染(module license ‘unspecified’taints kernel)的警告。

在Linux 2.6内核中, 可接受的LICENSE有“GPL”、“GPL v2”、“GPL and additional rights”、“Dual BSD/GPL”、“Dual MPL/GPL”和“Proprietary”。

大多数情况下, 内核模块应遵循GPL兼容许可权。

其中最常用的许可是GPL和Dual BSD/GPL。

LINUX操作系统-课程设计报告.doc

LINUX操作系统-课程设计报告.doc

xxx软件工程职业学院课程设计报告2015-2016学年度第一学期题目:LINUX操作系统姓名:xxxx班级:网络xxx系部:计算机学院指导教师:xxx日期:2015年11月21日Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多cpu的操作系统。

它能运行主要的UNIX工具软件、应用程序和网络协议。

Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

它主要用于基于Intel x86系列CPU的计算机上。

这个系统是由全世界各地的成千上万的程序员设计和实现的。

其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。

通过这次课程设计,提高了我们对Linux各子系统服务配置的动手能力和实践操作综合应用的能力。

关键字:DHCP服务、Samba服务器、DNS服务、WWW服务、FTP服务、telnet摘要 (2)目录 (3)DHCP服务 (4)一、需求分析: (4)二、步骤与结果: (4)三、拓扑图 (5)四、总结: (5)DNS (6)一.需求分析 (6)二.配置步骤 (6)三.拓扑图 (8)四.总结 (8)Samba (8)一.需求分析 (8)二.步骤与结果 (9)三.总结 (11)WWW (11)一.需求分析 (11)二.步骤与结果 (11)三.总结 (17)Telnet (17)一.需求分析 (17)二.步骤与结果 (17)三.总结 (19)FTP (19)一需求分析 (19)二步骤与结果 (20)三.总结 (23)参考文献 (23)DHCP服务一、需求分析:由于公司内部很多 Notebook计算机使用的场合!所以 Notebook 在使用上,当设定为DHCP client 的时候,那么只要它连接上的网域里面有一部可以上网的 DHCP服务器,那部notebook 也就可以连接上 Internet 了!网域内数量相当的多时:另外一个情况就是网域内计算机数量相当庞大时,大到您没有办法一个一个的进行说明来设定他们自己的网络参数,这个时候为了省麻烦,还是架设DHCP 来的方便。

linux操作系统课程设计

linux操作系统课程设计

linux操作系统课程设计一、教学目标本节课的教学目标是使学生掌握Linux操作系统的基本概念、命令和操作,培养学生具备基本的Linux操作系统使用能力。

具体目标如下:1.知识目标:–了解Linux操作系统的起源、发展和特点;–掌握Linux操作系统的基本命令和操作;–理解Linux操作系统的文件系统结构和权限管理。

2.技能目标:–能够熟练地在Linux操作系统上进行基本操作,如文件创建、编辑、删除等;–能够使用Linux命令行工具进行日常的网络和系统管理;–能够配置Linux操作系统的用户和权限设置。

3.情感态度价值观目标:–培养学生对Linux操作系统的兴趣和好奇心,提高学生对计算机操作的自信;–培养学生团队合作的精神,通过小组讨论和实验,共同解决问题;–培养学生对开源软件和自由软件理念的理解和尊重。

二、教学内容本节课的教学内容主要包括以下几个部分:1.Linux操作系统的起源、发展和特点:介绍Linux操作系统的起源和发展历程,讲解Linux操作系统的特点和优势。

2.Linux基本命令和操作:讲解Linux操作系统的常用命令,如文件操作命令、文本处理命令、网络命令等,并通过实际操作演示。

3.Linux文件系统结构和权限管理:介绍Linux操作系统的文件系统结构,讲解文件和目录的权限管理,包括读、写、执行权限的设置和更改。

三、教学方法本节课采用多种教学方法,以激发学生的学习兴趣和主动性:1.讲授法:讲解Linux操作系统的起源、发展和特点,以及基本命令和操作。

2.讨论法:学生进行小组讨论,共同解决问题,培养学生的团队合作精神。

3.案例分析法:通过实际案例,让学生学会使用Linux命令行工具进行日常的网络和系统管理。

4.实验法:安排学生进行实际操作,掌握Linux操作系统的使用方法。

四、教学资源本节课的教学资源包括以下几个方面:1.教材:选用《Linux操作系统教程》作为主要教材,为学生提供系统性的知识学习。

基于Linux的进程同步与通信的模拟实现课程设计报告

基于Linux的进程同步与通信的模拟实现课程设计报告

中北大学操作系统课程设计说明书学院、系:专业:学生姓名:学号:设计题目:基于Linux的进程同步与通信的模拟实现起迄日期:指导教师:2013 年 1月 16 日1需求分析该软件需要利用银行家算法判断系统是否处于安全状态,同时根据银行家算法得出的安全序列进行临界资源的分配。

软件设计的目的是要对输入的进程进行安全性判断模拟分配资源。

首先先创建进程:手动创建几个进程,都在界面上完成;其中包括每个进程已分配的资源、最大需求资源、系统剩余资源以及每个进程的执行时间。

实例中创建5个进程。

其次采用银行家算法,判断是否可以进行资源的分配。

最后,按照银行家算法得出的安全序列,对临界资源进行分配。

2总体设计软件由两个模块组成,分别是银行家算法判断安全序列模块以及临界资源分配模块。

2.1银行家算法模块本模块中有如下功能:初始化allocation矩阵,初始化max矩阵,初始化available矩阵,初始化need矩阵,初始化finished矩阵,初始化进程执行时间,用银行家算法判断是否安全,计算系统总资源数目,输出系统总资源数目。

其中设置了多个线性单链表结构存储矩阵中的数据,包括已分配allocation矩阵、最大需求量max矩阵、可用资源数available矩阵、需要资源数need矩阵、安全路径path矩阵、进程安全标示finish矩阵、进程运行时间ti矩阵。

银行家算法:设进程i提出请求Request[n],则银行家算法按如下规则进行判断。

(1)如果Request[n]>Need[i,n],则报错返回。

(2)如果Request[n]>Available,则进程i进入等待资源状态,返回。

(3)假设进程i的申请已获批准,于是修改系统状态:Available=Available-RequestAllocation=Allocation+RequestNeed=Need-Request(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

河南中医学院《linux操作系统》课程设计报告题目:基于Linux的进程调度模拟程序所在院系:信息技术学院专业年级:2011级计算机科学与技术完成学生:2011180021 郭姗指导教师:阮晓龙完成日期:201X 年06 月22 日目录1. 课程设计题目概述32. 研究内容与目的43. 研究方法54. 研究报告65. 测试报告/实验报告76. 课题研究结论87. 总结91、课程设计题目概述随着Linux系统的逐渐推广,它被越来越多的计算机用户所了解和应用. Linux是一个多任务的操作系统,也就是说,在同一个时间内,可以有多个进程同时执行。

如果读者对计算机硬件体系有一定了解的话,会知道我们大家常用的单CPU计算机实际上在一个时间片断内只能执行一条指令,那么Linux是如何实现多进程同时执行的呢?原来Linux使用了一种称为"进程调度(process scheduling)"的手段,首先,为每个进程指派一定的运行时间,这个时间通常很短,短到以毫秒为单位,然后依照某种规则,从众多进程中挑选一个投入运行,其他的进程暂时等待,当正在运行的那个进程时间耗尽,或执行完毕退出,或因某种原因暂停,Linux就会重新进行调度,挑选下一个进程投入运行。

因为每个进程占用的时间片都很短,在我们使用者的角度来看,就好像多个进程同时运行一样了。

本文就是对进程调度进行研究、实验的。

本文首先对Linux系统进行了简要的介绍, 然后介绍了进程管理的相关理论知识。

其次,又介绍最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)、先来先服务算法的相关知识,并对进程调度进行最高优先数优先的调度算法和先来先服务算法模拟实验,并对比分析两种算法的优缺点,从而加深对进程概念和进程调度过程/算法的理解设计目的:在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。

也就是说能运行的进程数大于处理机个数。

为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择某一进程占用处理机。

使得系统中的进程能够有条不紊的运行,同时提高处理机的利用率以及系统的性能。

所以设计模拟进程调度算法(最高优先数优先的调度算法、先来先服务算法),以巩固和加深处理进程的概念,并且分析这两种算法的优缺点。

关键词:linux 进程调度调度算法2. 研究内容与目的操作系统由四大功能模块组成:进程管理、存储器管理、设备管理和文件管理,进程管理是其中最重要的一个模块。

本文主要研究最高优先数优先的调度算法、先来先服务算法这两种调度算法,并且分析比较这两种算法的优缺点。

目的:进程是操作系统中最重要的概念,也是学习操作系统的关键。

通过本次课程设计,要求理解进程的实质和进程管理的机制。

掌握进程调度的工作流程以及进程调度的算法,并且分析比较这两种算法的优缺点。

3. 研究方法3.1研究方法3.1.1查找资料通过查找资料了解到:(1)优先数调度算法简介优先数调度算法常用于批处理系统中。

在进程调度中,每次调度时,系统把处理机分配给就绪队列中优先数最高的进程。

它又分为两种:非抢占式优先数算法和抢占式优先数算法在非抢占式优先数算法下,系统一旦把处理机分配给就绪队列中优先数最高的进程后,这个进程就会一直运行,直到完成或发生某事件使它放弃处理机,这时系统才能重新将处理机分配给就绪队列中的另一个优先数最高的进程。

在抢占式优先数算法下,系统先将处理机分配给就绪队列中优先数最高的进程度让它运行,但在运行的过程中,如果出现另一个优先数比它高的进程,它就要立即停止,并将处理机分配给新的高优先数进程。

(2)先来先服务算法如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务(FCFS: first come first service)总是把当前处于就绪队列之首的那个进程调度到运行状态。

也就说,它只考虑进程进入就绪队列的先后,而不考虑它的下一个CPU周期的长短及其他因素。

基本思想:先来先服务的作业调度算法:优先从后备队列中,选择一个或多个位于队列头部的作业,把他们调入内存,分配所需资源、创建进程,然后放入“就绪队列”先来先服务的进程调度算法:从“就绪队列”中选择一个最先进入队列的进程,为它分配处理器,使之开始运行原理:按照进程进入就绪队列的先后顺序调度并分配处理机执行。

先来先服务调度算法是一种不可抢占的算法,先进入就绪队列的进程,先分配处理机运行。

一旦一个进程占有了处理机,它就一直运行下去,直到该进程完成工作或者因为等待某事件发生而不能继续运行时才释放处理机。

①、系统只要有按FIFO规则建立的后备作业队列或就绪进程队列即可,就是一个作业控制块JCB或进程控制块PCB加入队列时加在相应队列末尾。

②、调度退出队列时从相应队列首开始顺序扫描,将相关的JCB或PCB调度移出相应队列。

3.2实验方法3.2.1模拟法根据最高优先数优先的调度算法、先来先服务算法的进程调度机制的流程,进行模拟这两种算法的实验。

3.2.2控制法进行实验时,输入进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态。

3.2.3观察法观察实验的结果,分析进程调度流程。

3.2.4比较法通过观察实验结果,比较两种调度算法的优缺点。

3.3可行性分析(课题理论上的要求、实践的可操作性、本人能力和现实条件(相关案例、资料等)的许可等内容)3.3.1环境运行在VMware-workstation-full-10.0.0-1295980上,导入CentOS操作系统,在CentOS操作系统上运行。

CentOS操作系统是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。

相对于其他Linux 发行版,其稳定性值得信赖。

因为CentOS操作系统安装了gcc编译器,能编译C语言。

3.3.2实践的可操作性在对linux进程调度机制以及调度算法进行深入分析后,根据对于最高优先数优先的调度算法采用最高优先数算法的动态优先数法则控制进程:系统把处理机分配给就绪队列中优先数最高的进程后,如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU,而先来先服务是从“就绪队列”中选择一个最先进入队列的进程,为它分配处理器,使之开始运行而制定实验方案的。

3.3.3本人能力虽然我对linux的进程调度方面的知识还有很多不知道的知识,但我是在不断学习的,遇到不懂得就通过查资料或请教他人的方法,不断地学习。

4. 研究报告4.1最高优先数优先的调度算法(抢占式)4.1.1实验原理1、进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)。

2、每个进程有一个进程控制块(PCB)表示。

进程控制块可以包含如下信息:进程名、优先数、需要运行时间、已用CPU时间、进程状态等等。

3、进程的优先数及需要的运行时间事先人为地指定。

4、每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

5、进程的运行时间以时间片为单位进行计算。

6、就绪进程获得CPU后都只能运行一个时间片。

用已占用CPU时间加1来表示。

7、采用最高优先数算法的动态优先数法则控制进程:如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

8、每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。

9、重复以上过程,直到所要进程都完成为止。

4.1.2实验内容1、数据结构(1)进程控制块结构PCB:是struct定义的结构体,定义如下:typedef struct pcb{char qname[20];/*进程名*/char state; /*进程状态*/int super; /*进程优先级*/int ndtime; /*进程需要运行的时间*/int runtime; /*进程已运行的时间*/int cpu; /*进程当前获得的时间片大小*/}PCB;(2)队列结点Node,结点储存PCB信息,定义如下:typedef struct node{PCB data; /*结点数据*/struct node *next; /*指向下一结点的指针*/}Node;(3)由队列结点Node扩展的队列Queue,定义如下:typedef struct queue{Node *front;/*队首*/Node *rear;/*队尾*/}Queue;2.相关函数(1)判断一个队列q是否为空的函数int is_empty(Queue *q);(2)将进程控制块x加入队列q的函数void enqueue(PCB x,Queue *q);(3)删除队列q的队首进程,将其值赋给x并修改状态的函数void dequeue(PCB *x,Queue *q);该函数将队列q的队首进程删除,由于可能该进程未运行完毕,需进入下一优先级队列,所以先修改其结构体内成员变量:已运行时间为上次已运行时间加上这次获得的cpu时间;优先级减1(若该进程已是最低优先级,则将在主控过程中恢复);下次获得的时间片为这次的时间片加1。

然后将修改后的进程赋给一个临时PCB变量x,以便将x插入下一优先级队列。

(4)主函数利用上述的数据结构和函数实现模拟进程调度。

3. 进程产生模拟通过标准输入模拟产生进程:先要求输入进程数目,再依次输入各个进程的进程名、进程优先数、进程需要运行的时间。

4.1.3参考代码#include<stdio.h>#include<string.h>#include<malloc.h>#include<conio.h>#define PCB_LEN sizeof(PCB)#define NODE_LEN sizeof(Node)#define QUEUE_LEN sizeof(Queue)/*进程控制块结构PCB*/typedef struct pcb{char qname[20];/*进程名*/char state; /*进程状态*/int super; /*进程优先级*/int ndtime; /*进程需要运行的时间*/int runtime; /*进程已运行的时间*/int cpu; /*进程当前获得的时间片大小*/}PCB;/*队列结点,结点储存PCB信息*/typedef struct node{PCB data;struct node *next;}Node;/*实现进程控制块的队列*/typedef struct queue{Node *front;Node *rear;}Queue;/*判断队列是否为空*/int is_empty(Queue *q){if(q->front)return 0;elsereturn 1;}/*将进程控制块x加入队列q*/void enqueue(PCB x,Queue *q){Node *p=(Node *)malloc(NODE_LEN);(p->data).state=x.state;(p->data).super=x.super;(p->data).ndtime=x.ndtime;(p->data).runtime=x.runtime;(p->data).cpu=x.cpu;strcpy((p->data).qname,x.qname);p->next=0;if(q->front)q->rear->next=p;elseq->front=p;q->rear=p;}/*删除队列q的队首进程,将其值赋给x并修改状态*/ void dequeue(PCB *x,Queue *q){Node *p=(Node *)malloc(NODE_LEN);if(is_empty(q))return;/*进入下一优先级队列之前修改状态*/x->state='W';/*状态改为就绪*/strcpy(x->qname,(q->front->data).qname);/*已运行时间为上次已运行时间加上这次获得的cpu时间*/x->runtime=(q->front->data).runtime+(q->front->data).cpu;/*优先级减1,若该进程已是最低优先级,则将在主控过程中恢复*/ x->super=(q->front->data).super-1;x->ndtime=(q->front->data).ndtime;/*下次获得的时间片为这次的时间片加1*/x->cpu=(q->front->data).cpu+1;p=q->front;q->front=q->front->next;free(p);}/*主控过程*/void main(){Queue *queue=NULL;/*设置就绪队列数组*/Node *wait=(Node *)malloc(NODE_LEN);PCB x;int numberOFcourse,i,j,super,time;int hight=0,num=0;int temp_ndtime,temp_runtime,temp_cpu;char name[20];printf("\n请输入进程总个数?");scanf("%d",&numberOFcourse);/*为队列数组开辟空间,每个数组表示不同的优先级队列*/queue=(Queue *)calloc(numberOFcourse,QUEUE_LEN);/*输入各进程信息并初始化,并将其加入相应的优先级队列*/for(i=0;i<numberOFcourse;i++){printf("\n进程号NO.%d\n",i);printf("\n输入进程名:");scanf("%s",name);printf("\n输入进程优先数:");scanf("%d",&super);if(super>hight)hight=super;printf("\n输入进程运行时间:");scanf("%d",&time);strcpy(x.qname,name);x.state='W';x.super=super;x.ndtime=time;x.runtime=0;x.cpu=1;enqueue(x,&queue[super-1]);}printf("\n\n");/*进程调度过程*/for(i=hight-1;i>=0;i--){/*从最高优先级队列开始调度进程,直到该队列为空,则调度下一优先级队列*/ while(!is_empty(&queue[i])){num++;/*调度次数*/printf("按任一键继续......\n");getch();printf("The execute number:%d\n\n",num);/*打印正在运行进程*/((queue[i].front)->data).state='R';printf("******当前工作的进程是:%s\n",((queue[i].front)->data).qname);printf("qname state super ndtime runtime\n");printf("%s",((queue[i].front)->data).qname);printf("R");printf("%d",(((queue[i].front)->data).super));printf("%d",(((queue[i].front)->data).ndtime));printf("%d\n\n",(((queue[i].front)->data).runtime));/*计算一个进程运行一个时间片后,还需要运行的时间temp_time*/temp_ndtime=((queue[i].front)->data).ndtime;temp_runtime=((queue[i].front)->data).runtime;temp_cpu=((queue[i].front)->data).cpu;temp_ndtime=temp_ndtime-temp_runtime-temp_cpu;/*若该进程已运行完毕*/if(temp_ndtime<=0){/*打印已完成信息,并将其删除出队列*/printf("进程[%s]已完成\n\n",((queue[i].front)->data).qname);((queue[i].front)->data).state='F';dequeue(&x,&queue[i]);}/*若该进程未运行完毕*/else{dequeue(&x,&queue[i]);/*将其删除出当前队列*//*若原优先级不是最低优先级,则插入下一优先级队列*/if(i>0)enqueue(x,&queue[i-1]);/*若原优先级是最低优先级,则插入当前队列末尾*/else{/*由于删除操作中将优先级减1,所以在此恢复*/x.super=x.super+1;enqueue(x,&queue[i]);}}/*打印就绪队列状态*/printf("******当前就绪队列状态为:\n");for(j=i;j>=0;j--){if(queue[j].front){wait=queue[j].front;while(wait){printf("qname state super ndtime runtime\n");printf("%s",(wait->data).qname);printf("W");printf("%d",(wait->data).super);printf("%d ",(wait->data).ndtime);printf("%d\n\n",((wait->data).runtime));wait=wait->next;}}}printf("\n");}}/*结束*/printf("进程已经全部完成\n");free(wait);free(queue);getch();}4.2先来先服务算法4.2.1实验原理先来先服务调度算法按照进程进入就绪队列的先后顺序调度并分配处理机执行。

相关文档
最新文档