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

为什么在linux的多线程中睡眠不能像我们的睡眠一样工作?

在Linux的多线程中,睡眠操作与我们日常生活中的睡眠有所不同。这是因为在多线程环境下,线程的睡眠是通过操作系统的调度来实现的,而不是像我们的睡眠一样自然地进入休眠状态。

在Linux中,线程的睡眠是通过调用系统函数来实现的,例如使用sleep()函数可以让线程暂停执行一段时间。但是,当一个线程调用睡眠函数时,它会被放入操作系统的等待队列中,等待一段时间后再次被调度执行。这意味着,在睡眠期间,该线程不会占用CPU资源,但其他线程仍然可以继续执行。

与此不同,我们的睡眠是一种自然的休眠状态,我们的身体和大脑都会进入休眠模式,几乎停止活动。而在多线程中,即使一个线程睡眠,其他线程仍然可以继续执行,因为操作系统会根据调度算法来分配CPU资源。

这种设计有以下优势和应用场景:

  • 提高系统的并发性:通过允许其他线程继续执行,可以充分利用CPU资源,提高系统的并发性能。
  • 避免线程阻塞:如果一个线程在睡眠期间完全阻塞,会导致其他线程无法执行,降低系统的响应性。通过让线程睡眠而不是阻塞,可以避免这种情况的发生。
  • 实现任务调度:操作系统可以根据线程的优先级和调度算法来决定哪个线程在何时被唤醒,从而实现任务的调度和管理。

腾讯云提供了一系列与云计算相关的产品,例如云服务器、容器服务、云数据库等,可以帮助用户构建和管理云计算环境。具体产品介绍和相关链接地址可以参考腾讯云官方网站:https://cloud.tencent.com/

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

相关·内容

Linux进程调度分析

首先,我们需要明确一点:进程调度是对TASK_RUNNING状态进程进行调度(参见《linux进程状态浅析》)。如果进程不可执行(正在睡眠或其他),那么它跟进程调度没多大关系。...尽管我们平常接触很多计算机(如桌面系统、网络服务器、等)负载都比较低,但是linux作为一个通用操作系统,不能假设系统负载低,必须为应付高负载下进程调度做精心设计。...而linux缺页异常处理代码中试图分配内存时,又可能由于系统内存紧缺而分配失败,导致进程进入睡眠; 2、代码执行过程硬件产生中断,linux进入中断处理程序而搁置当前进程。...调度程序跟内核很多过程一样会频繁被执行,如果效率不济就会浪费很多CPU时间,导致系统性能下降。 linux 2.4时,可执行状态进程被挂在一个链表。...但是,就像多线程程序需要用锁来保护临界区资源一样,内核也存在很多这样临界区,不大可能随时随地都能接收抢占。 linux 2.4时设计就非常简单,内核不支持抢占。

2.3K31

Java多线程详解1

线程是指进程一个执行流程,一个进程可以运行多个线程。比如java.exe进程可以运行很多线程。线程总是属于某个进程,进程多个线程共享进程内存。...一个Thread类实例只是一个对象,Java任何其他对象一样,具有变量和方法,生死于堆上。 Java,每个线程都有一个调用栈,即使不在程序创建任何新线程,线程也在后台运行着。...main()方法一样,它只是新线程知道调用方法名称(和签名)。因此,Runnable上或者Thread上调用run方法是合法。但并不启动新线程。...有关详细状态转换图可以参看本人“Java多线程编程总结”图 二、阻止线程执行 对于线程阻止,考虑一下三个方面,不考虑IO阻塞情况: 睡眠; 等待; 因为需要一个对象锁定而被阻塞。...A执行完毕之前,B不能工作

93490

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

(深度睡眠):可以被等待资源唤醒,但是不能被signal唤醒。...所以Linux内核代码里面经常看到这样代码模板,笔者Linux设备驱动开发详解》一书中也花了大篇幅解释如下模板: ?...在这个过程,如果我们执行浅度睡眠并响应信号而跳过去执行应用程序代码段设置信号处理函数,则此信号处理函数执行可能再次因为swap in需求引发进一步磁盘读,造成double page fault...可杀深度睡眠 Linux因此推出了一个特殊深度睡眠状态,叫做 TASK_KILLABLE(可杀深度睡眠):可以被等到资源唤醒,不能被常规信号唤醒,但是可以被致命信号唤醒,醒后即死。...但是SIGCHLD显然不一样,因为SIGCHLD默认就是忽略

