(操作系统)二、进程

二、进程

2.1 进程的定义、组成、组织方式

在这里插入图片描述
在这里插入图片描述
进程由程序段,数据段,PCB三组分组成。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 进程是系统进行资源分配和调度的独立单位,体现进程的独立性特征。进程的组成为PCB、程序段、数据段。其中PCB是关键的部分,全名进程控制块Process control block,存放进程的管理者(操作系统)所需的所有数据。PCB是进程存在的唯一标志。
  • 组织形式有链接方式,通过指针根据进程当前所处的状态划分。类似于链表,有表头。分别为执行指针,就绪队列通指针,阻塞队列指针。在就绪队列指针中,通常把优先级别高的进程放在队列的前面,优先执行。索引方式,根据进程当前的状态有三类索引表,执行指针,就绪指针(指向就绪的进程索引表),阻塞指针(指向仍在阻塞状态的进程索引表)。
  • 进程的特征,动态性(最基本的特征,进程是程序的一次执行过程,动态的开始变化和消亡),并发性(上一章讲过,依序顺序执行),独立性(进程是操作系统进行资源分配和调度的独立单位),异步性(各进程按各自独立的不可预知的速度执行,这也导致了结果的不确定性),结构性(顾名思义,进程的结构为PCB,程序段,数据段)。

进程的状态与转换

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 进程的状态:有五种,从创建到终止顺序考虑。创建态(操作系统为进程分配资源,创建PCB),就绪态(资源都分配好了,只差CPU),运行态(资源和CPU都分配好了),阻塞态(资源和CPU都无),终止态(操作系统回收资源,撤销PCB)。
  • 进程间状态的转换:最关键的为就绪态、运行态和阻塞态之间的转换。就绪态转到运行态,需要进程被调度,分配好CPU。运行态到就绪态,因为CPU是时分复用的,当前进程的时间片结束,CPU执行其它进程,或者处理机被抢占。运行态到阻塞态,是进程自己主动的行为,进程用“系统调度”请求某种系统资源,或者请求等待某个事件发生(例如socket通信的recv,当接收到比特后才会返回)。阻塞态到就绪态,是被动行为,不是由进程自身发出的,当需要的资源被分配或者等待的事情发生后,进入就绪态。

进程控制

由原语来实现。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进程控制就是实现进程状态的切换,是通过原语实现的。原语的运行是一气呵成,不会中断的。原语是最接近底层的特殊程序,被频繁调用。原语运行在核心态(开关中断这种非常关键的操作必然运行在核心态)。原语分为多种,创建、终止、阻塞、唤醒、切换。每次都会有找到要进行控制的进程的PCB做操作(创建PCB,存入PC版,更新PCB等)。

进程通信

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进程通信是指各进程之间的信息交换。各进程拥有的内存地址空间相互独立。主要的通信方式有三种:

  • 共享存储,互斥访问,存储区的共享更高级,速度更快。
  • 管道通信,可以理解为借助一个特殊的共享文件(实际为一个缓冲区)做数据传输。不过管道只能实现半双工通信。只有当管道装满后,才能读取,只有被读空后,才可以进行写。读进程最多有一个,不然容易发生错误。
  • 消息传递,结构化,有消息头(发送进程ID,接收进程ID,消息类型,消息长度,怎么感觉有点像UDP报文呢?)和消息体,类似于通信报文。直接通信方式,消息直接挂到接收方的消息队列(大多进程都有待处理的消息队列)。间接(信箱)通信方式,需要发送到中间实体(类似于信箱),由接收进程自己去信箱中读取属于自己的消息。

