一、内核配置的tick频率一般是100HZ,即每隔10ms后产生一次始终中断,然后在时钟中断结束后会有一次进程的调度,选择最合适的进程实现调度。

menuconfig Kernel FeaturesTimer frequency

二、问题

那么问题来了。假如代码中使用usleep实现小于10ms的延时,比方说usleep(10),延时10us,那么等usleep睡眠10us结束后,会立马执行嘛?还是必须等到10ms后执行?因为,usleep,msleep,sleep等函数会主动让出CPU休眠。

1、编写段代码查看下多久后能运行,且默认任务的调度policy

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sched.h>int main()
{struct timeval val;pid_t pid;int policy, priority;printf("__start.\n");pid = getpid();policy = sched_getscheduler(pid);priority = getpriority(0, 0);printf("pid=%d, policy=%d, priority=%d\n", pid, policy, priority);memset(&val, 0x00, sizeof(struct timeval));gettimeofday(&val, NULL);printf("before. second=%ld, us=%ld\n", val.tv_sec, val.tv_usec);memset(&val, 0x00, sizeof(struct timeval));sleep(1);gettimeofday(&val, NULL);printf("after. second=%ld, us=%ld\n", val.tv_sec, val.tv_usec);return 0;
}

2、运行结果

调度策略的宏定义情况<include/uapi/linux/sched.h>:

普通的编译程序调用策略是SCHED_NORMAL

3、通过strace命令可以查看sleep的系统调用调用时nanosleep系统接口

最终会调用内核中的hrtimer_nanosleep函数中的do_nanosleep

long hrtimer_nanosleep(ktime_t rqtp, const enum hrtimer_mode mode, const clockid_t clockid)

等待休眠时间的结束,把任务重新挂在到runqueue中,等待重新调度。

4、提高调度成功的机会就需要设置任务成SCHED_FIFO模式,同时优先级设置最高。尝试设置应用程序调度策略和优先级。

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sched.h>int main()
{int rt = -1;struct timeval val;pid_t pid;struct sched_param sparam;int policy, priority;printf("__start.\n");pid = getpid();policy = sched_getscheduler(pid);priority = getpriority(0, 0);printf("before settings. pid=%d, policy=%d, priority=%d\n", pid, policy, priority);memset(&sparam, 0x00, sizeof(struct sched_param));sparam.sched_priority = sched_get_priority_max(SCHED_FIFO);rt = sched_setscheduler(pid, SCHED_FIFO, &sparam);if (rt)printf("sched_setscheduler error.\n");policy = sched_getscheduler(pid);memset(&sparam, 0x00, sizeof(struct sched_param));rt = sched_getparam(pid, &sparam);if (rt)printf("sched_setscheduler error.\n");printf("after settings. pid=%d, policy=%d, priority=%d\n", pid, policy, sparam.sched_priority);memset(&val, 0x00, sizeof(struct timeval));gettimeofday(&val, NULL);printf("before. second=%ld, us=%ld\n", val.tv_sec, val.tv_usec);memset(&val, 0x00, sizeof(struct timeval));sleep(1);gettimeofday(&val, NULL);printf("after. second=%ld, us=%ld\n", val.tv_sec, val.tv_usec);return 0;
}

运行结果

进程调度策略修改成SCHED_FIFO,且优先级是最高等级99,可以看出设置成FIFO调度策略的程序延时比NORMAL的低一些

三、PREEMPT配置相关宏定义

CONFIG_PREEMPT_NONE

CONFIG_PREEMPT和CONFIG_PREEMPT_VOLUNTARY都不会设置,表示在内核态既不会被抢占,调might_resched()函数也不会主动切换

CONFIG_PREEMPT_VOLUNTARY

might_resched()函数会主动切换,但是内核依旧不会被抢占。常见于桌面系统

CONFIG_PREEMPT

和CONFIG_PREEMPT_VOLUNTARY同时生效,在中断返回内核态时会检查TIF_NEEDRESCHED标志,如果需要调度,则会调schedule,内核态会被抢占。常见于实时性高的环境,如嵌入式系统

四、NORMAL和FIFO调度策略的任务会共存于系统中,假如FIFO调度策略的任务一直在运行,那是否NORMAL的任务无法调度到呢?

1、系统提供了/proc/sys/kernel/sched_rt_period_us和/proc/sys/kernel/sched_rt_runtime_us两个参数,默认状态sched_rt_period_us=1000000,sched_rt_runtime_us=950000

2、在sched_rt_period_us周期内给FIFO调度策略的任务运行时间是sched_rt_runtime_us,其余给其他调度策略的任务,因此不存在其他调度策略的任务无法获取CPU权限的情况。

