进程调度负责决定哪个进程投入运行,何时运行以及运行多长时间。
进程调度:非抢占式和抢占式
Linux这么酷的系统当然是抢占式的喽。
进程在被抢占之前可以运行的时间是预先设定好的,叫做时间片。有效管理时间片能使调度程序从系统全局角度作出调度决定,避免个别进程独占系统资源。
I/O消耗型/处理器消耗型
I/O消耗型:进程的大部分时间用来提交I/O请求或是等待I/O请求,这样的进程经常处于可运行状态,但通常只运行很短时间,在等待I/O时会阻塞。
处理器消耗型:进程大部分时间都在执行代码,除非被抢占,否则一直执行,没太多I/O需求。调度器不应该经常让他们执行,应尽量降低它们的调度频率,而延长其运行时间。
调度策略就是要在这两个矛盾中寻找平衡:进程响应迅速(响应时间短)和最大系统利用率(高吞吐量),linux倾向于优先调度IO消耗性。
时间片:进程在被抢占前所能持续运行的时间。
时间片过长会导致系统对交互响应表现欠佳,时间片太短会明显增加进程切换耗时。
IO消耗型不需要长的时间片,而处理器消耗型的进程希望越长越好(提高高速缓存命中率)。
Linux的CFS调度器没有直接分配时间片到进程,而是分配处理器的使用比。这样进程所获得的处理器时间其实是和系统负载密切相关的,这个比例进一步还会受进程nice值(优先级)影响。具有更小nice值的进程会被赋予高权重,从而有用更多的处理器使用比。
我们先来看在什么情况下要执行调度程序。
Linux调度时机主要有:
1)Process/thread creation Process/thread exit