在引入多道程序技术之后,为了方便对各个任务进行管理,引入了进程和进程实体的概念.
进程只是一种概念,是一个程序在处理机上运行是发生的所有活动(动态性).是系统进行资源分配的一个独立单位.
而我们通常所讲的进程是指进程实体.之前的进程是进程实体的运行过程.
每一个进程实体都有其进程控制块PCB,程序段(所要执行的程序代码)和数据段(执行任务需要的变量,运算数据).
操作系统按照进程的状态将PCB分为多个队列,操作系统持有指向各个队列的指针.
执行指针,就绪队列指针,阻塞队列指针
根据进程状态的不同,建立几张索引表,操作系统持有指向各个索引表的指针.
索引表中的表项指向PCB
执行指针,就绪表指针,阻塞表指针
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-448hoApu-1575943302302)(/home/benjamin/.config/Typora/typora-user-images/1574566849150.png)]
进程在创建时是创建态,一经创建立即进入就绪态.当就绪态的线程被分配到了CPU执行时间时,进入运行态,运行态的进程使用完被分配的时间或者CPU被强占后重新变成就绪态.运行态的进程当使用系统调用申请系统资源或者等待某个事件发生时,进入阻塞态,阻塞态的进程在得到资源或者响应的事件发生后会进入就绪态等待分配CPU运行时间.
进程控制就是实现进程状态的转换.
进程控制是通过PCB在就绪队列和阻塞队列中的出队和入队实现的.其中使用原语保证进程控制的原子性.而原语则是采用关中断和开中断两个指令实现的.
进程控制相关的原语都做了3件事情:
进程通信就是进程时间的信息交换.但进程之间的内存空间是相互独立的.进程间通信保证了进程间的安全通信.
操作系统为两个进程分配一片可以共享访问的内存空间,两个进程可以使用这个共享空间进行信息交换.
两个进程对共享空间的访问必须是互斥的.
速度较慢,是一种低级的通信方式
由两个进程决定共享空间中的数据格式,相比之下这种方式速度更快,是一种更高级的通信方式.
在两个进程中开辟一个管道,用于信息的传输.
管道只能由一个进程填满,再由一个进程全部取出.一个管道不能双向通信.(半双工)
各个进程对管道的访问互斥.
进程之间以格式化消息传递信息,进程使用消息的发送和接收原语进行数据交换
发送进程直接将消息挂到接收进程的消息缓冲队列上
消息先发送到中间实体中,消息头中包含了消息的接收进程等等信息.
接收进程会主动在中间实体中查阅信息.
线程是一个基本的CPU执行单元,也是程序执行流的最小单位.
线程间的并发不需要切换进程环境,系统开销小.
线程的特性:
用户级线程:由应用程序通过线程库实现.用户级线程的线程切换可以再用户态下完成,无需操作系统的干预.
内核级线程:线程的管理工作由操作系统内核完成,所以线程的切换都需要在核心态下完成.
也叫作业调度,将作业从外存(磁盘,硬盘,U盘等等)调入内存(内存条)中,显示的应用于早起的批处理程序.
准确的讲:高级调度按照一定原则从后备队列的作业中挑选出一个,为它们分配内存等必要资源,并建立响应的进程(建立PCB),并使它们获得竞争处理机的权利.
作业调入时会建立相应的PCB,作业调出时才会撤销PCB.
虚拟存储技术:将一部分磁盘空间划为交换区,内存中暂时不会用到的数据会移动到这里进行存储,以节省内存空间.
暂时被调到外存中等待的进程状态被称为挂起状态.
中级调度就是决定要将那个处于挂起状态的进程重新调入内存.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H2cYi7gw-1575943302303)(/home/benjamin/.config/Typora/typora-user-images/1574579668356.png)]
低级调度也叫进程调度,是按照某一种策略从就绪队列中选取一个进程,将处理机分配给它.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OFbkaz5j-1575943302304)(/home/benjamin/.config/Typora/typora-user-images/1574579844676.png)]
当前运行的进程主动放弃处理机:进程正常终止,发生异常,主动请求阻塞(等待I/O)
当前运行的进程被动放弃处理机:分配的时间片用完,有更紧急的事情处理(中断),被强占CPU资源
不能进行进程调度的情况:
按照作业到达后背队列的顺序进行执行,不可抢占,不会发生饥饿
优点:公平,实现简单
缺点:对长作业有利,对短作业不利
每次选择作业时,选择当前所有作业中最短的作业执行.当作业时间一致时,先执行早到达的.会导致饥饿
优点:平均等待时间和平均周转时间短
缺点:对短作业有利,对长作业不利,会产生饥饿现象
每次选择作业是计算响应比((等待时间+要求服务时间)/要求服务时间).(响应比<=1)
综合考虑等待时间和运行时间,无明显缺点.不会导致饥饿.
时间片是将CPU每次分配的时间设置为一样的,公平地为每个进程轮流(根据作业到达的顺序)分配时间片.
根据时钟装置发出的时钟中断来进行抢占,所以是抢占式的.
不会导致饥饿.
优点:公平,响应快,适用与分时操作系统
缺点:不区分任务的紧急程度,由于高频度的进程切换会有一定开销.
时间片过短会导致开销过大,时间片过长会导致退化成先来先服务.
按照优先级进行选择
优点:区分任务的紧急成都,适用于实时操作系统
缺点:可能导致饥饿.
设置多级队列,优先级从高到低,时间片从小到大.
新进程直接进入一级队列
分配完时间片进入下一级队列,被处理机抢占的进程重新回到自己所在的队列尾.
当前一级队列为空时,才会为下一级队列中的进程分配时间片.
到最后一级的队列就不会再向下降级了.
优点:公平,可以灵活调整对进程的偏好程度(不降级的设置)
缺点:会造成饥饿
在一个进程访问完临界区后将权限给另一个进程.
当一个进程一直不访问临界区,那么另一个进程也无法访问.违背空闲让进
两个进程都有一个标志位
进入临界区前会先进行标志位检查,然后将另一个进程的标志位改为等待
退出临界区将另一个进程的标志位改为可以访问
进入临界区和对其他进程上锁不是原子操作,所以可能造成多个进程同时进入临界区.违反忙则等待
对标志的自旋检查放在了更改另一个进程标志位之后.
可能两个进程都更改了彼此的标志位,违反了空闲让进和有限等待.
设置一个变量表示那个进程优先进入临界区,在标志位检查之前更改为对方
原语的实现方式
简单高效,但不适合用户进程,内核态不可随意暴露给用户
原子性的进行上锁和检查操作
原子性的交换两个值
逻辑上与TAS指令一样
信号量其实就是一个变量,可以用来表示系统中的某种资源的数量.
使用wait(S)原语减少一个信号量(相当于获取锁),使用signal(S)原语增加一个信号量(解锁).
通常也简称为P(S),V(S)操作
信号量为整型变量
wait(S)操作自旋等待信号量大于0时,信号量-1,退出
signal(S)操作给信号量+1
信号量中除了定义整型信号量值,还定义了等待队列.
wait(S)先设置信号量的值减一,然后判断当前信号量的状态,如果小于零,将当前进程添加到等待队列
signal(S)先设置信号量的值加一,然后判断信号量的值小于等于0,从等待队列中唤醒第一个进程
可以解决让权等待
在临界区前面加上P操作,后面加上V操作.
初始信号量为0,先进行的操作后面进行V操作,后进行的操作之前进行P操作.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IK4trT2I-1575943302305)(/home/benjamin/.config/Typora/typora-user-images/1574586484003.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-88XLaAC0-1575943302305)(/home/benjamin/.config/Typora/typora-user-images/1574591548639.png)]
出现空闲位和生产者放入商品是同步关系 ===> 同步信号量 semaphore empty = n
缓冲区中出现商品与消费者拿出商品是同步关系 ===> 同步信号量 semaphore full = 0
所有进程之间都是互斥关系 ===> 互斥信号量 semaphore mutex = 1
互斥信号量的P操作要在同步信号量的P操作之后进行,防止已经获得了同步锁,但是缓冲区已满或者空,就死锁了.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pvimdsC7-1575943302306)(/home/benjamin/.config/Typora/typora-user-images/1574593201391.png)]
父亲放苹果和女儿吃苹果是同步关系 ===> 同步信号量 semaphore apple = 0
母亲放橘子和儿子吃橘子是同步关系 ===> 同步信号量 semaphore orange = 0
盘子为空和父亲母亲放入水果是同步关系 ===> 同步信号量 semaphore plate = 1(盘子中可以放入的水果数)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B9Y4m604-1575943302307)(/home/benjamin/.config/Typora/typora-user-images/1574593597436.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ZVXs1w4-1575943302308)(/home/benjamin/.config/Typora/typora-user-images/1574593703419.png)]
还是生产者消费者的问题
组合一的数量 ===> 同步信号量 semaphore offer1 = 0
组合二的数量 ===> 同步信号量 semaphore offer2 = 0
组合三的数量 ===> 同步信号量 semaphore offer3 = 0
抽烟是否完成 ===> 同步信号量 semaphore finish = 0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QQ6qvLKK-1575943302313)(/home/benjamin/.config/Typora/typora-user-images/1574595010949.png)]
思路一:只能有4个哲学家同时用餐,总有一个哲学家可以拿到两只筷子
思路二:奇数哲学家先拿左边筷子,偶数哲学家先拿右边筷子,会有一哲学家没有筷子被阻塞
思路三:加锁,同时拿两双筷子