线程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 线程可以理解为是一种轻量级的进程,可以增加并发度(传统的只能进行进程间并发,而现在线程间也可以并发),减少并发带来的开销。因为进程间切换需要操作系统进行调度,并在核心态做复杂的保存或恢复运行资源环境等操作。而线程并发是在进程内部,线程并发切换,不需要资源环境进行保存恢复操作。
  • 线程是处理机调度的单位,进程是资源分配的单位。同进程的多线程间共享该进程的资源。
  • 线程的实现方式:用户级线程(用户视角,对操作系统透明),内核级线程(操作系统视角,内核级线程才是处理机分配的单位(多核))。组合方式。注意重点:内核级线程才是处理机分配的单位。
  • 多线程模型:多对一(多个用户级线程对一个内核级线程,或者说一个用户级进程对应一个内核级线程,但是该用户级进程对应多个用户级线程。开销小,但是一个线程的阻塞,就会令整个进程阻塞,并发度低)。一对一(一个用户级线程映射一个内核级线程,虽然并发度高,但是线程间切换需要内核级线程切换,这会使用操作系统进行调度切换,管理的开销大。同一个进程需要多个内核级线程操作。)多对多(集二者之长,一般是m个用户级线程对应n个内核级线程,其中m > n)

2.2 处理机调度

概念、层次

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 处理机调度,就是根据某种算法从就绪队列中选择一个进程,并将处理机分配给它,实现进程的并发执行。复习并发(宏观上是同时发生的,微观上是交替进行的)。并行是两个或多个时间同一时间同时发生。
  • 三个层次:高级调度(作业调度,外存->内存,面向作业,无》创建态》就绪态),从外存后备队列中选取合适的作业调入内存,并为其创建PCB。。中级调度(内存调度,外存->内存,面向进程,挂起态->就绪态),从挂起队列中选择合适的进程将其数据调回内存。低级调度(进程调度,内存->CPU,就绪态》运行态,频率最高),按照规则,从就绪队列中选择一个进程为其分配CPU。
  • 挂起(采用虚拟存储技术后,内存的进程当前不能运行后,会将其数据返回外存,而PCB仍在内存中存储。保证内存中存储了数据的进程都是可以运行的进程,提高内存的利用率。而当之前不能运行的进程可以运行后,将其数据重新调入内存)。
  • 就绪挂起,阻塞挂起,七状态

进程调度的时机、切换与过程、方式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进程调度、切换是有代价的,并不是调度越频繁,并发度就越高。
进程调度时机:主动放弃、被动放弃

调度算法的评价指标

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

FCFS、SJF、HRRN的调度算法

饥饿:某进程或作业长期得不到服务。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
主要用于早起的批处理系统,交互性很差,不是现在的主流。

调度算法:时间片轮转、优先级、多级反馈队列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意多级反馈队列中,若当前被执行进程时间片用完后仍然没有执行完,则进入下一级队列。而如果当前执行进程因为被抢占而阻塞,则仍保持其优先级不变,将其返回到当前优先级的就绪队列。
多级反馈队列调度算法:

  • 多级就绪队列,优先级从高到低,时间片从小到大。
  • 新进程到达进入第1级队列(优先级最高),按FCFS(先到先得)规则排队等待被分配时间片,若用完时间片进程仍未结束,则进入下一级就绪队列队尾。如果已经是最下级队列,则重新放回最下级队尾。
  • 只有第k级队列为空时,才会为下级队列的队头进程分配时间片。

2.3 进程同步,互斥,信号量机制,生产者,吸烟者,读写者,哲学家进餐,管程

进程同步、互斥

在这里插入图片描述
让进程按照我们想要的顺序执行。
在这里插入图片描述
例如,成对的,写进程,必须在读进程前。进程同步。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
进程并发具有异步性,每个进程以各自独立的,不可预知的速度进行。而有些进程之间在某些位置上有制约关系,比如执行顺序。同步又可以理解为制约关系,协调多个进程之间的工作次序。
进程互斥,限制进程对临界资源的访问,互斥进行,不可同时访问。而同一时间只能被一个进程访问的资源就叫做临界资源。
四个部分:进入区(检查是够可以进入,进入,需要上锁),临界区(访问临界资源的那段代码),退出区(解锁),剩余区(其余代码部分,因为还有其他的功能可能要实现)。
原则:空闲让进,忙则等待,有限等待(对访问临界资源的进程,保证其能够在有限时间内进入,保证不会饥饿),让权等待(进不了临界区的进程,要释放处理机,防止忙等)

