一、进程与线程
进程
进程是资源分配的基本单位。
进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的
创建进程和撤销进程,都是指对 PCB 的操作。
下图显示了 4 个程序创建了 4 个进程,这 4 个进程可以并发地执行。
线程
线程是独立调度的基本单位。
一个进程中可以有多个线程,它们共享进程资源。
QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件
响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发
起 HTTP 请求时,浏览器还可以响应用户的其它事件。
区别
Ⅰ 拥有资源
进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。
Ⅱ 调度
线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个
进程中的线程切换到另一个进程中的线程时,会引起进程切换。
Ⅲ 系统开销
由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,
所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执
行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少
量寄存器内容,开销很小。
Ⅳ 通信方面
线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。
4、进程(或作业)的调度算法有哪些
4.1、先来先服务(FCFS,First-Come-First-Served)
按照进程进入就绪队列的先后次序来选择进程。
4.2、短进程优先(SPF,Shortest Process Next)
从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它。
4.3、优先权调度算法(Priority)
按照进程的优先权大小来调度。
4.4、高响应比优先调度算法(HRRN,Highest Response Ratio Next)
按照高响应比((已等待时间+要求运行时间)/ 要求运行时间)优先的原则【等待时
间长和运行时间短都会增加其优先值】,每次先计算就绪队列中每个进程的响应比,然后
选择其值最大的进程投入运行。
4.5、时间片轮转调度算法(RR,Round-Robin)
当某个进程执行的时间片用完时,调度程序便停止该进程的执行,并将它送就绪队列
的末尾,等待分配下一时间片再执行。然后把处理机分配给就绪队列中新的队首进程,同
先来先服务、短进程优先、优先权调度算法、高响应比优先调度算法、时间片轮转调
度算法、多级队列调度算法
时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程,在一给定的时间内,
均能获得一时间片处理机执行时间。
4.6、多级队列调度算法
多队列调度是根据进程的性质和类型的不同,将就绪队列再分为若干个子队列,所有
的进程按其性质排入相应的队列中,而不同的就绪队列采用不同的调度算法。
5、同步和互斥的区别,同步、异步、阻塞、非阻塞的区别
5.1、同步和互斥【同步体现的是一种协作性,互斥体现的是一种排他性】
同步:就是并发的线程在一些关键点上可能需要互相等待与互通信息,这种相互制约的等
待与互通信息称为进程(线程)同步。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥
无法限制访问者对资源的访问顺序,即访问是无序的。
5.2、同步、异步【关注的是消息通信机制】
同步: 就是指调用者会主动等待调用的返回结果。
异步: 就是指调用者不会主动等待调用结果,而是在调用发生后,被调用者通过状态、通
知来通知调用者。
5.3、阻塞、非阻塞 【关注的是程序在等待调用结果(消息,返回值)时的状
态】
阻塞: 是指调用结果返回前,当前线程会被挂起,即阻塞。
非阻塞: 是指即使调用结果没返回,也不会阻塞当前线程。
6、线程【进程】同步的方式有哪些
6.1、线程同步的基本概念
所谓同步,就是并发的线程在一些关键点上可能需要互相等待与互通信息,这种相互
制约的等待与互通信息称为进程(线程)同步。
“同”其实是协同,而不是同时,同步体现的是一种协作性。
互斥(指某一资源同时只允许一个访问者对其进行访问)体现的是一种排他性。一般
情况下,同步已经实现了互斥,特别是写入资源的情况必定是互斥的。
临界资源是指一次仅允许一个线程使用的资源。
临界区指的是一个访问共用资源(被多个线程共享的临界资源)的程序片段,而这些共用
资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必
须等待(例如:bounded waiting 等待法),有一些同步的机制必须在临界区段的进入点
与离开点实现,以确保这些共用资源是被互斥获得使用,例如:semaphore。只能被单一
线程访问的设备,例如:打印机。
6.2、线程同步的方式
临界区用于单个进程中线程间的同步;互斥量、信号量、事件用于多个进程间的各个
线程间实现同步。
1、临界区:
使用临界区对象。拥有临界区对象的线程可以访问被保护起来的资源或代码段,其他
线程若想访问,则被挂起,直到拥有临界区对象的线程放弃临界区对象为止【只用于同一
进程】
2、互斥量:
采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对
象只有一个,所以可以保证公共资源不会同时被多个线程访问。【互斥对象和临界区对象
非常相似,只是其允许在进程间使用,而临界区只限制于同一进程的各个线程之间使用】
3、信号量:
它允许多个线程同一时刻访问同一资源,但是需要限制同一时刻访问此资源的最大线
程数目。
信号量(Semaphore)是一个整型变量,可以对其执行 down 和 up 操作,也就是
常见的 P 和 V 操作。
down : 如果信号量大于 0 ,执行 -1 操作;如果信号量等于 0,进程睡眠,等待信
号量大于 0;
up :对信号量执行 +1 操作,唤醒睡眠的进程让其完成 down 操作。
down 和 up 操作需要被设计成原语,不可分割,通常的做法是在执行这些操作的时
候屏蔽中断。如果信号量的取值只能为 0 或者 1,那么就成为了 互斥量
(Mutex) ,0 表示临界区已经加锁,1 表示临界区解锁。
信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下
一个进程。信号量的值 S 与相应资源的使用情况有关。当 S 大于 0 时,表示当前可用资源
的数量;当 S 小于 0 时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅
能由 PV 操作来改变。
执行一次 P 操作意味着请求分配一个单位资源,因此 S 的值减 1;当 S < 0 时,表示
已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。
而执行一个 V 操作意味着释放一个单位资源,因此 S 的值加 1;若 S < 0,表示有某
些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
4、事件(信号):
事件机制,则允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。
【进程间通信中唯一的一个异步机制】
二、死锁
2.1 什么是死锁?
由于系统中存在一些不可剥夺资源,而当两个或两个以上进程占有自身资源,并请求
对方资源时,会导致每个进程都无法向前推进,这就是死锁。
2.2 死锁产生的原因?
1、竞争资源;
2、进程推进顺序不当(比如 a,b 互相等待对方发信息)。
2.3 死锁产生的必要条件?
1、互斥: 一个资源一次只能被一个进程所使用,即是排它性使用。
2、不剥夺: 一个资源仅能被占有它的进程所释放,而不能被别的进程强制剥夺。
3、请求与保持: 指进程占有自身本来拥有的资源并要求其他资源。
4、循环等待: 存在进程资源的循环等待链,链中每一个进程已获得的资源同时被下一个
进程所请求。
2.4 怎么处理死锁?
死锁的处理策略:
1、鸵鸟策略;
2、预防死锁;
3、避免死锁;
4、死锁的检测及解除。
2.6 预防死锁:破坏四个必要条件之一
1. 破坏互斥条件
即允许进程同时访问某些资源。但是,有的资源是不允许被同时访问的,像打印机等
等。所以,这种办法并无实用价值。
2. 破坏不可剥夺条件
当一个进程已占有了某些资源,它又申请新的资源,但不能立即被满足时,它必须释
放所占有的全部资源,以后再重新申请。这就相当于该进程占有的资源被隐蔽地强占了。
这种预防死锁的方法实现起来困难,会降低系统性能。
3. 破坏请求与保持条件
可以实行资源预先分配策略。即进程在运行前,一次性地向系统申请它所需要的全部
资源。
如果某个进程所需的全部资源得不到满足,则不分配任何资源,此进程暂不运行。只
有当系统能够满足当前进程的全部资源需求时,才一次性地将所申请的资源全部分配给该
进程。由于运行的进程已占有了它所需的全部资源,所以不会发生占有资源又申请资源的
现象,因此不会发生死锁。
4.破坏循环等待条件:实行顺序资源分配法
首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资
源一次申请完。也就是说,只要进程提出申请分配资源 Ri,则该进程在以后的资源申请
中,只能申请编号大于 Ri 的资源。
2.7 避免死锁
银行家算法:
当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可
以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请资源数之
和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源。若没超过则再测试系
统现存的资源能否满足该进程尚需的最大资源量,若满足则按当前的申请量分配资源,否
则也要推迟分配。
安全序列:
是指系统能按某种进程推进顺序(P1, P2, P3, ..., Pn),为每个进程 Pi 分配其所需要
的资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺序地完成。这种推进
顺序就叫安全序列【银行家算法的核心就是找到一个安全序列】。
系统安全状态 :
如果系统能找到一个安全序列,就称系统处于安全状态,否则,就称系统处于不安全
状态
2.8 死锁的检测和解除
即在死锁产生前不采取任何措施,只检测当前系统有没有发生死锁,若有,则采取一
些措施解除死锁。
1、死锁的检测
不试图阻止死锁,而是当检测到死锁发生时,采取措施进行恢复。
银行家算法【在动态分配资源的过程中,银行家算法防止系统进入不安全状态,从而
避免死锁】
每种类型一个资源的死锁检测
上图为资源分配图,其中方框表示资源,圆圈表示进程。资源指向进程表示该资源已
经分配给该进程,进程指向资源表示进程请求获取该资源。
图 a 可以抽取出环,如图 b,它满足了环路等待条件,因此会发生死锁。每种类型一
个资源的死锁检测算法是通过检测有向图是否存在环来实现,从一个节点出发进行深度优
先搜索,对访问过的节点进行标记,如果访问了已经标记的节点,就表示有向图存在环,
也就是检测到死锁的发生。
上图中,有三个进程四个资源,每个数据代表的含义如下:
E 向量:资源总量
A 向量:资源剩余量
C 矩阵:每个进程所拥有的资源数量,每一行都代表一个进程拥有资源的数量
R 矩阵:每个进程请求的资源数量
进程P1 和 P2 所请求的资源都得不到满足,只有进程 P3 可以,让 P3 执行,之后释
放 P3 拥有的资源,此时 A = (2 2 2 0)。P2 可以执行,执行后释放 P2 拥有的资源,A =
(4 2 2 1) 。P1 也可以执行。所有进程都可以顺利执行,没有死锁。
每种类型多个资源的死锁检测
算法总结如下:
每个进程最开始时都不被标记,执行过程有可能被标记。当算法结束时,任何没有被
标记的进程都是死锁进程。
1、寻找一个没有标记的进程 Pi,它所请求的资源小于等于 A;
2、如果找到了这样一个进程,那么将 C 矩阵的第 i 行向量加到 A 中,标记该进程,并转
回 1;
3、如果没有这样一个进程,算法终止。
2、死锁的解除
1、资源剥夺:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他死锁进程。
(但应该防止被挂起的进程长时间得不到资源);
2、撤销进程:强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。(撤销的原则可
以按进程优先级和撤销进程代价的高低进行);
3、进程回退:让一个或多个进程回退到足以避免死锁的地步。【进程回退时自愿释放资源
而不是被剥夺。要求系统保持进程的历史信息,设置还原点。】
3.2、页面置换算法有哪些?
最佳置换算法、先进先出置换算法、最近最久未使用置换算法 LRU、时钟置换算法、
最少使用置换算法:
1、最佳置换算法(Optimal):即选择那些永不使用的,或者是在最长时间内不再被访问
的页面置换出去。(它是一种理想化的算法,性能最好,但在实际上难于实现);
2、先进先出置换算法 FIFO:总是淘汰最先进入内存的页面;
3、最近最久未使用置换算法 LRU(Least Recently Used):即选择最近最久未使用的页
面予以淘汰。【系统在每个页面设置一个访问字段,用以记录这个页面自上次被访问以来
所经历的时间 T,当要淘汰一个页面时,选择 T 最大的页面。】
4、时钟(Clock)置换算法:也叫最近未用算法 NRU(Not RecentlyUsed)。该算法为
每个页面设置一位访问位,将内存中的所有页面都通过链接指针链成一个循环队列。当某
页被访问时,其访问位置“1”。在选择一页淘汰时,就检查其访问位,如果是“0”,就
选择该页换出;若为“1”,则重新置为“0”,暂不换出该页,在循环队列中检查下一个
页面,直到访问位为“0”的页面为止。由于该算法只有一位访问位,只能用它表示该页是
否已经使用过,而置换时是将未使用过的页面换出去,所以把该算法称为最近未用算法。
5、最少使用置换算法 LFU:该算法选择最近时期使用最少的页面作为淘汰页。
3、虚拟内存:虚拟内存是一些系统页文件,存放在磁盘上,每个系统页文件大小为 4K,
物理内存也被分页,每个页大小也为 4K,这样虚拟页文件和物理内存页就可以对应,实际
上虚拟内存就是用于物理内存的临时存放的磁盘空间。页文件就是内存页,物理内存中每
页叫物理页,磁盘上的页文件叫虚拟页,物理页+虚拟页就是系统所有使用的页文件的总
和。