Linux——进程基本概念中篇

Linux——进程基本概念中篇


文章目录

  • Linux——进程基本概念中篇
  • 一、通过系统调用创建进程——fork
    • 1.1 fork的理解
    • 1.2 fork的返回值
  • 二、进程状态
    • 2.1 运行状态
    • 2.2 睡眠状态和休眠状态
    • 2.3 停止状态和死亡状态
    • 2.4 僵尸进程
    • 2.5 孤儿进程
    • 2.6 前台和后台进程
  • 三、进程优先级
    • 3.1 查看优先级
    • 3.2 调整优先级
    • 3.3 并行与并发
  • 四、 Linux进程调度之大O(1)调度算法
    • 4.1活动队列
    • 4.2 过期队列
    • 4.3 active指针和expired指针


一、通过系统调用创建进程——fork

通过上篇文章我们了解到,进程 = 可执行程序 + 内核数据结构(PCB) 而操作系统OS就是通过PCB中的内容来管理进程,同时我们也了解到每个PCB中含有着自己的标识符——pid,我们需要额外了解的是对于每一个新创建的进程,其实都是由他的父进程创建而来,所以除了pid以外还有一个ppid来标志这个进程的父进程

在这里插入图片描述

1.1 fork的理解

创建进程有三种方式:

  1. 运行程序
  2. 执行命令
  3. 调用fork

由于创建进程的本质就是进程 = 可执行程序(代码和数据) + 内核数据结构(PCB) ,三者在创建本质上是没有区别的

运行程序是./文件名执行我们通过gcc或者g++编译好的可执行文件,而执行命令其实是Linux将一些常用功能写好打包通过环境变量使得系统能自动找到文件地址,直接输入文件名就能够直接执行

fork的本质是通过函数调用创建一个进程,而这个进程就需要可执行程序(代码和数据) + 内核数据结构(PCB),但fork是一个函数,是写在一段代码中的,只有当这段代码被编译执行成为一个进程(这里我们称为源进程),才会真正调用fork,但这个通过fork创建的新进程的代码从哪里来呢?

当源进程通过fork函数调用创建了一个新进程的时候,操作系统肯定也需要给新进程创建PCB,而代码和数据则是拷贝源进程的,所以我们一般称源进程为父进程,新进程为子进程

默认情况下会继承父进程的代码和数据,而且PCB也会以父进程为模板,初始化子进程的PCB(上下文信息也会继承,所以子进程fork前的代码不会运行),要注意代码是不可修改的(只读)

默认情况下会继承父进程的代码和数据,但也有特殊情况:对于父子都有的变量一个变量,父子任意一方将其修改,使得父进程与子进程中这个变量的值不同的时候,这时操作系统会针对变量发生写实拷贝,父子分别是两个值,因为进程具有独立性

这里补充写实拷贝的概念
由于进程具有独立性,当一个进程的数据发生修改,为了不让另一个进程也被改变,所以会拷贝一份数据再修改
好处:提高效率(不修改就共享)

1.2 fork的返回值

当调用fork函数时,系统就帮我们创建了一个新的进程,而我们创建一个子进程的目的肯定是需要执行与父进程不同的任务,这时就势必需要通过选择结构来区分父子进程

通过fork的返回值

失败:返回 < 0
成功
1️⃣ 给父进程返回子进程的pid
2️⃣ 给子进程返回0

在这里插入图片描述

在这里插入图片描述
如何理解一个函数会有两个返回值?

其实当fork执行到return语句的时候,fork的主要工作已经做完了,也就是说这时已经创建出了子进程,而我们上文中说到,子进程会和父进程有一样的代码和数据,其中就包括上篇中讲到的PC指针,它用于指向下一条需要执行的代码,所以这里看似是两个返回值,实际是父子进程返回的值不同,而用于接收的变量n,由于父子之间的值不同,发生了写实拷贝

值得注意的是,fork后父子进程之间谁先被执行是不确定的,需要看CPU如何调度,先调度谁,谁先执行

二、进程状态

首先想想为什么要有进程状态?

进程状态可以方便OS快速判断进程的状态,方便使其完成各种功能,本质是一种分类

linux中的进程一般有以下状态

R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里
S睡眠状态(sleeping):意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep)
D磁盘休眠状态(Disk sleep):有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束
T停止状态(stopped):可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT信号让进程继续运行
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

2.1 运行状态

在上篇中提到需要被运行的进程的PCB都被链接到一个运行队列中,在一个时间片中提供给CPU执行,到了下一个时间片就切换下一个进程,所以队列中的进程在排队被CPU调度

只要在运行队列中,所有的状态都叫做R状态,随时被CPU调用

2.2 睡眠状态和休眠状态

