Linux进程管理

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) :

.

posted @ 2018-02-05 20:06  zhuqingzhu  阅读(344)  评论(0编辑  收藏  举报