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

.

转载于:https://www.cnblogs.com/nju347/p/8419247.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值