操作系统实验-进程控制(python实现)

一、实验目标

模拟操作系统对进程的管理。实现进程之间的切换。

二、实验要求

(1)单处理机,即一次只能 1 个进程处于运行态
(2)内核实现进程切换和进程调度(scheduler&switch)的执行时间忽略,只考虑进程的执行所花时间
(3)程序的指令分为 cpu 和 io 两种类型。 cpu 代表 cpu 指令,执行 cpu 指令需要 1 个时间单位;io 代表 io 指令,需要阻塞该进程,执行 io 指令需要 5 个时间单位(第 1 个时间单位使用 cpu,后面 4 个时间单位使用 IO 设备)
(4)进程的状态有:READY,RUN:cpu, RUN:io, WAITING, DONE
(5)CPU 的状态有:1(忙),0(空闲),IOs 的状态有:1(忙),0(空闲)

三、代码实现

class PCB:                  #进程pcbdef __init__(self,id):  #通过id来区分是哪一个进程self.id=id          #进程idself.state='ready'  #进程初始状态均设置为ready就绪态self.instruction=[] #进程的指令self.waitingtime=0  #阻塞标记 io时使用class queue:                #用于进程调度管理的链式队列def __init__(self):self.head=None      #初始化赋空值self.tail=Noneself.size=0def isnotempty(self):   #判断队列是否为空if(self.head):      #队列非空返回1return 1else:               #队列为空返回0return 0def insert(self,node):  #插入一个新节点 尾插node.next=Noneif(self.head==None):#队列为空插入新节点self.head=nodeelse:               #队列非空插入新节点self.tail.next=nodeself.tail=nodeself.size+=1        def remove(self):       #将节点从队列取出 同时移出当前队列node=self.head#self.size-=1self.head=self.head.nextif self.isnotempty()==0 :self.tail=Nonereturn nodedef go():readyqueue=queue()runningProcess=queue()waitingqueue=queue()pid0=PCB('PID0')pid1=PCB('PID1')pid2=PCB('PID2')pid3=PCB('PID3') pid4=PCB('PID4')pid5=PCB('PID5')pid0.instruction=['io','cpu','cpu','io','cpu']pid1.instruction=['cpu','io','cpu']pid2.instruction=['io','cpu','cpu','io','io']pid3.instruction=['io','cpu','io']pid4.instruction=['cpu','io','cpu','io']pid5.instruction=['cpu','cpu','cpu','io']readyqueue.insert(pid0)readyqueue.insert(pid1)readyqueue.insert(pid2)readyqueue.insert(pid3)readyqueue.insert(pid4)readyqueue.insert(pid5)time=0cputime=0iotime=0print('Time   ',pid0.id,'      ',pid1.id,'      ',pid2.id,'      ',pid3.id,'      ',pid4.id,'      ',pid5.id,'      ','CPU     IOs')while readyqueue.isnotempty() or runningProcess.isnotempty() or waitingqueue.isnotempty():usecpu=0useio=0if runningProcess.isnotempty():rh=runningProcess.headif len(rh.instruction)==0:rh.state='done'runningProcess.remove()if waitingqueue.isnotempty():wh=waitingqueue.headwhile wh!=None:wh.state='waiting'wh.waitingtime-=1wh=wh.nextwh=waitingqueue.headwhile wh!=None:if wh.waitingtime==-1:if len(wh.instruction):if runningProcess.isnotempty()==0:runningProcess.insert(waitingqueue.remove())else:readyqueue.insert(waitingqueue.remove())else:wh.state='done'waitingqueue.remove()wh=wh.nextuseio=waitingqueue.sizeif readyqueue.isnotempty():reh=readyqueue.headwhile reh!=None :reh.state='ready'reh=reh.nextif runningProcess.isnotempty()==0 and readyqueue.isnotempty():runningProcess.insert(readyqueue.remove())if runningProcess.isnotempty():rh=runningProcess.headif len(rh.instruction):order=rh.instruction[0]if order=='cpu' :rh.state='run:cpu'del rh.instruction[0]usecpu+=1elif order=='io' :rh.state='run:io'rh.waitingtime=4del rh.instruction[0]waitingqueue.insert(runningProcess.remove())usecpu+=1else:rh.state='done'runningProcess.remove()time+=1print(time,' ',pid0.state,' ',pid1.state,' ',pid2.state,' ',pid3.state,' ',pid4.state,' ',pid5.state,' ',usecpu,' ',useio,sep='\t')if usecpu!=0 :cputime+=1if useio!=0 :iotime+=1print('Stats: Total Time ',time)print('Stats: CPU Busy ',cputime,' (',cputime/time*100,'% )')print('Stats: IO Busy ',iotime,' (',iotime/time*100,'% )')
if __name__=='__main__':go()

