1. 进程的概念
进程在Linux系统里的描述
进程的生命周期、状态
PCB task_struct 包含哪些,从进程是做什么的、管理来检验
ZOMBIE fork STOP
2. COW:
子进程复制父进程的内存资源,然后资源的映射表上,将属性标记为只读。
当父进程或者子进程,不论谁要修改这个资源,会触发错误(因为被标记为了只读),进程缺页异常。
进入缺页异常处理,要处理各种情况,检查是不是非法访问还是请求调页。
pthread_create=>clone调用
会完全复制进程的资源,但有各自的task_struct
在用户空间get_pid返回的是进程id, TGID,线程在内核空间的pid在用户空间通过tid得到,适应posix标准
孤儿进程的收养
【fork】
4. 进程调度
目标:吞吐 、 响应
上下文切换:切换时间是一方面,另一方面是cache miss的影响
任务类型: CPU Bound,IO Bound=》调度的输入
2.6内核中的调度:
0~99实时进程,高优先级抢占低优先级,同优先级选择FIFO、RR调度算法
100~139普通进程,全优先权轮转,sleep、阻塞的时间会越长,优先级会越来越高;执行的时间越长,优先级越低。优先级越高得到的时间片越多。=》这的目的是IO Bound(阻塞、睡眠长)容易比调度到,增加系统的整体性能
新的补丁,RT门限:
规定在period的时间里RT最多跑runtime的时间
/proc/sys/kernel/sched_rt_period sched_rt_runtime
这样避免了RT进程出现异常时,无法退出CPU
普通进程的调度,CFS
vruntime += delta * NICE_0_LOAD/se.weight
se.weight进程权重,有优先级决定
pthread_setschedparam(pthread_self(), SCHED_FIFO, prio) 进程自己设置优先级?
chrt
5. 负载均衡
实时进程:N个优先级高的RT分布到N个核
pull_rt_task() push_rt_task()
普通进程:
周期性负责均衡
IDEL时负载均衡
fork exec时负载均衡
pthread_attr_setaffinity_np()
sched_setaffinity()
taskset
6. 中断负载均衡
/proc/irq/12/smp_affinity
可以将网卡的软中断队列分布到不同的核上
cpu0收到中断,软中断也会在cpu0上处理。对于单队列网卡使用RPS,将包处理负载均衡到多个CPU
echo fffe > /sys/class/net/eth1/queues/rx-0/rps_cpus
cgroup
将进程、线程分组,然后控制组的使用资源。在组内还是公平调度
cgroup规定了该组的资源使用率,cpu 内存 磁盘
android就是使用了cgroups。
apps组
bg_non_interactive组
docker 使用cgroups调整容器的资源使用率
cyclictest工具测试实时性
7. 四类区间
中断
软中断
进程spin_lock
以上三个不能抢占
进程可调度
PREEMPT_RT补丁
1)spinlock迁移为可调度的mutex。raw_spin_lock
2)实现优先级继承协议
3)中断线程化
4)软中断线程化