Minix 进程调度代码详解

Minix 进程调度代码详解

ID:42596246

大小:23.40 KB

页数:4页

时间:2019-09-18

Minix 进程调度代码详解_第1页
Minix 进程调度代码详解_第2页
Minix 进程调度代码详解_第3页
Minix 进程调度代码详解_第4页
资源描述:

《Minix 进程调度代码详解》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、1.Minix3中为每个进程分配的时间片,当进程的时间片用完后,将进行进程调度。进程的时间片以时钟滴答为单位进行分配。每次时钟中断,中断处理程序将减少当前进程的时间片。当时间片减小到0时,进行进程调度,选择一个合适的进程来拥有CPU。Minix3以每秒钟60次的频率进行时钟中断,即时钟中断处理程序每秒执行60次。每次执行,减少当前进程的时间片:/*Getnumberofticksandupdaterealtime.*/ticks=lost_ticks+1;/*lost_ticks为BIOS中断所花费的时间*/lost_ticks=0;/*lost_ticks清0*/real

2、time+=ticks;/*更新时间*/proc_ptr->p_user_time+=ticks;/*更新当前进程的user_time*/if(priv(proc_ptr)->s_flags&PREEMPTIBLE){/*如果进程可被抢占,则减少时间片*/proc_ptr->p_ticks_left-=ticks;}if(!(priv(proc_ptr)->s_flags&BILLABLE)){/*如果当前进程能付费,则修改sys_time及减少时间片*/bill_ptr->p_sys_time+=ticks;bill_ptr->p_ticks_left-=ticks;}如

3、果时间片用完,则向clock_task发送通知。因为该进程的时间片用完,需要重新调度,所以该进程就成为了上一个执行的进程。if((next_timeout<=realtime)

4、

5、(proc_ptr->p_ticks_left<=0)){/*如果定时器到期或者进程时间片用完,则进行调度*/prev_ptr=proc_ptr;/*当前进程成为上一次执行的进程*/lock_notify(HARDWARE,CLOCK);/*sendnotification*//*时间到期时发送通知给clock_task,由该函数进行后续处理*/}2.clock_task为时钟任务的主程序,用一个

6、无限循环等待并处理时钟中断处理程序发来的通知。没有通知发来时,处于阻塞状态。while(TRUE){/*获取消息*/receive(ANY,&m);/*无消息时则阻塞*//*检查消息类型,只处理时钟中断处理程序发来的消息*/switch(m.m_type){caseHARD_INT:/*这个消息由时钟中断处理程序(clock_handler)发出*/result=do_clocktick(&m);/*处理该消息,检查时间片是否到期等*/break;/*result变量没有实际意义*/default:/*illegalrequesttype*/kprintf("CLOCK:i

7、llegalrequest%dfrom%d.",m.m_type,m.m_source);}}3.当通过消息检查后,调用do_clocktick函数处理该消息。首先,检查是否是进程的时间片到期。如果时间片到期,则重置该进程的时间片,并插入到就绪队列的适当位置。将进程移出、移入就绪队列,就能完成为进程重新分配时间片和插入适当位置的任务。if(prev_ptr->p_ticks_left<=0&&priv(prev_ptr)->s_flags&PREEMPTIBLE){lock_dequeue(prev_ptr);/*将进程移出队列*/lock_enqueue(prev_p

8、tr);/*在将进程移入队列*/}lock_dequeue函数将屏蔽中断,然后调用函数dequeue将进程移出就绪队列。而函数lock_enqueue同样将屏蔽中断,然后调用函数enqueue。下面详细讨论enqueue函数。4.enqueue首先调用函数sched,计算函数的优先级和应分配的时间片。如果该进程为前一次运行过的进程,即进程连续运行过两次,则降低进程的优先级。否则该进程可能无限期的占用CPU。if(!time_left){/*时间片是否用完*/rp->p_ticks_left=rp->p_quantum_size;/*分配完整的时间片?*/if(prev_pt

9、r==rp)penalty++;/*是否要降低进程优先级?*/elsepenalty--;/*进程都没执行过,则增加进程的优先级*/prev_ptr=rp;/*该进程刚运行过*/}接下来,确定进程的优先级。Minix3中,共有16个优先级队列,最高为0,最低为15。进程优先级最大为其规定的优先级,最小不能小于IDLE进程的优先级,即最小为14。if(penalty!=0&&!iskernelp(rp)){/*惩罚值不为0,且该进程不是内核进程*/rp->p_priority+=penalty;/*根据惩罚值,确定新

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。