linux 中的进程和线程都用 struct task
表示,区别在于线程共享了进程已创建的资源
,使用的资源更少,所以也叫 轻量级进程
。task 是调度的单位
任务有三种调度类,每个调度类型都有自己的任务队列
:
ddl和realtime组合起来有三种策略:
fair 类任务分为普通任务和后台任务两种调度策略:
CFS 即 Completely Fair Scheduling,在一段时间内,所有的任务运行时间一样
。但会优先调度优先级
高的任务,相应的,优先级高的任务每次运行的时间 vruntime
较少
我们根据 权重值
计算 vruntime:
权重值不等于优先级,内核中有一个 nice
值和权重值的转换表,nice 越低的权重越大,优先级越高,vruntime 越少,越先调度
每个CPU有自己的运行队列,根据调度类的不同分为三个运行队列,其中CFS调度队列用红黑树表示,其他两个都是普通的队列。
这几个调度类也分优先级:Deadline > Realtime > Fair,优先执行实时任务
可以通过调整nice值的方式实现,毕竟nice越少,vruntime越少,优先级越高
普通任务优先级可以调整的范围为:-20~19
,其中0为默认优先级。优先级会被映射到99139,这是普通任务的优先级范围,实时任务的优先级实际在098:
若想获得更高的优先级则需要更改调度策略
:
中断用于即时响应
硬件,会打断当前任务,调用 handler
响应。
关闭中断
,以防止再次被打断两部分
:软中断内核线程
的方式运行后半部分的handler被称为软中断handler,每个内核都有一个软中断内核线程,名字通常为:「ksoftirqd/CPU 编号」
内核也可以自定义
一些软中断事件,例如内核调度、RCU 锁等
这台服务器上显示了软中断事件类型、软中断累计运行次数、以及解释。一般来说,同一种中断在不同 CPU 上的累计次数相差不多
查看软中断内核线程
:
内核线程的名字外面都有有中括号,这说明 ps 无法获取它们的命令行参数
看 si
查看软中断变化速率
,可以通过这种方式定位开销最大的软中断:
1 | watch -d cat /proc/softirqs |
补码
存储数字,从而可以直接对二进制正负数进行加减近似值
表示,所以计算机计算到的某些浮点数结果只是近似值更详细的规则请见 IEEE 754 浮点数表示
使用科学计数法,存在 隐含1
7.22
和 15.95
位,故其有效数字为7-8位和15-16位什么是内核?