线程的调度

news2025/1/19 7:55:19

线程的执行总是趋向于CPU受限或IO受限

一些线程需要花费一定的时间使用CPU进行计算,而另外一些线程则会花费一些时间等待相对较慢的I/O操作的完成

一个用于计算16位整数的14次方根的线程属于前者,而一个等待人类用户通过敲击键盘提供输入数据的线程则属于后者

调度器会依据它对线程的趋向性的猜测把它们分类,并让I/O受限的线程具有更高的动态优先级以优先使用CPU。因为IO操作往往会花费更长时间,应该让它们尽早开始

线程的优先级调整

线程的动态优先级是可以被调度器实时调整的,而与之相对应的线程的静态优先级则只能由应用程序指定

如果应用程序没有显式指定一个线程的静态优先级,那么它将被设定为0

调度器并不会改变线程的静态优先级。线程的动态优先级就是调度器在其静态优先级的基础上调整得出的,它在线程的运行顺序上起到了关键的作用

而线程的静态优先级则决定了线程单次在CPU上运行的最长时间,也就是调度器分配给它的时间片的大小

动态优先级排序

所有等待使用CPU的线程会按照动态优先级从高到低的顺序排列,并依序放到与该CPU对应的运行队列中

因此,下一个运行的线程总是动态优先级最高的那一个

实际上,每一个CPU的运行队列中都包含两个优先级阵列

  • 用于存放正在等待运行的线程,称之为激活的优先级阵列
  • 用于存放已经运行过但还未完成的线程,称之为过期的优先级阵列

优先级阵列是一个由若干个链表组成的数组。一个链表只会包含具有相同优先级的线程,而一个线程也只会放到与其优先级相对应的那个链表中

当一个线程放入某个优先级阵列时,实际上就放到了与其优先级相对应的那个链表的末尾处

在这里插入图片描述

优先队列的运行

下一个运行的线程总是会从激活的优先级阵列中选出

如果调度器发现某个线程已经占用了CPU很长时间(该时间只会小于或等于给予线程的时间片)

并且激活的优先级阵列中还有优先级与它相同的线程在等待运行,那么调度器就会让那个等待的线程在CPU上运行,而被换下的线程会排入过期的优先级

当激活的优先级阵列中没有待运行的线程时,调度器会把这两个优先级阵列的身份互换,即之前的激活优先级阵列成为新的过期的优先级阵列,而之前的过期的优先级阵列则会成为新的激活的优先级阵列

如此一来,之前被放入过期的优先级阵列的线程就又有机会运行了

线程的状态

线程会因等待某个事件或条件的发生而加入到对应的等待队列中,并随即进入睡眠状态

当事件发生或条件满足时,内核会通知对应的等待队列中的所有线程,这些线程会因此而被唤醒并从等待队列转移至适当的运行队列中

调度器往往会稍稍调高唤醒的线程的动态优先级

线程与CPU

如果当前计算机上有多个CPU,那么平衡它们之间的负载也将会调度器的职责之一

调度器会尽量使一个线程在一个特定的CPU上运行。这样就可以维持高速缓存的高命中率以及高效使用就近的内存

有时候,一个CPU需要运行太多线程以至于造成了多CPU之间负载的不平衡。也就是说,一些CPU过于忙碌,另一些被闲置

在这种情况下,调度器会把一些原来在较忙碌CPU上运行的线程迁移至其他较空闲的CPU上运行

由于内核会为每个CPU建立一个运行队列,所以线程的这种迁移并不困难

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1881084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Bytebase 2.20.0 - 支持为工单事件配置飞书个人通知

🚀 新功能 支持 Databricks。支持 SQL Server 的 TLS/SSL 连接。支持为工单事件配置飞书个人通知。支持限制用户注册的邮箱域名。 🔔 重大变更 将分类分级同步设置从数据库配置移至工作空间的全局配置。 SQL 编辑器只读模式下只允许执行 Redis 的只读…

Java SE入门及基础(60) 线程的实现(下) 线程的同步(synchronized 和 Lock 的实现) 线程通信 线程状态

目录 线程 (下) 4. 线程同步-synchronized 同步方法语法 示例 同步代码块语法 示例 synchronized锁实现原理 5. 线程同步-Lock 示例 6. 线程通信 Object类中的通信方法 案例 分析 代码实现 7. 线程状态 线程状态转换图 线程 &#xff08…

老师如何将期末成绩单独发给家长?

老师们,期末季又到了,又要面临一个重要而微妙的任务——发放期末成绩。在这个信息爆炸的时代,如何安全、高效、又充满人情味地将成绩单送到家长手中,成了我们的一项挑战。今天,我就来和大家分享一些小技巧,…

Wp-scan一键扫描wordpress网页(KALI工具系列三十二)

