【Linux的进程管理】

进程管理

  • Linux的进程
  • 进程的管理
  • 进程的状态
  • 不同状态的进程由不同的功能的链表进行管理
  • Linux的进程切换和进程上下文
  • 进程调度
    • 抢占和非抢占式调度
    • 调度算法
      • 先来先服务
        • CPU密集和I/O密集
      • 最短作业优先调度算法
      • 高响应比优先调度算法
      • 时间片轮转调度算法
        • 时间片的长度设置
      • 最高优先级调度算法
        • 非抢占式
        • 抢占式
        • 静态优先级和动态优先级
      • 多级反馈队列调度算法

Linux的进程

一个二进制的可执行文件,在操作系统中可以运行起来,就需要申请资源,以进程为实体在操作系统中进行各种状态的变化。操作系统为程序申请资源,有文件描述符集,内存,信号集,页表,cpu资源。进程就是可执行二进制文件&内核数据结构然后再操作系统的资源下的一个状态会发生变化的实体,也是操作系统分配资源的最小单位。程序先加载至内存,然后操作系统为其创建进程。

进程的管理

内核需要对每一个进程都要有了解,所以需要对进程进行管理,由进程控制块PCB管理,实质上是对进程属性集合的描述。在Linux中是由一个task_struct的结构体类型进行管理,一个task_struct就是一个进程的描述。一个task_struct内会有许多的属性,有当前该进程的唯一标识ID,操作系统为该进程创建为模板的父进程ID,当前任务的状态,文件描述符集合,进程地址空间,内存空间,信号集等一些重要属性。为了让操作系统更好的对这些进程进行管理,使用链表的数据结构对这些进程控制块task_struct进行管理。然后每个进程都会有一个指向下一个进程的指针。

task_struct组织管理进程
在这里插入图片描述
链表数据结构进行对task_struct进行管理。
在这里插入图片描述

进程的状态

有运行状态,阻塞状态,结束状态。
运行状态的进程会有两种情况,被CPU调度和准备被CPU调度,因为一个CPU只能调度一个进程,有些进程虽然资源准备就绪,但是因为自身进程优先级的原因,就会导致资源已经就绪了,但还没有被调度,只能等上一个进程完成后,才能进行调度,因为就绪的进程实质上就差被CPU调度了,使用它也可以是运行状态的。进程时间片用完以后,如果进程没有接受,且协其他的资源也没有缺少,就从运行状态转变为就绪状态。

阻塞状态 有可中断和不可中断这两种。可中断状态时,进程会休眠,当某个条件满足时,就会成为就绪状态,被CPU调度,条件可能时硬件的信号或者系统的资源。
不可中断状态 是指进程正在等待某些硬件操作完成,且这个等待过程不允许被中断。一旦进程进入不可中断状态,它将无法被任何信号或中断唤醒,直到等待的硬件操作完成。尽管进程处于等待状态,但它仍然占用一定的系统资源,如CPU时间片(尽管实际上并不执行任何操作)和进程表项。

结束状态 进程释放他之前申请的资源,返回给操作系统。

阻塞进程多了,就使用挂起状态,当阻塞的进程多路,就会占用物理内存,就会将这些进程置换到磁盘当中,腾出内存供其他的进程进行使用。

不同状态的进程由不同的功能的链表进行管理

操作系统为了更高效率的调度处于运行状态的进程,会使用一个就绪队列的链表将就绪态的进程进行管理,操作系统直接调度进行队列的进程即可()。
需要等待资源的进程就使用一个阻塞队列的链表(wait_queue)进行管理,当阻塞的进程资源准备好了或者事件完成,就将阻塞等待的进程的状态改为运行状态(wake_up()函数唤醒等待的进程),然后将该进程添加到就绪队列,在阻塞队列删除,等待CPU的调度。

Linux的进程切换和进程上下文

CPU可以使正在被调度的进程进行挂起,把另一个进程切换或恢复之前挂起的进程重新让CPU进行调度的能力。这种切换叫进程切换。当正在执行的进程被切换的时候,操作系统会保存当前进程的消息,包括当前寄存器的数据,程序计数器PC,内存管理的信息,进程的内核栈,用户堆栈的信息,当前的进程状态或者打开的文件,网络套接字等,因为有些进程是因为进程的时间片用完了,但可以继续在就绪队列中等待下一次被CPU调度。然后将下一个进程的寄存器数据,内核栈和用户堆栈信息,内存管理的信息进行恢复,根据程序计数器的位置CPU继续的执行下去。
进程的上下文包括了用户空间的上下文,寄存器上下文,系统空间的上下文,文件或网络I/O的上下文。