进程互斥的软件实现方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先区分出进入区。
在这里插入图片描述
peterson算法,孔融让梨。进入区“主动争取》主动谦让》同时检查对方是否想进和己方是否谦让”。会发生忙等。

进程互斥的硬件实现方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
缺点:不满足“让权等待”,不能进入临界区的进程一直在while循环,占用处理机,忙等。
让权等待:进不了临界区的进程,要释放处理机,避免忙等。

!!!信号量机制(操作系统这本书最重要的部分)

视频链接:https://www.bilibili.com/video/BV1YE411D7nH?p=21
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 信号量本质为一个变量(整数(存在忙等)或者更复杂的记录型变量),用来表示系统中某种资源的数量。(一台打印机,semaphore初值为1)
  • 原语是特殊的程序段,其执行只能一气呵成,不能被中断。原语是由关中断/开中断指令实现的。软件解决方案的主要问题是“进入区的各种操作无法一气呵成”,而如果把进入区和退出区的操作都用原语实现就ok了
  • 一对原语:wait(S),signal(S),其中参数为信号量S,常称为P、V操作,因此这两个操作一般写为P(S)、V(S)
  • 有空写个实现练练手
  • 整数型信号量存在“忙等”问题,因此提出了“记录型信号量”(剩余资源数,等待队列)。
  • 一次P(S)操作表示请求一个单位的该类资源,需要执行一次S.value–;表示资源数减1,如果S.value < 0表示当前无资源,则调用block(S.L)原语阻塞该进程(运行态》阻塞态),当前进程主动放弃处理机,并插入该类资源的等待队列S.L中。遵循了让权等待,避免“忙等”。
  • 一次V(S)操作表示释放一个单位的该类资源,需要执行一次S.value++;表示资源数加1,若S.value<=0表示有进程在等待该类资源,因此调用原语wakeup(S.L)唤醒等待队列中的第一个进程,被唤醒进程(阻塞态》就绪态)。

用信号量实现进程互斥、同步、前驱关系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

生产者-消费者问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • empty表示空闲缓冲区的个数,full=0表示已存入产品的数量。full=0,表示缓冲区空,限制consumer读取,先producer后consumer。empty=0表示缓冲区满,可放入的个数为0。限制producer放入,先consumer后producer。
  • 注意是P是S先减1,后根据S是否小于0来判断要不要进行阻塞。因此阻塞关系清楚后,考虑S为0时的操作,判断进程的先后关系就好理解了。
  • 注意!!!实现互斥的P操作一定要在实现同步(顺序执行)的P操作之后。不然的话会出现“死锁”。例如,当前缓冲区已满,若互斥在同步之前,生产者先执行P(mutex)进入临界区,之后碰到P(empty),此时empty为0,减1变为-1,生产者被阻塞,阻塞在临界区,一直占用临界区。而消费者又无法进入临界区被阻塞,无法从临界区取出数据执行V(empty)。两个进程都互相阻塞,造成死锁。
  • 对于consumer,如果把使用产品放入PV之间,比如在从缓冲区中取出一个产品之后立即使用产品。因为在V(mutex)后才是释放缓冲区的锁,所以这样做的话相当于将使用产品的步骤在临界区执行。这样使consumer占用临界区的时间变长,producer的P(mutex)的阻塞时间更长,显然会降低进程间的并发效果。
    在这里插入图片描述
    生产者-消费者问题的关键在于,需要一个进程互斥(对临界区的互斥访问),两个进程同步(一个为临界区有数据才可以consumer,一个为临界区未满的时候才可以producer放入数据),mutex互斥,full=n配置可放入的数据块个数,限制producer,empty=0,限制consumer取。

多生产者-多消费者问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
临界区同时被多个生产者访问,会发生数据覆盖的问题。
缓冲区大小大于1,必须设置互斥信号量。最好还是设置。加上肯定更安全。
同一进程中,P操作,先同步后互斥,不然可能引起“死锁”。即“后操作”(同步)先获取临界区的访问权限(互斥),P操作阻塞等待“前操作”进行V操作,而“前操作”并不能进入临界区(更不要提进行V操作)而阻塞。两个进程都被阻塞,产生死锁。一般让互斥操作放在最中间,互斥的P和V操作只包含访问临界区。
在这里插入图片描述
在这里插入图片描述
考虑同步信号量,要从事件去考虑,而非进程。因为约束关系本质上是事件的约束关系。当多个进程可以触发同一事件时,就让他们对同一同步信号量操作即可。

