2.进程相关

进程的概念:

  • 对正在运行的程序的一个抽象,一个进程是在并发过程中程序的执行过程。

多道程序设计:CPU在程序之间来回的切换。

哪些事件会导致进程的创建:

  • 系统初始化
  • 执行了正在运行的进程所调用的进程创建了系统的调用
  • 用户请求了一个新的进程
  • 一个批处理作业的初始化

哪些条件会导致进程的终止:

  • 正常退出
  • 出错退出
  • 严重退出
  • 被其他的进程杀死

进程的状态:

  • 运行态(该时刻系统占用CPU)
  • 就绪态(可运行,但是因为其他的进程正在运行而暂时停止)
  • 阻塞态(进行运行所需的某些资源未来到,在等待)

在这里插入图片描述

进程的实现:

为了实现进程模型,操作系统维护着一张进程的表格(进程表),也叫进程控制块(process control model)PCB,该表包含很多的重要信息包括程序计数器,堆栈指针,内存分配状态,打开文件时的状态,账号和调度信息等

线程

为什么要使用线程:

  • 许多的应用(进程)中同时发生很多的活动,其中的某些活动会随着时间的推移而被阻塞。通过将这个应用分解成可以准并行运行的多个顺序线程,程序设计模型会变得十分简单。
  • 线程的创建比进程更加的轻量级,创建和撤销都更加容易。

加入了线程之后,位于相同进程的多个线程共享同一地址空间,而多进程具有的是不同的地址空间。

进程之间的通信(Inner Process Communication)IPC

进程需要与其他的进程进行通信,有三个问题必须要解决:

  1. 一个进程如何将信息传达给另外一个
  2. 多个进程在关键活动中不会有交叉
  3. 进程执行的顺序

竞争条件:多个进程读写某些共享的数据,而最后的结果取决于进程所运行的精确地时序

临界区

对共享内存进行访问的程序片段。
临界区的存在主要是为了避免竞争条件。要避免竞争条件,关键是要找出某种过程来阻止多个进程同时读写共享的数据。即,需要的是互斥(一个进程使用共享文件时,其他的进程不能够使用这个共享的文件)。
互斥量
  互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。

虽然避免了竞争条件,但是若要求临界区能够保证共享数据的并发进程正确高效的运行,还需要四个条件:

  1. 任何两个进程不能够同时处于临界区
  2. 不应对CPU的速度和数量做任何的假设
  3. 临界区外的进程不得阻塞其他的进程
  4. 不得使进程无限期地等待

在这里插入图片描述

信号量(Semaphores)

信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源 ,这与操作系统中的PV操作相同。它指出了同时访问共享 资源的线程 最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数 就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目, 不能在允许其他线程的进入,此时的信号量信号将无法发出。线程在处理完共享资源后,应在离开的同时通过ReleaseSemaphore()函数将当前可 用资源计数加1。在任何时候当前可用资源计数决不可能大于最大资源计数。

PV操作及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用共享资源的进程数。

P操作 申请资源:

(1) S减1;
(2) 若S减1后仍大于等于零,则进程继续执行;
(3) 若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转入进程调度。

V操作 释放资源:

(1) S加1;
(2) 若相加结果大于零,则进程继续执行;
(3) 若相加结果小于等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转入进程调度。

信号量具体可参见:https://blog.csdn.net/qq_19782019/article/details/79746627

下面给出进程间五种通信方式的介绍:

这里的五个概念没有真正搞明白

一、管道


	管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。
	1、特点:
		1.它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
		2.它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
		3.它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,
		 并不属于其他任何文件系统,并且只存在于内存中。

在这里插入图片描述

二、FIFO

FIFO,也称为命名管道,它是一种文件类型。

1、特点
	FIFO可以在无关的进程之间交换数据,与无名管道不同。
	FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

三、消息队列

消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。

1、特点
	消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
	消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
	消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

四、信号量

信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,
而不是用于存储进程间通信数据。

1、特点
	信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
	信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
	每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
	支持信号量组。

2、原型
	最简单的信号量是只能取 0 和 1 的变量,这也是信号量最常见的一种形式,叫做二值信号量(Binary Semaphore)。
	而可以取多个正整数的信号量被称为通用信号量。

五、共享内存

共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区。

1、特点:
	共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。
	因为多个进程可以同时操作,所以需要进行同步。
	信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

以上五种通信方式的比较:

