[转帖]并发控制- sched_yield 函数

并发,控制,sched,yield,函数 · 浏览次数 : 0

小编点评

**函数说明:** `sched_yield()` 函数的作用是让出处理器,调用时会导致当前线程放弃CPU,进程管理系统会把该线程放到其对应优先级的CPU静态进程队列的尾端,然后一个新的线程会占用CPU。 **与 sleep 的区别:** * `sched_yield` 让出 CPU 后,可能仍然执行该线程,而 `sleep` 等待一段时间。 * `sched_yield` 使用另一个级别等于或高于当前线程的线程先运行,而 `sleep` 等待所有线程都处于就绪状态才唤醒。 **性能损耗:** * `sched_yield` 每次让出处理器,进程调度系统都需要将其转换为就绪状态,CPU的寄存器等都会被刷新,即使下一个运行的依然是该线程。 * 使用 `sched_yield()` 的程序,可能因为频繁让出 CPU,导致系统性能下降。 **时机:** * 在 CPU 密集型程序中,调用 `sched_yield` 可以让程序更有效地利用 CPU。 * 可以通过给其他的线程或进程运行机会的方式来提升程序的性能。 **策略的调用:** * 使用 `sched_yield()` 可以改善程序的性能,因为它可以让出 CPU给其他线程或进程。 * 可以使用策略来确保各个线程或进程都有机会运行。

正文

函数说明

  • 函数原型
#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 函数相似的内容:

[转帖]并发控制- sched_yield 函数

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

[转帖]mvcc多版本并发控制的原理

https://baijiahao.baidu.com/s?id=1751185558149315946 MVCC多版本并发控制的原理:通过undo_log多版本链条,加上开启事务时产生的readView(不同隔离级别有不同产生策略),然后再有一个查询的时候,根据readView进行判断的机制,来决

[转帖]TiDB 中的各种超时

https://docs.pingcap.com/zh/tidb/stable/dev-guide-timeouts-in-tidb 本章将介绍 TiDB 中的各种超时,为排查错误提供依据。 GC 超时 TiDB 的事务的实现采用了 MVCC(多版本并发控制)机制,当新写入的数据覆盖旧的数据时,旧的

[转帖]PostgreSQL的MVCC vs InnoDB的MVCC

任何一个数据库最主要功能之一是可扩展。如果不删除彼此,则尽可能较少锁竞争从而达到这个目的。由于read、write、update、delete是数据库中最主要且频繁进行的操作,所以并发执行这些操作时不被阻塞则显得非常重要。为了达到这种目的,大部分数据库使用多版本并发控制(Multi-Version

[转帖]KingbaseES 事务总结

目录 1. 什么是事务? 2. 事务的属性-ACID 3. 数据库事务的操作方式 3.1. SET TRANSACTION 3.2. BEGIN 3.3. COMMIT 3.4. ROLLBACK 3.5. SAVEPOINT 3.6. ROLLBACK TO SAVEPOINT 4. 事务的并发控

[转帖]lua-book-控制语句

http://me.52fhy.com/lua-book/chapter4.html Lua 语言提供的控制结构有 if-else,while,repeat,for,并提供 break、return 关键字来满足更丰富的需求。不支持switch、continue。 Lua 提供的控制语句部分特征类似

【转帖】一文解析ethtool 命令的使用

命令简介 ethtool命令用于查询和控制网络设备驱动程序和硬件设置,尤其是有线以太网设备,devname网卡的名称。网卡就像是交换机的一个端口,正常使用我们只是配置网卡IP地址等信息,网卡的速率、双工模式等我们并不关心。通过ethtool命令我们可以像配置交换机网卡一样配置这些参数,这就是这个命令

[转帖]Docker容器动态添加端口

方法1 修改iptables端口映射 docker的端口映射并不是在docker技术中实现的,而是通过宿主机的iptables来实现。通过控制网桥来做端口映射,类似路由器中设置路由端口映射。 比如我们有一个容器的80端口映射到主机的8080端口,先查看iptables到底设置了什么规则:登录后复制

[转帖]解读CPU架构:X86、ARM、MIPS、IRSC-V、CISC

https://www.cnblogs.com/zhangxinglong/p/15019549.html CPU发挥“大脑”的功能,负责数据的处理和运算, CPU 与 GPU 、内存、硬盘和网卡间并不能直接通信,需要通过内存控制芯片、 PCIe 控制芯片和 I/O 处理芯片等实现,这类通信协调芯片

[转帖]Shell编程之免交互

目录 交互的概念与Linux中的运用Here Document 免交互tee命令重定向输出加标准输出支持变量替换多行注释Expect实例操作免交互预设值修改用户密码创建用户并设置密码实现 ssh 自动登录 交互的概念与Linux中的运用 交互:当计算机播放某多媒体程序的时候,编程人员可以发出指令控制