Linux下进程的调度与切换

这篇具有很好参考价值的文章主要介绍了Linux下进程的调度与切换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌎进程的调度与切换


文章目录:

进程的调度与切换

    进程切换

    进程调度
      活动状态进程队列
      位图判断
      过期队列

    总结


前言:

  在Linux操作系统中,进程的调度与切换是操作系统核心功能之一,它直接影响着系统的性能和响应速度。那么话不多说,开启我们今天的话题!

Linux下进程的调度与切换,Linux系统编程,linux,运维,服务器


🚀进程切换

  CPU中存在众多寄存器,不同的寄存器有不同的功能,这些寄存器都在CPU中保存着,每一个都能装一定的数据。

Linux下进程的调度与切换,Linux系统编程,linux,运维,服务器
  运行队列控制着PCB排队执行,每执行到一个进程的时候,内存里的eip指针会逐条追踪下一条指令

  我们要知道,所有的保存都是为了恢复,保存在CPU寄存器里的数据,是当前进程时间片用完之前所执行的进度,而 所有的恢复,都是为了从上次的运行位置继续运行。

  并且,CPU内的所有临时数据,我们称之为进程的 硬件上下文 硬件上下文,由我们的 进程进行保存,得以保护上下文。

Linux下进程的调度与切换,Linux系统编程,linux,运维,服务器

  当进程在进行第二次及第N次调度进程的时候,进程被放到CPU上开始运行,将曾经保存的硬件上下文进行恢复

  所以进程切换最重要的就是 进程上下文的保存和恢复

  我们可以看一下内核中的一些寄存器:

Linux下进程的调度与切换,Linux系统编程,linux,运维,服务器
注意: CPU中的寄存器只有一套,而寄存器保存的数据可以有多套。虽然寄存器数据放在了共享的CPU设备内,但是 所有的数据都是被进程私有的


🚀进程调度

✈️活动状态进程队列

  我们上次说过,Linux实现进程调度的算法,需要考虑 优先级,考虑进程饥饿,以及效率。那么CPU是如何实现进程调度的呢?

  我们来看一下Linux下CPU的运行队列的各项属性:
Linux下进程的调度与切换,Linux系统编程,linux,运维,服务器

  我们首先看蓝色框内的内容,有一个叫做 queue[140] 的数组,这里的 queue数组表示活动状态进程的进程队列

  其中在queue数组中,索引0~99号下标我们是不用的,这是因为0-99号下标对应的是 实时进程的优先级,实时进程是内核里更加重要的进程,放 在前100位由操作系统控制,避免系统抢占的情况

  所以我们只剩下 100-139 这个范围可操控,其实这也就和我们优先级的可控范围大小相同,正好对应队列的四十个空位,而OS通过 某种映射关系,将可控优先级映射到数组 100-139的下标。

Linux下进程的调度与切换,Linux系统编程,linux,运维,服务器


✈️位图判断

  我们看蓝色框内还有一项 bitmap数组,类型为int,这个数组用来干嘛呢?只能存储5个整形变量。

  数组的名字叫做bitmap已经很明显了,就是位图,5个整形元素有 32 * 5 = 160 个比特位比特位的位置,表示哪一个队列。比特位的内容,表示该队列为不为空

比如:0000 … 0000 ,如果最左侧0对应queue[100]的位置,那么如果该比特位为0表示在该下标映射的优先级下该队列为空,否则不为空。

  有人会问:为什么要用位图?不得不说,这是个愚蠢的问题,遍历整个队列的时间开销要远大于查找位图。

Linux下进程的调度与切换,Linux系统编程,linux,运维,服务器

  所以,bitmap是用来检测队列中是否有进程,检测对应的比特位是否为1!

  而蓝色框内还有一个元素:nr_active,在Linux中,nr_active 是运行队列中用于表示活跃进程数量的计数器nr_active 的值可以告诉内核有多少进程正在等待执行,从而帮助内核进行进程调度和资源分配。


✈️过期队列

  在红色框中的三项属性与蓝色框中的三项属性完全相同,也就是另外一个队列,被称为——过期队列

Linux下进程的调度与切换,Linux系统编程,linux,运维,服务器

  活跃队列表示当前CPU正在执行的运行队列,而 正在执行的运行队列(也就是活跃队列)是不可以增加新的进程的

  所以操作系统设置了一个 和活跃队列相同属性的过期队列当活跃队列正在执行时如果有进程需要添加进运行队列,那么就会添加至过期队列当中也就是说 活跃队列的进程一直在减少,而过期队列中的进程一直在增多!

  当活跃队列的进程执行完毕后,就会和过期队列进行交换,它们交换的方式是通过两个结构体指针:

Linux下进程的调度与切换,Linux系统编程,linux,运维,服务器

  就是 activeexpired 结构体指针,它们分别指向活跃队列和过期队列,而活跃队列与过期队列由于属性完全相同,于是被放在了一个叫做 prio_arry_t[2] 的数组里,prio_arry_t[0]指向活跃队列,prio_arry_t[1]指向过期队列

struct q{//q是我随意取的名字
	int nr_active;
	int bitmap[5];
	task_struct queue[140];
}

struct q *active;//活跃队列
struct q *expired;//过期队列

struct q *active = &prio_array_t[0];
struct q *expired = &prio_array_t[1];

