深入理解进程,线程,协程 (2)

优缺点:适用于实时操作系统,用优先级区分紧急程度,可灵活地调整对各种作业/及进程的偏好程度。缺点:若源源不断地提供高优先级进程,则可能导致饥饿

是否会导致饥饿: 会

多级反馈队列调度算法

算法思想:综合FCFS、SJF(SPF)、时间片轮转、优先级调度

算法规则:

1.设置多级就绪队列,各级别队列优先级从高到底,时间片从小到大

2.新进程到达时先进入第1级队列,按照FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾

3.只有第k级别队列为空时,才会为k+1级对头的进程分配时间片

用于作业/进程调度:用于进程调度

是否可抢占? 抢占式算法。在k级队列的进程运行过程中,若更上级别的队列(1-k-1级)中进入一个新进程,则由于新进程处于优先级高的队列中,因此新进程会抢占处理机,原理运行的进程放回k级队列队尾。

优缺点:对各类型进程相对公平(FCFS的有点);每个新到达的进程都可以很快就得到相应(RR优点);短进程只用较少的时间就可完成(SPF)的有点;不必实现估计进程的运行时间;可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、I/O密集型进程(拓展:可以将因I/O而阻塞的进程重新放回原队列,这样I/O型进程就可以保持较高优先级)

是否会导致饥饿: 会

image.png

image.png

2. 线程

引入线程之后,进程只作为除CPU之外的系统资源的分配单元(如:打印机,内存地址空间等都是分配给进程的)

image.png

image.png

线程的是实现方式:

用户级线程(User-Level Thread),用户级线程由应用程序通过线程库是实现如python (import thread), 线程的管理工作由应用程序负责。

内核级线程(kernel-Level Thread),内核级线程的管理工作由操作系统内核完成,线程调度,切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成

进程和线程的关系:一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。CPU的最小调度单元是线程,所以单进程多线程是可以利用多核CPU的。

2.1 线程模型:

用户级线程模型(一对多模型)

深入理解进程,线程,协程

多个用户态的线程对应着一个内核线程,程序线程的创建、终止、切换或者同步等线程工作必须自身来完成。python就是这种。虽然可以实现异步,但是不能有效利用多核(GIL)

内核级线程模型 (一对一)

深入理解进程,线程,协程

这种模型直接调用操作系统的内核线程,所有线程的创建、终止、切换、同步等操作,都由内核来完成。C++就是这种

两级线程模型(M:N)

深入理解进程,线程,协程

这种线程模型会先创建多个内核级线程,然后用自身的用户级线程去对应创建的多个内核级线程,自身的用户级线程需要本身程序去调度,内核级的线程交给操作系统内核去调度。GO语言就是这种。

python中的多线程因为GIL的存在,并不能利用多核CPU优势,但是在阻塞的系统调用中,如sock.connect(), sock.recv()等耗时的I/O操作,当前的线程会释放GIL,让出处理器。但是单个线程内,阻塞调用上还是阻塞的。除了GIL之外,所有的多线程还有通病,他们都是被OS调用的,调度策略是抢占式的,以保证同等有限级的线程都有机执行,带来的问题就是:并不知道下一刻执行那个线程,也不知道正在执行什么代码,会存在竞态条件

3. 协程

协程通过在线程中实现调度,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈。

python的协程源于yield指令

yield item 用于产出一个值,反馈给next()的调用方法

让出处理机,暂停执行生成器,让调用方继续工作,直到需要使用另一个值时再调用next()

协程式对线程的调度,yield类似惰性求职方式可以视为一种流程控制工具,实现协作式多任务,python3.5引入了async/await表达式,使得协程证实在语言层面得到支持和优化,大大简化之前的yield写法。线程正式在语言层面得到支持和优化。线程是内核进行抢占式调度的,这样就确保每个线程都有执行的机会。而coroutine运行在同一个线程中,有语言层面运行时中的EventLoop(事件循环)来进行调度。在python中协程的调度是非抢占式的,也就是说一个协程必须主动让出执行机会,其他协程才有机会运行。让出执行的关键字 await, 如果一个协程阻塞了,持续不让出CPU处理机,那么整个线程就卡住了,没有任何并发。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwsdf.html