处理器管理与进程管理
1.用图文描述组成进程的要素,并说明其作用。
一、进程概念
引子 程序运行在并发环境中的问题
(1)运行过程不确定
(2)结果不可再现
1.进程定义
进程是程序在某个数据集合上的一次运行活动。数据集合是指软硬件环境,多个进程共存或共享的环境。
2.进程的特征
(1)动态性
进程是程序的一次执行过程,动态产生且动态消亡;
(2)并发性
进程同其他进程一起向前推进;
(3)异步性
进程按照各自的速度向前推进(每一个进程按照自定逻辑,不考虑其他进程的运行,各自占用CPU);
(4)独立性
进程是系统分配资源和调度CPU的单位(但是有了线程后,操作系统调度CPU的单位就变成了线程)。
3.进程与程序的区别
(1)进程是动态的:程序的一次执行过程;
(2)程序是静态的:一组指令的有序集合;
(3)进程是暂存的:在内存中短期驻留;
(4)程序是长存的:可以在存储介质上长期保存;
(5)一个程序可能有多个进程。
4.进程的分类
(1)按照使用资源的权限进行分类
①系统进程:系统内核相关的进程;
②用户进程:运行于用户态的进程。
(2)按照对CPU的依赖性进行分类
①CPU型进程:主要用于计算;
②I/O型进程:主要用于I/O操作。
二、进程状态
1.进程的状态
(1)运行状态(Running)
进程已经占用CPU,在CPU上运行。
(2)就绪状态(Ready)
具备运行条件但是由于没有CPU可用,所以暂时不能运行。
(3)阻塞状态(Block)也叫等待状态(Wait)
由于等待某项服务完成或者等待某个信号而不能运行的状态,比如等待系统调用,I/O操作等等。
2.进程的三态模型
(1)就绪->运行:进程调度。
(2)运行->就绪:时间片到或者被强占。
(3)运行->阻塞:请求服务后等待响应,或者等待某个信号的到来。
(4)阻塞->就绪:请求的服务已经完成,或者等待的信号已经到来。
3.进程的五态模型
(1)新建状态
用户向系统提交程序后,在进程建立之前的过程。
(2)终止状态
进程撤出系统的过程.
2.用图文描述什么是进程切换,为什么进行进程切换,进程切换的步骤?
进程的切换
为了控制进程的执行,内核必须有能力挂起正在CPU执行的进程,恢复以前挂起的进程执行。
所有进程共享CPU寄存器,进程恢复时必须装入寄存器的一组数据(硬件上下文TSS)。在进程切换时,首先要保存挂起进程的硬件
上下文,同时要装载唤醒进程的硬件上下文。这块linux实现的是使用软件执行进程切换。这样可以通过move指令检查装入寄存器值的合法性。
进程的上下文
Context,指进程运行环境,CPU环境(比如各个寄存器的取值)等等。进程的上下文由三部分组成:用户级上下文(程序、数据、共享
存储区、用户栈,它们占用进程的虚拟地址空间)、寄存器上下文(由各个寄存器组成)、系统级上下文(PCB、核心栈等)。
进程切换的工作过程
1、(中断/异常等触发)正向模式切换并压入PSW/PC 。 (Program Status Word 程序状态字。program counter 程序计数器。指向下一条要执行的指令)
2、保存被中断进程的现场信息。
3、处理具体中断、异常。
4、把被中断进程的系统堆栈指针SP值保存到PCB。(Stack Pointer 栈指针。Process Control Block 进程控制块。)
5、调整被中断进程的PCB信息,如进程状态)。
6、把被中断进程的PCB加入相关队列。
7、选择下一个占用CPU运行的进程。
8、修改被选中进程的PCB信息,如进程状态。
9、设置被选中进程的地址空间,恢复存储管理信息。
10、恢复被选中进程的SP值到处理器寄存器SP。
11、恢复被选中进程的现场信息进入处理器。
12、(中断返回指令触发)逆向模式转换并弹出PSW/PC。
3.用图文描述模式转换、进程切换、进程状态转换三者之间的关系?
◆运行状态(TASK_RUNNING)
指正在被CPU运行或者就绪的状态。这样的进程被成为runnning进程。运行态的进程可以分为3种情况:内核运行态、用户运行态、就绪态。
◆可中断睡眠状态(TASK_INTERRUPTIBLE)
处于等待状态中的进程,一旦被该进程等待的资源被释放,那么该进程就会进入运行状态。
◆不可中断睡眠状态(TASK_UNINTERRUPTIBLE)
该状态的进程只能用wake_up()函数唤醒。
◆暂停状态(TASK_STOPPED)
当进程收到信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时就会进入暂停状态。可向其发送SIGCONT信号让进程转换到可运行状态。
◆僵死状态(TASK_ZOMBIE)
当进程已经终止运行,但是父进程还没有询问其状态的情况。
4.python练习:
(1)观察父进程、子进程
import time for i in range(5): print(i) time.sleep(3)
(2)观察进程运行状态
import psutil import os os.getpid() psutil.Process(5160)
(3)输入多个作业的作业编号,到达时间,所需CPU时间,形成列表,以备算法使用
jobs=[] for i in range(3): job=input('请输入作业编号,到达时间,所需CPU时间:') jobs.append(job) for i in range(len(jobs)): print(jobs[i])