吸烟者问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分析问题的关键,是事件。根据事件的先后顺序设置信号量。与上面的多生产者和多消费者类似。当盘子的大小为1时,不需要互斥,而当盘子的大小大于1时,需要设置互斥,避免多个进程同时访问临界区。
吸烟者问题,为一个供应者对应多个消费者,并轮流满足各个消费者的需求。消费者满足需求后触发供应者进行下一次供应,供给下一个消费者所需要的东西。因此事件的触发关系为:供应者放置某种资源后,通知需要该资源的消费者消费。各个消费者消费完后,触发供应者下一次供应。盘子不需要互斥,因为盘子的大小为1,供应者每次只放置一份吸烟者所需的材料。而如果盘子大小大于1时,就需要设置互斥信号量mutex了。避免多个进程同时访问临界区,同时清除数据,发生错误。而下面的读者-写者问题不同,多个读者可以同时读,因为它们只是读,不会改变数据。但是写进程和读进程同时共享数据,可能导致读出的数据不一致的问题。

读者-写者问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
写者间互斥,写者与读者互斥,读者与读者间不互斥。另外要避免读者较多时一直读取让写者进程“饥饿”。
通过再加一层P(w)和V(w)进一步使写进程和读进程互斥,互斥是每个进程都有对应的P和V操作。实现先到先服务。
注意此写者-读者问题的关键是,读进程之间可以同时进行,它是通过count来实现的。第一个读者进程到达的时候,获取临界区读权限,P(rw),最后一个读者进程读取接收后再V(rw),实现读进程整体和写进程的互斥。

  • 设信号量前先找出事件的互斥与同步关系。成对设置信号量。
  • 比如上面reader的V(w)操作,为什么放在读文件前,因为w信号量只是为了避免写进程饥饿,并不能影响读进程间同时读取的工作。因此便把V(w)放于写操作前。这样读进程间也是依次开始读操作,但可以同时读取。

哲学家进餐问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
问题:同时都可以拿筷子,会发生一人一根筷子的情况,发生死锁。
拿筷子做互斥就可以保证,将拿左筷子和拿右筷子同步进行。不过仍不完美,因为一桌子本来可以有两个人同时吃饭,现在最多只能有一个。
在这里插入图片描述

!!管程(高级同步机制)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
管程利用了封装的思想,把进程同步和进程互斥的操作封装到内部。
各进程必须互斥访问的特性是由编译器实现的。外部进程/线程只能通过管程提供的特定“入口”才能访问管程内定义的共享数据。
每次仅允许一个进程在管程内执行某个内部过程。

2.4 死锁

概念

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
死锁的必要条件:互斥条件(资源有限,互斥使用)、不剥夺条件(资源只能进程主动释放,不可强行剥夺)、请求和保持条件(保持某些资源不放的同时,请求别的资源)、循环等待条件(存在一种进程资源的循环等待链,循环等待未必死锁,但是死锁一定有循环等待)

死锁的处理策略——预防死锁

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

死锁的处理策略——避免死锁

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
银行家算法步骤:
1、先检查此次申请是否超过了之前声明的最大需求数,如果超过了则表示出错
2、检查此时系统剩余的可用资源是否还能满足这次请求
3、试探着分配,更改各数据结构(例如例子用使用的二维数组来表示的,进行矩阵加减操作)
4、用安全性算法检查此次分配是否会导致系统进入不安全状态。

安全性算法步骤:
1、检查当前剩余的可用资源是否能满足某个进程的最大需求,如果可以,就把进程加入安全序列。
2、并把该进程持有的资源全部回收
3、不断重复上述过程,看最终是否能让所有的进程都加入安全序列

死锁的处理策略——检测和解除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
绿线表示已经分配了的资源,蓝线表示已经分配资源后的想申请的资源。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值