进程
文章来源:(16条消息) 进程|操作系统_资资的博客-CSDN博客
一、进程的概念
1.1进程的定义
程序:指令序列
进程:程序段、数据段、PCB三部分组成了进程实体(进程映像)。
PCB是进程存在的唯一标志。
进程的定义:
- 进程是程序的一次动态执行。
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
- 进程是具有独立功能的程序在其数据集合上运行的过程,他是系统调度和资源分配的一个独立单位。
1.2进程组成
1.3进程的组织
进程组织方式 | 描述 |
---|---|
链式方式 | 按照进程的状态将PCB分为多个队列,操作系统持有指向各个队列的指针 |
索引方式 | 根据进程的状态不同,建立几张索引表,操作系统持有指向各个索引表的指针 |
1.4进程的特征
- 动态性
- 并发性
- 独立性
- 异步性
二.进程的状态和转换
2.1三种基本状态
状态 | 概念 |
---|---|
就绪 | 已经具备运行条件,但是由于没有空闲CPU,而暂时不能运行 |
运行 | 占有CPU,正在CPU上运行 |
阻塞 | 等待某一事件的发生,暂时不能运行 |
2.2另外两种状态
1)创建状态
2)结束状态
状态 | 概念 |
---|---|
创建 | 进程正在被创建,操作系统为进程分配资源,初始化PCB |
结束 | 进程正在从系统中撤销,操作系统会回收进程拥有的资源,撤销PCB |
2.3进程状态的转换
运行->阻塞:一种进程自身做出的主动行为(进程用“系统调用”的方式申请某种系统资源,或者请求等待某个事件的发生)
阻塞->就绪:不是进程自身能控制的,是一种被动行为
三、进程控制
进程控制的主要功能就是对系统中的所有进程实施有效的管理,它具有创建进程、撤销已有进程、实现进程状态转换的功能。
3.1用原语实现进程控制
原语:执行期间不允许中断,只能一气呵成
(原语采用“关中断”和“开中断指令”实现)
关中断和开中断的权限非常大,只允许在核心态下执行的特权指令
进程控制相关的原语
- 更新PCB中的信息
- 所有的进程控制原语都一定会修改进程状态标志
- 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
- 某进程开始运行前必然要恢复其运行环境
- 将PCB插入合适队列
- 分配/回收资源
四、进程通信
进程通信:进程之间信息交换
进程是分配系统资源的单位,因此各个进程拥有的地址空间相互独立
4.1共享存储
两个进程对共享空间的访问必须是互斥的(互斥通过操作系统提供的工具实现(P、V))。
操作系统负责提供共享空间和同步互斥工具。
-
1)基于数据结构的共享
低级通信 -
2)基于存储区的共享
高级通信
4.2消息传递
格式化消息
消息头 | 消息体 |
---|---|
发送进程 ID、接收进程 ID、消息类型、消息长度等格式化信息 | 消息内容 |
进程间交换的数据以格式化消息(Message)为单位。进程通过操作系统提供的“发送消息原语/接收进程原语”两个原语进行数据交换。
-
1)直接通信方式
消息直接挂到接收进程的消息缓冲队列上。 -
2)间接通信方式
消息要先发送到中间的实体(信箱)。
4.3.管道通信
“管道”是指用于连接读写进程的一个共享文件,又名pipe文件。它其实就是在内存中开辟一个固定大小的缓冲区。
管道只能采用“半双工通信”,某一时间段内只能实现单向传输。如果需要实现双向同时通信,则需要设置两个管道。
各个进程要互斥的访问管道。
数据以字符流的形式写入管道,当管道写满时,写进程的write()被阻塞。
如果没有写满,不允许读;如果没读空,就不允许写。
读进程只能有一个
五、线程概念
5.1为什么要引入线程
有的进程可能需要“同时”做很多事情,而传统的进程只能串行地执行一系列程序。为此,引入“线程”来增加并发度。
传统进程 | 引入线程 |
---|---|
进程是程序执行流的最小单位 | 线程是程序执行流的最小单位 |
只能进程间并发 | 线程间也能并发 |
进程并发,需要切换进程的运行环境,系统开销很大 | 如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小 |
5.2.线程的CPU
- 线程是处理机调度的单位
- 多CPU计算机中,各个线程可占用不同的CPU
- 线程也有三种基本状态
- 同一进程的不同线程共享进程的资源
- 同一进程的线程通信无需操作系统的干预,由于共享内存地址空间
- 同一进程中的线程切换,不会引起进程切换
- 不同进程中的线程切换,会引起进程切换
- 切换同一进程中的线程,系统开销小
- 切换进程,系统开销较大
5.3线程的实现方式
- 1)用户级线程(User-Level Thread)
用户级线程由应用程序通过线程实现,所有的线程管理工作都有应用程序负责。
用户及线程中,线程的切换可以在用户态下完成,无需操作系统干预。
在用户看来,是有多个线程,但是在操作系统内核看来,并意识不到线程的存在,调度还是以进程为单位。
-
2)内核级线程(Kernel-Level Thread KLT)
内核线程的管理工作由操作系统完成,线程调度、线程切换等工作也是由内核负责,因此内核级线程的切换必须要在核心态下才能完成。 -
3)两者组合的方式
操作系统只能感知内核级线程,因此只有内核级线程才是处理机分配的单位。 -
4)多线程模型
多对一
多个用户级线程映射到一个内核级线程,每个用户进程只对应一个内核级线程。
优点 | 缺点 |
---|---|
用户级线程的切换在用户空间即可以完成,不需要切换到核心态,线程管理的系统开销小,效率高 | 当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高,多个线程不能再多核处理机上并发执行 |
一对一 | |
一个用户级线程映射到一个内核级线程,每个用户进程有与用户级线程同样数量的内核级线程。 |
优点 | 缺点 |
---|---|
当一个线程被阻塞后,别的线程还可以继续执行,并发能力强,多线程可在多核处理机上并行执行 | 一个用户进程会占多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理成本高,开销大 |
多对多 |
六、处理机调度
6.1调度基本概念
在多道程序系统中,进程的数量往往是多于处理机的个数的,这样不可能同时并行的处理各个进程。
处理机调度:从就绪队列中按照一定的算法选择一个进程,将处理机分配给他运行,以实现进程的并发执行
6.2调度的三个层次
1)高级调度(作业调度)
高级调度(作业调度)是按一定原则从外存上处于后备队列中的作业中选择一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),使他们获得竞争处理机的权力。
2)中级调度(内存调度)
引入了虚拟存储技术后,可将暂时不能用的进程调至外存等待,等他重新具备了运行条件且内存又稍微有空时,再重新调入内存。
暂时调到外存等待的进程状态为挂起状态,PCB并不会一起调到外存(操作系统还需要管理),而是会常驻内存,PCB会记录进程数据在外存中存放的位置,进程状态等信息。
操作系统通过内存中的PCB来保持对各个进程的监控、管理。被挂起进程的PCB会被放到挂起队列中。
中级调度(内存调度):就是要决定哪个处于挂起状态的进程要重新调入内存。
一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。
3)低级调度(进程调度)
低级调度(进程调度),其主要任务就是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给他。
进程调度是操作系统中的一种最基本的调度,在一般的操作系统中都必须配置进程调度。
七、调度算法评价指标
-CPU利用率(忙碌的时间/总时间)
系统吞吐量(单位时间内完成的作业,总共完成作业/总共花销时间)
周转时间(作业被提交给系统开始,到作业完成为止这段时间的间隔)
在后备队列的等待时间+在就绪队列的等待进程调度时间+CPU执行时间+等待I/O操作完成的时间
周转时间=作业完成时间-作业提交时间
带权周转时间=作业周转时间/作业实际运行时间
响应时间:用户提交请求到首次产生响应所用的时间
调度算法
1.先来先服务
算法 特点
先来先服务 对长作业有利,对短作业没利
考虑的是等待时间,等待时间越久优先级越高。
2.短作业优先
算法 特点
短作业优先 对长作业没利,对短作业有利,可能产生饥饿现象
要求服务的时间越短,优先级越高
每次调度时选择当前已经到达,且运行时间最短的作业/进程
3.高响应比优先
上述两种算法的权衡折中
4.时间片轮转
时间片太大 时间片太小
沦为FCFS,响应时间过长 频繁的切换开销太大