Linux进程状态(僵尸进程,孤儿进程)+进程优先级+进程调度与切换

Linux进程状态[僵尸进程,孤儿进程]+进程优先级

  • 一.进程状态
    • 1.进程排队
    • 2.教材上对于进程状态的描述:
      • 1.阻塞挂起
    • 3.Linux下具体的进程状态:
      • 1.Linux下的进程状态数组
      • 2.R
      • 3.S:可终止睡眠---浅度睡眠
        • 1.补充:前台进程和后台进程
        • 2.一种"奇怪"的现象
      • 4.D:不可终止睡眠---深度睡眠
      • 5.T
      • 6.t
      • 7.Z
      • 8.X
  • 二.僵尸进程
    • 1.什么是僵尸进程
    • 2.为什么要有僵尸进程的存在
    • 2.实例
    • 3.僵尸进程的危害
  • 三.孤儿进程
    • 1.孤儿进程的概念
    • 2.实例
  • 四.进程优先级
    • 1.概念
    • 2.修改进程优先级
      • 1.top命令
      • 2.Linux为什么要让调整优先级是受到限制的呢?
    • 3.测试进程优先级
  • 五.进程调度与切换
    • 1.切换
      • 1.概念准备
      • 2.进程切换的方式
      • 3.总结
    • 2.调度
      • 1.Linux系统下的调度特性
      • 2.运行队列结构
      • 3.解决优先级问题
      • 4.解决饥饿问题
      • 5.解决效率问题

一.进程状态

1.进程排队

首先,我们要先说明一下将内存排队的概念

2.教材上对于进程状态的描述:

首先我们要先明确两点:
在这里插入图片描述
在这里插入图片描述

在运行队列就是运行状态:
不要用人的感觉去评价CPU的速度,而且CPU是轮转调度

其中,阻塞状态就像是这样:
在这里插入图片描述
在这里插入图片描述
此时这个进程就处于了阻塞状态
当我从键盘输入数据之后
在这里插入图片描述
才能继续向下运行

1.阻塞挂起

在这里插入图片描述

3.Linux下具体的进程状态:

1.Linux下的进程状态数组

这是Linux内核源代码对于进程状态的描述

static const char * const task_state_array[] = {
"R (running)",
"S (sleeping)", 
"D (disk sleep)",
"T (stopped)", 
"t (tracing stop)", 
"X (dead)",
"Z (zombie)",
};

其中:
R:运行状态

阻塞状态有以下4种:
S:睡眠状态:
D:睡眠状态:
T:暂停状态:
t: 暂停状态:

还有两个状态:
Z:僵尸状态
X:退出状态

下面我们就在Linux环境下
来看一下各种状态的样子

2.R

我们先来看一下R状态:
这里我们写了一个while(1)死循环的代码来看R状态
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当我们退出mycmd对应的进程之前
这个进程显示R+状态
在这里插入图片描述

3.S:可终止睡眠—浅度睡眠

什么叫做睡眠状态呢?

睡眠状态属于阻塞状态的一种
是比较常见的一种阻塞状态
该进程因为需要等待某种软硬件资源的提供而进入睡眠状态
就跟我们刚才说的教材上对于进程状态的描述是一样的

为什么说S是可终止睡眠呢?
因为这种睡眠状态是可以被我们使用ctrl+c退出的
下面给大家看一下:
在这里插入图片描述
sleep(1)是让程序休眠1s
在这段期间进程处于睡眠状态,一直等待这1s过去
在这里插入图片描述
这个进程一直处于S状态,当我们ctrl+c时,该进程正常退出
你说的好像没什么用吧,一般情况下还能退出不了吗?

1.补充:前台进程和后台进程

有些时候还真就退出不了
前面给大家看一看
先介绍两个概念

前台进程: 进程状态显示为+,可以被ctrl+c退出掉
此时是无法执行指令的