这两个状态实际上都是因为执行程序所需要的资源没有准备好,比如键盘的输入等等,这时由于资源不就绪,程序无法继续执行,进程就会被睡眠,等待资源就绪了才会被唤醒

这些处于睡眠或者休眠状态的进程会根据等待资源的不同,被链入不同的等待队列,比如等待键盘输入的会被链入键盘等待队列,等待磁盘读数的被链入磁盘等待队列

总结

等CPU资源的队列叫运行队列
等外设资源的队列叫等待队列
当PCB1一旦获取磁盘资源,就会把PCB1的状态改成R(被唤醒),放入运行队列中,等到他获取CPU资源的时候,再读取磁盘
从运行队列到等待队列叫做挂起等待也叫阻塞,从等待队列到运行队列叫唤醒进程

一个进程可能因为运行的需要,在不同的队列里,每个队列代表不同的运行状态

睡眠状态(S)和休眠状态(D)的区别?

S是浅度睡眠,是可以中断的
D是深度睡眠,不可中断

为什么要有两种“睡眠”状态?

当一个进程想要往磁盘写入数据,写入磁盘需要时间,此时该进程就在内存等待结果(处于休眠状态),如果此时可用资源比较少,该进程就会被OS杀死,那么磁盘写入结果的返回就无法送达,可能会引发问题,但是如果是D状态,OS也无法杀死

为什么数据刷新这么快,还是S状态?

在这里插入图片描述

在这里插入图片描述

数据写入显示器需要时间,而CPU写入的速度太快了(比IO快得多),所以我们以为进程一直在执行,其实进程大部分时间在休眠

2.3 停止状态和死亡状态

停止状态T跟睡眠状态S很像,都可以挂起进程,那么他们有什么区别呢?

睡眠状态S虽然什么事都没干,但会更新核心数据,比方说我们写了个sleep(10);到了10秒就会唤醒该进程
而停止状态T就是彻底暂停,不会更新数据,直到人为改变

停止状态就像我们平时调试的时候打的断点,程序运行起来的时候会自动运行到断点的时候停下来,这时就是停止状态

实现原理:信号

kill -19 可以暂停进程
kill -18 可以继续进程

死亡状态(X)
我们在创建进程的时候需要代码数据和PCB,当进程死亡的时候,也要把这些资源回收回去

kill -9 可以杀死进程

2.4 僵尸进程

当一个进程在退出的时候,退出信息会由OS写入到当前退出进程的PCB中,可以允许进程的代码和数据空间被释放,但是不能允许进程的PCB被立即释放,因为进程在退出的时候,要有些退出信息,表明自己把任务完成的怎么样

但当进程退出的时候,进程的所有资源不会立即回收,而是进入僵尸状态(Z),把数据暂时保存(要写入退出信息),目的是为了判断是否将任务成功完成

资源是由父进程进行回收
如果一个进程Z状态了,但是父进程就是不回收它,PCB就要一直存在?

是的,如果父进程一直不回收,PCB就会一直存在

所以僵尸进程我们需要尽量避免,因为会导致过度占用空间和内存泄漏

验证:我们可以让父进程休息,然后杀死子进程就可以看到僵尸状态

在这里插入图片描述

在这里插入图片描述

2.5 孤儿进程

字面意思,父子进程同时运行,父进程被杀掉,子进程就变成了孤儿进程
孤儿进程将会被1号进程(OS本身)领养

在这里插入图片描述

在这里插入图片描述
如果是前台进程创建的子进程,如果孤儿了,会变成后台进程

2.6 前台和后台进程

有的状态有的后面带+号有的不带,这表示什么呢?

后面带+号表示前台进程
后面不带+号表示后台进程

区别:

前台进程运行时我们无法输入任何指令,但可以Ctrl + c干掉进程
而后台进程运行的时候可以执行命令,但是Ctrl+ c不能干掉进程,想要杀死就用kill -9

三、进程优先级

首先要知道为什么有优先级,本质是因为资源不足
优先级也是PCB中的一个数据
它决定了程序获得CPU资源的顺序

Linux进程的优先级数值范围: 60 ~99
Linux中默认进程的优先级都是:80

3.1 查看优先级

ps指令

作用:ps指令主要用来显示linux进程信息
选项:-a 显示所有进程

PRI与NI

PRI :代表这个进程可被执行的优先级,其值越小越早被执行,默认值为80
NI :优先级修正数据,取值范围(-20 ~ 19)

Linux进程pcb中存在一个nice值:进程优先级的修正数据
pri(新)= pri(old) + nice

注意

old pri都是从80开始的
nice调整最小是:-20,超过部分统一当成-20
nice调整最大是:19,超过部分统一当成19

在这里插入图片描述
总结
PRI的最终值也取决于NI值(PRI=80+NI)NI范围:[-20,19]

3.2 调整优先级

