系统调用中断

系统调用时中断,一般主要发生在被阻塞的系统调用中,此类系统调用大多为慢系统调用。在阻塞期间,被阻塞的进程收到了不可屏蔽的信号,由系统将信号写入该阻塞进程信号描述符,然后强行将进程状态从TASK_INTERRUPTABLE改变至TASK_RUNNING,调用schedule()函数执行,由于进程之前一直被阻塞,而linux是交互型系统,因此,阻塞时间越长,进程动态优先级会被调高,因此该进程能在极短的时间内得到相应。但此时,系统调用需要完成的工作并没完成,提前返回将导致错误,设置errno为EINTR。读到这里,会觉得有点迷惑,信号处理程序到底在哪执行,不着急,见说明。

接下来对一些提到的概念进行说明:

  1. 慢系统调用    慢系统调用术语适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用永远无法返回,多数网络支持函数都属于这一类。如:若没有客户连接到服务器上,那么服务器的accept调用就会一直阻塞,直到进程exit时。慢系统调用可以被永久阻塞,包括以下几个类别:
    (1)读写‘慢’设备(包括pipe,终端设备,网络连接等)。若此时针对设备打开的文件描述符为阻塞型,因此文件描述符时,数据不存在,需要等待;写时,缓冲区满或其他原因,需要等待。读写磁盘文件一般不会阻塞。
    (2)当打开某些特殊文件时,需要等待某些条件,才能打开。例如:打开中断设备时,需要等到连接设备的modem响应才能完成。
    (3)pause和wait函数。pause函数使调用进程睡眠,直到捕获到一个信号。wait等待子进程终止。
    (4)某些IPC操作,如IPC信号量机制,若当前信号量不可用,则要在该信号量上进行操作的进程阻塞,将自身进程描述符与要在该信号量上进行的操作一同写入信号量的阻塞进程队列。
  2. 系统如何将信号通知到进程 信号分为同步信号与异步信号,在程序中采用kill或者killall命令发出的软信号,姑且称之为同步信号,当在键盘上按下CTR+C发出的SIGINT信号姑且称之为异步信号,但是无论如何这些信号都需要内核部分进行处理(系统调用陷入内核,中断处理需要内核),假设信号接收进程为p,此时内核会根据对p的进程描述符中信号描述相应信号进行置位,并修改进程状态到TASK_RUNNING。
  3. linux进程阻塞时间越长,动态优先级越高 linux系统在进程优先级方面着重考虑实时性进程有限和交互型进程优先,尤以实时性进程为甚。这里只谈谈普通的交互型进程优先级,普通进程优先级有两种表达方式,静态优先级和动态优先级:静态优先级从父进程处继承,并以此为据分配时间片;动态优先级以静态优先级为基础,可以动态改变,以此作为进程调度的依据,那么动态改变的依据是什么呢?   由于linux系统是交互型系统,因此姑且认为进程阻塞睡眠时,其正在进行io通信,故对于睡眠时间越长的进程,对其进行奖赏,调高其优先级。当该进程可以从睡眠中醒来时,则可以很快得到处理机。(可以这样理解,在终端输入shell命令的时候,总是希望系统可以很快响应,假设进程优先级不能动态改变,输入命令后,进程还得去同优先级队列中排队等候执行,此时用户感觉肯定就慢了,因此,在用户进行输入的时候系统认为当前进程阻塞,调高其动态优先级,当输入完成时,则可以更快响应执行)。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值