1.4K20

熬夜并不值得程序员炫耀

放弃睡眠就像是高利贷借款。没错,看上去你是得到了额外时间,但你想得太乐观了,你知道代价是什么吗?放高利贷会回来讨债,到时如果你不能支付的话,他就会夺走你创造力和你的士气。 ?...现在我们偶尔会借用睡眠时间做一些事情,如果你完全了解其后果,并且不让它成为一种习惯的话就没关系。几天前我熬夜了。我们发布更新到Basecamp单点登录系统,这让我一直工作到了凌晨1:30。...因为把终点设在了海市蜃楼,于是我得茫茫沙漠走更长时间才能找到绿洲。...比如说,这一天我阅读了5次RSS订阅,又阅读了一些其他无关紧要内容。去攻克真正重要问题积极性和士气锐减。 烦躁:如果你碰到一个炮仗一样一点就着的人,那么他很有可能正经受着睡眠被剥夺痛苦。...所以,试图今天压榨出110%性能而明天只有70%性能可用,绝对是一个坏主意。最终,你所能达到高峰只有77%。绝对是得不偿失交易。 这就是为什么我总是试图保证8.5小时睡眠

30010

Linux桌面GUI系统调度器应该怎么做才不卡顿呢?

关于太古老故事,我就长话短说,主要是留下个 UNIX进程调度器从何开始 印象,这样方便我们理解为什么Linux进程调度器会是现在这个效果。...现在让我们看看UNIX/Linux系统哪里会有这样时间点。 我们发现,很少有这样时间点,几乎没有。Why?...答案是I/O中断。...Windows其实就是把窗口焦点得失事件作为I/O事件一样作为中断一样事件来处理,同时,既然中断概念被泛化,那么和纯硬件中断相反,泛化后中断必须分层,这就有了IRQL概念,任何一个时刻,Windows...那么为什么Windows可以设计出和Linux截然不同调度器,并且应对桌面GUI处理方面绝佳呢? 这是和UNIX/Linux源自批处理分时系统基因完全不同UI基因使然。

1.8K20

Android电源管理基础知识整理

进入Doze模式idle状态,我们程序还能运行吗? 手机睡眠之后,为何我们写Alarm程序、来电显示程序依旧会生效?...当AP进入睡眠,有来电时,Modem(调制解调器)将唤醒AP;而我们平时所用Alarm硬件上则是依赖PMIC(电源管理芯片)RTC模块,所以即使AP断电进入睡眠我们闹钟依旧会生效。 ?...rgidle只是限制我们程序使用某些模块,如Doze模式不能访问网络;而dpidle则会冻结所有进程,系统进入睡眠。 进入Doze模式idle状态,我们程序还能运行吗?...Doze模式idle概念上属于rgidle状态,此时我们程序是能运行,只是不能访问网络等,但是在这个过程,系统可能会满足进入睡眠条件,冻结所有进程,这样我们程序就不会得到执行。...Alarm硬件上依赖是ModemPMICRTC模块,而不是APRTC模块,当定时器触发时,可以唤醒AP,使我们Alarm程序依旧会得到执行

4.9K21

Linux】进程排队理解&&进程状态表述&&僵尸进程和孤儿进程理解

Linux可能存在多个进程都要根据它状态执行后续动作。一个CPU都会维护一个运行队列,当一个进程PCB被链入到CPU运行队列时,我们就称这个进程状态为运行状态。...阻塞状态 操作系统层面上,为了管理好底层硬件,其实操作系统也是把硬件都描述成一个一个结构体,其中硬件结构体,就有CPU运行队列一样等待队列,当一个进程比如执行到scanf函数必须等待键盘资源时...而CPU运行速度是非常非常快,也就是说相对CPU而言,该进程大部分时间还是等待外设等待过程CPU就将该进程链入到外设等待队列,所以该进程查到状态大部分都是睡眠状态,这里Linux操作系统具体实现...创建子进程是为了让这个子进程给用户完成工作,子进程完成工作后必须得有结果数据,这些数据都保存在子进程PCB。这就是为什么要有僵尸状态原因,是为了获得子进程结果数据。...如果父进程不读取,那么这个僵尸状态进程会一直存在,会引起内存泄漏,造成系统资源浪费。 为什么我们之前进程没有见过处于Z状态呢?

12910

Linux唤醒抢占----Linux进程管理与调度(二十三)