Linux下进程的调度与切换,Linux系统编程,linux,运维,服务器
  当活跃队列被CPU执行完毕后,我们 只需要交换两个指针的内容即可,这样仅仅是指向的内容变了,活跃队列变为过期队列,过期队列变活跃队列,并且时间复杂度为 O(1):

swap(active, expried);//直接交换两个指针的内容

  新增进程在过期队列里插入,此时正在执行的是活跃队列,所以这个时候在过期队列里就有时间处理竞争饥饿的问题了。

  这样,我们竞争饥饿,优先级,以及进程效率都解决了。


📒✏️总结

  •  进程切换最重要的部分就是 进程上下文的保护和恢复
  •  进程调度的优先级问题由 活跃进程数组的下标与进程优先级形成一种映射关系 解决。
  •  进程调度的时间复杂度问题由 位图和两个结构体指针 解决,时间复杂度控制在了O(1)。
  •  进程调度的进程饥饿问题由 活跃队列和过期队列 解决。

Linux下进程的调度与切换,Linux系统编程,linux,运维,服务器
  创作不易,如果这篇文章对你有帮助的话,还望三连支持博主呀~~文章来源地址https://www.toymoban.com/news/detail-841352.html

到了这里,关于Linux下进程的调度与切换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统理论:Linux进程与进程状态(进程调度的大O(1)算法数据结构模型)

    冯诺依曼体系的计算机在运行时,内存中会预加载许多程序(数据+运算指令集),然而CPU 同一时刻只能执行一个程序 (多个程序竞争CPU资源),此时就需要操作系统 对内存中的诸多程序进行管理 ,让CPU资源得到合理的分配,于是便有了进程的概念: 进程:描述程序的结构体对象( PCB结构体

    2024年02月15日
    浏览(32)
  • Linux网络编程:多进程 多线程_并发服务器

    文章目录: 一:wrap常用函数封装 wrap.h  wrap.c server.c封装实现 client.c封装实现 二:多进程process并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 三:多线程thread并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 ​​​​   read 函数的返回值 wrap.h  wrap

    2024年02月12日
    浏览(41)
  • [Linux] 网络编程 - 初见TCP套接字编程: 实现简单的单进程、多进程、多线程、线程池tcp服务器

    网络的上一篇文章, 我们介绍了网络变成的一些重要的概念, 以及 UDP套接字的编程演示. 还实现了一个简单更简陋的UDP公共聊天室. [Linux] 网络编程 - 初见UDP套接字编程: 网络编程部分相关概念、TCP、UDP协议基本特点、网络字节序、socket接口使用、简单的UDP网络及聊天室实现…

    2024年02月16日
    浏览(45)
  • Linux中 socket编程中多进程/多线程TCP并发服务器模型

    一次只能处理一个客户端的请求,等这个客户端退出后,才能处理下一个客户端。 缺点:循环服务器所处理的客户端不能有耗时操作。 模型 源码 可以同时处理多个客户端请求 父进程 / 主线程专门用于负责连接,创建子进程 / 分支线程用来与客户端交互。 模型 源码 模型 源

    2024年02月12日
    浏览(27)
  • Linux系统编程——进程间通信的学习

    学习参考博文: 进程间的五种通信方式介绍 Linux 信号介绍 Linux系统编程学习相关博文 Linux系统编程——文件编程的学习 Linux系统编程——进程的学习 Linux系统编程——线程的学习 Linux系统编程——网络编程的学习 常规学习Linux系统编程的内容是复杂且繁多的,不推荐刚开始

    2024年02月08日
    浏览(27)
  • Linux系统编程(终端和进程的关系)

    本篇文章带大家学习终端和进程的关系,终端相信大家都听过,那么真的理解终端是什么吗?应该有很多同学对于终端只是有一个模糊的概念。那么这篇文章就详细的来讲解一下终端的概念。 在Linux系统中,终端(Terminal)和控制台(Console)是两个不同的概念。它们都提供了

    2024年02月11日
    浏览(29)
  • Linux下的系统编程——进程的执行与回收(八)

    前言: 前面我们对进程已经有了一个初步的了解与认识,现在让我们学习一下进程中一些函数的具体使用,比如exec可以执行一些指定的程序,wait / waitpid可以回收子进程,什么是孤儿进程,什么是僵尸进程,下面让我们一起对这些进行中的操作进行学习吧 目录 一、exec函数族

    2024年02月09日
    浏览(36)
  • Linux下的系统编程——进程间的通信(九)

    前言:  前面我们已经对进程已经有了一个简单的了解与认识,那么进程间的通信是什么样的呢,什么是父子进程,什么是兄弟进程,没有血缘关系间的进程是如何实现进程通信的,下面让我们一起学习一下什么是进程间的通信吧。 目录 一、进程间通信常用方式 IPC方式:

    2024年02月09日
    浏览(22)
  • Linux系统编程:采用管道的方式实现进程间通信

    目录 一. 进程间通信概述 二. 管道的概念  三. 通过管道实现进程间通信 3.1 实现原理 3.2 匿名管道创建系统接口pipe 3.3 管道通信的模拟实现 3.4 管道通信的访问控制规则 3.5 管道通信的特点 四. 通过匿名管道实现进程池 4.1 进程池的概念 4.2 进程池的模拟实现 五. 命名

    2024年02月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包