【Linux】7. 进程概念

news2024/11/27 10:28:33

在进程的学习之前首先需要理解并掌握冯诺依曼体系结构及操作系统的相关概念

1. 冯诺依曼体系结构

在这里插入图片描述
在这里插入图片描述
最终我们得到的结论是:
在数据层面上

  1. CPU不与外部设备进行交互,而是直接和内存交互
  2. 所有的外部设备需要数据载入,只能载入到内存中。数据从内存中写出,也一定是需要写到外部设备当中

程序需要运行就必须加载到内存当中,为什么呢?
因为冯诺依曼体系结构规定CPU需要执行我的代码/访问我的数据就只能从内存中读取

在这里插入图片描述

2. 操作系统

在这里插入图片描述
在这里插入图片描述
经过上面的描述,我们清楚的知道了管理的本质是对数据进行管理,管理方法是先描述再组织,但是以上都是操作系统管理硬件的方式,那么操作系统是如何管理软件的呢?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 进程概念

在这里插入图片描述

4. 进程指令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
命令行上启动的进程,一般情况下(不是特殊情况)它的父进程都是bash!

5. fork 创建子进程

在这里插入图片描述

6. 进程状态

6.1 为什么要存在进程状态

在这里插入图片描述

6.2 R- 运行状态

在这里插入图片描述

6.3 阻塞状态

假设CPU在执行处于运行状态的某个进程时(该进程处于运行队列当中),发现该进程要往磁盘上写入数据(fwrite),但是CPU的运行效率和磁盘相比不是一个量级的,CPU并不想等待磁盘做出响应(太慢),所以CPU将该进程从运行队列中拿出,将该进程链入磁盘的等待队列当中,CPU继续调度运行队列中的其他进程。
对于CPU来讲,CPU永远执行的是处于运行状态的进程,一旦该进程需要访问外设资源时,CPU就会将其从运行队列中拿出,链入到对应外设的等待队列当中
当该进程处于外设的等待队列中时,该进程也就不是R状态,我们将此时的进程状态称之为阻塞状态。
而上述的挪动操作并不是将加载到内存的代码和数据进行挪动而是针对进程的task_struct(PCB)对象放入到不同的队列当中。

当磁盘准备完毕(可以写入的状态)时,操作系统读取到磁盘当前的状态,发现磁盘的等待队列中存在进程,将该进程改为R状态,并重新放入到运行队列当中。

所谓的进程的不同状态,本质是进程(PCB)处于不同的队列当中,等待某种资源(位于运行队列当中就是在等待CPU资源,位于外设队列当中就是在等待外设资源)

6.4 挂起状态

假设当前内存中存在3个进程需要等待磁盘资源才能运行,也就是这三个PCB都处于阻塞状态在等待磁盘资源的到来,当磁盘资源准备完毕后这3个进程会不会被立即调度呢?
答案是不会,操作系统会先将这三个进程的阻塞状态改为R状态,进入到运行队列当中等待CPU调度
但是这种等待外设资源的进程可能需要等待很长时间,而在等待期间,该进程不会被调度,而其代码和数据又会在内存中占用空间,如果内存出现内存不够的情况下该如何处理呢?
将该进程的代码和数据暂时保存到磁盘当中(就节省了内存的空间),这部分省下的空间可以给操作系统使用
这种策略是针对所有进程的,并不是只针对几个

我们把这种将进程的代码和数据暂时保存到磁盘上的现象称之为进程被挂起了
挂起并不代表释放,该进程的内核数据结构(PCB)还存在于内存当中,当该进程要调度时,再将其代码和数据载入到内存当中,将该进程的状态改为R,再放入运行队列当中最后再运行。
将进程的相关数据加载或保存到磁盘当中,称为内存数据的换入换出

6.5 阻塞 vs 挂起

阻塞不一定挂起,但是挂起一定阻塞

7. Linux下的状态

上述的进程状态都是在宏观操作系统的角度来看待的,接下来我们来看看Linux操作系统下时如何实现这些进程状态

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

该数组中保存的就是Linux下的进程状态信息

'R’状态 – 运行状态

在这里插入图片描述

'S’状态 – 休眠状态

在这里插入图片描述
S状态对应的就是操作系统中阻塞状态的一种

'T’状态 – 暂停状态

在这里插入图片描述
当前进程处于暂停状态,暂停状态属于阻塞的一种,该进程可以被挂起。
对于用户而言,该进程代码没有被执行,被暂停了。至于是否被挂起,则是由操作系统决定的
在这里插入图片描述
经过上述学习,T暂停状态和S休眠状态都是阻塞状态中的一种,至于是否挂起都是取决于操作系统,而操作系统认为挂起状态并不需要暴露给用户,用户只需要关系进程当前是什么状态即可!

‘D’ 状态 – 深度睡眠