现代Linux操作系统, 进程一般都是用调用schedule方法进入睡眠状态, 下面的代码演示了如何让正在运行进程进入睡眠状态。..., 而我们fork新创建进程完成自己创建工作后, 可以通过wake_up_new_task完成唤醒工作, 参见Linux下进程创建过程分析(_do_fork/do_fork详解)–Linux进程管理与调度...Linux操作系统, 内核稳定性至关重要, 为了避免Linux操作系统内核中出现无效唤醒问题, Linux内核需要进程睡眠时候应该使用类似如下操作: /* ‘q’是我们希望睡眠等待队列...2号进程例子-避免无效抢占 下面让我们linux内核实例来看看Linux 内核是如何避免无效睡眠, 我还记得2号进程吧, 它主要工作就是接手内核线程kthread创建, 其工作流程函数是..., 可以多个内核线程同一个worker上工作, 共同完成work工作, 有点线程池工作方式.

3.7K30

Go语言调度器之盗取goroutine(17)

---- 上一小节我们分析了从全局运行队列与工作线程本地运行队列获取goroutine过程,这一小节我们继续分析因无法从上述两个队列拿到需要运行goroutine而导致从其它工作线程本地运行队列盗取...这里关键点在于读取runqhead和runqtail是两个操作而非一个原子操作,当我们读取runqhead之后但还未读取runqtail之前,如果有其它线程快速增加(这是完全有可能,其它偷取者从队列偷取...工作线程进入睡眠 分析完盗取过程,我们继续回到findrunnable函数。 如果工作线程经过多次努力一直找不到需要运行goroutine则调用stopm进入睡眠状态,等待被其它工作线程唤醒。...顺便说一下,为什么futex系统调用需要第三个参数val,需要在内核判断*uaddr与val是否相等,而不能在用户态先判断它们是否相等,如果相等才进入内核睡眠岂不是更高效?...我们知道线程一旦进入睡眠状态就停止了运行,那么如果后来又有可运行goroutine需要工作线程去运行,正在睡眠线程怎么知道有工作可做了呢?

72331

Java多线程

Java多线程 1 多线程介绍 2 为什么要用多线程?...比如,当你边打字发送表情,边好友视频时这些不同功能都可以同时运行,其中每一项任务都可以理解成“线程”工作多线程 多线程就是一个程序中有多个线程同时执行。...串行 所谓串行,其实是相对于单条线程来执行多个任务来说我们就拿下载文件来举个例子:当我们下载多个文件时,串行它是按照一定顺序去进行下载,也就是说,必须等下载完A之后才能开始下载B,它们时间上是不可能发生重叠...并行 并行就是下载多个文件,开启多条线程,多个文件同时进行下载,这里是严格意义上同一时刻发生,并行在时间上是重叠。 了解了这两个概念之后,我们再来说说什么是多线程。...如果是多线程的话,我们其实在清理垃圾时候,还可以进行查杀病毒、电脑加速等等其他操作,这个是严格意义上同一时刻发生,没有执行上先后顺序。 2 为什么要用多线程

6810

15个顶级Java多线程面试题及答案,快来看看吧

多线程和并发编程锁接口最大优势是,他们对阅读和写作分别提供锁,可以满足高性能数据结构和条件阻止你写ConcurrentHashMap。java线程面试问题越来越基于面试官答案变得。...我强烈建议您在进行多线程访问之前仔细阅读锁,因为现在它被广泛用于为电子事务构建客户端缓存和事务连接空间。 3)java等待和睡眠方法之间区别吗? java线程面试往往是电话采访问。...这是我最喜欢java线程面试问题,因为即使是很常见死锁问题时候写多线程并发程序,很多考生不能写无死锁代码(无死锁代码)。他们挣扎。...11)为什么我们调用开始()方法时执行run()方法,为什么我们不能直接调用run()方法呢? 这是一个非常经典java多线程面试问题。这也是我刚开始编写线程程序时一个难题。...另一个多线程经典面试问题与线程无关,但它有很大帮助。这个java面试问题是非常棘手,如果他要求你写一个不可变对象,或者问你为什么字符串是不可变。 15)多线程环境遇到常见问题是什么?

63250

解决 Linux 挂载 NTFS 分区只读不能问题

有没有小伙伴也是跟我一样电脑上同时装有 Windows 和 Linux 双系统呢?...既然休眠功能这么强大,并且优势这么多,那么为什么 Windows 开机选项默认不显示休眠呢,还要我们手动打开这个选项。今天踩到这个坑就给出了最好解释。...因为如果休眠的话,磁盘文件可能还没有保存,或者没有关闭,万一下次电脑崩了无法开机了,或者遇到今天这样双系统另一个系统又打开这个文件进行编辑时,就会造成文件数据错乱和数据丢失。...这时候再回到 Linux 重新挂载这个 D 盘时,就不会出现只读不能情况了。 说到这里,我得唠嗑几句。...这次遇到坑,其实算不上什么坑,并且我们得承认 Linux 这个数据保护措施做很到位,如果我 Windows 中将电脑休眠了而在 Linux 还能正常读写的话,那个后果是可想而知

9.3K30

ava多线程:volatile变量、happens-before关系及内存一致性

volatile 关键字典型使用场景是多线程环境下,多个线程共享变量,由于这些变量会缓存在 CPU 缓存,为了避免出现内存一致性错误而采用 volatile 关键字。...多线程环境下,有可能多个线程同时执行,每个线程使用不同 CPU(虽然这完全依赖于底层操作系统),每个 CPU 都从主内存拷贝变量到它自己缓存。...2、读线程尝试消费一个值,但是它缓存副本 hasValue 被设置为 false,所以即使写线程生产了一个新值,也不能被消费,因为读线程无法跳出睡眠循环(hasValue 值为 false)。...3、因为读线程不能消费新生成值,所以写线程也不能继续,因为标识变量没有设置回 false,因此写线程阻塞在睡眠循环中。 4、这样,就产生了死锁!...结果,当第二个线程访问这三个变量时候,就可以访问到被线程 1 写入值,即使这些变量之前被缓存(这些缓存副本都会被更新)。 这就是为什么我们不需要第一个示例一样将变量标示为 volatile 。

70620

操作系统进程同步与信号量---08

只发信号还不能解决全部问题 从信号到信号量 信号量开始工作… 什么是信号量?...记录一些信息(量),并根据这个 信息决定睡眠还是唤醒(信号)。 ---- 信号量开始工作… 信号量会记录额外信息,然后通过这个额外信息来决定是发出睡眠信号,还是唤醒信号。...所以执行修改信号量代码时,必须加以保护,保证修改过程其他进程不能修改同一个信号量值。...因为CPU当中除了内存之外,还会好几块缓存。我们可以将CPU原子操作挪到CPU某一块缓存当中执行,这样我们就只需要锁住某一块缓存就行了,就可以不用锁住整块内存了。...缺点: 对于溢出处理比较麻烦 实现还是比较麻烦 ---- 临界区保护另一类解法… 我们可以采用软硬件结合方式来完成对临界区保护,为什么临界区一段指令不能够原子执行,是因为有时钟中断产生

80030

关于Java里面的wait,notify,notifyAll常见问题

我们都知道Java多线程里面,wait,notify,notifyAll,是用来做线程之间通信使用,它们作用如下: wait方法:告诉当前线程,释放锁,然后开始睡眠等待,此时状态为Watting...,这里面最经典案例就是生产者-消费者模式,这里有一些关于这三个方法很有意思问题,我们来看一下: (1)为什么这三个方法定义Object类里面而不是Thread类?...,比如A线程调用了自己wait方法,然后它需要告诉B线程,你可以工作了,这就是典型侵入依赖,其实A线程可以不用知道其他任何线程,它只需要告诉监视器自己睡眠了,然后监视器自己去通知其他一样使用该监视器线程该干工作了就可以了...这有点类似大街上红绿灯,我们完全不需要知道其他车到底是谁开,只需要看信号通知即可。 (2)为什么这三个方法必须出现在同步方法或同步块? 这其实很容易理解,首先为什么需要同步?...https://github.com/qindongliang/Java-Note 这个项目主要是我记录Java相关学习笔记,包含了Java里面一些基础或者常见知识如字符串和多线程并发相关等,并且不断更新

35761

《现代操作系统》—— 进程间通信问题

遇到类似问题时可以考虑竞争条件(多线程也是如此)。另外,多核增长带来真并行使得竞争条件越来越普遍。 互斥 我们已经知道了竞争条件出现原因,那如何避免出现竞争条件?...为什么会出现竞争条件呢?本质原因是会存在发送给一个尚未睡眠进程/线程信号丢失了。因为我们没有对count访问加以限制。...进程可以在任何需要时候调用管程过程,但不可以管程之外声明过程中直接访问管程内数据结构。换言之,进程只可以调用管程过程,而不能访问管程变量。...他们和信号量up、down一样都属于系统调用,而不像管程属于语言成分。所以,我们可以很容易将他们加到系统库。...如下图所示: 多线程,屏障也多有应用,比如有3个异步子线程网络请求,我们需要3个网络请求都返回后才允许执行下一步任务,此时可以使用屏障。 QA 操作系统为什么用C语言编写?

1K10

python协程--asyncio模块

高并发场景下,python提供了一个多线程模块threading,但似乎这个模块并不近人如意,原因在于cpython本身全局解析锁(GIL)问题,一段时间片内实际上执行是单线程。...一、threading模块 threading模块thread线程 密集 运算争夺变量测试 代码: #多线程共有数据争夺检测 from threading import Thread,currentThread...思路2结果很符合我们认知常识,那么思路1结果是怎么得来呢?原因在于,多并发(此处密集型运算用于模拟一系列并发内部操作)情况下,阻塞协程会暂时被搁置,切换到另外协程。...队列每一个元素间是互不干扰。于是,就出现了以上结果----有序协程运行。...6375 this is coroutetime : 1999 7650 this is coroutetime : 1999 8925 this is coroutetime : 1999 10200 为什么所有的协程号都一样

80720

从软件(JavahotspotLinux)到硬件(硬件架构)分析互斥操作本质

可以使用自旋锁保护 资源,在读取资源时,其他线程不能修改资源,那么释放操作就会被放到睡眠之后: ?   为何可以使用自旋锁?...也不会睡眠,所以也不会出现因为睡眠而错过资源情况,上二张图就是错过资源情况,自选锁一直都在争抢。   但是自旋锁局限性也很大,空转,无意义CPU时间被浪费。...如果在上面,那么资源唤醒之前就释放了,保护区里肯定可以得到资源,免于睡眠。 如果在下面,那么无论资源唤醒之前哪个位置,就算是保护区里也好,只要是释放了就行。... 调用LockSupport.unpark 之后调用LockSupport.park 的话,线程不会休眠。这个点很重要,没有这个点 ,JUCAQS无法正常工作。...:为什么unpark 之后 park 不会休眠 AQS 起到关键作用?

78530

我是如何每周坚持 5 天自学机器学习,并拿到offer

周末 Uber,工作日机器学习,那是我日常生活。我必须学习。我必须学会这些,我不能一直开车,虽然我还不知道我目标是什么,但我知道肯定不是开车。...改变你环境 你祖父第一个橘子农场失败了。 土壤很好,种子就在里面,所有的设备也和别人一样。 那为什么会这样? 天气太冷了。...当她把他带走时,他不停地笑着,挥舞着他蓝色塑料铲。 是什么让他着迷? 他玩耍,他玩得很开心,对他来说整个世界都是新我们文化工作和娱乐之间有严格界限,学习被视为工作。...你应该学习以获得更多工作。你应该工作赚钱,钱可以让你有闲暇时间。一旦你有了闲暇时间,那么你才能 Charlie 一样,欢笑着跑来跑去。...这两天我就像火车一样不停地工作。星期一到了,我会有另外作息。星期二时候我就好多了,到星期三我又回到了原来作息,然后这个循环将在周五重复。 这种不正常睡眠安排是不可接受

86721

深入浅出 Linux 惊群:现象、原因和解决方案

这个是 linux 上困扰了大家很长时间一个经典问题, linux2.6(似乎 2.4.1 以后就已经解决,有兴趣同学可以去验证一下)以后内核得到彻底解决,通过添加了一个 WQ_FLAG_EXCLUSIVE...accept客户端请求,进行一些初始化工作,将accept到socket fd放入epoll。...    工作worker抢夺到accept权限,加锁成功时候,要将事件处理delay到释放锁后处理(为什么ngx_posted_accept_events队列上事件处理不需要延迟呢? ...然而这种方式编程实现起来比较难,难道不能 accept 一样解决 epoll "惊群"问题么?答案是可以。...LT(水平触发模式)、ET(边沿触发模式)"惊群"问题上,有什么不一样表现么?要说明这个,就不能不来谈谈 Linux 内核 sleep/wakeup 机制以及 epoll 实现核心机制了。

2.1K30
领券