Linux 进程(五) 调度与切换

概念准备 

        当一个进程放在cpu上运行时,是必须要把进程的代码跑完才会进行下一个进程吗?答案肯定是 不对。现在的操作系统都是基于时间片轮转执行的。

        时间片(timeslice)又称为“量子(quantum)”或“处理器片(processor slice)”是分时操作系统分配给每个正在运行的进程微观上的一段CPU时间(在抢占内核中是:从进程开始运行直到被抢占的时间)。现代操作系统(如:Windows、Linux、Mac OS X等)允许同时运行多个进程 —— 例如,你可以在打开音乐播放器听音乐的同时用浏览器浏览网页并下载文件。事实上,虽然一台计算机通常可能有多个CPU,但是同一个CPU永远不可能真正地同时运行多个任务。在只考虑一个CPU的情况下,这些进程“看起来像”同时运行的,实则是轮番穿插地运行,由于时间片通常很短(在Linux上为5ms-800ms),用户不会感觉到。

        与分时操作系统对应的就是实时操作系统,实时操作系统比如车载操作系统,当一个进程的优先级很高必须执行完才能执行下一个,如刹车进程,必须执行完,才能执行下一个,要不然就坑用户了,所以他的进程优先级可以很低。

        分时操作系统却不会这样,分时操作系统的优先级是有范围的( [60,99] ),这样能保证每个进程都能被调度到,能够公平的照顾到每个进程,同时也照顾到了进程饥饿的问题。

进程与进程之间的关系:

        竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
        独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
        并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
        并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

        

进程切换:

        cpu由控制器和运算器组成,运算器上有寄存器如:eax/ebx/ecx/ ... ... ebp/ esp ... ...

         寄存器是cpu内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。

        进程在cpu中执行中要产生大量的数据,这些数据会被存储到寄存器上,但是当时间片耗尽时,那么这些数据该怎么办?简单来说会从cpu上剥离下来,数据存储到pcb上。其中有一个关键的寄存器叫eip,它会记录当前cpu执行到了哪一行代码的下一行。

        当cpu首次执行该进程到时间片耗尽的时候,cpu内部所产生的临时数据存放在寄存器中,这些数据我们叫进程硬件的上下文,硬件上下文让我们的进程得以保存并存储到pcb上,当进程之后在被调度时,首先就要恢复硬件的上下文,从上次结束的地方再继续执行。

        cpu寄存器只有一套,但是里面存储的进程的数据却可以有很多套,虽然数据存储在一个共享的cpu设备里,但是某个进程的数据,都是被某个进程所私有的!!!

进程调度

        上面我们提到过Linux的优先级是可以被修改的,并且范围是[60,99]。

        普通的运行队列都是FIFO的机制,Linux下的调度算法是考虑到优先级,考虑到效率和考虑到饥饿的问题。

        首先Linux下有一个这样的数组,它的类型是结构体指针,他的大小是140。[0,99]号元素我们现在不谈,[100,139]号元素,我们发现这对应的不就是nice值修改的范围。至此我们发现运行对列的数组下有存储着不同优先级队列的地址,这时cpu在调度的时候就考虑到了优先级的问题。根据优先级的高低来运行调度进程。

        在运行队列的上面我们有bitmap[5],它的类型是int,也就是说有32 * 5 = 160 个比特位,我们用每一个bit位的位置来对应每一个队列,因为只有140个队列,所以还剩下20个bit位置我们不用。bit位的内容来对应该队列是否为有内容。这样考虑到了调度时的效率问题。

        

        在runqueue上还存在着两个指针,查看英文释义,一个是活跃的,一个是到期的。活跃的意思也就是该指针指向的队列正在被cpu运行,而到期的则没有被运行。

        当cpu执行完活跃队列的进程之后,就会执行过期进程。而在执行活跃进程中又来的新进程则被按照优先级安插到了过期队列中。这样一共有两个队列,通过指针的不停切换就实现了调度的公平性。一定程度上解决了进程饥饿的问题。

        nr_active 表示有多少个活跃的队列。如果没有直接切换。

        这两个指针是怎么切换的呢?简单的来说有一个结构体数组,里面分别存放着两个队列。

把第一个元素(地址)给到active ,第二个给到 expired,然后等到活跃的进行运行完,交换两个指针的内容,实现切换。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

求职招聘小程序平台运营版系统源码 全开源源代码 附带完整的安装与部署教程

近年来,移动互联网的普及,求职招聘行业也在逐步向数字化转型。在这个过程中,小程序因其便捷性、即时性等特点,成为了求职者和招聘方的新宠。罗峰来给大家分享一款求职招聘小程序平台运营版系统源码,致力于为用户提供高…

安装elasticsearch、kibana、IK分词器、扩展IK词典

安装elasticsearch、kibana、IK分词器、扩展IK词典 后面还会安装kibana,这个会提供可视化界面方面学习。 需要注意的是elasticsearch和kibana版本一定要一样!!! 否则就像这样 elasticsearch 1、创建网络 因为我们还需要部署k…

Unable to connect to Redis server

报错内容: Exception in thread "main" org.redisson.client.RedisConnectionException: java.util.concurrent.ExecutionException: org.redisson.client.RedisConnectionException: Unable to connect to Redis server: 175.24.186.230/175.24.186.230…

Elasticsearch:带有自查询检索器的聊天机器人示例