1.管道:速度慢,容量有限,只有父子进程能通讯

2.FIFO:任何进程间都能通讯,但速度慢

3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题

4.信号量:不能传递复杂消息,只能用来同步

5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存。

调度算法

进程调度的原理:

为了充分利用cpu的资源,可在内存中存放数目远远大于计算机CPU个数的进程,让这些进程在os的调度下能更加高效
(高的吞吐量throughput)、及时(低延时-latency)、公平(fairness)的使用cpu。
进程调度的机制是通过进程的上下文切换(context switch)来完成进程的切换。

进程调度的指标

  1. CPU利用率
  2. 吞吐量:单位时间内CPU完成的进程数目
  3. 周转时间:从进程创建到进程结束所经过的时间
  4. 等待时间:进程在就绪队列中等待所花的时间之和
  5. 响应时间:事件产生到系统做出相应所花的时间

进程调度的时机:

在这里插入图片描述
根据上面的进程状态图,可以看到进程调度的时机与在运行态–>退出态、阻塞态、就绪态时的切换相关。主要可分为以下的几类:

	1.正在执行的进程执行完毕,需要选择新的就绪进程执行。
	
	2.正在执行的进程调用相关系统调用(包括与I/O操作,同步互斥操作等相关的系统调用)导致需等待某事件发生
	或等待资源可用,从而将白己阻塞起来进入阻塞状态。
	
	3.正在执行的进程主动调用放弃CPU的系统调用,导致自己的状态为就绪态,且把自己重新放到就绪队列中。
	
	4.等待事件发生或资源可用的进程等待队列,从而导致进程从阻塞态回到就绪态,并可参与到调度中。
	
	5.正在执行的进程的时间片已经用完,致自己的状态为就绪态,且把自己重新放到就绪队列中。
	
	6.在执行完系统调用后准备返回用户进程前的时刻,可调度选择一新用户进程执行
	
	7.就绪队列中某进程的优先级变得高于当前执行进程的优先级,从而也将引发进程调度。

进程调度的方式:

存在两种进程抢占处理器的调度方式:

	1.可抢占式(可剥夺式,preemptive):就绪队列中一旦有某进程的优先级高于当前正在执行的进程的优先级时,操作系统便立即进行进程调度,
	完成进程切换。
	2.不可抢占式(不可剥夺式non_preemptive):即使在就绪队列存在有某进程优先级高于当前正在执行的进程的优先级时,
	当前进程仍将占用处理机执行,直到该进程自己进入阻塞状态,或时间片用完,或在执行完系统调用后准备返回用户进程前的时刻,
	才重新发生调度让出处理机。

进程调度的算法:

1. 先来先服务(FCFS)调度算法:

处于就绪态的进程按先后顺序链入到就绪队列中,而FCFS调度算法按就绪进程进入就绪队列的先后次序选择当前最先进入就绪队列的进程来执行,直到此进程阻塞或结束,才进行下一次的进程选择调度。FCFS调度算法采用的是不可抢占的调度方式,一旦一个进程占有处理机,就一直运行下去,直到该进程完成其工作,或因等待某一事件而不能继续执行时,才释放处理机。操作系统如果采用这种进程调度方式,则一个运行时间长且正在运行的进程会使很多晚到的且运行时间短的进程的等待时间过长。

2. 短作业优先(SJF)调度算法(短进程优先调度算法)

此算法选择就绪队列中确切(或估计)运行时间最短的进程进入执行。它既可采用可抢占调度方式,也可采用不可抢占调度方式可抢占的短进程优先调度算法通常也叫做最短剩余时间优先(Shortest Remaining Time First,SRTF)调度算法。短进程优先调度算法能有效地缩短进程的平均周转时间,提高系统的吞吐量,但不利于长进程的运行。而且如果进程的运行时间是“估计”出来的话,会导致由于估计的运行时间不一定准确,而不能实际做到短作业优先。

3. 时间片轮转(RR)调度算法

RR 调度算法与FCFS 调度算法在选择进程上类似,但在调度的时机选择上不同。RR调度算法定义了一个的时间单元,称为时间片(或时间量)。一个时间片通常在1~100 ms之间。当正在运行的进程用完了时间片后,即使此进程还要运行,操作系统也不让它继续运行,而是从就绪队列依次选择下一个处于就绪态的进程执行,而被剥夺CPU使用的进程返回到就绪队列的末尾,等待再次被调度。时间片的大小可调整,如果时间片大到让一个进程足以完成其全部工作,这种算法就退化为FCFS调度算法;若时间片设置得很小,那么处理机在进程之间的进程上下文切换工作过于频繁,使得真正用于运行用户程序的时间减少。时间片可以静态设置好,也可根据系统当前负载状况和运行情况动态调整,时间片大小的动态调整需要考虑就绪态进程个数、进程上下文切换开销、系统吞吐量、系统响应时间等多方面因素。