进程调度

Linux通过对进程的快速切换,让CPU在短时间内对多个进程独立的调度,让用户看起来有多个任务在同一时间内一起执行,这种情况叫并发。如果是多个CPU,就是并行。有抢占式调度和非抢占式的调度。

抢占和非抢占式调度

  • 系统中有许多的进程,但一个CPU只能在某一时间内运行一个进程,当一个正在CPU运行的进程被打断,让CPU资源给其他的进程,就是抢占式的调度,比如运行状态变为就绪状态,就绪状态变为运行状态。
  • 非抢占式的调度,就是进程一直运行,不会被打断,直到运行结束和进程需要某些资源而没有准备的时候发送阻塞,才让出CPU资源的式非抢占式调度。

调度算法

先来先服务

先来先服务的调度算法,是最简单的调度算法,是基于非抢占式的调度算法。直到当前在CPU调度的进程执行完成或者当前进程因为某些资源没有准备好的时候被阻塞。才会让出CPU资源。让下一个进程进行调度。每个进程在就绪队列中进行等待,先到先服务。

  • 适合CPU密集,和进程时间短的,因为可以减少进程切换的开销。
  • 不适合I/O密集,因为会有可能阻塞。看似很好的调度算法,但是如果一个进程是长作业,后续的进程就不能及时的被调度。
CPU密集和I/O密集
  • 在Linux中,更倾向于I/O密集型的进程。I/O密集型是计算机进行I/O操作会占大部分,CPU要等待I/O操作的完成,CPU的计算占少量,CPU利用率低,不能充分的使用CPU资源。所以可以使用多线程的方式来提高CPU的利用率。
  • CPU密集型,也是计算密集型,CPU的 Loading 100%,CPU密集型主要是消耗CPU资源,I/O处理很少,会在极短的时间内完成,而不会涉及大量的等待外部数据的时间。只有计算机有多个CPU,才能在CPU密集型的到效率的提升。

最短作业优先调度算法

在这里插入图片描述
最短作业有限,是将短作业时间的进程,排在运行队列的前面,选择最短时间的进程进行调度,可以提高系统的吞吐量,让更多的进程被调度。

  • 缺点:如果有太多的短作业,就会造成后续的长作业无法在合理的时间被调度。对于有实时性的任务实用性较差。

高响应比优先调度算法

该方法主要是为了权衡短作业和长作业,先计算响应优先级,然后将响应优先级高的进程先运行。优先级的算法是(等待的时间 + 要求服务的时间)/要求服务的时间。执行的时候,要么执行完毕,要么进行阻塞等待,然后更新高响应比,重新调度,直到进程全部执行完毕。

  • 优点:短作业多的时候,可以提高效率,提高操作系统的吞吐量。
  • 缺点:可能响应比的低的长作业长时间不会被调度,造成饥饿现象的问题。

时间片轮转调度算法

最简单直接的方法就是时间片轮转RR的调度算法,为每一个进程分配一个时间段,运行进程只能在该长度的时间内被CPU调度执行,如果时间片用完或者进程在时间片内完成了任务,都把CPU资源切换给下一个进程。
在这里插入图片描述

时间片的长度设置
  • 如果时间片分配得太少,会造成进程上下文的频繁切换,降低CPU的效率。
  • 如果时间分配过长,短作业的响应时间会变成。

最高优先级调度算法

该方法式赋予进程一个优先级,优先级高的进程先被CPU进行调度,有非抢占式和抢占式这两中最高优先级调度算法。

非抢占式

当CPU可以进行调度式,选择队列中优先级最高的进行运行,只有该进程让出CPU资源或发送等待事件时,才会让出CPU资源。

  • 优点:没有抢占,减少了频繁的上下文切换,有利于提高系统的稳定和可靠性。
  • 缺点:当有优先级更高的进程,可能会无法及时的进行调度,如果一个优先级高的作业调度时间长,可能会导致低优先级的作业产生饥饿情况。
抢占式

抢占式的话,如果来了一个优先级更高的进程,则会将当前进程挂起,让出CPU资源,调度优先级更高的进程。

  • 优点:在就绪队列中,优先级更高的进程会被调度,无论当前CPU是否调度进程,及时调度了,也会被高优先级进程进行抢占。
  • 缺点:会造成频繁的进程上下文切换。导致系统性能下降。
