linux 内核研究--1--进程调度
内容组织:
一段牢骚+学习内容
1,一段牢骚
我是“半路出家”的。在大学过了两年的“必修课选逃,选修课必逃”的快乐时光后开始考虑未来。
本来打算大学毕业后读研来着,当时幸运,正好赶上金融危机,在把量子物理看了两遍后,感觉没戏
,于是就着急将来靠什么安身立命,思索再三,感觉网络工程师这个职业前途无量,于是在大三的暑
假来临前,在当当上买了本网络工程的书(第一次网购),以高考的状态看完后,又感觉没意思,后
来感觉平面设计前途无量,于是搜寻大量这方面的资料,还没来得及瞄一眼,就在一次学校举办的演
讲会上被专家定义为低端职业。走投无路时,有一个培训机构到我们学校笔试招人。于是就从图书馆
借了一本谭浩强的书,研习一晚,考了48分,义无反顾的加入了嵌入式的大军。。。
欲知后事如何,且听下回分解。说正事。。。
2,进程调度
2.1 概念
进程,程序,线程,调度。几乎所有介绍linux kernel的书上都有说明,并且说的很详细,生怕咱弄
混了。
2.2 进程调度
首先有几件事先说明一下:
1>进程调度程序独立于所有进程之外
2>2.4 和2.6内核的调度程序相差比较大,2.6进行了重写
3>在linux世界里,可以把进程和线程搞混,没有人会笑话你(本来他们就没多大差别)。
4>每个进程都有自己的第二代身份证(task struct),和身份证号码(PID)。
5>强调一下是第二代身份证,上面有芯片,它里面有内核管理这个进程的所有信息(32位机,1.7K左
右,)。
6>强调一下身份证号,不是无限大,默认32768,一般桌面系统够用了,但是对于大型server就可能不
够用,可以通过/proc/sys/kernel/pid_max修改
7>所有进程的身份证以一个双向链表联系在一起,current全局变量只是当前active的进程。
8>进程的身份证和上面芯片里的内容较多,它在<linux/sched.h>里面呆着呢,有兴趣可以自己探望
一下,先不说。
然后说一下调度算法:
调度准备:
0>每个CPU有一个执行队列
1>把把执行队列分为两类,可运行的和不可运行的,分别组成两个简单链表。
2>把可运行的再分成两个数组,活跃组和过时组。
3>两个数组又按优先级分成优先级个组,组每个元素包含这个优先级的可运行进程链表
4>每个数组元素主要包括一个160位的bitmap,当进程进入运行时,将与自己优先级对应的bit置位。
开始调度:
1>通过位图第一位,找到最高优先级的可运行进程
2>执行这个进程。
没了,当然没有这么简单,还有很多内容需要考虑。
next:
1,考虑重新计算时间片和动态修改进程优先级
2,考虑I/O消耗型进程和CPU消耗型进程
3,考虑多CPU情况下的负载平衡
说明:本人菜鸟,内容有错误之处,纯属无心,敬请指出。