init进程
在内核启动时,会有一个init_task进程,他是所有进程的鼻祖,又称0号进程。当系统没有进程需要调度时候,会执行idle进程。
进程控制块PCB
内核栈
通常内核栈大小为8KB,即两个物理页面的大小。他存在于内核映像文件的.data段中,由编译时分配好。ARM32处理器从汇编跳转到startkernel前,设置好SP指针指向栈顶。
进程创建
最终都是调用内核里的do_fork()函数。
进程分类
按调度需求,进程分为:
交互式进程,如鼠标键盘,特点是要求相应快;
批处理进程,特点是需要很大算力或资源;
实时进程,特点是对延时要求严格,如vr设备,延时太大会眩晕,工控设备延时太大会出事故。
CFS调度器
完全公平调度
内核使用0139表示优先级,数值越低,优先级越高。100139给普通进程使用。用户空间有个nice值映射到普通进程优先级100~139.。
cfs定义了一种新的模型,它给cfs_rq(cfs的run queue)中的每一个进程安排一个虚拟时钟,vruntime。如果一个进程得以执行,随着时间的增长(也就是一个个tick的到来),其vruntime将不断增大。没有得到执行的进程vruntime不变。而调度器总是选择vruntime跑得最慢的那个进程来执行。这就是所谓的“完全公平”。为了区别不同优先级的进程,优先级高的进程vruntime增长得慢,以至于它可能得到更多的运行机会。
进程状态
R, TASK_RUNNING:就绪态或者运行态,进程就绪可以运行,但是不一定正在占有CPU
S, TASK_INTERRUPTIBLE:浅度睡眠,等待资源,可以响应信号,一般是进程主动sleep进入的状态
D, TASK_UNINTERRUPTIBLE:深度睡眠,等待资源,不响应信号,典型场景是进程获取信号量阻塞
Z, TASK_ZOMBIE:僵尸态,进程已退出或者结束,但是父进程还不知道,没有回收时的状态
T, TASK_STOPED:停止,调试状态,收到SIGSTOP信号进程挂起。