后台进程:进程状态显示时没有+,无法被ctrl+c退出掉
此时是可以执行指令的

我们正常./可执行程序名字的时候是默认以前台进程方式来运行的
但是./可执行程序名字 &就会以后台进程方式来运行该进程

./mycmd  前台进程
./mycmd & 后台进程

在这里插入图片描述
为了更好地演示,我们加一行printf

这是作为前台进程运行:
在这里插入图片描述
此时我输入了ls,pwd这些指令,都没有用
而且ctrl+c成功退出

这是作为后台进程运行:
在这里插入图片描述

此时我输入ls,pwd这些命令就都有用了
不过ctrl+c无法退出
只能使用kill -9 进程PID来杀死进程才能退出
在这里插入图片描述

关于前台进程和后台进程我们以后还会详细介绍的
目前在这篇博客中大家先了解一下即可

2.一种"奇怪"的现象

有些细心的小伙伴可能发现了一个现象:
刚才我们printf打印的那个进程为什么明明打印了
却还是显示S状态呢?
它不应该显示R状态吗?
在这里插入图片描述
在这里插入图片描述
因为:
printf的实质是在显示器上打印
printf导致该进程频繁与显示器交互,交互时因为要等待显示器所以就处于S了
而且大部分时间是处于交互的
因此大部分时候我们看到的都是S,
只有非常低的概率才能看到R

也正是因为这个原因,我们在一开始介绍R状态的时候才会只用一个while(1)死循环

4.D:不可终止睡眠—深度睡眠

首先要说明一点:

操作系统在被逼急了的时候(资源特别紧张的时候),是会杀掉进程的(至少Linux下是这样)

因此当我们的计算机资源特别特别紧缺的时候,操作系统可能就会杀掉一部分进程

这时,如果一个特别重要的进程被杀掉了,那么会对用户造成非常大的影响.因此才有了这个D状态的出现
在这里插入图片描述

5.T

T:暂停状态
为什么会有暂停状态呢?

有些时候某些进程具有危险操作,如果你非要执行这些进程,那么操作系统就会暂停这个进程来保护计算机

首先我们要先介绍几个命令

kill -l:查看进程信号

kill -19 进程PID:暂停进程  

kill -18 进程PID:让暂停进程继续运行

在这里插入图片描述
下面我们来演示一下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一旦暂停进程了,那么这个进程就会自动从前台进程切换为后台进程,即使之后又继续运行了,但是依然是后台进程

6.t

为什么会有t状态呢?

"t (tracing stop)"

追踪停止
其实在我们使用gdb调试程序的时候,这个进程就处于t状态

大家一定不要忘了,想要用gdb调试可执行程序
使用gcc编译时要加-g选项,即使用debug模式生成可执行程序

在这里插入图片描述
下面我们来演示一下
在这里插入图片描述
当我打上断点开始运行,它就进入了t状态

7.Z

Z是僵尸状态,
处于僵尸状态的进程就是僵尸进程
我们下面会详细解释的

8.X

死亡状态(退出状态)
当一个进程要退出的时候,先把它置为X状态,然后退出这个进程

二.僵尸进程

1.什么是僵尸进程

在这里插入图片描述

2.为什么要有僵尸进程的存在

在这里插入图片描述

2.实例

在这里插入图片描述
这个代码的含义就是:
创建一个子进程,然后子进程运行5秒之后就会退出
父进程一直运行,但是父进程并不会接收子进程的结束信息
在这里插入图片描述
在这里插入图片描述
我们知道

Linux中的普通进程都有它的父进程
除非该进程是由我们所创建的进程所创建的
否则该进程的父亲就是bash

而bash会自动接收它的子进程的退出信息

那么能不能让父进程接收子进程的退出信息呢?
当然可以啦

使用
wait(NULL);
等待子进程  会接收子进程的退出信息

头文件:
#include <sys/wait.h>

下面我们来演示一下
在这里插入图片描述

