TASK_INTERRUPTIBLE 和TASK_UNINTERRUPTIBLE
TASK_INTERRUPTIBLE 和TASK_UNINTERRUPTIBLE
TASK_INTERRUPTIBLE 和TASK_UNINTERRUPTIBLE 的区别
TASK_INTERRUPTIBLE是可以被信号和wake_up()唤醒的,当信号到来时,进程会被设置为可运行。
而TASK_UNINTERRUPTIBLE只能被wake_up()唤醒。
信号本质
信号是在软件层次上对中断机制的一种模拟,软中断
信号来源
信号事件的发生有两个来源:
硬件来源:(比如我们按下了键盘或者其它硬件故障);
软件来源:最常用发送信号的系统函数是kill, raise,
alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。
区分是什么原因唤醒进程,用signal_pending( current
);
检查当前进程是否有信号处理,返回不为0表示有信号需要处理。-ERESTARTSYS
表示信号函数处理完毕后重新执行信号函数前的某个系统调用。也就是说,如果信号函数前有发生系统调用,在调度用户信号函数之前,内核会检查系统调用的返回
值,看看是不是因为这个信号而中断了系统调用.如果返回值-ERESTARTSYS,并且当前调度的信号具备-ERESTARTSYS属性,系统就会在用
户信号函数返回之后再执行该系统调用。
实例:
186 static int inet_csk_wait_for_connect(struct sock *sk, long timeo)
187 {
188 struct inet_connection_sock *icsk = inet_csk(sk);
189 DEFINE_WAIT(wait);
190 int err;
191
192 /*
193 * True wake-one mechanism for incoming connections: only
194 * one process gets woken up, not the 'whole herd'.
195 * Since we do not 'race & poll' for established sockets
196 * anymore, the common case will execute the loop only once.
197 *
198 * Subtle issue: "add_wait_queue_exclusive()" will be added
199 * after any current non-exclusive waiters, and we know that
200 * it will always _stay_ after any new non-exclusive waiters
201 * because all non-exclusive waiters are added at the
202 * beginning of the wait-queue. As such, it's ok to "drop"
203 * our exclusiveness temporarily when we get woken up without
204 * having to remove and re-insert us on the wait queue.
205 */
206 for (;;) {
207 prepare_to_wait_exclusive(sk->sk_sleep, &wait,
208 TASK_INTERRUPTIBLE);
209 release_sock(sk);
210 if (reqsk_queue_empty(&icsk->icsk_accept_queue))
211 timeo = schedule_timeout(timeo);
212 lock_sock(sk);
213 err = 0;
214 if (!reqsk_queue_empty(&icsk->icsk_accept_queue))
215 break;
216 err = -EINVAL;
217 if (sk->sk_state != TCP_LISTEN)
218 break;
219 err = sock_intr_errno(timeo);
220 if (signal_pending(current))
221 break;
222 err = -EAGAIN;
223 if (!timeo)
224 break;
225 }
226 finish_wait(sk->sk_sleep, &wait);
227 return err;
228 }
TASK_INTERRUPTIBLE 和TASK_UNINTERRUPTIBLE的更多相关文章
- 睡眠--TASK_INTERRUPTIBLE and TASK_UNINTERRUPTIBLE
http://i.cnblogs.com/EditPosts.aspx?opt=1 Two states are associated with sleeping, TASK_INTERRUPTI ...
- android开发读书笔记
第九章心得: HAL ( Hardware Abstraction Layer,硬件抽象腔,〉是建立在Linux驱动之上的一套翻字库.这套程序 j率并不属于 Linux 内核, 而是属于 Linux ...
- Linux内核创建一个新进程
张雨梅 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 创建新进程 如果同一个程序被多 ...
- 《Linux内核分析》之第四章读书笔记
4.1多任务 多任务操作系统:同时并发地交互执行多个进程的操作系统 多任务操作系统会使多个进程处于堵塞或者睡眠状态.这些任务尽管位于内存,但是并不处于可运行状态.这些进程利用内核堵塞自己,直到某一事件 ...
- 20135202闫佳歆--week 8 课本第4章学习笔记
第四章 进程调度 一.多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统. 多任务操作系统使多个进程处于堵塞或者睡眠状态,实际不被投入执行,这些任务尽管位于内存,但是并不处于可运行状态. ...
- linux进程调度之 FIFO 和 RR 调度策略
转载 http://blog.chinaunix.net/uid-24774106-id-3379478.html linux进程调度之 FIFO 和 RR 调度策略 2012-10-19 18 ...
- Linux驱动设计——阻塞和同步
阻塞和非阻塞是设备访问的两种基本方式,阻塞和非阻塞驱动程序使用时,经常会用到等待队列. 阻塞和非阻塞 阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作.被挂起的 ...
- 使用latencytop深度了解你的系统的延迟(转)
转载自系统技术非业余研究 http://blog.yufeng.info/archives/1239 我们在系统调优或者定位问题的时候,经常会发现多线程程序的效率很低,但是又不知道问题出在哪里,就知道 ...
- 《Linux内核设计与实现》读书笔记(十)- 内核同步方法【转】
转自:http://www.cnblogs.com/wang_yb/archive/2013/05/01/3052865.html 内核中提供了多种方法来防止竞争条件,理解了这些方法的使用场景有助于我 ...
随机推荐
- MongoDB学习笔记-数据库命令
概念 数据库命令(database command)是一种非常特殊类型的查询.文档的创建.更新.删除及查询都属于数据库命令的范畴,它还包含管理性的任务(比如关闭服务器和克隆数据库).统计数据及执行聚合 ...
- Json.Net使用JSON Schema验证JSON格式【实例】
给出一个Json,验证其格式是否符合规则. { "coord": { //对象 "lon": 145.77, "lat": -16.92 } ...
- ThinkPHP技巧
在php文件可以用 echo D_S()->getLastSql();来打印出 当前的sql语句
- 设置浮点数的显示精度&precision(0)
/* 设置浮点数的显示精度 cout.precision(int)可以设置浮点数的显示精度(不包括小数点) 注: 1.如果设置的精度大于浮点数的位数,如果浮点数能根据IEEE ...
- 转载:JS快速获取图片宽高的方法
快速获取图片的宽高其实是为了预先做好排版样式布局做准备,通过快速获取图片宽高的方法比onload方法要节省很多时间,甚至一分钟以上都有可能,并且这种方法适用主流浏览器包括IE低版本浏览器. 我们一步一 ...
- android 通过工具抓包
工具: 1.tcpdump :http://www.strazzere.com/android/tcpdump 2.wireshark:http://pan.baidu.com/s/1geooiav ...
- JavaScript对象进阶
要了解JavaScript对象,我们可以从对象创建.属性操作.对象方法这几个方面入手.概括起来,包括以下几模块: 1.创建对象 1.1 对象直接量 对象直接量是创建对象最简单的方式,由若干名/值对组成 ...
- bzoj 1196 二分+生成树判定
我们先二分一个答案,对于每个答案,先加一级公路,如果不够k直接break, 然后再加二级公路,加的过程类似Kruskal. /************************************* ...
- JAVA 关于Icon,Image,ImageIcon的简单的对比参考 分类: Java Game 2014-08-14 17:08 210人阅读 评论(0) 收藏
转自:http://blog.csdn.net/bcmissrain/article/details/7190886 其实就算是现在,我还是有不少地方概念模糊,但是下面的内容是是没有什么问题的.稍微介 ...
- NENU_CS_segment_tree
单点更新 http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意:单点更新加减,区间查询求和. #include<cstdio> #define ...