LAB1 线程机制和线程调度实现
任务完成情况
任务 | Y/N |
---|---|
调研Linux的PCB | Y |
Exercise1 源代码阅读 | Y |
Exercise2 扩展线程的数据结构 | Y |
Exercise3 增加全局线程管理机制 | Y |
Exercise4 源代码阅读 | Y |
Exercise5 实现优先级抢占调度算法 | Y |
*Chalenge 实现时间片轮转算法 | Y |
调研Linux的进程控制块
五个互斥状态
状态 | 描述 |
---|---|
TASK_RUNNING | 表示进程正在执行,或者已经准备就绪,等待处理机调度 |
TASK_INTERRUPTIBLE | 表示进程因等待某种资源而被挂起(阻塞态),一旦资源就绪,进程就会转化为TASK_RUNNING态 |
TASK_UNINTERRUPTIBLE | 与TASK_INTERRUPTIBLE状态类似,同样表示进程因等待某种资源而阻塞。二者唯一的区别在于:前者可以通过一些信号或者外部中断来唤醒,而后者只能通过等待的资源就绪被唤醒。这种状态很少被用到,但是不代表它没有用,实际上这种状态很有用,特别是对于驱动刺探相关的硬件过程至关重要。 |
TASK_STOPPED | 进程被停止执行,当进程接收到SIGSTOP、SIGTTIN、SIGTSTP或者SIGTTOU信号之后就会进入该状态 |
TASK_TRACED | 表示进程被debugger等进程监视,进程执行被调试程序所停止,当一个进程被另外的进程所监视,每一个信号都会让进城进入该状态 |
两个终止状态
状态 | 描述 |
---|---|
EXIT_ZOMBIE | 僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源,但如果父进程不退出,子进程所占有的进程ID将不会被释放,如果系统中僵尸进程过多,会占用大量的PID,导致PID不足,这是僵尸进程的危害,应当避免 |
EXIT_DEAD | 进程正常结束的最终状态 |
进程的转换过程
调度策略
字段 | 描述 | 所在调度器类 |
SCHED_NORMAL | (也叫SCHED_OTHER)用于普通进程,通过CFS调度器实现。SCHED_BATCH用于非交互的处理器消耗型进程。SCHED_IDLE是在系统负载很低时使用 | CFS |
SCHED_BATCH | SCHED_NORMAL普通进程策略的分化版本。采用分时策略,根据动态优先级(可用nice()API设置),分配 CPU 运算资源。注意:这类进程比上述两类实时进程优先级低,换言之,在有实时进程存在时,实时进程优先调度。但针对吞吐量优化 | CFS |
SCHED_IDLE | 优先级最低,在系统空闲时才跑这类进程(如利用闲散计算机资源跑地外文明搜索,蛋白质结构分析等任务,是此调度策略的适用者) | CFS |
SCHED_FIFO | 先入先出调度算法(实时调度策略),相同优先级的任务先到先服务,高优先级的任务可以抢占低优先级的任务 | RT |
SCHED_RR | 轮流调度算法(实时调度策略),后者提供 Roound-Robin 语义,采用时间片,相同优先级的任务当用完时间片会被放到队列尾部,以保证公平性,同样,高优先级的任务可以抢占低优先级的任务。不同要求的实时任务可以根据需要用sched_setscheduler()API 设置策略 | RT |
SCHED_DEADLINE | 新支持的实时进程调度策略,针对突发型计算,且对延迟和完成时间高度敏感的任务适用。基于Earliest Deadline First (EDF) 调度算法 |
Linux与Nachos的异同
Linux中的task_struct
PID |
---|
特征信息(name, tID, tgID等) |
进程状态 |
优先级 |
通信状态 |
现场保护区 |
资源需求、分配控制信息 |
进程实体信息 |
其他(工作单位、工作区、文件信息) |
Nachos中的PCB实现
成员变量 | 描述 |
---|---|
name | 进程名字 |
status |