sleep睡眠时间的疑问相关推荐

  1. 最健康的睡眠时间究竟是多少?

    我每天都睡足8个小时,怎么还是这么困啊?"很多男性朋友都有这样的疑问.不是说每天8个小时的睡眠是最健康的,为什么那些一天睡5.6个小时的人看上去反而更生龙活虎.精力充沛呢? 怪8小时不如6小 ...

  2. 计算机睡眠时间 win7,技术编辑帮你win7系统设置计算机睡眠时间的详细解法

    或许有朋友在使用电脑工作的时候,遇到过win7系统设置计算机睡眠时间的情况,还有很多朋友不知道win7系统设置计算机睡眠时间的情况如何处理,针对这一问题,我给大家整理总结出了win7系统设置计算机睡眠 ...

  3. mysql当前时间减1小时_最佳睡眠时间:晚上睡眠不超8小时,午睡不超1小时

    最近,2020年的欧洲心血管学会 年会(ESC 2020)公布的两则研究摘要, 都是和睡觉有关的. 根据这两则研究, 可以得出最佳睡眠时间: 晚上睡眠不超8小时, 午睡不超1小时! 晚上睡超过8小时, ...

  4. win7计算机睡眠怎么设置方法,win7系统更改(设置)计算机睡眠时间的操作方法...

    很多小伙伴都遇到过对win7系统更改(设置)计算机睡眠时间进行设置的困惑吧,一些朋友看过网上对win7系统更改(设置)计算机睡眠时间设置的零散处理方法,并没有完完全全明白win7系统更改(设置)计算机 ...

  5. 三种睡眠时间函数的区别:linux 的sleep()、usleep()、nanosleep()函数

    三种睡眠时间函数的区别:linux 的sleep().usleep().nanosleep()函数 (1)sleep()-------以秒为单位 unsigned int sleep(unsigned ...

  6. 计算机专业大学生每天睡多久,大学生睡眠时间最少的10个专业!是你的专业吗?...

    原标题:大学生睡眠时间最少的10个专业!是你的专业吗? 事业单位 选择大学专业这件事,一定得慎重! 常言道,专业选的好,天天在养老:专业选不好,年年胜高考.大学里的专业,有的男生多,简直就是少林寺一般 ...

  7. 如何修改Win11睡眠时间

    近日,微软发布了 Win11 的首个预览版,所有之前已加入到 Insider Preview 的用户都能收到这个版本.该版本融入了发布会里的很多变化,但并未添加 Microsoft Teams 和安卓 ...

  8. 10电脑睡眠后自动关机怎么回事 win_Win8.1睡眠后自动关机如何解决 Win8.1电脑睡眠时间久了自动关机怎么办...

    很多人在使用电脑的过程中有时候会离开电脑一段时间,一段时间没碰电脑的话电脑就会自动进入睡眠状态,只要鼠标轻轻晃动就可以唤醒睡眠,但是有不少win8.1系统用户遇到这样一个奇怪现象,就是win8.1电脑 ...

  9. 怎么修改win11睡眠时间

    当电脑不需要使用的时候,我们可以给电脑设置睡眠时间,省电节能.不过有些小伙伴是刚开始使用win11系统,对win11的一些基础操作还不熟悉.有网友想了解怎么修改win11睡眠时间,下面小编就教下大家修 ...

最新文章

  1. Sublime Text3 安装SublimeLinter
  2. 洛谷 P1294 高手去散步-邻接矩阵+dfs-求无向图的一条最长路径
  3. React 在body上绑定事件以及阻止事件冒泡
  4. 信息学奥赛C++语言:乘车费用
  5. 小程序入门到精通:微信小程序介绍及开发准备工作(一)
  6. 求一列数据中的波峰_pandas查看缺失数据占比(实战)
  7. MongoDB SQL
  8. Linux 命令(101)—— bc 命令
  9. Spring AOP面向切面源码解析
  10. Java模拟实现一个基于文本界面的《家庭记账软件》
  11. socket error:10053
  12. 第一次c++上机实验
  13. (转)亚马逊创始人贝佐斯:前进路上,善良远比聪明重要
  14. 《Web漏洞防护》读书笔记——第12章,CSRF跨站点请求伪造防护
  15. ButterWorthFIlter(巴特沃斯滤波器)
  16. 信息系统项目管理师学习笔记10-项目沟通管理和干系人管理
  17. 苹果IOS14版本自建服务器无法下载解决方法
  18. 新底座、新产品、新方案,2022用友BIP技术大会三大数智化突破
  19. 用Python海归作图--turtle,画椭圆
  20. 千里马-modulo

热门文章

  1. 生死疲劳|因为此书莫言获得诺贝尔奖
  2. 编程猫python课程结束后哪里再学更高级别的_编程猫“敏于新,精于质”课程迭代比赛结束,离更有价值的教育又近一步...
  3. @RequestBody理解
  4. 电脑上导表显示服务器不能创建对象6,EXCEL服务器IE配置及常见问题--调用ESCal_cln10失败,Automation 服务器不能创建对象...
  5. 基于Django的图书管理系统设计与实现
  6. Ontrack EasyRecovery 数据恢复 v16.0.0.2(简体中文汉化)技术员一款全面的U盘硬盘内存卡数据恢复软件
  7. .NET TextBox滚动条高度计量
  8. leetcode刷题记录:算法(九)动态规划
  9. 半米系列:(1)移动母婴医疗健康市场分析
  10. mock挡板_【接口测试】17 Postman使用mock进行挡板测试(2)