日期:2014-05-16 浏览次数:20643 次
By cszhao1980
System call是提供给user进程的接口,使其可以主动进入内核,完成一些特殊的操作。
多数的sys call的实现很简单,莱昂留给大家分析,我在这里多说几句。
首先是35号系统调用——sleep。这个system call由sslep()函数处理,它的实现比较简单,
我们唯一需要注意的是,它的参数是通过r0传入的。当user进程要休眠一段时间时,会
调用此函数——其参数为醒来的时间。而sslep会用输入时间同tout[ ]数组内记录的下次叫
醒时间作比较,如果早于tout[ ]则更新tout[ ],然后以tout[ ]数组的首地址为睡眠id,调用
sleep(汇编)例程进入睡眠。
显然,所有调用sleep sys call的进程都使用同样的睡眠id,而系统也仅仅记录了第一个要醒来
的时间(即tout数组)。这样,在进行进程唤醒时,所有进程都会醒来。因此,必须在进程醒
来后作一些额外(以确定是否需要再次睡眠)的工作。这样的设计似乎有些低效——莱昂也
提到了这一点。
然后是第35号sys call——nice,用来设置p_nice值,p_nice会用在setpri()那个古怪的算法里。显然,
用户进程可以通过设置nice来改变自己的优先级,但是根据setpri()的算法来看,其影响是有限的。
还有第43号sys call——times(2955: 1, ×, /* 43 = times */),用来获取与进程相关的6种时间。
04