首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

读/写阻塞的系统调用是否将进程置于TASK_UNINTERRUPTIBLE或TASK_INTERRUPTIBLE状态?

读/写阻塞的系统调用会将进程置于TASK_INTERRUPTIBLE状态。

当进程执行读/写阻塞的系统调用时,如果所需的数据还未准备好或者写入操作无法立即完成,进程将被置于TASK_INTERRUPTIBLE状态。在这种状态下,进程会暂停执行,等待数据准备好或者写入操作完成。进程处于TASK_INTERRUPTIBLE状态时,可以通过信号唤醒,例如当数据准备好或者写入操作完成时,内核会发送一个信号给进程,使其从阻塞状态中唤醒。

相比之下,TASK_UNINTERRUPTIBLE状态与TASK_INTERRUPTIBLE状态类似,但不会对信号做出响应。进程在TASK_UNINTERRUPTIBLE状态下无法被信号唤醒,只能等待所需的数据准备好或者写入操作完成后才能继续执行。

需要注意的是,进程在执行读/写阻塞的系统调用时,会根据具体情况选择置于TASK_INTERRUPTIBLE状态还是TASK_UNINTERRUPTIBLE状态。这取决于系统调用的实现和内核的策略。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux系统进程状态

例如,在进程对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行操作,而read系统调用最终执行到对应设备驱动代码,并与对应物理设备进行交互),可能需要使用TASK_UNINTERRUPTIBLE...然后wait系列系统调用会顺便进程尸体(task_struct)也释放掉。...孤儿状态进程退出,相应一个多个子进程还在运行,那么那些子进程处于孤儿状态,成为孤儿进程。这些进程会被托管给别的进程,托管给谁呢?...而进程从TASK_RUNNING状态变为非TASK_RUNNING状态,则有两种途径: 1、响应信号而进入TASK_STOPED状态TASK_DEAD状态; 2、执行系统调用主动进入TASK_INTERRUPTIBLE...状态(如nanosleep系统调用)、TASK_DEAD状态(如exit系统调用);由于执行系统调用需要资源得不到满足,而进入TASK_INTERRUPTIBLE状态TASK_UNINTERRUPTIBLE

10.1K41

Linux进程状态

一.简介 进程初始状态 进程是通过fork系列系统调用(fork、clone、vfork)来创建,内核(内核模块)也可以通过kernel_thread函数创建内核进程。...而进程从TASK_RUNNING状态变为非TASK_RUNNING状态,则有两种途径: 1、响应信号而进入TASK_STOPED状态TASK_DEAD状态; 2、执行系统调用主动进入TASK_INTERRUPTIBLE...状态(如nanosleep系统调用)、TASK_DEAD状态(如exit系统调用);由于执行系统调用需要资源得不到满足,而进入TASK_INTERRUPTIBLE状态TASK_UNINTERRUPTIBLE...(参见《linux内核异步中断浅析》) 在进程对某些硬件进行操作时(比如进程调用read对某个设备文件进行操作,而read系统调用最终执行到对应设备驱动代码,并与对应物理设备进行交互),可能需要使用...父进程可以通过wait系列系统调用(如wait4、waitid)来等待某个某些子进程退出,并获取它退出信息。然后wait系列系统调用会顺便进程尸体(task_struct)也释放掉。

