函数说明

  • 函数原型
#include <sched.h>
int sched_yield(void);
  • 1
  • 2
  • 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();
  • 1
  • 在Linux平台上,sched_yield总是执行成功的,所以不用判断返回值。

使用时机

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

[转帖]并发控制- sched_yield 函数的更多相关文章

  1. 【linux】spinlock 的实现

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

  2. RHCA学习笔记:RH442-Unit8进程与调度

      UNIT 8  Processes and the Scheduler 进程与调度 学习目标 A. CPU cache 与Service time之间的关系 B. 分析应用程序使用CPU cach ...

  3. phpcms 源码分析三:common.inc.php

    这次是逆雪寒分析common.inc.php的数据库部分: <?php // 包含数据库操作类,下章详说 require PHPCMS_ROOT.'/include/'.$db_file.'.c ...

  4. SQL Server 2012 案例教程(贾祥素)——学习笔记

    第2章 SQL Server 2012概述 1.SQL(Structed Query Language),结构化查询语言. 2.SSMS(SQL Server Mangement Studio),SQ ...

  5. (转)Lua的table库函数insert、remove、concat、sort详细介绍

    原帖链接:http://www.jb51.net/article/64711.htm#comments 有增注标识的地方为额外注释,非原帖内容. 函数列表:(增注:只能用于数组!) table.ins ...

  6. 一个无锁消息队列引发的血案(五)——RingQueue(中) 休眠的艺术

    目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...

  7. MIT-6.828-JOS-lab4:Preemptive Multitasking

    Lab 4: Preemptive Multitasking tags: mit-6.828, os 概述 本文是lab4的实验报告,主要围绕进程相关概念进行介绍.主要将四个知识点: 开启多处理器.现 ...

  8. C++11中的mutex, lock,condition variable实现分析

    本文分析的是llvm libc++的实现:http://libcxx.llvm.org/ C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装.不 ...

  9. 北航操作系统实验2019:Lab4-1流程梳理

    北航操作系统实验2019:Lab4-1流程梳理 前言 操作系统的实验课实在令人头秃.我们需要在两周时间内学习相关知识.读懂指导书.读懂代码.补全代码.处理玄学bug和祖传bug,以及回答令人窒息的思考 ...

  10. 一文带你了解.Net自旋锁

    本文主要讲解.Net基于Thread实现自旋锁的三种方式 基于Thread.SpinWait实现自旋锁 实现原理:基于Test--And--Set原子操作实现 使用一个数据表示当前锁是否已经被获取 0 ...

随机推荐

  1. SignalR:React + ASP.NET Core Api

    一. 后台WebApi配置: 注:Vision为业务名称,以此为例,可随意修改 1. 安装包:Microsoft.AspNetCore.SignalR 2. 注入 Startup.cs Configu ...

  2. 初窥门径代码起手,Go lang1.18入门精炼教程,由白丁入鸿儒,首次运行golang程序EP01

    前文再续,书接上回,前一篇:兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00,我们搭建起了Go lang1.18的开发 ...

  3. Spring Boot 整合 Log4j2 日志并压测性能

    1/ Log4j2的性能测试 从图中不难看出,在线程数为 2~16 之间,混合使用同步和异步的logger来打印日志,性能是最好的. 2/ 目标 混合 sync/async 彩色日志 分类输出到不同文 ...

  4. 30秒,2种方法解决SQL Server的内存管理问题

    今天和大家聊一聊SQL server的内存管理,说之前我们需要先提出一个问题,SQL Server到底是如何使用内存的?弄清楚如何使用之后,才能谈如何管理. 简单说,SQL Server 数据库的内存 ...

  5. 如何利用CANN DVPP进行图片的等比例缩放?

    摘要:介绍如何用昇腾AI处理器上的DVPP单元进行,图像的等比例缩放,保证图像不变形. 本文分享自华为云社区<CANN DVPP进行图片的等比例缩放>,作者:马城林 . 1. 为什么需要进 ...

  6. 华为云MVP周峥:气象预报是个技术活,大数据、超算、AI,缺一不可

    摘要:在这样一个关乎民生的行业里,人工智能.大数据.超算这些技术,可发挥的潜力也是无限的,华为云MVP周峥就是其中的技术践行者,他正带领着团队为国内气象行业带来一股温柔而不失力量的春风. 本文分享自华 ...

  7. Go 1.18 新特性:多模块工作区模式

    摘要:在 Go 1.18 推出多模块工作区模式--Multi-Module Workspaces,用以支持模块的多个工作空间,我们来看看到底有什么特别. 本文分享自华为云社区<一起看看 Go 1 ...

  8. 火山引擎 DataTester:A/B 实验如何应用在抖音的产品优化流程中?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 日前,在 WOT 全球创新技术大会上,火山引擎 DataTester 技术负责人韩云飞做了关于字节跳动 A/B 测 ...

  9. why哥这里有一道Dubbo高频面试题,请查收。

    这是why的第 64 篇原创文章 荒腔走板 大家好,我是 why,欢迎来到我连续周更优质原创文章的第 64 篇.老规矩,先荒腔走板聊聊其他的. 上面这图是我之前拼的一个拼图. 我经常玩拼图,我大概拼了 ...

  10. Windows 2016 2019 显示桌面图标

    运行cmd窗口 输入命令 rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0 弹出桌面图标设置窗口