本工作簿演示了 Elasticsearch 的自查询检索器 (self-query retriever) 将问题转换为结构化查询并将结构化查询应用于 Elasticsearch 索引的示例。 在开始之前,我们首先使用 langchain 将文档分割成块,然后使用 ElasticsearchStore.from_documents 创建…

多粒度在研究中的应用

FontDiffuser: One-Shot Font Generation via Denoising Diffusion with Multi-Scale Content Aggregation and Style Contrastive Learning 存在的问题 现有的字体生成方法虽然取得了令人满意的性能,但在处理复杂字和风格变化较大的字符(尤其是中文字符)时&#x…

lunux(mysql下载以及操作)

下载mysql 查看镜像 docker images 下载MySQL镜像 mysql/mysql-server:8.0 创建文件夹,创建配置文件和放数据文件 mkdir -p /data/mysql/{conf,,data} 创建配置文件 my.cnf 写入配置文件my.cnf的代码 [client] default-character-setutf8[mysql] de…

MySQL数据库高级SQL语句及存储过程

目录 一、高级SQL语句 (一)case语句 1.语法定义 2.示例 (二)空值(NULL) 和 无值( ) 1.区别 2.示例 (1)字符长度 (2)判断方法 ① 空值(NULL) ② 无值( ) (3…

了解Apache 配置与应用

本章内容 理解 Apache 连接保持 掌握 Apache 的访问控制 掌握 Apache 日志管理的方法 Apache HTTP Server 之所以受到众多企业的青睐,得益于其代码开源、跨平台、功能 模块化、可灵活定制等诸多优点,不仅性能稳定,在安全性方面的表现也十分…

物联网-物联网概念初识

物联网:将无线通信技术、传感设备、全球定位系统或其他信息获取方式等各种传感器嵌入到各种物体、设施中。 物联网三层架构 感知层 ——> 传输层 ——> 应用层 一、物联网通信协议 LoRa技术:基于扩频技术的超远距离无线传输方案,Lo…

C++上位软件通过Snap7开源库访问西门子S7-200/合信M226ES数据块的方法

前言 上一篇文章中介绍了Snap7访问西门子S7-1200/S7-1500 DB块的方法,对于S7-200PLC是没有数据块访问的。S7-200PLC中Snap7只能通过访问MB块,VB块的方法进行和PLC之间的Snap7通信和数据交换。手头没有S7-200PLC故通过合信CTMC M226ES运动控制器进行测试&…

以爱之名,与“EYE”同行 蔡司光学公益行一直在路上

用心传递公益温暖之力,助力更多乡村学童拥有光明未来。2023年12月26日,一场以“EYE”为主题的公益活动正在中卫市宣和镇东台小学举办。本次,眼视光领域领军品牌蔡司光学携手中卫德明眼科的专业视光团队一同来到活动现场,为该校全体…

C++八股学习心得.2

1.C常量 常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。 常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。 常量就像是常规的变量,只不过常量的值在定义后不能进行修改。 …

C# 语法进阶 委托

1.委托 委托是一个引用类型,其实他是一个类,保存方法的指针 (指针:保存一个变量的地址)他指向一个方法,当我们调用委托的时候这个方法就立即被执行 关键字:delegate 运行结果: 思…

第二证券:停牌意味着什么?

股票停牌的原因? 一般来说,股票停牌的原因可以分为以下几类: 1、上市公司有严峻情况变化,如企业并购、重组等,为了确保生意顺利完成和信息宣布的及时、充分、准确,避免商场出现信息不对称的情况&#xff…

喜报 | 群策群力,奋战半年 ! 钡铼技术顺利通过ISO9001质量管理体系认证

在这个中秋和国庆双节同庆的时刻之后,我想借此机会宣布一个好消息。钡铼技术已成功通过ISO 9001质量管理体系的认证啦。ISO 9001是全球范围内广泛应用的质量管理体系认证,具有极高的含金量和国际认可度。这一认证对公司的质量管理、环境保护和员工健康安…

软件工程期末总结

软件工程期末总结 软件危机出现的原因软件生命周期软件生命周期的概念生命周期的各个阶段 软件开发模型极限编程 可行性研究与项目开发计划需求分析结构化分析的方法结构化分析的图形工具软件设计的原则用户界面设计结构化软件设计面向对象面向对象建模 软件危机出现的原因 忽视…

P38[11-3]软件SPI读写W25Q64

接线演示及解释: CS片选,接PA4 DO从机输出,接PA6 CLK时钟,接PA5 DI从机输入,接PA7 主机:时钟(CLK,PA5),主机输出(DI,PA7),片选(CS,PA4)引脚均为推挽输出 主机输入(DO,PA6)为上拉输入 第一行显示ID号,分别是厂商ID和设备ID 第二行是写的数据内容 第二行是读的数据内…

2487. 从链表中移除节点

使用栈,依次出栈判断连接 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.…

python算法问题,求两个字符串的最长公共子序列长度

对于问题,两个字符串的最长公共子序列长度进行求解,首先要知道子序列的定义,如果说给定一个字符串,对这个字符串中的原有字符进行不改变字符相对位置的删除,这里的相对位置就是处于前还是后的相对关系,进行…

中文自然语言处理库(SnowNLP)的简单使用

snownlp 是一个简单易用的 Python 库,专为处理中文文本而设计。它基于自然语言处理技术,提供了多种功能,包括分词、词性标注、情感分析、文本转换(简繁转换)等。这个库的核心优势在于对中文文本的处理能力,…