1.process:一个独立运行单位
系统资源:cpu时间,存储空间
2.OS: VM
CPU:
时间:切片
缓存:缓存当前进程数据
进程切换:保存现场、恢复现场
内存:线性地址<-- 物理地址
空间:映射
I/O:内核--》进程
3. 进程描述符:创建一个进程首先要添加一个进程的描述符,并添加到双向链表
进程描述符文件保存在内核中,当线程切换时,就会把stack pointer, other registers,EIP register ect保存到进程描述符文件中。
进程元数据
双向链表
linux上进程有5种状态:
运行(正在运行或在运行队列中等待)
中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行)
3.1. 进程切换是由内核控制的,会有进程的上下文切换,所以会有内核占用时间,用户进程占用时间,内核空间到用户空间到内核空间到用户空间切换。
所以进程切换太快,会有很多时间是消耗在内核上,切换太慢,就意味程序响应太慢
3.2. linux支持进程抢占,但是在一定的时间里才能抢占,系统内部有个时钟控制 tick
3.3. Linux进程类别
交互式进程(I/O):IO密集型 时间片短,优先高
批处理进程:CPU密集型的,时间片长,优先级低
实时进程:优先级非常高的 ,优先级高
3.4. Linux优先级
实时优先级(1-99 数字越小,优先级越低)
静态优先级(100-139 数字越小,优先级越高)
实时优先级比静态优先级高 内核进程都为实时 的
查看优先级:
CLS:调度类别
-e:显示所有线程
-o:自定义显示字段
class:调度类别
rtprio:实时优先级
pri:优先级
nice:调整静态优先级 从-20 到19 (与静态优先级一一对应) 分别对应100 到139
cmd:加了中括号的表示内核进程
4.linux的调度类别
实时进程 :
SCHED_Other:用来调度用户空间进程 TS
SCHED_FIFO (first in first out) FF
SCHED_RR (Round Robin)
动态优先级:
内核监控会监视长时间没有运行的进程,进行临时调高优先级。主要针对 SCHED_Other
4.1.如何手动调整优先级
100-139:nice
nice N COMMAND
renice -n # PID
1-99: 调整实时优先级
chrt -f -p [prio] PID
chrt -r -p [prio] PID
启动一个进程时调整优先级:chrt -f -p [prio] COMMAND
5. 创建进程
每一个进程都是由父进程通过fork()生成,第一个进程 :init