OS进程管理
进程与线程
- 基本概念
- 进程控制
- 进程通信
基本概念
这一章没什么算的全是概念
试着通过回答三个问题来试着去解释我对进程的理解
- 为什么要引入进程?
- 什么是进程?进程由什么组成?
- 进程是如何解决问题的?
为什么要引入进程?
我的理解是随着os的发展,在多道程序环境下,要求多个程序能够并发执行,就是我打字的时候还想着要听音乐.而要使得各个程序能够并发执行,必须对其规范化管理调度,这样子才能够合理分配资源.
进程就是为了单位化程序,方便os管理并分配资源的.而单位化管理分配资源是为了能够并发执行程序/作业.
所以进程诞生就是为了并发,那么进程下的线程诞生自然也是为了更好的并发.
ps:
这里还要提一下.并发与共享是分不开的.并发执行离不开共享的支持.并发和共享是现代操作系统最基本的两个属性.而这两个属性是相辅相成的,互为彼此存在的条件.
### 并发
并发是指进程可以在某一时间段一同运行.宏观上看是两个程序同时运行.微观上同一时刻是只有一个程序在运行的.
并行是同一时刻有多个程序运行,一般指的是多处理器
### 共享
并发的执行牵扯到对资源的共享使用.这里的资源包括互斥共享和非互斥资源
互斥共享为打印机等非互斥为磁盘也就是可以"同时"访问
共享是为并发创造条件的
单道os既没有并发也自然没有共享
### 虚拟技术
虚拟技术总结起来: 时分复用和空分复用
时分复用指的是处理器并发处理进程,空分复用指的是虚拟内存.
### 异步
其实我对异步了解的还是不够深刻,只知道在做题时,遇到等待I/O设备时异步等待就可以节省出处理机资源
以上为操作系统四大特效,实际为第一章内容,但我写的时候发现并没有很熟练,因此进行总结.四大特性为1.并发,2.共享,3.虚拟,4.异步
其实第一章最根本的就是介绍这四点操作系统特性.而后续的操作系统课程都是围绕这四点最基本的特性展开.
什么是进程?进程由什么组成?
啊这,难倒我了?不可能
进程是作业运行的一种状态.实际上进程强调的是其动态性.
在操作系统的并发概念中.进程是中级调度的范围.是从静态的作业转移到实际运行态的实体.进程是os分配资源的最小,最基本单位.这一定义即便存在线程也是如此.
操作系统分配资源时只会向进程分配资源.进程是其分配资源的最小单位.
这里容易迷惑的一点,既然进程是动态的一个概念,操作系统又要向进程分配资源,分配资源必须要一个实体,那么这个实体又是什么呢?
答案是进程映像,也就是PCB.
操作系统眼中应该是看不到进程的,进程只是一个运行过程.操作系统只能看到PCB,向PCB分配资源,操作系统只能通过管理PCB来管理进程.
那么进程是由什么组成呢?
进程来源于作业,上了计算机以后,一定会被转换成三部分:数据段,程序段和PCB.
其中PCB和程序段都在栈中,而数据段肯定是在堆中的,这没有疑问.
什么是线程?线程由什么组成?
线程是轻量化的进程.是为了增加进程内部的并发性而实现的技术.
线程只是处理机调度分配的基本单位,但是资源分配的基本单位还是进程!
进程内部的线程之间通信,共享资源,并发度非常高.不需要os出来切换.但是进程之间的线程调度通信同样耗费资源,需要先调度他们的爸爸也就是进程,才能继续调度他们.
所以线程应该是通过减少进程内部线程切换的开销来增加进程内部的并发性.反应到整体就是增加了整体的并发性.
那为什么线程之间的调度,创建与撤销代价小呢?就是因为线程只是处理机的资源分配单位,使用的是进程的资源包括空间分配等其他资源.所以其调度不牵扯到其他资源的调度,只有处理机的调度分配.所以代价小!
关于线程的组成.线程和进程一样也有一个用于管理的实体,TCB.
线程更复杂的一点是要区分出内核线程和用户线程.
内核线程在我的理解来看基本可以做到和进程一样,管理切换其他用户线程.可以说是变成三级结构:进程--内核线程--用户线程.
在这里有一个知识点就是一个线程阻塞是否会导致这个进程下面其他线程阻塞?
这个考察的就是内核线程的组织方式.
也就是线程的实现方式和线程管理:
用户级线程由用户创建并管理,内核无法意识到其存在.比如写的游戏中的while主循环下面会有很多敌人和主角并发行动的判断和执行.这就是用户线程
当然也可以通过线程库来设计实现多线程
而内核级线程,线程的管理工作不再由用户操作而是通过os管理.
一般考察的实际上就是内核进程和用户进程的组合方式
也就是多线程模型
一对一,多对一和多对多
一般选择多对多.这样子一个线程阻塞不会让其他线程都阻塞掉.
还是要再看一下这一课的内容,关于内核线程和用户线程
我记得当时记的是内核线程实际上才是处理机分配单位.****
进程是如何解决问题的?
实际上就是运行五态
进程状态的转换,进程管理,进程通信这三个问题
进程调度与进程切换
进程调度,我们通常讲,进程调度算法,是一种决策行为,决定为哪个进程分配资源/处理机.
而进程切换是实际执行行为.将1.进程运行状态保存(保存处理机上下文,包括寄存器信息和程序计数器).2.更新PCB状态信息.3.转入相应的状态队列.4.执行另一个进程,更新其PCB数据.5.更新内存管理结构(?)这里是什么意思?6.恢复处理机上下文.
阻塞态与就绪态
阻塞态和就绪态都是在等待资源,为什么两个的状态名不一样呢?
王道书上将阻塞态也叫做等待态.是因为阻塞态的时间远远大于就绪态
就绪态等待的只是处理机,而处理机资源分配是以时间片也就是毫秒为单位.能够并发执行.其状态转换非常的频繁.
另外,进程由运行态切换到阻塞态是主动的.是主动的调用Block原语将自己阻塞.
而进程从运行态到就绪态是被动的,时间片剥夺将程序转换为了就绪态.
进程通信
1.共享存储,这个是为了后面使用PV操作埋下的伏笔.PV操作本身是一种低级通信.
2.消息传递,主要是为了引出间接通信方式,中间放一个邮箱进行通信.
3.管道通信:半双工,一方写,另一方读.只有先把管道写满,才允许另一方读.在管道还有数据时不允许写.
处理机调度
- 为什么需要处理机调度
- 有哪些调度算法?
1.为了提高处理机资源的利用率.提高算力利用率
2.非抢占式:先来先服务,静态优先级,短进程优先,高响应比优先,
抢占式:多级队列调度,动态优先级,时间片
大面上考虑1.公平,2.效率
效率指的不是运行时间,不管使用什么算法,程序的运行时间总数不变.变的是周转时间.
打个比方,就像是奶茶店买奶茶在你前面的人买了十几杯奶茶,这时候后面的所有人体验都不好.因为大家突然要等特别长时间
这时候讲究效率就让长进程等等,先服务短进程再服务长进程
将就公平那就还让长进程运行
公平指的是不会让进程饥饿
效率为的是降低平均周转时间
周转时间=作业完成时间-作业到达时间.
平均周转时间,为周转时间/n.
带权周转时间=周转时间/运行时间>1
关于优先级算法,主要讲一下优先级
1.系统进程>用户进程
2.交互式>非交互式---前台进程优先于后台
3.I/O型>计算型进程--先让I/O跑,可以并行执行计算型.
高响应比优先算法
第一个融合怪,是对先来先服务和短进程优先以及优先级算法的融合.
主要是解决了短进程优先算法的饥饿问题
响应比=(等待时间+要求服务时间)/要求服务时间
等的时间越长,优先级越高
时间片算法
时间片算法牵扯到的主要是对时间片大小的选择
时间片太大---FCFS
时间片太小--进程切换太频繁,开销过大.
多级反馈队列
每级队列采用的算法都不一样
前面的队列空了才调用后面的队列.前面的队列分配的时间片小一些.后面的越来越大
注意在计算周转时间时,调用开销也要算进等待时间里
进程同步与互斥
进程同步是由进程异步带来的.在异步前提下,吃饭和拉屎两个进程并发执行.谁先谁后就是进程同步问题.进程同步就是制约进程发生顺序.必须先吃饭才有屎拉.所以只有吃完饭以后,进程才会使用v原语使得拉屎进程的p才能得到继续往下执行
进程互斥,是指访问临界资源时,只能一个访问,一个访问时,就需要设置pv原语阻止其他人访问.
三个必要条件,加上第四条是希望执行的条件
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待
其中第四条我们很希望达到,但很多算法都达不到.是一种理想情况
在介绍PV之前,我们介绍的软硬件方法来实现临界区互斥,但是都实现不了让权等待
软件实现上:
- 单标志法: 身份令牌进厕所.第一个用过之后,将厕所改为只允许第二个人进.这时候第二个可以进了,但是第二个不想上厕所,这时候第一个还想进,就进不了了.违背了空闲让进.也就是第二个人不用没有把令牌钥匙再交还
- 双标志先检查法:在于进入区的检查和上锁动作不能同时完成,导致先检查完毕还没来得及上锁就切换到下一个程序,一看也没上锁,两个同事进入临界区.如果能够改进为检查和上锁同事完成则没有问题.
- 双标志后检查法:先上锁后检查.也是不能同时完成.会导致饥饿
- 皮特森算法,在3的基础上有加入了一个谦让动作.谁最后谦让谁就真的谦让了.加入谦让动作避免了饥饿.但同样没有办法实现让权等待
硬件实现
-
中断屏蔽:
关中断
临界区
开中断
和我们一般理解一样不够是从硬件层实现
-
硬件指令方法:TestAndSet
我们之前解释过软件2,3的主要方法是没有办法同时执行上锁和检查
TestAndSet的意思就是检查并且设置.同时执行.
PV信号量
整型信号量--1234
记录型信号量:直接加队列只有纪录性信号量实现了让权等待.
信号量实现,同步,互斥
同步就是先驱执行完然后v,后续上来p.初始为0
互斥就是初始为1,执行p上锁检查,然后退出区执行v
最值得考试的是利用信号量实现前驱关系
每一对前驱关系(每一个剪头)都对应一个信号量.分别去执行同步关系组设置.
管程
没啥说的就是一个封装
p对应wait,v对应signal
经典问题
- 生产者-消费者问题
- 读者-写着问题
- 哲学家金灿问题
- 吸烟者问题
实际就是综合考虑同步与互斥问题
生产在前消费在后.盘子为临界资源,访问之前应做检查
整理出互斥和同步关系之后再进行
需要等待后续习题练习
死锁
死锁是两个以上同是持有对方需要的资源而等待发生的饥饿现象
死锁产生的必要条件
- 互斥
- 不波多条件
- 请求并保持条件
- 循环等待条件
死锁的处理策略
1, 死锁预防
从这四个条件出发破坏死锁先决条件.
其中1是很难破坏的,我们一般只讨论破坏234
2.破坏不剥夺条件,那就剥夺呗,你卡住了就把你给弄出来然后把你自己拿着的先交出来.但这可能导致他之前做的都浪费了.
3.破坏请求并保持条件:一次性全拿走要不然不拿.不能一边拿着一边要更多
4.破坏循环等待条件,设立申请次序.这很机械,很僵硬
死锁避免
也就是使用银行家算法,给出一个安全序列使得系统处于安全状态.
死锁检测和解出
画图,如果图能够完全清掉,则不会死锁.清不掉的就是死锁,那就是这里出现了问题需要干掉.
网友评论