目录 1、KALI LINUX 简介 2、Wp-scan工具简介 3、信息收集 3.1 目标IP(服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描已知漏洞 4.3 扫描目标主题 4.4 列出用户 4.5 输出扫描文件 4.6 输出详细结果 5、总结 1、KALI LINUX 简介 Kali Linux 是一…

LeetCode 算法:二叉树的右视图 c++

原题链接🔗:二叉树的右视图 难度:中等⭐️⭐️ 题目 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4…

某易六月实习笔试

第一题 下面代码需要更改的地方已指出。 解题思路 模拟题,用双指针记录双方当前式神,再记录一下当前谁先手,直到有一方指针越界。 把下面代码now1变为now(now1)%2就行。 第二题 解题思路 01背包变种,只是背包的容量变为多个维度…

清华大学世界排名:2025QS世界大学排名第20名

近日,国际高等教育研究机构QS Quacquarelli Symonds正式发布了2025QS世界大学排名,其中麻省理工学院连续第13年蝉联榜首,北京大学排名由去年的全球第17上升至全球第14名,清华大学位列2025QS世界大学排名第20名,以下是查…

【高级篇】分区与分片:MySQL的高级数据管理技术(十三)

引言 在上一章,我们探讨了MySQL的主从复制与高可用性,这是构建健壮数据库架构的基石。现在,让我们深入到更高级的主题——分区与分片,这些技术对于处理大规模数据集和提升数据库性能至关重要。我们将详细介绍表分区的概念、类型及分片技术的应用,为下一章讨论MySQL集群与…

【硬件视界2】CPU和GPU:计算机架构的双子星

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 1、CPU (中央处理器)①主要作用②特点 2、 GPU (图形处理…

架构师篇-9、从事件风暴到微服务设计的落地过程

用户付款功能第二个版本的设计实现 单一职责原则(SRP) 软件系统中的每个元素只完成自己职责内的事,将其他的事交给别人去做“职责”通常人理解为一个事情,与该事情相关的事都是它的责任 一个职责是软件变化的一个原因 第二次需求…

2024年06月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

本文收录于《Scratch等级认证CCF-GESP图形化真题解析》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(共 10 题,每题 3 分,共 30 分) 第1题 小杨父母带他到某培训机构给他报名参加 CCF 组织的 GESP 认证考试的第 1 级,那他可以选择的认证语言有几…

Apache Ranger 2.4.0 集成hadoop 3.X(Kerbos)

1、安装Ranger 参照上一个文章 2、修改配置 把各种plugin转到统一目录(源码编译的target目录下拷贝过来),比如 tar zxvf ranger-2.4.0-hdfs-plugin.tar.gz tar zxvf ranger-2.4.0-hdfs-plugin.tar.gz vim install.properties POLICY_MG…

基于vue脚手架创建的图书商城

功能简介 此项目包括首页, 搜索列表, 商品详情, 购物车, 订单, 支付, 用户登陆/注册等多个子模块,使用 Vue 全家 桶ES6WebpackAxios 等技术,采用模块化、组件化、工程化的模式开发。 功能模块图 2.1首页 2.2.搜索列表 2.3.商品详情 2.4.购物车 2.5.支…

flask的基本使用2

上一篇我们介绍了基本使用方法 flask使用 【 1 】基本使用 from flask import Flask# 1 实例化得到对象 app Flask(__name__)# 2 注册路由--》写视图函数 app.route(/) def index():# 3 返回给前端字符串return hello worldif __name__ __main__:# 运行app,默认…

正则表达式阅读理解

这段正则表达式可以匹配什么呢? 超级复杂的一段正则表达式。 ((max|min)\\s*\\([^\\)]*(,[^\\)]*)*\\)|[a-zA-Z][a-zA-Z0-9]*(_[a-zA-Z][a-zA-Z0-9]*)?(\\*||%)?|[0-9](\\.[0-9])?|\\([^\\)]*(,[^\\)]*)*\\))(\\s*[-*/%]\\s*([a-zA-Z][a-zA-Z0-9]*(_[a-zA-Z][…

Servlet_Web小结

1.web开发概述 什么是服务器? 解释一:服务器就是一款软件,可以向其发送请求,服务器会做出一个响应. 可以在服务器中部署文件,让他人访问 解释二:也可以把运行服务器软件的计算机也可以称为服务器。 web开发: 指的是从网页中向后…

vue2实例实现一个初步的vue-router

vue2实例实现一个初步的vue-router 实现源码:vue2-review 1.App.vue 2.router目录下的index.js 3.自己实现的x-router.js 4.自己实现的xrouter-view.js 5.自己实现的xrouter-link.js 6.效果 微信公众号:刺头拾年

Unity Shader 极坐标

Unity Shader 极坐标 前言项目简单极坐标极坐标变体之方形极坐标变体之圆形拉花 鸣谢 前言 极坐标记录 项目 简单极坐标 极坐标变体之方形 极坐标变体之圆形 拉花 鸣谢 【菲兹杂货铺】【Unity Shader教程】极坐标实现以及极坐标的两种变体

VUE的快速使用

使用步骤 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&…

【LeetCode】 740. 删除并获得点数

这真是一道好题&#xff01;这道题不仅考察了抽象思维&#xff0c;还考察了分析能力、化繁为简的能力&#xff0c;同时还有对基本功的考察。想顺利地做出这道题还挺不容易&#xff01;我倒在了第一步与第二步&#xff1a;抽象思维和化繁为简。题目的要求稍微复杂一些&#xff0…