初探Linux进程调度
已知:父进程创建子进程后,父子进程同时运行。
问题:如果计算机只有一个处理器,父子进程以什么方式同时执行?
基本概念
运行:一个可执行程序从文件,变成进程的过程。
执行:拿到了处理器,执行指令。
Linux系统调度
- 内核具有进程调度的能力,多个进程可以同时运行。
- 微观上,处理器同一时间只能执行一个进程。
- 同时运行多个进程时候,每个进程都会获得适当的执行时间片
- 当执行时间片用完,内核调度下一个进程执行
进程调度原理
Linux系统调度策略
普通调度策略
SCHED_OTHER : Linux默认的调度策略,也被称为CFS(Completely Fair Scheduler),给每个进程动态计算优先级,根据优先级和进程执行的历史记录来确定下一个执行的进程。
实时调度策略
SCHED_FIFO :基于优先级顺序调度进程,并在一个进程获得CPU时候一直执行,直到进程主动释放。
SCHED_RR :基于"时间片轮转"的调度策略,给每个进程设置一个固定的时间片,并按照优先级顺序对进程进行轮流调度。
如何验证Linux中的进程调度?
实验目标:
1.验证同一时刻只有一个进程在执行。
2.验证不同调度策略,进程执行的连续性不同。
实验设计:
1.n个进程同时运行,统计各个进程的执行时刻。
2.进程运行方式:(确定记录那些数据)
2.1 每个slice时间记录如下值:进程编号、当前时间值、完成度
2.2 在total时间后结束运行,并输出记录的数据
2.3 通过记录的数据分析进程调度策略
实验中需要解决的问题
- 如何让进程每次 ”固定” 工作 slice时间(单位毫秒)?
- 如何获取和改变进程的调度策略?
- 如何记录数据并输出数据(需要保持数据)?
- 如何图形化数据?
#include <time.h>
/usr/include/newlib/sys/_timespec.h
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* and nanoseconds */
};
/* Get current value of clock CLOCK_ID and store it in TP. */
extern int clock_gettime (clockid_t __clock_id, struct timespec *__tp) __THROW;
__clock_id:
.CLOCK_MONOTONIC -> 系统启动后到当前的时间
.CLOCK_REALTIME -> 从1970.1.1 到当前的时间