四、实验结果

管理实验结果如下图所示,其中Time表示时间片,PID0=PID5表示6个进程,其中ready表示进程处于就绪态,run:cpu表示当前正在运行cpu指令,run:io表示正在进行io指令,此时会占用一个时间片的cpu,之后会继续进行三个时间片的阻塞,即waiting状态,done表示此进程指令已经全部执行完成。由于本实验是单处理机,所以CPU这一列表示此时间片是否占用cpu,包括run:io和run:cpu,1表示有cpu被占用,0表示没有cpu被占用。IOs表示此时间片被占用io数量,为0表示无waiting,由于阻塞可以多个进程同时进行,所以其他数字即表示当前时间片waiting总数。Total Time表示总时间片个数,图中表示为执行本程序共用29个时间片,CPU Busy表示占用cpu的时间,图中表示cpu占用24个时间片,后面括号内数字为占用cpu时间与运行程序总时间的比,这里为24/29所得,IO Busy表示占用io的总时间,这里27表示有27个时间片使用了io,后面的百分比是使用io时间与总时间的比,这里是27/29。


五、小结
这里我模拟了操作系统对进程的管理,实现了进程之间的切换,我们应该对操作系统的进程管理有一定的了解,了解进程是如何调度的,如何执行的。这里通过readyqueue、runningProcess、waitingqueue三个队列来管理进程,通过出队入队等操作将进程作为节点在不同队列上切换,并根据不同进程当前指令判断,这样就实现了进程状态的转换,需要要理解操作系统后台对进程是如何进行调度的,操作系统会按照一定逻辑来完成调度,在这里我按照自己的理解来设计,实现了多进程的并发执行,这就需要一定的调度机制,初始时,所有进程均放入就绪队列,然后会从就绪队列取出第一个进程放入执行队列,判断此进程第一个指令是哪种,是cpu指令则执行run:cpu,此时cpu将处于忙碌状态,且由于是单cpu,同一时刻只能有一个进程占用cpu,若是io则执行run:io,此时也会占用cpu,在之后需要将其放入阻塞队列,执行三次waiting,才可以被放回就绪队列,然后还会从就绪队列取进程,如此往复,直到redyqueue和waitingqueue全为空,即所有进程的所有指令都进行完毕,程序结束。

(如有问题,欢迎留言)

