导图社区 进程管理
进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程;进程是操作系统处于执行状态程序的抽象,程序=文件(静态)。
编辑于2023-08-26 20:54:20 山西进程管理
进程的概念与特征
进程的定义
进程是程序的一次执行
程序的定义:程序是存储在磁盘上的可执行程序,本质是链接好的指令流及其需要的数据。
进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程,
进程是运行中的程序
由上下文信息和程序执行的地址空间可以还原进程,因此进程是程序运行状态的集合
进程包含了正在运行的一个程序的所有状态信息(代码、数据、状态寄存器、通用寄存器组、经常占有系统资源
进程是操作系统处于执行状态程序的抽象,程序=文件(静态)
进程执行需要的资源:内存(保存数据和代码)CPU(执行指令)
进程地址空间
进程可以访问的虚拟内存地址范围以及其映射方式称为进程的地址空间
进程虚拟空间同样属于进程上下文的一部分
进程控制块
进程的抽象PCB
PCB是进程存在的唯一标志
进程控制块的组织
链表
同一状态的进程其PCB成一个链表,多个状态对应不同的链表
如:就绪列表、阻塞列表
索引表
同一状态的进程归入一个索引表,各状态的进行形成不同的索引表:就绪索引表,阻塞索引表
进程的特征
动态性
并发性
独立性
独立运行,独立获得资源,独立接受调度
异步性
相互制约,会导致执行结果的不可再现性
进程的状态与切换
5状态进程模型
创建态
分配内存
退出态
进程运行终止后,os会回收资源和PCB
几种情况:正常退出,错误退出(自愿),致命错误(强制退出)被其他系统或进程杀死
就绪态
获得CPU就可以运行
阻塞态
等待除CPU外的其他资源
信号量小于等于0执行P操作
发起IO请求
对管程中的条件变量执行wait()操作
试图创建进程却无法申请到足够的资源
运行态
进程状态转换
创建成功即进入就绪态
发生创建的几种情况
就绪——运行
调度
进入阻塞的情况
只能由运行到阻塞
运行——就绪
高优先级抢占CPU
时间片用完
阻塞到就绪
资源得到满足或者被阻塞进程等待的事件发生
进程只能被别的进程或os唤醒
挂起与激活
计算机中的内存空间是有限的,把进程换回外存叫挂起
不仅让出CPU还让出内存
从外存放回内存叫激活
进程调度
进程切换
进程创建
创建
申请pid和空白PCB
系统中可以容纳的进程数有限
申请进程需要的其他资源
其他资源包括内存文件IO设备和CPU时间
⚠️当前没有足够的资源也不会认为创建失败,只会阻塞创建该进程的进程(A创建进程B,阻塞的是A)
初始化PCB
将新进程PCB加入就绪队列
若无法插入就绪队列,则阻塞父进程
终止
归还进程全部资源,将该进程PCB删除
阻塞
唤醒
父子进程
父进程和子进程共享部分全局变量
不共享地址空间
线程
多线程解决思路
实体间可以并发执行
实体之间共享相同的地址空间
概念
进程的一部分,描述指令流执行状态,是进程中的指令执行流的最小单位,是CPU调度的基本单元
进程与线程的区别
用户级线程
由一组用户级的线程库函数来完成线程的管理,包括线程的创建,终止,同步,调度
内核不了解
可用于不支持线程的多进程操作系统
每个进程有私有的的线程控制块TCB
TCB由线程库函数维护
不足
线程发起系统调用阻塞时,整个进程都阻塞
不支持基于线程的处理机抢占
只能按进程分配CPU时间
多个线程进程中,每个线程的时间片较少
内核级线程
内核管理
特点
由内核维护PCB和TCB
线程执行系统调用而被阻塞而不影响其他线程
线程的创建、终止、切换相对较大
多线程的进程可以获得更多CPU时间
多线程模型
多对一模型
一个内核线程管理同一进程的所有线程
类似用户级线程
一对一
一个用户线程对应一个内核线程
多对多
进程间通信
含义
一个进程使用另一个进程提供的数据
不同的进程有内存隔离
而一个进程中的不同线程没有内存隔离,共享地址空间
三种方式
共享存储
建立过程
进程A通过系统调用创建一块共享内存
进程AB分别通过系统调用将建立好的共享内存链接进自己的用户地址空间
释放
进程取消和共享内存关联时,共享内存不会被释放,只有操作系统收到释放共享内存的系统调用才会释放共享内存
共享内存访问方式
用户进程访问共享内存时使用虚拟内存机制直接访问,不一定需要切换特权级
Q:为什么不一定?
消息传递
内核缓冲区
由于各个进程都有内核区域的同映射,因此可以利用内核空间作为中介来允许多个进程共同访问,通常我们在内核中构建一个多进程均可读写的数组作为内核缓冲区
直接通信方式
send(P2,msg1),receive(P1)
间接通信方式
类似邮箱
多个内核缓冲区
send(mailbox,P2,msg1),receive(mailbox,P2)
管道
管道存放数据依靠内核空间中的环形缓冲区
特点
管道中每个数据只可以读一次就会失效
管道是环形的数据缓冲区
管道中只能读当前读指针指向的数据,只能在当前写指针指向的区域写入
读空管道,进程阻塞,写满管道,进程阻塞
实现方式
环形数组
数据读完就会失效
循环队列
管道的本质不是文件,只是复用了文件的接口
管道的读写权限
进程对管道的访问权限有读和写两种
通信方式
管道是半双工通信
管道的继承
管道只能在父子进程之间继承,且继承对管道的访问权限
管道的引用次数
当前有几个进程拥有这个进程的读权限&写权限
管道的释放
当读端和写端关闭,管道就释放
Q:为什么当前无readable的进程,就直接关闭读端而不考虑后续可能存在的需要读管道的进程?
A:读权限与继承有关
匿名管道和命名管道
匿名:前面介绍的都是
命名管道:无血缘关系进程之间传递信息
调度
调度的概念
作业:用户以作业为单位提交任务,操作系统通过作业控制块来管理作业
作业调度产生进程PCB
作业调度:高级调度
外存掉入内存,创建进程,分配资源
中级调度:内存调度
作业调度与中级调度的区别:作业调度是第一次为作业分配内存和其他资源,中级调度只会引发进程状态的改变(挂起与非挂起)
挂起
可能引发PCB中状态变化
处理机调度
通过调度算法从就绪队列中选一个进程执行
当就绪进程为空,则闲逛进程
作用:防止CPU空转,通常只有一条指令,用来减少CPU损耗,优先级最低,只运行在内核态,不需要PCB,只需要CPU
处理机调度
抢占式
实时性强,频繁调度
实现方式:在当前进程需要被调度时,设置需要调度标识(need_resched=1),在某个时机(如中断返回)时进行进程调度并切换
不能调度的情况:
当前进程处于中断处理过程中
进程在操作系统内核临界区
屏蔽中断中
非抢占式
调度参数
调度算法
先来先服务
优先级调度
静态优先级
动态优先级
在执行过程中动态优先级会改变
常见优先级比较
计算密集型<IO密集型
后台<前台
需要交互
用户进程<系统进程
不绝对:闲逛进程
分为抢占式和非抢占式
短进程优先
非抢占式算法
最有最优平均周转时间
缺点:可能导致饥饿,连续的短进程流会使长进程无法获得CPU资源
最高响应比优先
响应比:(等待时间+计算时间)/计算时间
典型的动态优先级
时间片轮转
算法思路:时间片结束时按先来先服务切换到下一个就绪进程
多级队列调度
就绪队列被分为多个独立的子队列
多级反馈队列算法
进程可以在不同队列间移动
总结
时钟中断
系统时钟发起的中断,是进程感知时间的基本方式,时钟的时间间隔数是操作系统内部的基本时间单位
任何与时钟有关的算法都需要时钟中断的辅助。如时间片轮转
同步与互斥
同步互斥的基本概念
临界资源
临界区
访问共用资源的程序片段
原子操作
不会被线程调度机制打断的操作
锁
保证线程继续运行的一种机制,只有第一个申请到锁的进程才能继续运行
锁的本质是由一位内存,一个阻塞队列和申请锁、释放锁的方法组成的数据结构
实现临界区访问的基本方法
临界区
临界区的访问规则
空闲让进
忙则等待
有限等待
让权等待(可选)
不能进入临界区的释放CPU
实现方法
禁用中断
软件方法
更抽象的高级方法
基于软件的同步解决方法
皮特森算法
穷举法
断点分析法
互斥锁
锁
锁是一个抽象的数据结构。
自旋锁
锁在被释放前,一直忙等,锁被释放后获取锁
阻塞锁
锁的实现方式
1.关中断
只对单CPU有效
代价比较大
2.原子操作指令
TS指令
交换指令
总结
信号量
用信号量表示系统资源的数量,信号量是一种抽象数据类型,由一个整形变量sem和两个原子操作组成
P()sem-1
sem<0,进行阻塞队列
P操作可能会阻塞
V()sem+1
sem<=0,唤醒一个进程
管程
定义
管程是一种用于多线程互斥访问共享资源的程序结构
采用面向对象的方法
任一时刻最多有一个线程执行管程代码
正在管程中的线程可以临时放弃管程的互斥访问,等待事件出现时恢复
管程的使用
在对象/模块中收集相关共享数据
定义访问共享数据的方法
组成
锁
控制管程代码的互斥访问
0或多个条件变量
wait()
将自己阻塞在等待队列中
signal()
与信号量区别
管程思路是阻塞条件,信号量是资源
信号量的应用
信号量天然满足死锁产生的前三个条件,只需要满足循环等待就会死锁
生产者消费者
生产者
放入产品需要申请访问缓冲区的互斥资源,和一个缓冲区的空位
消费者
取走产品。申请访问缓冲区的互斥资源和产品资源
读者写者问题
同类不竞争资源,配套计数器实现
读者进程
一个读者读其他也可以读
写者进程
写者进程写的时候,别的不能写,也不能读
读者写者问题进阶
哲学家就餐问题
死锁
利用信号量实现先来先服务
死锁
出现死锁的必要条件
互斥
持有并等待
非抢占
循环等待
破坏条件——死锁的预防
死锁处理方法
死锁的预防
限制申请方式
把互斥的共享资源封装成可同时访问
进程请求资源时要求不持有其他资源
仅允许进程在开始执行时,一次请求所有需要的资源
非抢占改为抢占式
对资源排序,要求进程按顺序请求资源
死锁避免
只允许不会死锁的进程请求资源
安全状态与死锁的关系
银行家算法
死锁检测和解除
死锁检测
死锁检测的时间和周期选择依据
死锁恢复
由应用进程处理死锁