日期:2014-05-16  浏览次数:20607 次

(莱昂氏unix源代码分析导读-23) 若干系统调用的实现

           

                                                                                           By cszhao1980

                                                                                                 

System call是提供给user进程的接口,使其可以主动进入内核,完成一些特殊的操作。

 

多数的sys call的实现很简单,莱昂留给大家分析,我在这里多说几句。

首先是35号系统调用——sleep。这个system callsslep()函数处理,它的实现比较简单,

我们唯一需要注意的是,它的参数是通过r0传入的。当user进程要休眠一段时间时,会

调用此函数——其参数为醒来的时间。而sslep会用输入时间同tout[ ]数组内记录的下次叫

醒时间作比较,如果早于tout[ ]则更新tout[ ],然后以tout[ ]数组的首地址为睡眠id,调用

sleep(汇编)例程进入睡眠。

 

显然,所有调用sleep sys call的进程都使用同样的睡眠id,而系统也仅仅记录了第一个要醒来

的时间(即tout数组)。这样,在进行进程唤醒时,所有进程都会醒来。因此,必须在进程醒

来后作一些额外(以确定是否需要再次睡眠)的工作。这样的设计似乎有些低效——莱昂也

提到了这一点。

 

然后是第35sys call——nice,用来设置p_nice值,p_nice会用在setpri()那个古怪的算法里。显然,

用户进程可以通过设置nice来改变自己的优先级,但是根据setpri()的算法来看,其影响是有限的。

 

还有第43sys call——times2955: 1, &times, /* 43 = times */),用来获取与进程相关的6种时间。

 

04