调整优先级其实就是调整NI值

输入top后按r->输入进程pid->输入nice

我们知道NI的范围只能是-20 ~ 19,那么为什么不让范围更大呢?

OS调度的时候,要较为均衡的让每一个进程都要得到调度
优先级不管怎么调也只是相对的优先,不能出现绝对的优先,不然会让一些进程一直得不到资源,形成进程饥饿

3.3 并行与并发

并行

多个进程在多个CPU下分别,同时进行运行,就是在任意时刻都有两个以上的进程在运行,这称之为并行

并发:

多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发(也就是之前说的等待队列中的时间片调度)

四、 Linux进程调度之大O(1)调度算法

前面我们了解到进程之间有优先级,但优先级也分实时优先级和普通优先级,在上文中提到的优先级就是普通优先级,这里我们暂不考虑实时优先级

在这里插入图片描述

4.1活动队列

那么在Linux系统中,OS到底是如何根据进程的优先级来调度进程的呢?

OS会在系统内维护一个运行队列,我们着重看上图队列中蓝色和红色的部分,队列中会维护两个队列,分别是活跃队列和过期队列,操作系统会根据活跃队列中优先级的顺序依次调用活跃队列中的进程,直到队列中的进程全部被执行
过程
1. 从0下表开始遍历queue[140]
2. 找到第一个非空队列,该队列必定为优先级最高的队列
3. 拿到选中队列的第一个进程,开始运行,调度完成
4. 遍历queue[140]时间复杂度是常数,但还是太低效了

那么如何优化这个过程呢?

运行队列中维护了一个bitmap[5] 32 bit * 5 = 160bit 可以记录160个位置的存在信息,一共有140个优先级,所以有140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样便可以大大提高查找效率,此时效率近似于O(1)

4.2 过期队列

如果在操作系统调用活跃队列的途中,来了许多新进程呢,并且新进程比现在执行的进程优先级还高怎么办呢?

新来的进程会按照优先级依次链入过期队列中,等待活跃队列执行完,当活跃队列中没有进程需要执行的时候,OS就会将指向活跃队列的指针和指向过期队列的指针进行交换,这样活跃队列中又有进程了,并且还能保证一定的调度公平性

过期队列和活动队列结构一模一样
过期队列上放置的进程,都是时间片耗尽的进程
当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算

4.3 active指针和expired指针

active指针永远指向活动队列
expired指针永远指向过期队列

可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在

在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批新的活动进程

在这里插入图片描述


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

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

相关文章

【QT教程】QT6物联网应用

QT6物联网应用 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免费Q…

大模型入门相关文章

1.了解国内外大模型发展现状188个大模型和20个开源基础模型&#xff0c;《2023大模型产业发展白皮书》全面解析国内外大模型发展情况 - 知乎 (zhihu.com) 2.垂直领域&#xff0c;美妆大模型 关于懂美学的视觉大模型&#xff0c;我们问了美图 21 个问题 - 知乎 (zhihu.com) 3…

在C语言中如何找到字符串的长度

在C语言中处理字符串时&#xff0c;你需要知道如何找到它们的长度。 在许多情况下&#xff0c;找到C语言中字符串的长度都是至关重要的。 你可能需要执行字符串操作&#xff0c;而许多字符串操作函数都需要字符串的长度作为参数。你可能还需要验证用户输入、比较两个字符串&a…

一文读懂Partisia Blockhain:兼顾去中心化、安全性与可扩展性

“Partisia Blockhain 解决了区块链领域长期存在的问题&#xff0c;其兼顾了去中心化、安全性以及可扩展性” Partisia Blockchain 是一个具有独特零知识证明预言机以及分片解决方案的 Layer1&#xff0c;解决了困扰整个区块链行业的问题。 目前&#xff0c;多样化的区块链层出…

个人开发微信小程序?我来劝退!

为什么小程序那么受欢迎&#xff1f; 相比传统app&#xff0c;小程序即点即用&#xff0c;免下载安装&#xff0c;这是小程序最明显的优势 但使得小程序真正能火爆&#xff0c;让众多开发者喜欢的原因&#xff0c;还是其强大的分享能力和多端互通能力。寄生与微信这么一个聊天…

SRIO系列-基本概念及IP核使用

参考&#xff1a;串行RapidIO: 高性能嵌入式互连技术 | 德州仪器 SRIO协议技术分析 - 知乎 PG007 目录 一、SRIO介绍 1.1 概要 1.2 SRIO与传统互联方式的比较 1.3 串行SRIO标准 1.4 SRIO层次结构&#xff1a; 1.4.1 逻辑层 1.4.2 传输层协议 1.4.3 物理层 二、Xilinx…

全量知识系统 程序详细设计 之“因果关系模型”(QA百度文库)