这个代码的意思是:
子进程运行5s后退出
父进程运行8s后退出,退出后立即接收子进程的退出信息
然后休眠5s后退出

在子进程退出之后,父进程接收子进程退出信息之前
子进程一直处于僵尸状态
父进程接收子进程退出信息之后
子进程成功退出
在这里插入图片描述

3.僵尸进程的危害

在这里插入图片描述

三.孤儿进程

1.孤儿进程的概念

在这里插入图片描述

2.实例

在这里插入图片描述
这个代码的意思是:
子进程一直死循环运行
父进程运行5s之后退出
退出之后子进程就成为了孤儿进程
在这里插入图片描述
在这里插入图片描述

四.进程优先级

1.概念

在这里插入图片描述
在Linux中
优先级是通过一个整形变量来表示的
默认优先级是80
整个优先级的区间是[60,99](包括60 和99)
一共40个整数

数字越低,优先级越高
数字越高,优先级越低

2.修改进程优先级

Linux系统允许用户调整优先级,但是不允许用户直接修改优先级
而是通过修改nice值的方式来修改优先级

ps -l 查看进程信息

在这里插入图片描述
下面我们就来修改一下进程优先级

注意:我们不建议去调整优先级

在这里介绍这个修改进程优先级的方法是为了让我们
以后如果别人修改进程优先级,我们能看懂
还有一点就是加深一下理解

1.top命令

top命令 修改进程优先级
按q键退出
新PRI=PRI(old)+nice

注意:
1.PRI(old)一直都默认是80
这样规定是为了让我们以后修改进程优先级的时候可以不用管上一次的优先级是多少
修改起来更加方便

2.因为PRI的范围是[60,99]
而PRI(old)一直都是80
所以nice的范围是[-20,19]
1.ps -la  查看进程信息
2.top
进入top之后,我们按r
然后输入我们想要修改的进程的PID
然后输入nice值
最后退出即可

在这里插入图片描述
在这里我想将优先级修改为90
成功修改

2.Linux为什么要让调整优先级是受到限制的呢?

在这里插入图片描述

任何的分时操作系统,在进程调度上需要进行较为公平的调度!

3.测试进程优先级

下面我们来测试一下进程优先级的上下限
分别调整两次mycmd这个进程的优先级
第一次调为0(输入-80)
第二次调为200(输入120)
在这里插入图片描述
直接不允许我调整为0
我想要调整为200,结果只能调整为99

五.进程调度与切换

1.切换

1.概念准备

在这里插入图片描述

2.进程切换的方式

首先我们先举一个日常生活中的小例子
其实进程切换也是这样进行的
在这里插入图片描述
进程切换是这样运行的:
在这里插入图片描述

3.总结

在这里插入图片描述
此时再回头看看那个图书馆的例子
就能更深刻地理解进程切换了

2.调度

1.Linux系统下的调度特性

在这里插入图片描述
那么Linux操作系统的调度特性是如何做到的呢?
这就跟Linux运行队列的结构紧密相关了
下面我们就来看一下Linux运行队列的结构

2.运行队列结构

在这里插入图片描述
乍一看这个结构好麻烦啊
不要担心,我们只需要关心几个重要的结构数据即可
下面我们会一一介绍这个运行队列的结构是如何同时兼顾
优先级,效率和饥饿问题的

3.解决优先级问题

在这里插入图片描述

4.解决饥饿问题

在这里插入图片描述

操作系统是根据nr_active的值来迅速确定queue数组中的进程个数的
据此判断什么时候可以交换active指针和expired指针的指向

当一个进程的时间片耗尽了,这个进程就是过期了,就会进入过期队列当中

当一个进程运行结束了,那么就退出运行队列,也不再进入过期队列 而是变为僵尸进程,等待父进程读取结束信息

5.解决效率问题

可是这样的话,每次都还要去遍历一遍这个queue数组
又因为你CPU进程切换非常频繁,效率能不能再好一点了
这就是那个int bitmap[5];的作用了
在这里插入图片描述

