1、Linux任务调度基本概念
1.1 task_struct
Linux系统上执行很多进程、线程,但在内核中这些都被称为“任务”,而内核调度的单位也是“任务”,即线程。
进程和线程的差别在于进程有单独的内存,而线程要和其他线程共享内存。一个进程可以包含很多个线程,所以进程可以理解为线程组。内核代码task_struct结构体里面,刚好有个线程组号tgid。当task_struct中pid与tgid相等时,那么这个线程/任务就是线程组的主线程,即进程号。
进程号和线程号变量在task_struct结构体内,源码在sched.h中,如下图:
注意,在Linux系统用户态,终端输入ps显示的pid是进程号,用户态的pthread提供了pthread_t来表示线程号,和内核是不同的。
1.2 cpu工作流程
cpu其实只做两件事:读指令和执行指令。
while(1){
读指令;
执行指令;
}
如上是cpu的工作流程,“指令”可以理解成一条条汇编语句。