程序段、数据段和PCB
本质:和进程管理有关的都存放在PCB中,程序本身运行所需数据在程序段和数据段中
三种基本状态:运行态、就绪态(万事俱备、只欠CPU)、阻塞态
创建态(新建态)、终止态(结束态)
同一个进程被分为多个线程,增加并发度。
程序执行流的最小单位,轻量级进程
同一进程内的线程切换,不会引起进程切换
不同进程中的线程切换,会引起进程切换
用户级线程:从用户角度可以看到的线程,对操作系统来说用户级线程是透明的
(同理内核级线程)
重点:操作系统只看得见内核级线程,因此只有内核级线程才是处理机分配的单位
重点:操作系统只看得见内核级线程,因此只有内核级线程才是处理机分配的单位
多对一:多个用户级线程映射到一个内核级线程(开销小)(易阻塞)
一对一:一个用户级线程映射到一个内核级线程(并发能力强)(线程管理成本高开销大)
多对多:n映射到m(n大于等于m)(克服上述二者缺点)
同时有很多事情要处理,需要确定某种规则来决定处理任务的顺序
处理机调度:进程数量大于处理机数量,那么从就绪队列中按照一定的算法选择一个进程并将处理机分配给他运行,以实现进程的并发执行
高级调度(作业调度):按照一定的原则从外存上处于后备队列的作业中挑选(一个或多个)作业,为其分配内存资源并建立相应进程(建立PCB)
中级调度(内存调度):决定将哪个处于刮起状态的进程重新调入内存。(引入了虚拟存储技术后,可将暂时不能运行的进程调至外存等待,即调出的进程处于挂起状态)
注意区分广义和狭义上的进程调度
进程切换是有代价的,物极必反,不是越频繁越好,效率降低
CPU利用率
系统吞吐量
周转时间,带权周转时间(必然大于等于1),越小越好
等待时间
即按照到达的先后顺序调度,事实上等待时间越久的越优先得到服务
对于短进程来说体验不好,如奶茶店买奶茶,你买一杯,前面的人买20杯
分为非抢占式短作业优先和抢占式短作业优先
即每次调度时选择当前已到达且运行时间最短的作业/进程
同时考虑了进程的等待时间和要求服务时间
HRRN是非抢占式,只有进程主动放弃CPU时,才需要进行调度
注意:
1.时间片不能太大:如果时间片太大,该算法退化为先来先服务算法,并且会增大进程响应时间
2.时间片太小,进程切换过于频繁,效率低(一般来说,设计时间片要让切换进程的开销占比不超过1%)
对于那些时间片到达但是还没执行完的进程,会进入就绪队列依次排队等待继续执行
当进程执行完但时间片还没用完时,该进程会主动放弃处理机,发生调度
例题:时间片大小为2
分为抢占式优先级调度算法和非抢占式优先级调度算法
就绪队列可能不唯一;优先级可分为静态(创建进程时确定,之后不变)和动态(有初始值,并后来不断调整)
进程同步:要让各并发进程按要求有序地推进(因为进程的异步性导致两个进程交替推进的次序是不确定的)
个人理解:为了解决进程并发运行带来的异步问题,为了实现某些应用需求,必须协调某些进程的工作次序
举例:
要实现女一号和女二号想法的需求,则必须有指令先后顺序的需求,才能实现想法
第二个想访问临界资源的进程必须等第一个访问临界资源的进程结束并释放该资源后,第二个进程才可以访问
进入(上锁),访问,退出(解锁),其他操作
解决进程互斥,进程同步的问题
分为整型信号量和记录型信号量
信号量:一个变量,表示系统中某种资源的数量
原语:此处的wait(s)申请资源可记为P(s) 和 signal(s)可记为V(s)释放资源原语用于操作信号量
wait(s) signal(s)相当于两个函数,s相当于参数,通过s加一或减一的结果,记录系统中某个可用资源(如打印机的数量),如果没有可用的则进程进入等待队列
mutex, mutex1, mutex2相当于自己设的3个信号量(变量),如记录打印机,摄像头等资源
进程互斥的信号量可以设初值为1(即临界资源只可同时给1个进程使用)
信号量实现进程同步(信号量初始值设为0)
下图中右侧文字的两种情况都可以实现预期功能(即代码4一定在代码2后执行)
信号量机制实现前驱关系(复杂的同步关系)
多类生产者生产的产品和消费者消费的产品,而不是多个
例子:
儿子或女儿会触发一个事件(使盘子为空),才允许父亲或母亲向盘子里放水果
写进程和任何其他进程(包括读进程和写进程)都互斥两个读进程可以
读写一起:可能读进程读到的并不是自己想读的进程(而是写进程新写的进程)
两个写:数据覆盖
rw:read 和 write
多个读进程读的时候,第一个读进程要进行加锁操作(防止写进程干扰),之后的读进程则直接读即可(不用再加锁),读工作结束后最后一个读进程要执行解锁操作
每个哲学家进程需要同时持有两个临界资源(左右两边的筷子),才能开始吃饭
是用来实现进程的互斥和同步的
为了避免因为使用信号量机制编写程序困难易出错的问题(不用再关注复杂的PV操作),而引入了管程——一种高级同步机制
编译器负责互斥的进入管程中的过程(即相当于调用类中的各个操作缓冲区产品的函数)如下图中的insert和remove函数
1.破坏互斥条件(很多时候无法使用此方法)(SPOOLING技术)
2.
3.
4.破坏循环等待条件
最大需求,已分配,最多还需要
(可以逐个进程分配资源,只要不死锁即可)
死锁检测算法:依次消除与不阻塞进程相连的边,直到无边可消
绿色边表示之前已经分配出去的,此时再看剩下的资源还是否满足蓝色边的申请。
如果某一个进程P1或P2已经执行完,则可以将与该节点相连的所有边都划掉