函数说明

  • 函数原型
#include <sched.h>
int sched_yield(void);
  • sched_yield的作用是让出处理器,调用时会导致当前线程放弃CPU,进程管理系统会把该线程放到其对应优先级的CPU静态进程队列的尾端,然后一个新的线程会占用CPU。
  • 详细说明可以查看man中的帮助信息。

理解

与sleep的区别

  • 从作用上来看,sched_yield与sleep很相似,但是差别很大。
  1. sched_yield让出CPU后,并不一定会执行另一个进程,可能依然是执行该线程,而sleep一定会等待一段时间,sched_yield函数可以使用另一个级别等于或高于当前线程的线程先运行。如果没有符合条件的线程,那么这个函数将会立刻返回然后继续执行当前线程的程序。
  2. sched_yield让出CPU后,该线程处于就绪状态,而调用sleep后,线程处于阻塞状态,唤醒后需要先转为就绪状态才能执行。

性能损耗

  • 不能随意调用sched_yield函数,虽然该函数并不会造成不良的效果,但是每次让出处理器,进程调度系统都需要将其转换为就绪状态,CPU的寄存器等都会被刷新,即使下一个运行的依然是该线程。

使用

  • 调用
sched_yield();
  • 在Linux平台上,sched_yield总是执行成功的,所以不用判断返回值。

使用时机

  1. 由于时刻处于争夺CPU状态,CPU密集型程序更容易得到调度,持续占用CPU,会导致其它线程阻塞,得不到时间片,运行时长变长,周期性调用sched_yield,可以将该进程对系统的冲击减到最小,给其它线程运行机会,如果没有其它线程需要CPU资源也会立即获得调度,进入运行状态。
  • 有策略的调用sched_yield()能在资源竞争情况很严重时,通过给其他的线程或进程运行机会的方式来提升程序的性能。也就是说,调用sched_yield()能让你的当前线程让出资源,通过一定的策略调用sched_yield()满足你的业务要求可以保证各个线程或进程都有机会运行。
  1. 应用层锁,如果一个线程试图取得另一个线程所持有的锁,则新的线程应该让出处理器直到该锁变为可用,用户空间锁没有内核的支持,这是一个最间单、最有效率的做法,但是现在Linux线程实现引入一个使用futexes的优化解决方案。

并发控制- sched_yield 函数相关推荐

  1. linux进程的高级管理,sched_yield()函数 高级进程管理

    1.让出处理器 Linux提供一个系统调用运行进程主动让出执行权:sched_yield.进程运行的好好的,为什么需要这个函数呢?有一种情况是用户空间线程的锁定.如果一个线程试图取得另一个线程所持有的 ...

  2. 理解操作系统的sleep函数

    写的很形象,分享一下.另外Linux中的sleep(0)内部实现其实就是sched_yield()函数,所以本来就是用于让出cpu控制权的. http://www.cnblogs.com/ILove/ ...

  3. 关于sched_yield()主动出让CPU的占有权

    有时候程序在一个死循环中执行,不断尝试获取某个资源,如果没有获得就会不断尝试.为了防止程序空跑,可以调用sched_yield函数来主动出让CPU的占有权,减少CPU的空跑.比如自旋锁的实现可以调用s ...

  4. 【linux】spinlock 的实现

    一.什么是spinlock spinlock又称自旋锁,是实现保护共享资源而提出一种锁机制.自旋锁与互斥锁比较类似,都是为了解决对某项资源的互斥使用 无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一 ...

  5. Linux内核设计与实现---进程调度

    进程调度 1 策略 I/O消耗型和处理器消耗型的进程 进程优先级 时间片 进程抢占 2 Linux调度算法 可执行队列 优先级数组 重新计算时间片 schedule() 计算优先级和时间片 睡眠和唤醒 ...

  6. js 模拟浏览器的并行请求限制

    // 实现一个createRequest方法(假设浏览器允许无限多的并行请求),调用形式如下图,最后实现效果如图:// ====> // =====> // =======> // ...

  7. linux两个子进程通信,Linux c 匿名管道实例—创建两个子进程与父进程进行管道通信...

    综合: 建立两个子进程: 一个负责计算1-50000的素数 另外一个负责计算50001-100000 父进程负责存储 利用fork创建两个子进程的框架: #include #include #incl ...

  8. Linux进程调度-deadline调度器

    Linux内核中定义了5个调度器类,分别对应5个调度器,调度优先级顺序由高到低依次为:stop_sched_class.dl_sched_class.rt_sched_class.fair_sched ...

  9. OSDI‘22 BEST PAPER“XRP: In-Kernel Storage Functions with eBPF“阅读笔记

    原文链接:https://www.usenix.org/conference/osdi22/presentation/zhong 背景和动机 1.动机实验配置 CPU 6-core i5-8500 3 ...

最新文章

  1. Java学习笔记二十五:Java面向对象的三大特性之多态
  2. 小目标 | DAX高级实践-Power BI与Excel联合应用
  3. MPB:农科院田健、韩东飞等-​​水稻根系互作功能微生物的筛选方法
  4. Ant Design 3.16.2 发布,企业级 UI 设计语言
  5. matlab增强对数字辅助,MATLAB 增强对数字辅助 RF MIMO 系统的设计支持
  6. python三层装饰器-python三大神器===》装饰器
  7. epoll 的accept , read, write
  8. 关闭Android/iPhone浏览器自动识别数字为电话号码
  9. linux与安卓系统目录,android系统架构及源码目录结构
  10. SAP IBASE logic of pt_equiindx
  11. P3338 [ZJOI2014]力 FFT + 推式子
  12. 帝国cms 6.6 采集入库多记录时出现空白 解决办法
  13. git 从远程git服务上拉代码 git服务器非默认端口
  14. “食物链”的顶端合约ALOKEX 顺势而行一万年太久只争朝夕
  15. 解放你的双手,python在excel中的高效办公
  16. 华为交换机升级包及补丁验证完整性
  17. linux系统解压缩rar文件夹,linux下解压缩rar文件的办法
  18. map函数、filer函数、reduce函数的用法和区别
  19. 安逸云中小云厂商机遇
  20. 罗密哦与朱丽叶----this指针、函数封装

热门文章

  1. 2022-5-4-找出游戏的获胜者
  2. 在uniAPP中使用使用低功耗蓝牙通讯
  3. 5种div 内容水平垂直居中方法
  4. 泛微OA V8 SQL注入漏洞和文件上传漏洞
  5. 如何使用ipv6格式的url访问HTTP服务器
  6. 利用Python对文件夹下的TXT文件批量改名、改内容操作
  7. python:中文词法分析(LAC)
  8. 条码打印软件如何连接激光打印机打印条码标签
  9. 下载 tumblr 标记为喜欢的内容
  10. 高速数字PCB板设计中的信号完整性分析