5.5K50
  • 【Linux 内核】进程管理 ( Linux 内核中进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE )

    文章目录 一、Linux 内核中进程状态 二、TASK_RUNNING 状态 三、TASK_RUNNING 状态 四、TASK_UNINTERRUPTIBLE 状态 五、__TASK_STOPPED...状态 六、EXIT_ZOMBIE 状态 一、Linux 内核中进程状态 ---- Linux 内核 为 进程管理 提供了一系列 API , 如 TASK_RUNNING TASK_INTERRUPTIBLE...TASK_UNINTERRUPTIBLE __TASK_STOPPED EXIT_ZOMBIE 二、TASK_RUNNING 状态 ---- TASK_RUNNING : 表示 执行状态 就绪状态...: 表示 可中断睡眠状态 ; 进程进入到该状态进行阻塞 , 一旦 执行条件达成 , 立刻 中断阻塞 , 开始执行进程 , 进入 TASK_RUNNING 状态 ; 该状态又称为 " 浅睡眠状态 " ;..., 在阻塞状态太下 , 不受干扰 , 不接收任何外部信号 ; 使用 ps aux 命令查看进程时 , 标记为 D 状态 是该 TASK_UNINTERRUPTIBLE 状态 , 该状态进程不能被杀死

    61720

    你真的懂Linux内核中阻塞和异步通知机制吗?

    阻塞/非阻塞简介 阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作条件后再进行操作。被挂起进程进入睡眠状态,被从调度器运行队列移走,直到等待条件被满足。...阻塞方式访问设备时,如果设备不可操作,那么进程就会进入休眠状态。等待队列就是来完成进程休眠操作一种数据结构。...,这两个函数会将这个等待队列头中所有进程都唤醒 wake_up函数可以唤醒处于 TASK_INTERRUPTIBLETASK_UNINTERRUPTIBLE状态进程,而wake_ up_ interruptible...如果没有文件可以读取,那么就会根据 timeout参数来判断是否超时。可以 reads设置为NULL,表示不关心任何文件变化。...writefds和 reads类似,只是 writers用于监视这些文件是否可以进行操作。

    1.6K20

    宋宝华: 聊一聊进程深度睡眠TASK_KILLABLE这个状态

    众所周知,Linux进程睡眠有两种常规状态TASK_INTERRUPTIBLE(浅度睡眠):可以被等待资源唤醒,也能被signal唤醒; TASK_UNINTERRUPTIBLE(深度睡眠):可以被等待资源唤醒...调用__set_current_state(TASK_INTERRUPTIBLE)并schedule()出去进程,醒来第一件事往往就是通过signal_pending(current)查看信号是否存在...正在读本文你,可能都有过这样悲催经历,在NFS文件系统上面运行程序,但是NFS服务器挂了,你怎么都ctrl + c不掉那个进程,因为它就是个深度睡眠场景。...你徘徊,你迷茫,你问能不能直接都改为TASK_INTERRUPTIBLE,彻底删除TASK_UNINTERRUPTIBLE呢? 对此,祖师爷Linus答复是:不可能。请看他2002年邮件: ?...那么是不是只有信号9,才可以杀死TASK_KILLABLE进程,信号2(CTRL+C)是否无能为力呢?

    2.3K30

    宋宝华:可以杀死深度睡眠TASK_KILLABLE状态(最透彻一篇)

    深度睡眠与浅度睡眠 众所周知,Linux进程睡眠有两种常规状态TASK_INTERRUPTIBLE(浅度睡眠):可以被等待资源唤醒,也能被signal唤醒; TASK_UNINTERRUPTIBLE...调用__set_current_state(TASK_INTERRUPTIBLE)并schedule()出去进程,醒来第一件事往往就是通过signal_pending(current)查看信号是否存在...你徘徊,你迷茫,你问能不能直接都改为TASK_INTERRUPTIBLE,彻底删除TASK_UNINTERRUPTIBLE呢? 对此,祖师爷Linus答复是:不可能。请看他2002年邮件: ?...磁盘很大程度上不一定是read系统调用引发,考虑到代码段、数据段、堆和栈往往是发生了page fault后才去从磁盘swap进来。...那么是不是只有信号9,才可以杀死TASK_KILLABLE进程,信号2(CTRL+C)是否无能为力呢?

    1.5K20

    Linux编程(阻塞和非阻塞IO)

    阻塞应用程序通常使用select系统调用查询是否可以对设备进行无阻塞访问最终会引发设备驱动中 poll 函数执行。...非阻塞I/O操作在应用层通常会用到select()和poll()系统调用查询是否可对设备进行无阻塞访问。select()和poll()系统调用最终会引发设备驱动中poll()函数被调用。...poll_wait()函数,将对应等待队列头添加到poll_table 返回表示是否能对设备进行无阻塞,写访问掩码 驱动函数中poll()函数典型模板如下: static unsigned int...return mask; } 三、总结 阻塞与非阻塞操作: 定义并初始化等待对列头; 定义并初始化等待队列; 把等待队列添加到等待队列头 设置进程状态TASK_INTERRUPTIBLE(可以被信号打断...)和TASK_UNINTERRUPTIBLE(不能被信号打断)) 调用其它进程

    5.5K20

    linux每日命令(34):ps命令和pstree命令

    (参见《linux内核异步中断浅析》)在进程对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行操作,而read系统调用最终执行到对应设备驱动代码,并与对应物理设备进行交互),可能需要使用...只能等到调试进程通过ptrace系统调用执行PTRACE_CONT、PTRACE_DETACH等操作(通过ptrace系统调用参数指定操作),调试进程退出,被调试进程才能恢复TASK_RUNNING...进程初始状态 进程是通过fork系列系统调用(fork、clone、vfork)来创建,内核(内核模块)也可以通过kernel_thread函数创建内核进程。...而进程从TASK_RUNNING状态变为非TASK_RUNNING状态,则有两种途径:1、响应信号而进入TASK_STOPED状态TASK_DEAD状态;2、执行系统调用主动进入TASK_INTERRUPTIBLE...状态(如nanosleep系统调用)、TASK_DEAD状态(如exit系统调用);由于执行系统调用需要资源得不到满足,而进入TASK_INTERRUPTIBLE状态TASK_UNINTERRUPTIBLE

    2.3K30

    关于 Linux 进程睡眠和唤醒 ,来看这篇就够了~

    Linux 中进程睡眠状态有两种:一种是可中断睡眠状态,其状态标志位 TASK_INTERRUPTIBLE; 另一种是不可中断 睡眠状态,其状态标志位为 TASK_UNINTERRUPTIBLE...在现代 Linux 操作系统中,进程一般都是用调用 schedule() 方法进入睡眠状态,下面的代码演示了如何让正在运行进程进入睡眠状态。... TASK_UNINTERRUPTIBLE 进程调度,那么还有一个附加步骤将被执行:当前执行进程在另外一个进程被调度之前会被从运行队列中移出,这将导致正在运行那个进程进入睡眠,因为 它已经不在运行队列中了...() 把自己加入到等待队列中,并且进程状态设置为TASK_INTERRUPTIBLE 或者 TASK_INTERRUPTIBLE。...小结 通过上面的讨论,可以发现在 Linux 中避免进程无效唤醒关键是在进程检查条件之前就将进程状态置为 TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE,并且如果检查条件满足的话就应该将其状态重新设置为

    2.3K90

    Linux进程Uninterruptible sleep(D)状态

    Linux进程睡眠状态有2种:     一种是可中断睡眠,其标志位是TASK_INTERRUPTIBLE ,可中断睡眠状态进程会睡眠直到某个条件变为真,比如说产生一个硬件中断、释放进程正在等待系统资源或是传递一个信号都可以是唤醒进程条件...一种睡眠是不可中断睡眠,其标志位是TASK_UNINTERRUPTIBLE ,把信号传递到这种睡眠状态进程不能改变它状态,也就是除非等待资源得到满足,否则就是怎么kill,这个进程也不会变成TASK_RUNNING...在对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行操作,而read系统调用最终执行到对应设备驱动代码,并与对应物理设备进行交互),可能需要TASK_UNINTERRUPTIBLE...通常情况下TASK_UNINTERRUPTIBLE状态是非常短暂,通过ps命令基本上不可能捕捉到。进程又是为什么会被置于 uninterruptible sleep 状态呢?...NFS 卷不可访问导致进程进入 D状态,那么可以通过恢复该 NFS 卷连接来使进程 IO 请求得到满足,除此之外,要想干掉处在 D 状态进程就只能重启整个 Linux 系统了。

    10.6K10

    Linux 进程调度之schdule主调度器

    直接调用主调度器schdule函数场景有3种: (1)当前进程需要等待某个条件满足才能继续运行时,调用一个wait_event()类函数将自己状态设为TASK_INTERRUPTIBLE或者TASK_UNINTERRUPTIBLE...(不等待任何事件)时,调用一个sleep()类函数将自己状态设为TASK_INTERRUPTIBLE或者TASK_UNINTERRUPTIBLE但不进入任何等待队列,然后设置一个合适唤醒定时器,最后调用...: (1)如果内核可抢占(CONFIG_PREMPT=y): 在系统调用异常上下文中,在下一次调用preempt_enable()时检查是否需要抢占调度。...由于进程不是运行态:TASK_RUNNING了,那么就不能在CFS就绪队列中了,那么就调用 deactivate_task 陷入阻塞进程移除CFS就绪队列,并将进程调度实体 on_rq 成员置0...通常主动请求调用之前会提前设置当前进程运行状态TASK_INTERRUPTIBLE 或者 TASK_UNINTERRUPTIBLE

    1.8K20

    Linux进程描述符task_struct结构体详解--Linux进程管理与调度(一)【转】

    状态 描述 TASK_RUNNING 表示进程要么正在执行,要么正要准备执行(已经就绪),正在等待cpu时间片调度 TASK_INTERRUPTIBLE 进程因为等待一些条件而被挂起(阻塞)而所处状态...这些条件主要包括:硬中断、资源、一些信号……,一旦等待条件成立,进程就会从该状态阻塞)迅速转化成为就绪状态TASK_RUNNING TASK_UNINTERRUPTIBLE 意义与TASK_INTERRUPTIBLE...新增睡眠状态 如前所述,进程状态 TASK_UNINTERRUPTIBLETASK_INTERRUPTIBLE 都是睡眠状态。...进程置为睡眠状态普通方法是进程状态设置为 TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE调用调度程序 schedule() 函数。...如果进程处于可中断模式睡眠状态(通过将其状态设置为 TASK_INTERRUPTIBLE),那么可以通过显式唤醒呼叫(wakeup_process())需要处理信号来唤醒它。

    2.3K20

    关于 Linux 进程睡眠和唤醒 ,来看这篇就够了~

    Linux 中进程睡眠状态有两种:一种是可中断睡眠状态,其状态标志位 TASK_INTERRUPTIBLE; 另一种是不可中断 睡眠状态,其状态标志位为 TASK_UNINTERRUPTIBLE...在现代 Linux 操作系统中,进程一般都是用调用 schedule() 方法进入睡眠状态,下面的代码演示了如何让正在运行进程进入睡眠状态。... TASK_UNINTERRUPTIBLE 进程调度,那么还有一个附加步骤将被执行:当前执行进程在另外一个进程被调度之前会被从运行队列中移出,这将导致正在运行那个进程进入睡眠,因为 它已经不在运行队列中了...() 把自己加入到等待队列中,并且进程状态设置为TASK_INTERRUPTIBLE 或者 TASK_INTERRUPTIBLE。...小结 通过上面的讨论,可以发现在 Linux 中避免进程无效唤醒关键是在进程检查条件之前就将进程状态置为 TASK_INTERRUPTIBLE TASK_UNINTERRUPTIBLE,并且如果检查条件满足的话就应该将其状态重新设置为

    7.5K10

    等待队列

    基础介绍 等待队列很早就作为一个基本功能单位存在linux内核中,它以队列为基础数据结构,与进程调度机制紧密配合,能够用于实现内核中异步事件通知机制。等待队列也可以用来同步对系统资源访问。...在使用时将其当做成一个普通队列数据结构,只不过等待队列是若干个休眠进程集合,且内核自己实现了此队列初始化队列、入队列、出队列一系列API,在使用时只需要调用系统API即可。...wait_event(queue, condition); 当前进程进程状态设置为 TASK_UNINTERRUPTIBLE ,然后 schedule() wait_event_interruptible...与 TASK_UNINTERRUPTIBLE 区别在于,它休眠是否会被信号中断,别的进程发来一个信号比如 kill ,TASK_INTERRUPTIBLE 就会醒来去处理。...等待队列: 是当前进程先休眠,直到该进程被其他进程唤醒才可执行,且有超时唤醒功能。 2020-06-27

    2.2K30

    进程状态

    state域能够取5个互为排斥值(通俗一点就是这五个值任意两个不能一起使用,只能单独使用)。系统每个进程都必然处于以上所列进程状态一种。...状态 描述 TASK_RUNNING 表示进程要么正在执行,要么正要准备执行(已经就绪),正在等待cpu时间片调度 TASK_INTERRUPTIBLE 进程因为等待一些条件而被挂起(阻塞)而所处状态...这些条件主要包括:硬中断、资源、一些信号……,一旦等待条件成立,进程就会从该状态阻塞)迅速转化成为就绪状态TASK_RUNNING TASK_UNINTERRUPTIBLE 意义与TASK_INTERRUPTIBLE...类似,除了不能通过接受一个信号来唤醒以外,对于处于TASK_UNINTERRUPIBLE状态进程,哪怕我们传递一个信号或者有一个外部中断都不能唤醒他们。...,当一个进程被另外进程所监视,每一个信号都会让进城进入该状态

    1.2K40

    你真的懂Linux内核中阻塞和异步通知机制吗?(花了五天整理,墙裂推荐!)

    阻塞/非阻塞简介   阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作条件后再进行操作。被挂起进程进入睡眠状态,被从调度器运行队列移走,直到等待条件被满足。...阻塞方式访问设备时,如果设备不可操作,那么进程就会进入休眠状态。等待队列就是来完成进程休眠操作一种数据结构。...,这两个函数会将这个等待队列头中所有进程都唤醒   wake_up函数可以唤醒处于 TASK_INTERRUPTIBLETASK_UNINTERRUPTIBLE状态进程,而wake_ up_...interruptible函数只能唤醒处于 TASK_INTERRUPTIBLE状态进程 等待事件 wait_event(wq, condition)   等待以wq为等待队列头等待队列被唤醒,前提是...如果没有文件可以读取,那么就会根据 timeout参数来判断是否超时。可以 reads设置为NULL,表示不关心任何文件变化。

    1.1K50

    Linux下2号进程kthreadd--Linux进程管理与调度(七)

    ppid = 0) 所有其它内核线程ppid 都是 2,也就是说它们都是由kthreadd thread创建 所有的内核线程在大部分时间里都处于阻塞状态(TASK_INTERRUPTIBLE)只有在系统满足进程需要某种资源情况下才会运行...TASK_INTERRUPTIBLE, 如果当前 没有要创建线程则主动放弃 CPU 完成调度.此进程变为阻塞态*/ set_current_state...在for循环中,如果发现kthread_create_list是一空链表,则调用schedule调度函数,因为此前已经将该进程状态设置为TASK_INTERRUPTIBLE,所以schedule调用将会使当前进程进入睡眠...其实就是调用首先构造一个假上下文执行环境,最后调用 do_fork() 返回进程 id, 创建后线程执行 kthread 函数 */ pid = kernel_thread(...TASK_UNINTERRUPTIBLE */ __set_current_state(TASK_UNINTERRUPTIBLE); /* current 表示当前新创建 thread

    2.4K20

    Linux 中 D 状态进程与平均负载

    当使用 fork() 等系统调用来创建一个新进程时,新进程状态是 Ready 状态,在 linux 中,就绪态进程也属于 TASK_RUNNING 状态,这个时候只是还没有拿到 CPU 使用权。...图中 Ready 和 Running 状态进程都属于「可运行状态进程,对应 top 命令中 R 标记。 处于 Running 状态进程在等待某些事件资源时会进入 Blocked 状态。...可中断进程TASK_INTERRUPTIBLE)可以被信号和 wakeup 唤醒,重新进入 Ready 就绪状态,对应于 top 中标记为 S 进程。...D 状态进程 TASK_UNINTERRUPTIBLE 在 top 命令中显示为 D 标记,也就是大名鼎鼎 「D 状态进程。...从侧面来看,磁盘驱动是工作在内核中,如果磁盘出现了故障,磁盘不到数据,内核就陷入了很尴尬两难局面,这个锅只能自己扛着,进程标记为不可中断,谁让磁盘驱动是跑在内核中呢。

    2.2K40

    直接内存回收中等待队列

    之后进程由于内存不足,对zonelist进行直接回收时,会调用到try_to_free_pages(),在这个函数内,决定了进程是否加入到node结点pgdat->pfmemalloc_wait这个等待队列中...TASK_INTERRUPTIBLE状态,然后加入到nodepgdat->pfmemalloc_wait,并且会设置超时时间为1s * 2.如果分配标志没有禁止了文件系统操作,则将要进行内存回收进程加入到...,则将要进行内存回收进程设置为TASK_INTERRUPTIBLE状态,然后加入到nodepgdat->pfmemalloc_wait,并且会设置超时时间为1s * 2.如果分配标志没有禁止了文件系统操作...,则将要进行内存回收进程加入到nodepgdat->pfmemalloc_wait,并设置为TASK_KILLABLE状态,表示允许 TASK_UNINTERRUPTIBLE 响应致命信号状态...(gfp_mask & __GFP_FS)) { /* 如果分配标志禁止了文件系统操作,则将要进行内存回收进程设置为TASK_INTERRUPTIBLE状态,然后加入到nodepgdat

    1.6K40
    领券