sleep实现原理(转载)
两个问题
假设现在是 20018-12-03 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 20018-12-03 12:00:01.000 的时候,这个线程会不会被唤醒?
某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) 。既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?
对于第一个问题,答案是:不一定。因为你只是告诉操作系统:在未来的1000毫秒内我不想再参与到CPU竞争。那么1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束;况且,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。
Thread.Sleep(0)的作用,就是“让出cpu,会触发操作系统立刻重新进行一次CPU竞争”。竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。
sleep的底层实现
sleep():进程、线程或任务(Linux中不区分进程与线程,都称为task)可以sleep,这会导致它们暂停执行一段时间,直到等待的时间结束才恢复执行或在这段时间内被中断。
sleep()在OS中的实现的大概流程:
- 挂起进程(或线程)并修改其运行状态
- 用sleep()提供的参数来设置一个定时器。
- 当时间结束,定时器会触发,内核收到中断后修改进程(或线程)的运行状态。例如线程会被标志为就绪而进入就绪队列等待调度。
- 可变定时器(variable timer)一般在硬件层面是通过一个固定的时钟和计数器来实现的,每经过一个时钟周期将计数器递减,当计数器的值为0时产生中断。内核注册一个定时器后可以在一段时间后收到中断。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
///时钟编程 alarm()void wakeUp()
{printf("please wakeup!!\n");
}int main(void)
{printf("you have 4 s sleep!\n");signal(SIGALRM,wakeUp);alarm(4);//将进程挂起pause();printf("good morning!\n");return EXIT_SUCCESS;
}
alarm(time);执行之后告诉内核,让内核在time秒时间之后向该进程发送一个定时信号,然后该进程捕获该信号并处理;
pause()函数使该进程暂停让出CPU,但是该函数的暂停是可被中断的睡眠,也就是说收到了中断信号之后处理完毕,再重新执行该进程的时候就直接执行pause()函数之后的语句;注意的是一个进程只能有一个闹钟时间,如果调用alarm()之前已经设置了闹钟时间,那么任何以前的闹钟时间都会被新值所代替。
综上所述,内核的sleep()函数是在挂起原语的基础上利用定时器实现的。
可参考究竟什么是阻塞?
sleep实现原理(转载)相关推荐
- linux+mmap父子通信_linux库函数mmap()原理?转载
linux库函数mmap()原理 转载 1.mmap基本概念 2.mmap内存映射原理 3.mmap和常规文件操作的区别 4.mmap优点总结 5.mmap相关函数 6.mmap使用细节 7.mmap ...
- ConcurrentHashMap实现原理--转载
原文地址:http://ajax-xu.iteye.com/blog/1104649 ConcurrentHashMap是Java 5中支持高并发.高吞吐量的线程安全HashMap实现.在这之前我对C ...
- java原子操作的实现原理--转载
原文地址:http://www.infoq.com/cn/articles/atomic-operation 1. 引言 原子(atom)本意是"不能被进一步分割的最小粒子",而原 ...
- JDK动态代理实现原理--转载
之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的,直到前几个星期才把这些问题全部搞明白了. ...
- jQuery UI Widget(1.8.1)工作原理--转载
先看下代码的相关注释: /*!* jQuery UI Widget 1.8.1** Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) ...
- 深度剖析:CDN内容分发网络技术原理--转载
1.前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因 ...
- 深入分析 iBATIS 框架之系统架构与映射原理--转载
http://www.ibm.com/developerworks/cn/java/j-lo-ibatis-principle/ iBATIS 通过 SQL Map 将 Java 对象映射成 SQL ...
- 图解elasticsearch原理转载自
转载自 图解elasticsearch原理 版本 elasticsearch版本: elasticsearch-2.x 内容 图解ElasticSearch 云上的集群 集群里的盒子 云里面的每个白 ...
- 数字证书原理[转载]
文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理, ...
- AIDAS原理(转载)
AIDAS原理 AIDAS原理的内容 AIDAS原理是由刘易斯(Lewis)提出的,AIDAS原理是用来说明广告对消费者产生的不同作用,它包括以下五个阶段: A(Attention)引起注意: I(I ...
最新文章
- FPGA基础知识极简教程(8)详解三态缓冲器
- 基于TensorFlow 2.0的中文深度学习开源书来了!GitHub趋势日榜第一,斩获2K+星
- c语言最大公约数和最小公倍数_五年级数学最大公因数最小公倍数 练习
- 跳跃游戏Python解法
- ubuntu12.04
- 前端开发神器 vscode 常用快捷键
- PHP笔记-自定义MVC框架
- mysql里面的页面筛选_【mysql】像很多网站(比如电商)里的筛选功能一般是如何实现的?...
- wp转shp_将china.wl拓扑生成的wp面转换成shp格式,然后在arcgis中打开,截图,提交截图。...
- AJAX初始化combox 并取值
- element-ui upload 多个文件一次请求上传(Vue精简版)
- kubectl rollout restart重启pod
- 数据结构之线性表(顺序表、链表、栈、队列)
- 基于Ocean Connect云平台的照明控制系统设计
- 微信跳一跳游戏外挂(mac电脑+android手机)
- HP EliteDesk 800 G4 DM 35W (Japan) Mini Tower黑苹果efi引导文件
- 一生何求的伤感空间日志发布:如果有一天,我还记得你
- 最佳sd卡恢复数据软件/sd卡恢复照片软件
- 非易失性存储器的分类和未来发展预测
- 你还在用普通的漏电保护器吗