进程管理
进程管理
1.进程的概念与特征
1.为什么引入进程?
为了提高系统的资源利用率,基于多道程序设计技术出现了多道批处理系统。但是由于多道程序环境下,允许程序并发执行,此时程序之间失去封闭性,并且具有间断性和不可再现的特征。程序的运行结果会出现不可预知的结果,所以引进了进程的概念,以便更好的描述和控制进程的并发执行,实现操作系统的并发性和共享性。
2.什么是进程?
为了使参与并发执行的程序能独立运行,因此需要设计一个独立的数据结构,称为进程控制块(PCB),系统通过该数据结构描述进程的基本情况和运行状态,进而管理和控制进程。
进程是程序执行的一个实例,通过PCB描述,是一个包括程序代码、运行过程中的数据以及发生的活动的抽象描述。
PCB是进程存在的唯一标志,其中包括进程PID,上下文环境,进程状态,程序计数器,内存指针等等。
进程是进程实体的运行过程,是系统中进行资源调度和分配的一个基本单位。
3.进程的特征?
动态性:创建、活动、暂停、终止等过程,具有生命周期
并发性:多个进程实体同时存储与内存中,能在一段时间内同时运行
独立性:进程间可以独立运行,独立获得资源和独立接受调度,互不干扰
异步性:进程间的推进顺序是不可预知的,因此必须提供一些保证进程同步的机制
2.进程的状态转换
运行态:进程正在处理机上运行
就绪态:进程已获得除处理机之外的所有资源,一旦得到处理机,即可立即运行
阻塞态:又称等待态,进程正在等待某一事件的完成,如果等待的事件处理完毕或I/O设备空闲,则进入就绪态
创建态:正在创建描述进程的数据结构PCB,包括空间申请,PCB初始化,分配运行所必须的资源等等,尚未转到就绪态。
结束态:也称终止态,进程从系统中消失,可以是正常执行完,结果正确,进程退出;执行完,结果不正确,进程退出;进程执行过程出现不可修复的问题导致进程崩溃退出执行。
3.进程控制
1.进程控制的主要功能
主要是对系统中的所有进程实施有效的管理,创建新进程、撤销已有进程、实现进程状态切换等。
操作系统中,将进程控制用的程序段称为原语,原语的特点就是执行期间不允许中断,它是一个不可分割的基本单位。
2.进程创建
允许一个进程创建一个新进程。创建者称为父进程,被创建的进程称为子进程,子进程可以继承父进程的所拥有的资源
操作系统中,终端用户登录、作业调度、系统提供服务、用户程序的应用请求都会引起进程的创建。
创建新进程的过程如下:
(1)为新进程申请唯一的进程标识符PID,并申请一个空白的PCB,如果PCB申请失败,则会导致创建进程失败。
(2)为进程分配资源,为新进程的程序和数据以及用户栈分配必要的空间(如果资源不足,则不是创建失败,而是进程处于阻塞状态,等待内存资源)
(3)初始化PCB,初始化PCB中的控制信息
(4)若进程就绪队列能够接纳新进程,则会加入就绪队列(用一句话概括就是创建好之后会将PCB加入调度队列)
Linux中的进程创建如下,调用fork系统调用:
详细参 https://blog.csdn.net/qq_38410730/article/details/81193118
#include <stdio.h> #include <sys/types.h> int main(void) { pid_t pid; pid = fork(); if(pid < 0){ ... //打印fork()失败信息 }else if(pid == 0){ ... //子进程代码 }else{ ... //父进程代码 } return 0; }
3.进程终止
引起进程终止的事件:
(1)正常结束,程序执行完毕,任务完成退出运行
(2)异常结束,运行过程中发生了异常事件,比如存储区越界、保护错、非法指令、特权指令错、运行超时、算术运算错、I/O故障等,程序无法继续执行
(3)外界干预,进程应外界请求终止,如操作系统或程序员干预、父进程请求父进程终止
终止的过程如下:
(1)根据终止进程的标识符,检索PCB,读取进程状态
(2)若处于运行态,则立即剥夺处理机,将处理机交给其他进程
(3)若该进程有子孙进程,则终止所有子孙进程
(4)回收该进程的所有资源
(5)将PCB从调度队列中剔除
4.进程的阻塞和唤醒
正在执行的进程,由于期待的某件事没发生,如请求系统资源失败,等待某种I/O的完成,由系统自动执行阻塞原语,使自己由运行态变为阻塞态(自身主动行为)
阻塞原语执行过程如下:
(1)找到相应阻塞态的PCB
(2)如果为运行态,则保护现场,改变PCB中进程状态信息,停止运行
(3)将PCB挂入阻塞队列
如果进程期待的事件发生,唤醒原语执行如下:
(1)阻塞队列中找到相应PCB
(2)从等待队列中剔除,修改状态信息
(3)挂入就绪队列
注:Block阻塞原语和Wakeup原语是一对作用刚好想反的原语,需成对出现,阻塞原语是自我调用实现,而唤醒是别的进程调用实现
5.进程切换
进程的切换过程如下:
(1)保存上下文信息、程序计数器等
(2)更新PCB信息
(3)把PCB移入相应的队列
(4)选择另一个进程执行,更新PCB
(5)更新内存管理的数据结构
(6)恢复处理机上下文
6.进程的组织
进程控制块PCB:
(1)进程PID、用户UID
(2)进程状态
(3)优先级
(4)程序计数器
(5)内存指针
(6)处理机占用时间
(7)信号量使用
(8)资源分配清单
(9)处理机相关信息
进程的组织方式有链接方式和索引方式两种:
链接方式是将PCB根据状态划分,链成一个队列,不同状态对应不同的队列;
索引方式是将同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB,不同的状态对应不同的索引表。
程序段:进程执行的程序代码段
数据段:存储进程对应程序加工处理的原始数据,或者程序执行期间的中间数据或者执行结束的最终结果
7.进程间通信
1.共享存储
进程之间可以直接访问的共享空间,通过对这个共享空间的信息读写实现进程间的信息交换。低级方式是基于数据结构的共享,高级方式是基于存储区的共享。
2.消息传递
进程间的信息交换是以格式化的消息为单位的。通过发送消息和接收消息的两个原语实现数据交换。
直接通信方式
间接通信方式,又称信箱通信方式,通过中间载体信箱实现信息交换
3.管道通信
本质是一种特殊的文件,用于连接读进程和写进程,实现信息通信,又叫pipe文件
面向字符流、半双工通信、不可靠。
为了实现管道机制,实现双方通信,必须有保证互斥、同步、确认对方存在的能力
管道在Linux中是比较频繁的一种进程间通信方式
8.线程和多线程模型
1.为什么引入线程?
引入进程是为了更好的使多道程序并发,提高资源利用率和系统吞吐量;而引入线程的目的则是为了减小程序并发执行时所付出的时间开销,提高操作系统的并发性能。(另一方面,也可以说将并发粒度进一步细化,进程内部也可以通过线程并发执行提高资源利用率和系统吞吐量,比如QQ进程,其中文件传输、发消息、打视频即可通过线程实现)
2.线程和进程的比较
(1)调度:传统的操作系统中,拥有资源和独立调度的基本单位都是进程;引入线程后,线程是调度的基本单位,进程事资源分配的基本单位。同一进程中的线程切换不会引起进程切换
(2)拥有资源:进程是资源分配的基本单位,而线程可以访问其隶属进程的系统资源
(3)并发性:进程并发,线程并发,大大提高了系统的并发性
(4)系统开销:线程切换所付出的代价远远小于进程切换带来的时间开销
(5)地址空间和其他资源(文件描述符):进程地址空间相互独立,同一进程的线程共享进程的资源。
(6)通信方面:进程间通信需要通过其他机制保证,但线程间可以直接通过读写数据段(全局变量)实现通信
3.线程属性
线程ID,不同线程可以执行不同的程序,同一进程中的线程共享进程的资源,线程被处理机独立调度
4.线程的实现方式
用户级线程:所有线程相关的工作都有应用程序实现,内核意识不到线程的存在(线程库)
内核级线程:线程的管理工作由内核完成,应用程序没有线程管理的代码,只有一个到内核级线程的编程接口。
5.多线程模型
有些系统同时支持用户线程和内核线程,因此产生了不同的多线程模型,即实现用户级线程和内核级线程的连接方式:
(1)多对一模式
优点:线程管理在用户空间,效率高
缺点:一个内核线程阻塞会导致整个进程阻塞,多个线程不能并行执行在处理机上
(2)一对一
优点:当一个线程阻塞后允许另一个线程执行,并发能力强
缺点:线程管理在内核,线程调度开销大
(3)多对多
将n个用户级线程映射到m个内核级线程上,要求m<=n
集前面两者之优点,开销小,效率高