'S’状态 被称为浅度睡眠状态,该状态的进程可以被终止
而处于’D’状态深度睡眠的进程无法被终止
在通常使用操作系统时,都不会出现该状态,一般出现在数据库的开发"高IO/高并发"的场景当中

现在来模拟该场景:
假设操作系统中存在进程A 包含10万条用户数据写入到磁盘当中,当进程A被加载到内存当中时,进程A需要访问磁盘资源并写入,磁盘在写入时,进程A等待磁盘写完并返回…
假设此时操作系统资源吃紧,操作系统采用挂起进程的策略将内存中的空间腾出来,但是还是无法解决问题,此时操作系统发现了游手好闲的进程A(啥事不干) 且当前操作系统资源紧缺,Linux操作系统就将进程A杀死了(不杀自己就要死了)…
此时磁盘将数据写完,发现写入的过程中出现部分失败的数据,要告诉进程A相关信息,但是此时进程A已经被杀死了,没有进程接收退出信息。数据就被丢失…
此时用户前来了,需要写入的数据被丢失,当前数据非常重要该问责谁呢?
那么此时用户就给操作系统下规定:凡是需要往磁盘写入重要数据的进程,给个免死金牌’D’状态,无法再被操作系统杀死,只能通过断电或者进程自己醒来解决(只有高IO时,才能看见D状态)

‘t’ 状态 – 被追踪

在这里插入图片描述

'X’状态 – 死亡

'X’状态表示的是死亡状态,这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
在Linux操作系统当中无法验证,因一旦进程死亡,操作系统会立即或者延时(相较于CPU而言,非常快)将其所占用资源回收(PCB,代码在内存所在空间等),所以无法查看

'Z’状态 – 僵尸

僵死状态(Zombies)是一个比较特殊的状态。
当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
在这里插入图片描述

僵尸进程的危害

进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,也就意味着子进程就一直处于Z状态!!!
维护退出状态本身就是需要数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说**,Z状态一直不退出,PCB一直都要维护**
那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?
是的!因为数据结构对象本身就要占用内存,PCB需要一直维护处于僵尸状态的进程(而且该进程无法使用kill命令杀死,因为进程已经退出了,无法响应)属于"占着茅坑不拉屎"(占用内存资源)
那么是否会造成内存泄漏呢? 会的!

7. 孤儿进程

在这里插入图片描述
在这里插入图片描述

8. 进程优先级

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9. 进程切换

10. 其他概念

竞争性:

系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
举例:学生在食堂打饭是需要排队(进程在运行时的运行队列,根据优先级进行排队执行)

独立性:

多进程运行,需要独享各种资源,多进程运行期间互不干扰
举例:我们在使用手机(Linux操作系统)时,迅雷下载中止会影响QQ运行嘛?/ 打游戏闪退会导致抖音也闪退嘛?
很明显不会,所以进程是具有独立性的
我们已经知道不相干的进程具有独立性,那么对于父子进程呢?
在这里插入图片描述

并行:

多个进程在多个CPU下分别,同时进行运行,这称之为并行
存在多个CPU,可以使得在同一时刻可以有多个进程分别在各个CPU上运行,称之为并行

并发:

多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
如果只有1个CPU,那么在同一时刻只能存在1个进程在运行
但是我们都知道,进程并不是运行起来就独占CPU资源直到结束的,而是时间片轮转的策略
(比如:获得CPU资源后,只能使用10毫秒的时间,不管是否运行结束都需要替换下去,要么进入运行队列中重新排队,要么进行等待)

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

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

相关文章

相见恨晚的Matlab编程小技巧(3)-程序运行太慢了咋解决——合理使用循环语句(1)

相信大家在使用matlab时候经常会收到程序运行太慢的困扰,当程序比较复杂时,常常需要很长时间等待。我有个朋友就是这样,每次debug都要很长时间,等着的时候就想耍会手机,结果耍完一抬头发现程序运行结束了,但…

利用废旧手机搭建一台属于自己的服务器

1. Termux —— 手机终端模拟器App 1.1 使用F-Droid应用商店安装Termux # F-Droid 下载地址:https://f-droid.org/packages/com.termux/ 1.2 使用Termux安装环境 在手机上打卡Termux软件(操作很不方便),后面介绍使用ssh服务通过…