Q1. 今天聊聊全量知识系统&#xff08;简称“全知系统”&#xff09;中 对“因果”的理解。&#xff08;地位、意义和作用&#xff09; 在全量知识系统&#xff08;全知系统&#xff09;中&#xff0c;“因果”是一个核心概念&#xff0c;具有极其重要的地位、意义和作用。 首…

BADI-AC_DOCUMENT-交货单过账科目替代

BADI-AC_DOCUMENT-交货单过账科目替代 一、业务场景 事务代码VL02N/VL22N及其他交货单过账事务&#xff0c;在交货单过账生成会计凭证的时候对科目进行替代 二、BADI增强&#xff1a;AC_DOCUMENT 这个BADI理论上可以处理很多的会计凭证科目替代&#xff0c;不止是交货单过账…

服务注册与发现Eureka、Zookeeper、Consul 三个注册中心的异同点(CAP理论)

Eureka Eureka是由Netflix开源的一个服务注册和发现组件&#xff0c;它主要用于构建高可用、分布式系统的基础设施中。Eureka的服务器端被称为Eureka Server&#xff0c;客户端则是那些需要注册的服务。Eureka具有以下特点&#xff1a; 高可用性&#xff1a;Eureka支持多节点…

java:Java中的String详解

目录 前言&#xff1a; String类的常用方法 1.构造方法&#xff1a; 2.字符串比较&#xff1a; 3.字符串查找&#xff1a; 4.字符串转化&#xff1a; StringBuffer和StringBuilder: 强大的字符串处理工具 1. StringBuffer和StringBuilder的作用和区别 2. StringBuilder…

ModuleNotFoundError: No module named google.protobuf 亲测有效

真的无语了每次都是环境bug&#xff0c;这次又遇上了ModuleNotFoundError: No module named google.protobuf 我先尝试了 pip uninstall protobuf pip uninstall google pip install google pip install protobuf接着还是没起色&#xff0c;我试了试 conda install -c anaco…

探索通过GPT和云平台搭建网安实战培训环境

项目背景 网络安全是一个不断演变的领域&#xff0c;面临着日益复杂的挑战和不断扩大的威胁。数字化时代&#xff0c;随着勒索攻击、数据窃取、网络钓鱼等频频出现&#xff0c;网络攻击的威胁指数和影响范围进一步增加&#xff0c;如何防范网络攻击&#xff0c;确保数据安全&a…

测试技术的发展趋势是什么

测试技术的发展趋势是在不断提高灵敏度、精确度和可靠性的基础上&#xff0c;向小型化、非接触化、多功能化、智能化和网络化方向发展。 测试人员技能需求的转变&#xff1a;测试人员需要具备更多的技能&#xff0c;如编程、脚本编写、数据分析等&#xff0c;以适应自动化和AI…

HTML5+CSS3小实例:菜单按钮的三种切换动画

实例:菜单按钮的三种切换动画 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initia…

漂亮的个人主页源码

源码介绍 漂亮的个人主页源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 漂亮的个人主页源码

原创: 重构证据定义以消解贝叶斯确证逻辑的内在矛盾

摘要&#xff1a;现行的贝叶斯确证逻辑沿袭传统确证逻辑的证据观&#xff0c;不考虑经验事实与待确证假说之间逻辑关系的确证作用&#xff0c;因而存在着旧证据问题、非相干确证问题、乌鸦悖论等内在矛盾。依据科学方法论重新构筑证据的逻辑表达&#xff0c;厘清确证的量化过程…

【正则表达式】正则表达式基本语法元素

目录 字符类量词边界匹配逻辑和分组转义和特殊字符验证正则表达式是否能够成功提取数据 字符类 .&#xff1a;匹配除换行符之外的任何单个字符。 [abc]&#xff1a;匹配方括号内的任何字符。 [^abc]&#xff1a;匹配不在方括号内的任何字符。 [a-z]&#xff1a;匹配任何小写字…

Linux安装 swoole

第一步:去官网下载swoole扩展包 ,下载地址&#xff1a; https://github.com/swoole/swoole-src/releases,下载后放入服务器根目录即可。 第二步:cd 进到该目录。执行命令/www/server/php/71/bin/phpize(注:当时我php版本是7.1)&#xff0c;该命令执行成功后应该提示如下: Con…

DZY Loves Chemistry (并查集)

//新生训练 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <queue> using namespace std; bool a[60][60]; bool vis[60]; int n; long long int cnt; void bfs(int x) {int y;queue<int> q;v…

真实世界的密码学(二)

原文&#xff1a;annas-archive.org/md5/655c944001312f47533514408a1a919a 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第六章&#xff1a;非对称加密和混合加密 本章内容包括 对秘密信息进行加密的非对称加密方法 对数据进行加密到公钥的混合加密方法 非对称和…