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

linux0.11进程睡眠唤醒原理分析

进程睡眠是通过调用sleep_on函数,该函数修改了进程的状态并且通过schedule函数切换到其他进程执行,从而实现进程的挂起,TASK_UNINTERRUPTIBLE状态的进程只能被wake_up...} // 当前进程挂载到睡眠队列p,p指向队列头指针的地址 void sleep_on(struct task_struct **p) { struct task_struct *tmp;...,即tmp指向第一个睡眠节点 头指针指向当前进程,这个版本的实现没有采用真正链表的形式, 他通过每个进程在栈的临时变量形成一个链表,每个睡眠进程, 在栈里有一个变量指向后面一个睡眠节点...,然后把链表的头指针指向当前进程, 然后切换到其他进程执行,当被wake_up唤醒的时候,wake_up会唤醒链表的第一个 睡眠节点,因为第一个节点里保存了后面一个节点的地址...去唤醒别的进程,自己却还睡眠 */ if (*p && *p !

2.3K40
您找到你想要的搜索结果了吗?
是的
没有找到

深入理解Linux内核之进程睡眠

1开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 无论是任务处于用户态还是内核态,经常会因为等待某些事件而睡眠...注:由于篇幅问题,文章分为上下两篇,且这里不区分进程和任务,统一使用任务来表示进程。 主要讲解以下内容: 睡眠的三种状态 睡眠的内核原理 用户态睡眠 内核态睡眠 总结 2....如延迟睡眠场景,内核将即将睡眠的任务记录在定时器相关的数据结构;可睡眠的信号量场景,内核将即将睡眠的任务加入到信号量的相关链表。...进程睡眠按照进程所处的特权级别可以分为:用户态进程睡眠和内核态进程睡眠,用户态进程睡眠需要进程通过系统调用陷入内核来发起睡眠请求。...对于进程睡眠,内核主要需要做三大步操作:1.设置任务状态为睡眠状态 2.记录睡眠的任务 3.发起主动调度。

2.6K40

深入理解Linux内核之进程睡眠(下)

来看下freezable_schedule: //include/linux/freezer.h freezable_schedule ->schedule() ->__schedule(false...当然,内核态睡眠有两种场景:一种是睡眠特定的时间的延迟操作(唤醒条件为超时),一种是等待特定条件满足(如IO读写完成,可睡眠的锁被释放等)。...进程睡眠按照进程所处的特权级别可以分为:用户态进程睡眠和内核态进程睡眠,用户态进程睡眠需要进程通过系统调用陷入内核来发起睡眠请求。...对于进程睡眠,内核主要需要做三大步操作:1.设置任务状态为睡眠状态 2.记录睡眠的任务 3.发起主动调度。...这三大步操作都是非常有必要,第一步设置睡眠状态为后面调用主调度器做必要的标识准备;第二步记录下睡眠的任务是为了以后唤醒任务来准备的;第三步是睡眠的主体部分,这里会将睡眠的任务从运行队列踢出,选择下一个任务运行

1.8K20

深入理解Linux内核之进程睡眠(上)

1开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 无论是任务处于用户态还是内核态,经常会因为等待某些事件而睡眠...注:由于篇幅问题,文章分为上下两篇,且这里不区分进程和任务,统一使用任务来表示进程。 主要讲解以下内容: 睡眠的三种状态 睡眠的内核原理 用户态睡眠 内核态睡眠 总结 2....睡眠的三种状态 任务睡眠有三种状态: 浅度睡眠 中度睡眠 深度睡眠 2.1 浅度睡眠 进程描述符的state使用TASK_INTERRUPTIBLE表示这种状态。...2.2 中度睡眠 进程描述符的state使用TASK_KILLABLE表示这种状态。 可以被致命信号所打断。...如延迟睡眠场景,内核将即将睡眠的任务记录在定时器相关的数据结构;可睡眠的信号量场景,内核将即将睡眠的任务加入到信号量的相关链表

1.4K20

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

