两个问题

假设现在是 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实现原理(转载)相关推荐

  1. linux+mmap父子通信_linux库函数mmap()原理?转载

    linux库函数mmap()原理 转载 1.mmap基本概念 2.mmap内存映射原理 3.mmap和常规文件操作的区别 4.mmap优点总结 5.mmap相关函数 6.mmap使用细节 7.mmap ...

  2. ConcurrentHashMap实现原理--转载

    原文地址:http://ajax-xu.iteye.com/blog/1104649 ConcurrentHashMap是Java 5中支持高并发.高吞吐量的线程安全HashMap实现.在这之前我对C ...

  3. java原子操作的实现原理--转载

    原文地址:http://www.infoq.com/cn/articles/atomic-operation 1. 引言 原子(atom)本意是"不能被进一步分割的最小粒子",而原 ...

  4. JDK动态代理实现原理--转载

    之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的,直到前几个星期才把这些问题全部搞明白了.  ...

  5. jQuery UI Widget(1.8.1)工作原理--转载

    先看下代码的相关注释: /*!* jQuery UI Widget 1.8.1** Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) ...

  6. 深度剖析:CDN内容分发网络技术原理--转载

    1.前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因 ...

  7. 深入分析 iBATIS 框架之系统架构与映射原理--转载

    http://www.ibm.com/developerworks/cn/java/j-lo-ibatis-principle/ iBATIS 通过 SQL Map 将 Java 对象映射成 SQL ...

  8. 图解elasticsearch原理转载自

    转载自  图解elasticsearch原理 版本 elasticsearch版本: elasticsearch-2.x 内容 图解ElasticSearch 云上的集群 集群里的盒子 云里面的每个白 ...

  9. 数字证书原理[转载]

    文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理, ...

  10. AIDAS原理(转载)

    AIDAS原理 AIDAS原理的内容 AIDAS原理是由刘易斯(Lewis)提出的,AIDAS原理是用来说明广告对消费者产生的不同作用,它包括以下五个阶段: A(Attention)引起注意: I(I ...

最新文章

  1. FPGA基础知识极简教程(8)详解三态缓冲器
  2. 基于TensorFlow 2.0的中文深度学习开源书来了!GitHub趋势日榜第一,斩获2K+星
  3. c语言最大公约数和最小公倍数_五年级数学最大公因数最小公倍数 练习
  4. 跳跃游戏Python解法
  5. ubuntu12.04
  6. 前端开发神器 vscode 常用快捷键
  7. PHP笔记-自定义MVC框架
  8. mysql里面的页面筛选_【mysql】像很多网站(比如电商)里的筛选功能一般是如何实现的?...
  9. wp转shp_将china.wl拓扑生成的wp面转换成shp格式,然后在arcgis中打开,截图,提交截图。...
  10. AJAX初始化combox 并取值
  11. element-ui upload 多个文件一次请求上传(Vue精简版)
  12. kubectl rollout restart重启pod
  13. 数据结构之线性表(顺序表、链表、栈、队列)
  14. 基于Ocean Connect云平台的照明控制系统设计
  15. 微信跳一跳游戏外挂(mac电脑+android手机)
  16. HP EliteDesk 800 G4 DM 35W (Japan) Mini Tower黑苹果efi引导文件
  17. 一生何求的伤感空间日志发布:如果有一天,我还记得你
  18. 最佳sd卡恢复数据软件/sd卡恢复照片软件
  19. 非易失性存储器的分类和未来发展预测
  20. 你还在用普通的漏电保护器吗

热门文章

  1. 不要争了!技术选择没那么重要
  2. 读名老中医之路笔记(四)
  3. 数据库的三才阵——地
  4. NOIp 2014 #5 解方程 Label:数论?
  5. 关于直线,折线切割平面的问题
  6. 拷贝一个用户下的所有表和数据到另外一个库
  7. OSChina 周六乱弹 —— 那些神一样的电视剧
  8. Asp.net 高性能数据分页函数,调用示例
  9. 为什么修改配置文件要重启server
  10. 12.软件架构设计:大型网站技术架构与业务架构融合之道 --- CAP理论