基于ARIMA-LSTM组合模型的预测方法研究(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Vector - CAPL - CANoe DBC消息相关自动化_02

目录 GetMessageID -- 获取报文ID​编辑 代码示例 GetMessageName -- 获取报文名称 代码示例 getNextCANdbFilename -- 获取指定位置数据库文件命名 代码示例 getNextCANdbName -- 获取指定数据库的名称 代码示例 setSignalStartValues -- 设置目标信号初始值 代码示例…

计算机网络知识点大全

文章目录 1 计算机网络概述1.1.1 概念、组成、功能和分类1.1.2 标准化工作及相关组织1.1.3 速率相关的性能指标1.1.4 时延、时延带宽积、往返时间RTT、利用率1.2.1 分层结构、接口、协议、服务1.2.2 OSI参考模型1.2.4 TCP/IP与五层参考模型 第一章知识大纲2.物理层2.1 物理层基…

Docker实用篇

文章目录 Docker实用篇0.学习目标1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.安…

vue3的push问题

今天在处理动态数据时,使用push方法像数组中添加数据,会导致数组中所有参数都发生变化,解决方法可以搜到很多,这里使用的是如下的方法: 需要注意的是, 在push的时候需要newVal_value才能获取到深拷贝的值

常见的两种通信方式

引言 随着后端服务的发展,业务难度增加;单体的后端服务逐渐满足不了快速迭代,敏捷开发的节奏,在这样的背景下,分布式系统架构思想逐渐发展,并流行起来;在微服务思想下,将原有复杂的…

【c语言】文件的基本操作

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

说说谷歌Chrome浏览器无痕浏览器窗口

当您启用无痕浏览后&#xff0c;设备的其他用户将不会看到您的历史记录。 Chrome 不会保存您的浏览记录或您在表单中填写的信息。当您浏览时&#xff0c;Chrome 会记住相应的 Cookie 和网站数据&#xff0c;但当您退出无痕模式时&#xff0c;Chrome 会删除这些数据。您可在打开…

qkeras量化模型-直接搭建模型的量化感知训练

量化框架qkeras: qkeras是谷歌的感知训练量化框架&#xff0c;具有一些功能&#xff1a; 1、支持导入keras模型到qkeras模型&#xff1b; 2、支持剪枝和量化&#xff0c;使用tensorflow lite一起配合&#xff0c;简直不要太好用&#xff1b; 3、支持指定量化函数&#xff0…

如何将百度等其他网页设置为谷歌浏览器的首页

原因&#xff1a; 谷歌浏览器默认是https://chrome.google.com/以该网址访问的 如果您想将百度网页设置为谷歌浏览器的首页&#xff0c;可以按照以下步骤进行操作&#xff1a; [ 1 ] 打开您的谷歌浏览器&#xff0c;点击右上角的“三个点”按钮&#xff0c;选择“设置”选项。[…

基于SpringBoot的财务管理系统的设计与实现

背景 财务管理系统能够通过互联网得到广泛的、全面的宣传&#xff0c;让尽可能多的员工了解和熟知财务管理系统的便捷高效&#xff0c;为管理者和员工提供了服务&#xff0c;节省人力、物力和时间&#xff0c;提高工作效率。 系统设计 为了更好的去理清本系统整体思路&#…

深度学习用于医学预后-第二课第四周1-4节-使用线性和基于树的模型构建风险评估模型

今天起进入到第四周课程的学习&#xff0c;使用线性和基于树的模型构建风险评估模型 风险分数 本周&#xff0c;你将学习建立和评估生存预测模型的策略&#xff0c;这些模型将使你能够比较个体患者的风险。您将学习两个这样的模型:Cox比例风险和生存树。最后&#xff0c;您将…

【学习心得】VMware的下载安装与创建Ubuntu虚拟机

Python在Linux系统中的开发环境搭建① 1、VMware的下载安装 1.1 去官方网站下载软件&#xff1a;https://www.vmware.com/ 1.2 在工具中找到workstation pro 1.3 点击试用版本 1.4 点击下载 1.5 双击安装 1.6 下一步 1.7 接受许可 1.8 选择足够空间的磁盘进行安装、勾选增强…

chatgpt赋能Python-pycharm中如何设置滚动条

PyCharm中如何设置滚动条 介绍 PyCharm是一款由JetBrains开发的Python集成开发环境&#xff0c;提供了丰富的功能和工具&#xff0c;让Python开发更加高效和方便。其中一个重要的功能就是滚动条&#xff0c;它可以帮助我们在长篇代码中快速找到需要的部分&#xff0c;并浏览整…

Chrome浏览器更新失败的问题(chrome无法更新至最新版本怎么办)

报错1 如果在计算机上更新 Chrome 时遇到问题&#xff0c;您可能会看到以下错误消息&#xff1a; 更新失败&#xff1a;管理员已停用更新更新失败&#xff08;错误&#xff1a;3 或 11&#xff09;&#xff1a;检查更新时出错&#xff0c;无法访问更新服务器更新失败&#xf…

网络安全学习路线

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

chatgpt赋能Python-pycharm关联py文件

PyCharm关联Python文件的使用指南 PyCharm作为一款强大的Python开发工具&#xff0c;其集成的许多功能可以大大提高开发效率。其中之一就是PyCharm可以自动关联Python文件&#xff0c;让用户更加方便的进行Python程序的编写。本文将详细介绍PyCharm关联Python文件的使用方法及…