静态优先级和动态优先级
  • 静态优先级:在创建进程的时候就已经确定了,然后整个运行时间优先级都不会改变。
  • 动态优先级:会动态变化优先级,随着运行时间的增加,优先级会降低,如果进程等待时间增加了,优先级就提高。

多级反馈队列调度算法

是时间片轮转和最高优先级算法的综合和发展。

  • 多级:表示有多个队列,每个队列优先级高到低,优先级越高,时间片越短。
  • 反馈:如果有优先级更高的进程到来,加入到优先级高的队列,然后将当前调度的进程切换下来,来运行刚到来的优先级更高的进程。
    -在这里插入图片描述

工作原理

  • 设置多个队列,队列优先级由高到低,同时,优先级越高的队列,时间片就越短。
  • 当新的进程到来的时候,将进程添加到优先级最高的队列中,按先来先到的调度方法。如果在第一级队列规定的时间片没运行完成,则将其转入到第二级队列的末尾,以此类推,直至完成。
  • 如果在第一级队列规定的时间片没运行完成,则将其转入到第二级队列的末尾,以此类推,直至完成。
    可以发现,对于短作业可能在第一级队列很快的处理完。对于长作业,如果处理不完,可以移到下一次队列进行等待被执行,虽然等待时间变长了,但总会运行的。
  • 优点:对于短作业和优先级较高的进程,响应的时间越短,就可以提高系统的响应速度。有多级队列,可以合理分配的CPU的时间,避免被进程占用过多时间。
  • 缺点:频繁的队列调度和进程的移到会导致进程上下文的频繁切换,系统性能会降低。

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

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

相关文章

ava总结篇系列:Java泛型Java sort用法详解

