首页
学习
活动
专区
工具
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会唤醒链表的第一个 睡眠节点,因为第一个节点里保存了后面一个节点的地址...&(init_task.task)) panic("task[0] trying to sleep"); tmp=*p; *p=current; /* 可中断地睡眠

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

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

1开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 无论是任务处于用户态还是内核态,经常会因为等待某些事件而睡眠...本文来探讨一下,任务处于睡眠中有哪些状态?睡眠对于任务来说究竟意味着什么?内核是如何管理睡眠的任务的?我们会结合内核源代码来分析任务的睡眠,力求全方位角度来剖析。...注:由于篇幅问题,文章分为上下两篇,且这里不区分进程和任务,统一使用任务来表示进程。 主要讲解以下内容: 睡眠的三种状态 睡眠的内核原理 用户态睡眠 内核态睡眠 总结 2....这里给出被致命信号打断/唤醒的代码路径: include/linux/sched.h #define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE...为不可中断的睡眠状态,不能被任何信号所唤醒(特定条件没有满足发生信号唤醒可能导致数据不一致等问题,这种场景使用这种睡眠状态,如等待IO读写完成)。 3.

2.6K40

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

4.用户态睡眠 以sleep为例来说明任务在用户态是如何睡眠的。...来看下freezable_schedule: //include/linux/freezer.h freezable_schedule ->schedule() ->__schedule(false...5.内核态睡眠 当任务处于内核态时,有时候也需要睡眠一段时间,不像任务处于用户态需要发生系统调用来请求内核进行睡眠,在内核态可以直接调用睡眠函数。...6.总结 进程睡眠按照应用场景可以分为:延迟睡眠和等待某些特定条件而睡眠,实际上都可以归于等待某些特定条件而睡眠,因为延迟特定时间也可以作为特定条件。...进程睡眠按照进程所处的特权级别可以分为:用户态进程睡眠和内核态进程睡眠,用户态进程睡眠需要进程通过系统调用陷入内核来发起睡眠请求。

1.8K20

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

1开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 无论是任务处于用户态还是内核态,经常会因为等待某些事件而睡眠...本文来探讨一下,任务处于睡眠中有哪些状态?睡眠对于任务来说究竟意味着什么?内核是如何管理睡眠的任务的?我们会结合内核源代码来分析任务的睡眠,力求全方位角度来剖析。...注:由于篇幅问题,文章分为上下两篇,且这里不区分进程和任务,统一使用任务来表示进程。 主要讲解以下内容: 睡眠的三种状态 睡眠的内核原理 用户态睡眠 内核态睡眠 总结 2....这里给出被致命信号打断/唤醒的代码路径: include/linux/sched.h #define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE...为不可中断的睡眠状态,不能被任何信号所唤醒(特定条件没有满足发生信号唤醒可能导致数据不一致等问题,这种场景使用这种睡眠状态,如等待IO读写完成)。 3.

1.4K20

内置AI技术的智能戒指,帮你搞定各种睡眠问题

市面上的睡眠追踪器种类繁多,但创业公司 sleepon 认为该领域依然存在创新的空间。最近,他们就在众筹平台上推出了一款名叫 Go2Sleep 的睡眠追踪戒指。...Go2Sleep 并没有什么花哨的功能,它的唯一职责就是对你的睡眠情况进行追踪。它可以用来改善睡眠习惯,甚至是帮助检测出困扰数百万人的睡眠障碍问题。...这些数据随后会被同步到配套的应用程序当中,后者会使用人工智能生成一份分析报告,同时提供改善睡眠习惯的建议,比如改变饮食结构,或是进行锻炼。 Go2Sleep 还能判断你是否存在睡眠呼吸暂停的问题。...这个睡眠障碍目前困扰着 1800 万美国人,并且会增加罹患高血压、糖尿病、甚至是心脏病的风险。...它的续航可坚持连续 3 晚的使用,并可存储最多 7 晚的睡眠数据。

555100

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

在现代的 Linux 操作系统中,进程一般都是用调用 schedule() 的方法进入睡眠状态的,下面的代码演示了如何让正在运行的进程进入睡眠状态。...找到了原因后,重新设计一下 A 进程的代码结构,就可以避免上面例子中的无效唤醒问题了。...4 Linux 内核的例子 在 Linux 操作系统中,内核的稳定性至关重要,为了避免在 Linux 操作系统内核中出现无效唤醒问题Linux 内核在需要进程睡眠的时候应该使用类似如下的操作: /*...从上面可以看到,Linux 的内核代码维护者也是在进程检查条件之前就设置进程的状态为睡眠状态,然后才循环检查条件。...下面让我们用 linux 内核中的实例来看看 Linux 内核是如何避免无效睡眠的,这段代码出自 Linux2.6 的内核 (linux-2.6.11/kernel/sched.c: 4254): 4253

2.2K90

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

在现代的 Linux 操作系统中,进程一般都是用调用 schedule() 的方法进入睡眠状态的,下面的代码演示了如何让正在运行的进程进入睡眠状态。...找到了原因后,重新设计一下 A 进程的代码结构,就可以避免上面例子中的无效唤醒问题了。...4 Linux 内核的例子 在 Linux 操作系统中,内核的稳定性至关重要,为了避免在 Linux 操作系统内核中出现无效唤醒问题Linux 内核在需要进程睡眠的时候应该使用类似如下的操作: /*...从上面可以看到,Linux 的内核代码维护者也是在进程检查条件之前就设置进程的状态为睡眠状态,然后才循环检查条件。...下面让我们用 linux 内核中的实例来看看 Linux 内核是如何避免无效睡眠的,这段代码出自 Linux2.6 的内核 (linux-2.6.11/kernel/sched.c: 4254): 4253

7.2K10

性能测试-性能测试指标

(服务器), 越来越多的顾客(用户)过来理发 Light Load: 师傅多客少;理发师还有空抽个烟,刷个手机;顾客来了就剪,剪完就走,体验不错 Heavy Load: 师傅少客多;理发师虽然忙个不停,...但仍然井井有条; 顾客等待的时间越来越长 Buckle Zone: 师傅少客人贼多; 理发师开始安抚等待的客人维持秩序, 剪发的效率下降; 顾客等待的时间指数级增长, ,而且没板凳坐,不满得喊理发师搬板凳...评级 <70% <30% 好 70%-90% 30%-60% 一般 >90% > 60% 差 性能分析 操作系统为了最大化利用内存,一般都设置大量的 cache,因此,内存利用率高达 99%并不是问题...,内存的问题主要看某个进程占用的内存是否非常大以及是否有大量的swap(虚拟内存交换)。...服务器或服务器集群 单位时间内 处理请求的数量 服务器集群 一般指多个提供相同服务的服务器的集合; 不同服务的服务器集群应该分开统计 监控方式 grafana工具监控 手动监控-日志 开发修改代码

12710

当“码农”遇上 Tony 老师:程序员理发时都在想些什么?

“嗯嗯好的没问题!” “咔嚓!” “?!” “您好,办卡消费 2888,欢迎下次光临!” 在 Tony 老师的一阵操作猛如虎里,我们收获了一个和预期效果迥异的意识流发型。...要说这理发师与他的职业是多么相似啊!石磊是一名资深程序员,虽然他的职称距离“总监”的路程比理发师远得多的多。 产品经理提需求,程序员根据需求开发写代码;而理发师也是根据前来理发的顾客提出的要求动剪子。...程序员敲代码时“啪啪啪”,理发师剪发时“咔嚓咔嚓”。程序员敲完一个模块,便要做个单元测试一下功能;理发师剪完某个部位便要对着镜子打量一下成果。...石磊把埋怨收进心底,尽量温声细语地对理发师说。 程序员在产品经理的催促下,只能硬着头皮改代码继续优化;理发师在顾客的埋怨下,讨好似的拿起剪刀做进一步的修剪。...找到一个靠谱的理发师比招到一个靠谱的程序员要难得多! 只有被剪坏的头型,没有被敲坏的代码。偶尔个别不靠谱的程序员写出了烂代码,起码还能找个厉害的来替他收拾残局。

71030

提了这么多年的面向对象,你真的懂它的含义吗?

面向过程的编程方法,注重解决问题的每一个步骤,并实现对应功能。 比如,我们要完成一天的任务清单,今天的任务包括理发、打扫卫生、搬家。于是我们开始按照顺序,对每个步骤进行实现。...这样编写好的代码,都线性的堆在一起,那下次如果再想理发、打扫卫生、搬家,那之前的代码怎么复用呢? 我们这时,想到了函数的封装。...因为我们使用的是面向过程的编程思路,出发点是注重怎么样一步一步的解决这个问题。 于是问题解决完成,功能实现,大量的线性代码已经写完后,再去想怎么封装优化。...但我们在寻求理发师的帮助时,不会直接向这个"职业"直接发起请求,因为它本身就是一个抽象,理发师那么多?你找的是哪一个? 我们要找的是某一个从业者,比如理发师张三。...而使用面向对象实现的代码,更容易复用,因为我们在写代码时,目的就是更好的封装,高内聚低耦合。 当然,这两种编程方式没有优劣之分。

43610

05-Java NIO 编程 零拷贝 与 AIO

我们分析mmap和sendFile这两个零拷贝 另外我们看一下NIO中如何使用零拷贝 传统IO数据读写 Java传统IO和网络编程的一段代码 传统IO模型 DMA : direct memory access...mmap 通过内存映射, 将文件映射到内核缓冲区,同时 用户空间可以共享内核空间的数据, 这样,在进行网络传输时, 就可以减少内核空间到用户空间的拷贝次数,如下图 mmap示意图 sendFile 优化 Linux...数据根本不经过用户态,直接从内核缓冲区进入到Socket Buffer ,同时, 由于和用户态完全无关, 就减少了一次上下文切换 示意图和小结 提示: 零拷贝从操作系统角度, 是没有CPU拷贝的 Linux...一般适用于连接数较多,且连接时间较长的应用 目前AIO还没有广泛应用,Netty也是基于NIO,而不是AIO,因此就不在这里讲AIO了,有兴趣的可以链接一下 <<Java 新一代网络编程模型AIO原理及Linux...异步非阻塞: 给理发师打电话,让理发师上门服务,自己干其他事情,理发师上门通知,来你家给你理发 NIO完结撒花花

29650

睡眠有助于巩固复杂问题解决技能的记忆痕迹

睡眠优先有利于策略和解决问题的能力,而不是伴随的运动执行动作。然而,目前还不清楚如何从睡眠中获得新的策略。在这里,参与者需要执行一系列动作来学习新的认知策略。...这项研究表明,睡眠是一段特殊的时间,可以增强解决问题所需的新获得的认知策略。1 简述人类历史上一些最非凡的想法、发明和艺术作品的灵光一现都是在一夜的睡眠中表现出来的。...睡眠确实有一些特别之处,它促进了洞察问题解决方案的过程。解决问题包括推理、计划、策略和技巧,这些都是程序性记忆和长期记忆的重要方面。当记忆最初被获取时,它还没有完全稳定或完全集成。...相比之下,对于执行问题解决方案所需的运动,睡眠并没有比清醒更有利,这表明睡眠处理递归策略,这不是通过与睡眠相关的运动序列本身的增强来实现的。...相比之下,与睡眠相关的记忆巩固与策略和问题解决能力之间的神经关系则不那么明确。

37630

Java 零拷贝_java clone 深拷贝

消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率 零拷贝技术减少了用户进程地址空间和内核地址空间之间因为上:下文切换而带来的开销 传统的IO数据读写 如下的例子,Java传统IO和网络编程的一段代码...可见使用mmap进行IO,进行了3次拷贝,进行了3次上下文切换 Linux支持的零拷贝 1.sendfile linux 2.1支持的sendfile 当调用sendfile()时,DMA将磁盘数据复制到...sendfile会经历:3次拷贝,1次CPU copy 2次DMA copy,以及2次上下文切换 提示 – 零拷贝是从操作系统角度来看的,是指没有CPU拷贝 Linux在2.4版本中,做了一些修改...AIO的比较 BIO NIO AIO IO模型 同步阻塞 同步非阻塞(多路复用) 异步非阻塞 编程难度 简单 复杂 复杂 可靠性 差 好 好 吞吐量 低 高 高 1.同步阻塞:到理发店理发,一直等待理发师...,直到轮到自己 2.同步非阻塞:到理发店理发,发现前面有其它人理发,给理发师说下,先干其它的事情,一会儿过来看是否轮到自己 3.异步非阻塞:给理发师打电话,让理发师上门服务,自己干其它事情,理发师自己来给你理发

71620
领券