以上就是Linux进程状态(僵尸进程,孤儿进程)+进程优先级+进程调度与切换的全部内容,希望能对大家有所帮助!

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

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

相关文章

如何避免光模块接口受到污染?

光模块作为光通信领域一个重要的配件&#xff0c;实现光电和电光的转换&#xff0c;和光纤连接&#xff0c;承载了数据流量的快速转换与传输。因而在整个网络体系中&#xff0c;起着至关重要的作用。虽然光模块在使用过程中&#xff0c;不像交换机和服务器等网络设备一样需要经…

echarts 自定义提示样式

在setOption中添加自定义样式 tooltip: {trigger: axis,formatter: (params)> {// console.log(params);var result if(params[0] && params[1]){result 发电量对比<div style"background:#F4F7FC;padding:5px;margin:5px 0px;border-radius:6px"&…

简易版王者荣耀

所有包和类 GameFrame类 package newKingOfHonor;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.ArrayList;im…

前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案一:编译项目时动态生成一个记录版本号的文件

前言 当我们重新部署前端项目的时候&#xff0c;如果用户一直停留在页面上并未刷新使用&#xff0c;会存在功能使用差异性的问题&#xff0c;因此&#xff0c;当前端部署项目后&#xff0c;需要提醒用户有去重新加载页面。 技术框架 vue、js、webpack 解决方案 编译项目时动…

MacOS14 Sonoma 安装 Flutter 开发环境

本文针对 小白用户也包括自己&#xff0c;以前都是将这些写入我的有道云笔记。为了让给多人看见或者说自己更好的浏览&#xff0c;先将其记录如下。 朋友介绍一个项目说要开发一款App&#xff0c;最近也是闲着就答应下来。主要功能是通过蓝牙BLE控制设备的一个 Iot边缘设备&…

2020年06月 Scratch(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共15题,每题2分,共30分) 第1题 执行下图程序后,“花名”列表的第3项是? A:莲花 B:丁香 C:合欢 D:月季 答案:C 列表基本知识,选C。 第2题 执行如下图所示程序后,其结果为? A: B:

P2704 [NOI2001] 炮兵阵地 题解

P2704 题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示 解题思路分析Code更多方法 题目 原题链接 题目描述 司令部的将军们打算在 N M N\times M NM 的网格地图上部署他们的炮兵部队。 一个 N M N\times M NM 的地图由 N N N 行 M M M 列组成&#x…

解决视口动画插件jquery.aniview.js使用animate.css时无效的问题(最新版本网页视口动画插件的使用及没作用、没反应)

当网站页面元素进入视口时自动应用过渡效果。CSS过渡效果可以为网页添加动画效果&#xff0c;并提供了一种平滑的转换方式&#xff0c;使元素的变化更加流畅和生动。而通过jQuery插件来获取页面滚动位置决定合适调用动画效果。 一、官网 animate.css官网 一款强大的预设css3动…

Unity - Graphic解析

Gpahic 的作用 Graphic 是 Unity最基础的图形基类。主要负责UGUI的显示部分。 由上图可以看你出我们经常使用的Image&#xff0c;Text&#xff0c;都是继承自Graphic。 Graphic的渲染流程 在Graphic的源码中有以下属性 [NonSerialized] private CanvasRenderer m_CanvasRend…

深度学习中的注意力机制:原理、应用与实践

深度学习中的注意力机制&#xff1a;原理、应用与实践 摘要&#xff1a; 本文将深入探讨深度学习中的注意力机制&#xff0c;包括其原理、应用领域和实践方法。我们将通过详细的解析和代码示例&#xff0c;帮助读者更好地理解和应用注意力机制&#xff0c;从而提升深度学习模…

图解算法数据结构-LeetBook-树03_层序遍历奇数偶数行方向不同

一棵圣诞树记作根节点为 root 的二叉树&#xff0c;节点值为该位置装饰彩灯的颜色编号。请按照如下规则记录彩灯装饰结果&#xff1a; 第一层按照从左到右的顺序记录 除第一层外每一层的记录顺序均与上一层相反。即第一层为从左到右&#xff0c;第二层为从右到左。 示例 1&…

【论文解读】Edit-DiffNeRF:使用2D-扩散模型编辑3D-NeRF

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/abs/2306.09551 摘要 最近的研究表明&#xff0c;将预训练的扩散模型与神经辐射场&#xff08;NeRF&#xff09;相结合&#xff0c;是一种很有前途的文本到 3D 的生成…

Java(119):ExcelUtil工具类(org.apache.poi读取和写入Excel)

ExcelUtil工具类(XSSFWorkbook读取和写入Excel)&#xff0c;入参和出参都是&#xff1a;List<Map<String,Object>> 一、读取Excel testdata.xlsx 1、new XSSFWorkbook对象 File file new File(filePath); FileInputStream fis new FileInputStream(…

如何获取抖音订单API数据接口?

在开放平台中&#xff0c;每个API接口都有相应的文档说明和授权机制&#xff0c;以确保数据的安全性和可靠性。开发者可以根据自己的需求选择相应的API接口&#xff0c;并根据文档说明进行调用和使用。 开放平台API接口是一套REST方式的开放应用程序编程接口&#xff0c;它…

【Qt】判断QList链表内是否有重复数据

QList<int> listInt;listInt.push_back(1);listInt.push_back(1);listInt.push_back(2);listInt.push_back(3);qDebug().noquote() << listInt.toSet().toList();

【Python】使用globals()函数成功解决tkinter多个新窗口问题

我在近期的一个项目&#xff08;tkinter复刻记事本&#xff09;上遇到一个很有意思的问题&#xff1a;如何在创建多个新窗口后&#xff0c;每个窗口还能独立运行&#xff1f;当时我尝试几种方法&#xff0c;奈何实力不足&#xff0c;于是便下定结论非使用线程不可&#xff0c;至…

YOLOv7独家原创改进: AKConv(可改变核卷积),即插即用的卷积,效果秒杀DSConv | 2023年11月最新发表

💡💡💡本文全网首发独家改进:可改变核卷积(AKConv),赋予卷积核任意数量的参数和任意采样形状,为网络开销和性能之间的权衡提供更丰富的选择,解决具有固定样本形状和正方形的卷积核不能很好地适应不断变化的目标的问题点,效果秒殺DSConv 1)AKConv替代标准卷积进行…

【全新升级】:Word、Excel和PPT批量转PDF - PyQt设计

文章目录 ✨前言✨脚本使用教程&#x1f4da;资源领取&#xff08;含源代码&#xff09; ✨前言 最近花了十几天的时间学习了PyQt的使用&#xff0c;发现PyQt具有丰富的特性和功能&#xff0c;可以创建出漂亮、交互性强的GUI应用程序&#xff0c;而且还可通过CSS样式表来设计界…

亥姆霍兹线圈磁场特点

亥姆霍兹线圈是一种由两个平行的同轴线圈组成的电磁装置&#xff0c;它的电流方向相反&#xff0c;且它们的半径相等&#xff0c;距离也相等。亥姆霍兹线圈的磁场特点主要有以下几个方面&#xff1a; 磁场均匀性高&#xff1a;亥姆霍兹线圈的磁场均匀性非常高&#xff0c;因为…

ESXi 添加新网络 配置ubuntu虚拟机双网卡

基本概念 在ESXi的虚拟机之间确保正常通信的基础是网络服务&#xff0c;通常在物理网络中需要使用不同的物理设备进行连接才能组建出高效的网络服务&#xff0c;而在虚拟网络中&#xff0c;需要不同的虚拟设备为其提供服务。 ESXi的网络类型&#xff1a; 1、物理网络&#xf…