Linux进程管理框架简介:
1.Fork_init()、Sched_init() 用于初始化;
2.do_fork()用来创建一个新进程,并把进程插入全局链表&init_task;
3.Scheduler_tick()由时钟中断处理函数调用(OS是基于时钟中断来实现基于时间片的多进程调度),用来更新当前进程的时间片,判断进程的时间片是否用完,并把进程插入对应的链表;
4.Schedule()实现进程的调度;
.
下图是进程PID管理的框架图:
1. 当我们要根据pid查找对应进程时,顺序扫描进程链表并检查进程描述符的pid字段是可行但相当低效的;
2. 引入hash散列表的目的是为了加快进程的查找;
3. 通过整形的hash算法(见下面的代码实例)计算pid的hash值,把具有相同hash值的pid组成一个链表;
4. 当我们要查找一个进程,先计算pid的hash值,再在对应链表pid_hash[n]里面根据pid查找,这样会快很多。
.
下面是整形的hash算法一个小例子(来源Linux源代码):
1. hash_long()会把pid的hash值限制在[0, 2^pidhash_shift-1] ;
//bits值越小用的hashtable的空间越小 unsigned long hash_long(unsigned long val, unsigned int bits) { unsigned long hash = val * 0x9e370001UL; return hash >> (32 - bits); } int hash(void) { int pid; int pidhash_shift = 5; for(pid = 0; pid <=1221; pid++){ printf("pid:%d--->hash:%d\n", pid, hash_long(pid, pidhash_shift)); } return 0; }
下图显示hash值被限制在 [0, 31]之间 (31 = 2^5-1) :
.