操作系统实验-进程控制(python实现)相关推荐

  1. 操作系统实验进程控制(C语言版)

    操作系统实验进程控制 1.实验目的 2.实验内容 3.实验准备 3.1进程 3.1.1进程的含义 3.1.2进程状态 3.1.3进程状态之间的装换 3.2进程控制块 3.3进程的创建与撤消 3.4进程 ...

  2. Linux多线程矩阵,操作系统实验(进程)多线程实现矩阵乘法

    <操作系统实验(进程)多线程实现矩阵乘法>由会员分享,可在线阅读,更多相关<操作系统实验(进程)多线程实现矩阵乘法(6页珍藏版)>请在人人文库网上搜索. 1.多线程编程实现矩阵 ...

  3. 操作系统实验--进程的创建撤销和控制

    进程的创建撤销和控制 一.实验名称 进程的创建撤销和控制 二.实验内容 学生独立设计用于描述进程的数据结构,完成进程的创建.同步和互斥. 三.实验原理和设计思路 在Linux系统下用fork()函数创 ...

  4. 操作系统:进程控制与调度

    目录 3.3 进程控制与调度 3.3.1 进程执行 3.3.2 进程调度 3.3.3 进程调度算法 3.4 作业与进程的关系 3.5 线程引入 3.3 进程控制与调度 3.3.1 进程执行 系统模型: ...

  5. 模拟进程创建、终止、阻塞、唤醒原语_操作系统基础8-进程及进程控制

    进程(Process) 的定义 从不同的角度,进程可以有不同的定义,传统典型的定义: 进程是程序的一次执行过程. 或者:一个正在执行的程序的实例 进程是一个程序及其数据在处理机上顺序执行所发生的活动 ...

  6. 实验四 linux进程控制实验报告,Linux系统进程控制操作系统实验报告4

    实验课程名称:操作系统 实验项目名称Linux系统进程控制实验成绩 实验者专业班级组别 同组者实验日期年月日第一部分:实验分析与设计(可加页) 实验内容描述(问题域描述) 要求:掌握Linux系统中进 ...

  7. 操作系统实验:Linux下的进程控制实验

    进程控制实验 一.实验目的: 二.实验平台: 三.实验内容: 1.进程的创建与销毁 进程控制相关函数 实验结果分析 2.多进程并发执行 time命令 实验结果分析 四.总结分析 一.实验目的: 加深对 ...

  8. 操作系统—进程控制实验

    文章目录 1.关于实验前环境准备 2.关于可能用到的命令 3.关于makefile 4.关于实验说明 5.关于实验指导的程序 6.关于独立实验 Q(跪求大佬解答)? 1.关于实验前环境准备 要准备好C ...

  9. 操作系统实验二进程的创建控制实验(含代码及实验心得)

    实现工具:PC机 实现环境:Linux 实习内容(功能.目标): 实验目的:  创建进程,体会进程间的并发特征. 实验内容:  编写一段程序,使用系统调用 fork() 创建两个子进程 p1 和 p2 ...

最新文章

  1. 博为峰Java技术题 ——JavaSE Java 方法Ⅲ
  2. 后端传输大量log数据_京东智联云MySQL读写分离最佳实践 ,轻松搞定数据库高性能扩展...
  3. Android 5.0 SEAndroid下如何获得对一个内核节点的访问权限
  4. Pandas period_range
  5. Day4 dict和set
  6. 【转】初试JNI Java与C/C++交互
  7. java类 权限修饰词_java-学习笔记-访问权限修饰词一
  8. echarts曲线图 鼠标位置偏移与提示框的大小设置(与竖线位置偏离)
  9. 2.4 大电路静态工作点的稳定
  10. python 删除pdf页面_使用Python批量删除扫描PDF中的空白页
  11. [云原生专题-22]:K8S - 集群编排工具K8S与SWARM比较与技术选择
  12. 玩转基因组浏览器之查看gwas结果
  13. 微信公众号开发整理(五)--自定义菜单
  14. 虚拟机Centos,登陆之后又弹回到登陆界面,无法进入系统
  15. 游戏中的亚洲后现代电影
  16. LDA深入精讲(强力推荐)
  17. 杰奇是否生成html,杰奇1.70如何自定义页面
  18. 嵌入式Linux学习笔记(1-1)——linux系统搭建
  19. 解决ASUS电脑重装系统导致键盘灯无法调节和ASUS Battery Health Charging变灰不能选择充电模式默认充电80%
  20. 开学季,几何画板降到冰点

热门文章

  1. 历届真题 魔方旋转问题【历届真题】【决赛】【高职组】
  2. 从分布式训练到大模型训练
  3. 使用cookie登录
  4. 【腾讯云原生降本增效大讲堂】作业帮云原生降本增效实践之路
  5. 安装wampserver后图标一直红色的解决办法
  6. 【MySQL】数据库索引原理 | 索引数据结构 | B+Tree
  7. 微信小程序:修复采集接口版云开发表情包
  8. C语言FILE文件详细操作
  9. 神经网络 和 NLP —— 神经网络入门
  10. css 多层ul li,css中的ul li ul li ul li ul li 实现四级菜单