Linux 进程概念补充【Linux】 进程是什么(不熟悉的兄弟可以看看)。
1. runqueue介绍
我们知道当进程处于运行(R)状态时会被链入运行队列中,那么运行队列长什么样子呢?
上图有两个一摸一样的结构array[0]和array[1]分别叫活跃队列,和过期队列 。先来介绍其字段的作用。
nr_activeb:表示总共有多少个运行状态的进程。
queue[140]:其中0-99用于实时操作系统 100到139表示我们分时操作系统的优先级(刚好对应我们的nice值)。如图:
最后一个字段bitmap[5](位图)是int类型的数组。有32*5(160)个比特位 我们用前140个来表示queue对应位置是否有task_struct。相当于每次遍历步长为32(一个4字节整形的比特数)以提高遍历效率。
2. O(1)调度算法
那么runqueue为啥要设计两份相同的字段呢?这就涉及其进程调度的逻辑了。
在操作系统学科中有非常多的进程调度算法,其中Linux(O)1调度算法算得上最优雅的调度算法之一了。
其中被cpu执行的queue叫活跃队列,在这期间过期队列接收从其他状态变为运行状态的进程或是活跃队列中时间片用完的进程。(保证公平性,减少进程饥饿)。
runqueue中有两个指针active指针和expired指针,分别指向活跃队列和过期队列。
当活跃队列占用一定时间的cpu后。Linux会交换active指针和expired指针。相当于过期队列变成了活跃队列,活跃队列变成了过期队列(无缝丝滑交换效率之高)。
所以无论从进程调度的效率方面来考虑还是进程调度的公平性Linux进程调度算法都相当优秀。
总结:
在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!