一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(String[] args) { 4 List list new ArrayList(); 5 list.add(&q…

(学习记录)使用 STM32CubeMX——GPIO引脚输出配置

学习总结:(学习总结)STM32CubeMX HAL库 学习笔记撰写心得https://blog.csdn.net/Wang2869902214/article/details/142435481 STM32F103C8T6的GPIO引脚输出配置 时钟配置 (学习记录)使用 STM32CubeMX——配置时钟&…

原子结构与电荷

1.原子结构与电荷 1.1 物质到底是由什么构成的 阴极射线 电磁波 电磁波 我们生活中的物质。究竟是由什么构成的呢?这个问题其实困扰了人们很久。 1.提出“原子”的概念 早在2400年前,古希腊哲学家德莫克里特就提出了原子的概念。当时他就认为&…

鸿蒙操作系统(HarmonyOS)生态与机遇

HarmonyOS技术特点 鸿蒙操作系统(HarmonyOS)是华为公司开发的一款面向全场景的分布式操作系统。 架构特点: 分布式架构:这是鸿蒙系统的显著特点之一。它支持跨设备无缝协同体验,使不同设备能够快速连接、能力互助和资…

Qt --- 常用控件的介绍 --- 其他控件

一、QPushButton QWidget中设计到的各种属性/函数/使用方法,针对接下来要介绍的Qt的各种控件都是有效的。 使用QPushButton表示一个按钮,这也是当前我们最熟悉的一个控件了。这个类继承了QAbstractButton,这个类是一个抽象类,是…

逆元 P3811

【模板】模意义下的乘法逆元 - 洛谷 费马太典了。 ax py 1 (mod p) 所求 x 即逆元 exgcd. 递推: 转自zjp_shadow 由整除性得 -p/i p-p/i; 故有代码&#xff08;只用了递推 #include<bits/stdc.h> #define int long long using namespace std; int exgcd(int a,…

代码随想录算法训练营第58天|卡码网 117. 软件构建、47. 参加科学大会

1. 卡码网 117. 软件构建 题目链接&#xff1a;https://kamacoder.com/problempage.php?pid1191 文章链接&#xff1a;https://www.programmercarl.com/kamacoder/0117.软件构建.html 思路&#xff1a;使用BFS BFS的实现思路&#xff1a; 拓扑排序的过程&#xff0c;其实就两步…

win11永久关闭Windows Defend

# Win11 Microsoft Defender 防病毒 彻底关闭 Win11 Microsoft Defender 防病毒关闭 **WinR****——输入 gpedit.msc &#xff0c;打开本地组策略编辑器——计算机配置——管理模板——Windows组件——Microsoft Defender 防病毒——关闭 Microsoft Defender 防病毒策略——设置…

大厂面试真题:SpringBoot的核心注解

其实理解一个注解就行了&#xff20;SpringBootApplication&#xff0c;我们的启动类其实就加了这一个 但是这么答也不行&#xff0c;因为面试官要的答案肯定不止这一个 我们打开SpringBootApplication的源码&#xff0c;会发现上面加了一堆的注解 相对而言比较重要是下面三个…

《Learning Interactive Real-World Simulators》论文导读

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl引言与背景 为了构建一个能够真实反映现实世界并允许智能体进行交互的模拟器,《Learning Interactive Real-World Simulators》这篇论文提出了一种通过学习生成模型来创建交互式现实世界模拟器的…

C++--模板(template)详解—— 函数模板与类模板

目录 1.泛型编程 2.函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3.类模板 3.1 类模板的定义格式 3.2 类模板的实例化 1.泛型编程 在C中如果让你写一个交换函数&#xff0c;应该怎么做呢&#xff1f…

Leetcode990.等式方程的可满足性

题目 原题链接 等式方程的可满足性 思路 定义一个长度为26&#xff08;变量为小写字母&#xff09;的数组充当并查集&#xff0c;并将数组中的元素初始化为 -1判断“”并合并元素&#xff0c;将相等的放在一个集合中判断“!”&#xff1b;不等的如果在一个集合中&#xff0c;则…

2021世界人工智能大会召开 百度展示量子技术影响力

姓 名&#xff1a;王芷若 学 号&#xff1a;19020100180 学 院&#xff1a;电子工程学院 转载自&#xff1a;钥成网 原文链接&#xff1a; https://baijiahao.baidu.com/s?id1704906954970597725&wfrspider&forpc&searchword2021%E4%B8%9…

intellij idea 控制台运行java出现中文乱码的解决方法

原因&#xff1a; 字符编码不一致&#xff1a; 当你在intellij idea使用了UTF-8编码&#xff0c;而在控制台使用了其他编码&#xff08;比如gbk&#xff09;&#xff0c;就可能导致乱码。 文件读写编码问题&#xff1a; 如果读取文件时使用的编码与文件实际编码不一致&#xf…

AtCoder Regular Contest 156 C. Tree and LCS(思维题 构造 数学归纳法)

题目 构造一个排列p&#xff0c; 使得对于任意树上路径&#xff0c; 求该路径上的点(x1,...,xk)和对应排列上的点(Px1,...,Pxk)的最长公共子序列都得到一个值&#xff0c; 称为相似值 现在想令任意树上路径的相似值的最大可能长度最小&#xff0c; 最小化前提下&#xff0…

Redis笔记(基本操作+Java实现)

Redis是什么 一种数据库&#xff0c;但是不是mysql那样的表格&#xff0c;而是key-value的形式存储&#xff0c;而且它存在内存里&#xff0c;所以读写速度更快。 Redis常用数据类型 Redis常用命令简单使用 字符串操作 set name x get name 哈希操作 列表操作 集合操作 有…

自己开发了一个电脑上滚动背单词的软件

在这个快节奏的时代&#xff0c;我们每天都在忙碌中度过&#xff0c;手机虽然方便&#xff0c;但往往难以找到一整块时间来专心背单词。然而&#xff0c;你是否意识到&#xff0c;每天坐在电脑前的时间远比使用手机的时间要长&#xff1f;现在我们来介绍一个新型的学习软件灵思…

windows 驱动实例分析系列-COM驱动案例讲解

COM也被称之为串口,这是一种非常简单的通讯接口,这种结构简单的接口被广泛的应用在开发中,几乎所有系统都能支持这种通讯接口,它有RS232和RS485等分支,但一般我们都会使用RS232作为常见的串口,因为它足够简单和高效。 几乎所有的开发板,都会提供用于烧录、调试、日志的…

汽车总线之----FlexRay总线

Introduction 随着汽车智能化发展&#xff0c;车辆开发的ECU数量不断增加&#xff0c;人们对汽车系统的各个性能方面提出了更高的需求&#xff0c;比如更多的数据交互&#xff0c;更高的传输带宽等。现如今人们广泛接受电子功能来提高驾驶安全性&#xff0c;像ABS防抱死系统&a…

Nginx-HTTP和反向代理web服务器

概述 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 &#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;公开版本1.19.6发布于20…