4. 高响应比优先(Highest Response Ratio First,HRRF)调度算法

HRRF调度算法是介于先来先服务算法与最短进程优先算法之间的一种折中算法。先来先服务算法只考虑进程的等待时间而忽视了进程的执行时间,而最短进程优先调度算法只考虑用户估计的进程的执行时间而忽视了就绪进程的等待时间。HRRF调度算法二者兼顾,既考虑进程等待时间,又考虑进程的执行时间,为此定义了响应比(Rp)这个指标:
Rp=(等待时间+预计执行时间)/执行时间=响应时间/执行时间
上个表达式假设等待时间与预计执行时间之和等于响应时间。HRRF调度算法将选择Rp最大值的进程执行,这样既照顾了短进程又不使长进程的等待时间过长,改进了调度性能。但HRRF调度算法需要每次计算各各个进程的响应比Rp,这会带来较大的时间开销(特别是在就绪进程个数多的情况下)。

5. 多级反馈队列(Multi-Level Feedback Queue)调度算法

在采用多级反馈队列调度算法的执行逻辑流程如下:

设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二队次之,其余队列优先级依次降低。仅当第1~i-1个队列均为空时,操作系统调度器才会调度第i个队列中的进程运行。赋予各个队列中进程执行时间片的大小也各不相同。在优先级越高的队列中,每个进程的执行时间片就越小或越大(Linux-2.4内核就是采用这种方式)。

当一个就绪进程需要链入就绪队列时,操作系统首先将它放入第一队列的末尾,按FCFS的原则排队等待调度。若轮到该进程执行且在一个时间片结束时尚未完成,则操作系统调度器便将该进程转入第二队列的末尾,再同样按先来先服务原则等待调度执行。如此下去,当一个长进程从第一队列降到最后一个队列后,在最后一个队列中,可使用FCFS或RR调度算法来运行处于此队列中的进程。
如果处理机正在第i(i > 1)队列中为某进程服务时,又有新进程进入第k(k < i)的队列,则新进程将抢占正在运行进程的处理机,即由调度程序把正在执行进程放回第i队列末尾,重新将处理机分配给处于第k队列的新进程。

从MLFQ调度算法可以看出长进程无法长期占用处理机,且系统的响应时间会缩短,吞吐量也不错(前提是没有频繁的短进程)。所以MLFQ调度算法是一种合适不同类型应用特征的综合进程调度算法。

6、最高优先级优先调度算法

进程的优先级用于表示进程的重要性及运行的优先性。
一个进程的优先级可分为两种:静态优先级和动态优先级。

静态优先级是在创建进程时确定的。一旦确定后,在整个进程运行期间不再改变。静态优先级一般由用户依据包括进程的类型、进程所使用的资源、进程的估计运行时间等因素来设置。一般而言,若进程需要的资源越多、估计运行的时间越长,则进程的优先级越低;反之,对于I/O bounded的进程可以把优先级设置得高。

动态优先级是指在进程运行过程中,根据进程执行情况的变化来调整优先级。动态优先级一般根据进程占有CPU时间的长短、进程等待CPU时间的长短等因素确定。占有处理机的时间越长,则优先级越低,等待时间越长,优先级越高。那么进程调度器将根据静态优先级和动态优先级的总和现在优先级最高的就绪进程执行。

调度算法小结

FCFS先来先服务:

  • 不公平,平均等待时间较差

SPN/SRT短进程优先:

  • 优先考虑执行时间比较短的进程,导致的结果可能是执行时间比较长的进程会处于饥饿的状态
  • 不公平,但是平均等待时间最小
  • 需要精确预测运行的时间

HRRN最高响应比优先:

  • 将等待的时间考虑进去,
  • 不可抢占

RoundRobin 轮询:

  • 公平,但是平均的等待时间较差

MLFQ多级反馈队列:

  • 动态地根据进程执行的过程调整其优先级

Fair-sharing Scheduling公平共享调度

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值