线程、进程及其调度简介

知识需要不断总结、验证、迭代,知其然,知其所以然。

1、进程和线程

进程和线程的区别与联系:

进程:资源申请的最小单位

线程:资源调度的最小单位,进程的一部分,描述指令流的执行状态。

内核中,描述进程的数据结构PCB:进程控制块,描述线程的数据结构 TCB:线程控制块。

图1 单线程进程

图2 多线程进程     

进程主要设计目的是隔离,和其他进程地址空间隔离开来;线程是进程的一部分,主要设计目的是通信和并发,隔离不是主要目的。

进程/线程生命周期:

图3 进程生命周期

2、线程的调度

调度算法最基本的一类是基于线程优先级的,线程的一种分类角度为:普通线程(SCHED_OTHER)和实时线程(SCHED_RR/SCHED_FIFO)。实时线程的优先级高于普通线程。操作系统每次从就绪队列中选择线程调度,占有cpu。

关于优先级,在TCB中有三个字段描述优先级:

A、静态优先级,static_proi,和nice的值(-20~19)相关

B、动态优先级,  proi

C、实时优先级,  rt_priority

普通线程使用,A、B,实时线程使用的参数A、C。

在分时线程中,操作系统根据动态优先级选定下一个待执行的线程,静态优先级是动态优先级的一个基准。即B会在A的基础上浮动,同时A决定了线程调度的时间片。

在实时线程中,操作系统不计算动态优先级,只根据C即实时优先级选定下一个待执行的线程。如果是FIFO则没有时间片(要么主动放弃cpu、要么被高优先级线程抢占),如果RR,可以理解为带时间片轮转的FIFO。

1、假设系统中只有:OTHER的线程,A、B、C、D、E、F…

那么系统会根据动态优先级高低来调用其中的线程,

动态优先级 = max(100, min(静态优先级 – bonus + 5, 139))(参考深入理解linux内核)。

同时每个线程执行的时间片,也是和静态优先级强相关的。

2、假设系统中只有RR类型的线程,A、B、C、D、E、F…

操作系统每次调用就只会根据实时优先级的高低选择带执行的线程,假如A在执行,这个时候B等待的资源满足了,B的实时优先级比A高,那A就会B抢占。B结束有三种可能:1、B的时间用完了;2、B主动放弃cpu(等待某种资源);3、B被更高优先级线程抢占。

3、假设系统中只有FIFO类型的线程,A、B、C、D、E、F….

       操作系统同样每次直选实时优先级最高的线程执行,假如A正在执行,这个时候B等待的资源满足了,B的优先级 >  A的优先级,那同样B就抢占A。B结束的条件是:1、主动放弃cpu;2、被更高优先级抢占。FIFO线程没有时间片的概念,如果需要它会一直占着cpu,直到被抢占或者主动放弃。

4、如果系统中三类线程都有会是什么情况呢?

首先,实时线程 > 普通线程,优先选择实时线程且普通线程还会被实时线程抢占。

实时线程中,选择优先级高的执行,在执行过程中,也会被更高优先级的线程抢占。假如有两个FIFO线程A和B,优先级都是80,如果A在执行且一直占用cpu,那么B就无法执行,产生饥饿,直到A主动放弃cpu。如果他们不是FIFO而是RR的,那么A和B就是时间片轮转执行,大家都有机会拿到cpu。

参考:深入理解linux内核

      Linux内核设计与实现

          在线课程:《操作系统》—清华大学向勇

猜你喜欢

转载自blog.csdn.net/Liukengpeng/article/details/80239496