1 Linux 进程睡眠和唤醒 在 Linux ,仅等待 CPU 时间的进程称为就绪进程,它们被放置在一个运行队列,一个就绪进程的状 态标志位为 TASK_RUNNING。...Linux 进程睡眠状态有两种:一种是可中断的睡眠状态,其状态标志位 TASK_INTERRUPTIBLE; 另一种是不可中断 的睡眠状态,其状态标志位为 TASK_UNINTERRUPTIBLE...在现代的 Linux 操作系统进程一般都是用调用 schedule() 的方法进入睡眠状态的,下面的代码演示了如何让正在运行的进程进入睡眠状态。...4 Linux 内核的例子 在 Linux 操作系统,内核的稳定性至关重要,为了避免在 Linux 操作系统内核中出现无效唤醒问题, Linux 内核在需要进程睡眠的时候应该使用类似如下的操作: /*...下面让我们用 linux 内核的实例来看看 Linux 内核是如何避免无效睡眠的,这段代码出自 Linux2.6 的内核 (linux-2.6.11/kernel/sched.c: 4254): 4253

2.2K90

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

1 Linux 进程睡眠和唤醒 在Linux ,仅等待 CPU 时间的进程称为就绪进程,它们被放置在一个运行队列,一个就绪进程的状 态标志位为 TASK_RUNNING。...Linux 进程睡眠状态有两种:一种是可中断的睡眠状态,其状态标志位 TASK_INTERRUPTIBLE; 另一种是不可中断 的睡眠状态,其状态标志位为 TASK_UNINTERRUPTIBLE...在现代的 Linux 操作系统进程一般都是用调用 schedule() 的方法进入睡眠状态的,下面的代码演示了如何让正在运行的进程进入睡眠状态。...4 Linux 内核的例子 在 Linux 操作系统,内核的稳定性至关重要,为了避免在 Linux 操作系统内核中出现无效唤醒问题, Linux 内核在需要进程睡眠的时候应该使用类似如下的操作: /*...下面让我们用 linux 内核的实例来看看 Linux 内核是如何避免无效睡眠的,这段代码出自 Linux2.6 的内核 (linux-2.6.11/kernel/sched.c: 4254): 4253

7.2K10

Linux进程信号(

当代码除0时,程序运行后就崩溃了,程序运行变为进程进程运行代码时出现了非法代码,进程退出了 ---- 将内存的指令数据load到CPU 状态寄存器中有比特位表示当前计算的状态 CPU中有的寄存器保存未来的计算结果...,所以每一次进程被调度,操作系统都会识别到异常,向进程发送11号信号 导致一直无线循环打印 ---- 核心转储 在众多信号,存在Core和Term类型,都可以终止进程 两者之间有什么区别呢?...容我慢慢来说 ---- Linux在系统级别提供了一种能力,可以将一个进程异常的时候, 操作系统可以将该进程在异常的时候,核心代码部分进行核心转储 (将内存中进程的相关数据,全部dump到磁盘) 一般会在当前进程的运行目录下...---- 在终端1运行可执行程序,在终端2发送2号信号干掉进程 ---- 当干掉进程后,并没有发现以pid结尾的文件 说明使用Term类型的信号,干掉进程后,不发生核心转储 ---- 8...号信号 Core,浮点数异常 在终端1运行可执行程序,在终端2发送8号信号干掉进程,并出现core dump即核心转储 ---- 再次使用 ls -l 指令,发现多出来一个 core.2257

17730

Linux查看进程、杀死进程、进入进程的命令

2.杀死进程    使用kill命令结束进程:kill xxx    常用:kill -9 324    Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如:...# killall -9 NAME 进程杀死 HUP 1 控制的终端/程序中断 INT 2 键盘的插入指令(同 Ctrl + C) QUIT 3 键盘的中断指令(同 Ctrl + \) TERM...324的进程: #kill -9 324 (2)解除Linux系统的死锁 在Linux中有时会发生这样一种情况:一个程序崩溃,并且处于死锁的状态。...(4)killall命令 Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如: # killall -HUP inetd *杀死进程最安全的方法是单纯使用kill...如下: # kill -HUP PID 该命令让Linux和缓的执行进程关闭,然后立即重启。 *绝杀 kill -9 PID 同意的 kill -s SIGKILL 。

11.2K30

Linux查看进程状态信息

Linux查看进程状态信息 一、常用命令总结 ps -l 列出与本次登录有关的进程信息; ps -aux 查询内存中进程信息; ps -aux | grep ***...( 更多内容,可参阅程序员在旅途) 二、进程简述及查看方式 进程是运行的程序在系统的存在形式,通过查看进程的状态信息,我们可以了解进程占用的系统资源情况,对系统的运行状态进行分析、调整...Linux查看进程信息的基本命令有ps、top,其中ps(Process Status)查看的是进程信息的一个快照,显示的我们执行ps这个命令时进程的信息,top显示的是进程的动态信息,使用这个命令会看到进程信息的动态变化...; S 代表这个程序的状态 (STAT); ( 常见的进程的 STAT 如下: R 运行 Runnable (on run queue) 正在运行或在运行队列中等待, S 睡眠 Sleeping 休眠...3.3 动态显示内存进程信息(top) 四、进程的清除 kill -9 -pid (pid通过上面的命令可以查到) 注:有些进程是不允许停止的,因为停止会造成系统的不稳定,甚至崩溃。

10.8K20

详解Linux的守护进程

一、什么是守护进程 Linux系统启动时会启动很多系统服务进程,这些系统服 务进程没有控制终端,不能直接和用户交互。...守护进程也被称为精灵进程,是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。 查看方式 ps axj命令:查看系统进程。...fork创建的子进程和⽗进程在同⼀个进程,进程组的Leader必然是该组的第⼀个进程,所以子进程不可能是该组的第⼀进程,在子进程调用setsid就不会有问题了。...除了自己实现外,我们还可以调用系统的demon进行设置; 进行第二次fork的原因? 要明晰第二次fork的原因,就必须明晰这两次fork的作用。...只有确定会话首进程能打开终端设备,也就是再fork一次,再把父进程退出,再次fork的子进程作为守护进程继续运行,保证了该精灵进程不是对话期的首进程

3.5K43

清理linux的僵尸进程

什么是僵尸进程 Linux 的僵尸进程有时也称为失效或死进程。它们是已完成执行的进程,但它们的条目并未从进程删除。 进程状态 Linux 维护着所有正在运行的进程及其状态的进程表。...让我们简要概述各种进程状态: 正在运行 (R):这些进程当前正在运行或可运行。 等待 (S/D):这些是等待事件或资源的进程。等待可以是可中断睡眠 (S) 或不可中断睡眠 (D)。...停止(T):我们可以通过发送适当的信号来停止Linux 进程。 僵尸(Z):当一个进程完成它的任务时,它会释放它正在使用的系统资源并清理它的内存。...但是,它从进程的条目不会被删除,它的状态被设置为EXIT_ZOMBIE。 僵尸进程的创建 当一个进程完成它的工作时,Linux 内核通过发送SIGCHLD 信号通知退出进程的父进程。...在这种情况下,父进程无法监视子进程的状态变化,最终会忽略SIGCHLD信号。这会导致已完成进程的僵尸状态留在进程,因此它作为僵尸进程出现在进程列表

3.2K20

Linux】深度解析Linux的几种进程状态

前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎!...本章主要内容面向接触过Linux的老铁 主要内容含: 一.Linux进程状态 1.Linux进程状态在kernel源代码里的定义 R运行状态(running) : 并不意味着进程一定在运行,它表明进程要么是在运行要么在运行队列里...意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep)) 浅度睡眠状态,可以被终止 浅度睡眠会对外部信号做出响应 1.S状态与S+状态 前台进程:带+ 后台进程...Linux在特殊情况下,会通过 杀掉睡眠进程,节省资源! 即我们熟知的“杀后台” 深度睡眠状态不可被杀掉!...Z :僵尸状态(Linux特有状态) 处于僵尸状态的进程:僵尸进程 进程结束不会立刻释放,会等一小会 当一个进程在退出的时候,退出信息会由OS写入到当前退出进程的PCB,可以允许进程的代码和数据空间被释放

21710

linux通过进程名杀死进程_linux关闭进程命令

笔记:根据一个进程的名字或启动此进程的命令(连续的一部分即可)杀死进程 一、使用单条命令 ps -ef | grep 进程名/启动进程的命令 | grep -v grep | awk ‘{print $2...}’ | xargs kill -9 执行结果: [1]-  已杀死               sleep 200 [2]+  已杀死               sleep 200 二、编写脚本 linux...函数功能:根据进程名杀死程序     参数:进程名     返回值:无 !...————————————————————— # 根据进程名查询包含进程名的进程 并排除grep查询进程和此脚本进程 ps -ef | grep “$pName” | grep -v grep | grep.../bin/bash 脚本路径  程序”来启动脚本会很麻烦 我们可以将这个命令加入到我们的环境变量里面去 这样使用起来就会方便很多 比如我们将它加入到当前用户(也可以修改全局的对所有用户生效)的环境变量

15.8K20

Linux进程学习【进程状态】

,即把手机揣进兜里,然后 专心执行走路这个 进程 进程状态 进程 有各种运行状态,方便OS进行管理,在 Windows 进程 状态是这样的 而在我们 Linux ,新建、就绪、运行都可以看作...运行 R 这一个状态,所以比较清晰 而我们今天要学习的正是 Linux 进程 状态 进程是何种状态,取决于此进程的PCB在哪里排队 ️运行 R 首先来看看第一种状态 R 以我们以往的认知来说...可以看到当前的进程状态为 睡眠 S+ 注: + 表示当前进程在前台运行 进程 难道没有运行吗?...运行了,但我们 很难捕捉到 对于 CPU 来说,将这么简单的一句话输出到屏幕上是一件很小的事,可能几毫秒就完成了 而其他大多数时间,进程 都在外设等待队列 排队 当我们将打印语句和睡眠语句屏蔽后,进程...不一定在 CPU 上运行 ️睡眠 S 睡眠 S 的本质就是 进程阻塞,表示此时进程因等待某种资源而暂停运行;睡眠 S 又称为可中断休眠,当 进程 等待时间过长时,我们可以手动将其关闭,应用卡死后强制关闭也是这个道理

18230
领券