[转帖]并发控制- sched_yield 函数
函数说明
- 函数原型
#include <sched.h>
int sched_yield(void);
- 1
- 2
- sched_yield的作用是让出处理器,调用时会导致当前线程放弃CPU,进程管理系统会把该线程放到其对应优先级的CPU静态进程队列的尾端,然后一个新的线程会占用CPU。
- 详细说明可以查看man中的帮助信息。
理解
与sleep的区别
- 从作用上来看,sched_yield与sleep很相似,但是差别很大。
- sched_yield让出CPU后,并不一定会执行另一个进程,可能依然是执行该线程,而sleep一定会等待一段时间,sched_yield函数可以使用另一个级别等于或高于当前线程的线程先运行。如果没有符合条件的线程,那么这个函数将会立刻返回然后继续执行当前线程的程序。
- sched_yield让出CPU后,该线程处于就绪状态,而调用sleep后,线程处于阻塞状态,唤醒后需要先转为就绪状态才能执行。
性能损耗
- 不能随意调用sched_yield函数,虽然该函数并不会造成不良的效果,但是每次让出处理器,进程调度系统都需要将其转换为就绪状态,CPU的寄存器等都会被刷新,即使下一个运行的依然是该线程。
使用
- 调用
sched_yield();
- 1
- 在Linux平台上,sched_yield总是执行成功的,所以不用判断返回值。
使用时机
- 由于时刻处于争夺CPU状态,CPU密集型程序更容易得到调度,持续占用CPU,会导致其它线程阻塞,得不到时间片,运行时长变长,周期性调用sched_yield,可以将该进程对系统的冲击减到最小,给其它线程运行机会,如果没有其它线程需要CPU资源也会立即获得调度,进入运行状态。
- 有策略的调用sched_yield()能在资源竞争情况很严重时,通过给其他的线程或进程运行机会的方式来提升程序的性能。也就是说,调用sched_yield()能让你的当前线程让出资源,通过一定的策略调用sched_yield()满足你的业务要求可以保证各个线程或进程都有机会运行。
- 应用层锁,如果一个线程试图取得另一个线程所持有的锁,则新的线程应该让出处理器直到该锁变为可用,用户空间锁没有内核的支持,这是一个最间单、最有效率的做法,但是现在Linux线程实现引入一个使用futexes的优化解决方案。
</article>
[转帖]并发控制- sched_yield 函数的更多相关文章
- 【linux】spinlock 的实现
一.什么是spinlock spinlock又称自旋锁,是实现保护共享资源而提出一种锁机制.自旋锁与互斥锁比较类似,都是为了解决对某项资源的互斥使用 无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一 ...
- RHCA学习笔记:RH442-Unit8进程与调度
UNIT 8 Processes and the Scheduler 进程与调度 学习目标 A. CPU cache 与Service time之间的关系 B. 分析应用程序使用CPU cach ...
- phpcms 源码分析三:common.inc.php
这次是逆雪寒分析common.inc.php的数据库部分: <?php // 包含数据库操作类,下章详说 require PHPCMS_ROOT.'/include/'.$db_file.'.c ...
- SQL Server 2012 案例教程(贾祥素)——学习笔记
第2章 SQL Server 2012概述 1.SQL(Structed Query Language),结构化查询语言. 2.SSMS(SQL Server Mangement Studio),SQ ...
- (转)Lua的table库函数insert、remove、concat、sort详细介绍
原帖链接:http://www.jb51.net/article/64711.htm#comments 有增注标识的地方为额外注释,非原帖内容. 函数列表:(增注:只能用于数组!) table.ins ...
- 一个无锁消息队列引发的血案(五)——RingQueue(中) 休眠的艺术
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- MIT-6.828-JOS-lab4:Preemptive Multitasking
Lab 4: Preemptive Multitasking tags: mit-6.828, os 概述 本文是lab4的实验报告,主要围绕进程相关概念进行介绍.主要将四个知识点: 开启多处理器.现 ...
- C++11中的mutex, lock,condition variable实现分析
本文分析的是llvm libc++的实现:http://libcxx.llvm.org/ C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装.不 ...
- 北航操作系统实验2019:Lab4-1流程梳理
北航操作系统实验2019:Lab4-1流程梳理 前言 操作系统的实验课实在令人头秃.我们需要在两周时间内学习相关知识.读懂指导书.读懂代码.补全代码.处理玄学bug和祖传bug,以及回答令人窒息的思考 ...
- 一文带你了解.Net自旋锁
本文主要讲解.Net基于Thread实现自旋锁的三种方式 基于Thread.SpinWait实现自旋锁 实现原理:基于Test--And--Set原子操作实现 使用一个数据表示当前锁是否已经被获取 0 ...
随机推荐
- 为什么OpenAPI是未来企业数字化转型的决定性因素?
本文分享自华为云开发者联盟公众号<为什么OpenAPI是未来企业数字化转型的决定性因素?>. 随着数字经济不断发展升级,数据互通.万物互联正在逐步成为IT产业发展的主旋律,企业数字化转型也 ...
- 云图说|Git云上仓库哪家好?一张图了解华为云代码托管服务
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要: 云办公时代已然到 ...
- 【活动预告】数据集成引擎BitSail遇上CDC
BitSail是字节跳动开源数据集成引擎,于2022年10月26日宣布开源,可支持多种异构数据源间的数据同步,并提供离线.实时.全量.增量场景下全域数据集成解决方案.BitSail支撑了字节内部众多的 ...
- 火山引擎 DataTester“智能发布”:覆盖产品研发、测试、上线全流程,一站式智能管理 A/B 实验
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 A/B 测试是企业产品新老功能迭代时,进行效果监测的方法.通过 A/B 测试,可以提高功能改动给产品带来正向收益的确定性. ...
- WxJava for Solon - 咱也不知道为啥要写
? 应 Solon 技术交流群里小伙伴的要求,我分享下在 Solon 中使用 WxJava 的经验.类库. 具体实现 提供统一的 Yaml 配置 package cn.edu.hnuahe.mount ...
- Intellij 查找排除JAR包的依赖关系(Maven Helper)
Intellij 查找排除JAR包的依赖关系(Maven Helper) 安装插件 Windows 类似
- 跟着老猫来搞GO,系好安全带,准备发车!
为什么想要开篇这么一个系列博客主题? 我想有很多小伙伴想要问我这个,其实主要有以下几个原因. 在粉丝面前丢脸了 之前写过几篇关于java分布式系统的一些坑,然后就有小伙伴挺崇拜的,认为老猫啥都会,甚至 ...
- peewee 操作 sqlite 锁表问题分析
在使用python orm 框架 peewee 操作数据库时时常会抛出以一个异常,具体的报错就是 database is locked 初步了解是因为sqlite锁的颗粒度比较大,是库锁.当一个连接在 ...
- 自用 | Rust 基础学习资料
Rust语言圣经:Github,GitBook Rustt,RusttT 翻译小组的官方仓库,这里有国外优秀的技术文章.学习教程.新闻资讯的高质量翻译. Rust语言周刊,每周五发布,精选过去一周的技 ...
- Puppeteer 入门与实战
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/P-YdQPOQ9GZgjDEP7VG8ag作者:Wang Zhenzheng Puppetee ...