linux——进程的概念与状态

news2024/9/20 18:53:02

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档大家好,我是旗帜僵尸。今天我将带领大家学习进程的概念。

本篇文章将继续收录于我的linux专栏中,若想查看关于linux其它知识的文章也可以点击右方链接。旗帜僵尸——linux

文章目录

  • 一、进程概念
    • 冯诺依曼体系结构
    • OS(操作系统Operator System)
    • 进程的概念
    • PCB(进程控制块)
    • 关于进程的指令与函数
        • 指令
        • 函数
  • 二、进程状态
    • 操作系统层面的进程状态
    • LINUX的进程状态
  • 总结


一、进程概念

冯诺依曼体系结构

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
如上图所示,冯诺依曼体系结构将计算机划分为3部分,分别是CPU存储器I/O设备
运行速度:CPU>>存储器>>I/O设备
在数据传输时,为了加快程序运行速度,CPU是不会与I/O设备直接交涉的,而是通过存储器作为桥梁来交互。

存储器指系统内存,而磁盘属于I/O设备

OS(操作系统Operator System)


我们从上图来学习OS。
用户希望开发,为了方便用户开发,所以我们有了用户操作接口
而在用户开发时,为了保护底层数据,又有了系统调用接口
通过调用接口,进行各种管理
驱动管理又细分为各个驱动
每个驱动对应着一个底层硬件

从图中看到,操作系统向上便于用户开发,保护隐私数据
向下又管理各种程序

OS作为用户与底层的中间者。其本质是管理各式各样的数据,确保计算机运行稳定。

进程的概念

我们可以看到OS中有对进程的管理。
进程的本质 = 内核数据结构 + 对应的可执行程序代码。
![在这里插入图片描述](https://img-blog.csdnimg.cn/86c9b952a26b4f6a947e7a803d146fee.pn

在运行代码时,我们的程序首先从磁盘中加载到内存。
而此时,内存中除该程序代码外,还要为其创建一个用于描述代码信息的结构体——task_struct.
OS通过这些描述代码的结构体来做出管理。

PCB(进程控制块)

PCB:由task_struct组成的控制模块
可以理解为一个链表,用于管理进程。

tast_struct结构体中的内容大致有如下几类:
示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针.
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息

关于进程的指令与函数

指令

ps ajx:查看进程
ps ajx | head -1:输出第一行
在这里插入图片描述
演示代码如上

PID:进程标识符
PPID:父进程的标识符
STAY:状态

kill 命令(其有许多选项,现讲解其中几种)
kill -9:杀死进程
kill -19:暂停进程
kill -18:结束暂停
在这里插入图片描述
演示代码如上
-9
在这里插入图片描述-19,-18
在这里插入图片描述
在这里插入图片描述

值得关注的是,当我们暂停一个进程,再运行时,查询它的信息
在这里插入图片描述
其状态栏,少了一个+号,+号代表前后台。
有+号,其为前台程序,在执行时,我们不能运行其他指令,可以用ctrl c终止进程
无+号,其为后台程序,在执行时,我们可以运行其他指令,不能用ctrl c终止进程,只能用Kill杀死进程

函数

getpid();
getppid();
通过man查询可知,其返回类型为pid_t(整数类型),第一个返回值是进程的PID,第二个是父进程的PID
在这里插入图片描述
在这里插入图片描述

演示代码如上
在这里插入图片描述
我们发现,其每次运行,PID会变化,而PPID却一直不变
这是因为,我们的进程实际上都是bash(命令行解释器)的子进程,当我们还在使用LINUX时,bash一直在运行,所以其PID不会变化。

fork();
它用于创建子进程,返回值为子进程的PID。
在这里插入图片描述
在这里插入图片描述
演示代码如上
在这里插入图片描述

在这个代码中,出现了一个很奇怪的现象,if的两种情况都打印了
暂时可理解为进程之间互不影响,独立执行。
当我们学习之后的概念与内容就可以更好的理解它。

二、进程状态

操作系统层面的进程状态

在这里插入图片描述
对于OS而言,我们有许许多多的代码要执行,也就意味着有许许多多的进程要运行。
其状态诸如运行,新建,就绪,挂起,阻塞,等待,停止,挂机,死亡等等,而我们重点关注运行,阻塞,挂起

运行状态:
CPU在运行代码时,会创建一个运行队列,存放运行程序的各种信息,以及之后要运行的程序
而当进程进入这个队列时,则意味着它处于运行状态,即使它还在等待前面的进程运行结束。

阻塞状态:
当进程被CPU执行时,发现需要调用某个硬件,而该硬件此时还在被别的进程调用。CPU为了避免浪费时间,它会将该进程,放入硬件的等待队列,此时,它的状态便更改为了阻塞。
等硬件可以使用了,CPU会将进程重新纳入运行队列,进行执行。

挂起状态:
内存中,所有的代码与PCB都需要占用一定空间。
而当内存不够用,OS便会将一些处于阻塞状态的进程的代码先释放了,而其PCB仍在等待队列之中。此时,它的状态便是挂起状态。

对于上述状态中的各种队列,它们是对应的模块所创建的结构体,用来与PCB对接,对进程进行管理

LINUX的进程状态

在LINUX中,我们进程的状态被放在一个指针数组里:

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 */
}; 

R:
运行状态。
在这里插入图片描述

在这里插入图片描述

S:
睡眠状态。对应阻塞状态。
在这里插入图片描述
在这里插入图片描述
这个进程运行时,其大部分时间都在等待外设,而运行状态只占很小一部分,所以基本查不到R状态。

D:
深度睡眠状态(这个状态我们无法查询,只能讲解。)

之前我们说过挂起状态。如果一个进程,在向磁盘写入数据,而此时内存紧张,它被挂起了。磁盘写入时发生异常,它在返回异常时,找不到该进程了。磁盘于是就继续执行下一个进程。
这段原本要被写入磁盘的数据也就丢了。

为了避免这种情况,D状态出现了,它标志着,该进程只有断电或者运行结束才能终止。

T:
暂停状态。
在这里插入图片描述
在这里插入图片描述
手动暂停则状态为T

t:
跟踪暂停状态。
在这里插入图片描述
当我们调试代码时,我们设置断点后,再运行。
程序运行至断点处暂停,此时,该进程状态为t状态

X:
死亡状态。
一个进程在结束时,由OS回收它的各种资源,在此时,它处于死亡状态。(时间太短,查询不到)

Z:
僵死状态。
一个进程在结束后,会被回收各种资源,而回收资源的工作一般由其父进程执行。
当子进程结束,父进程还未结束时,它处于僵死状态。
在这里插入图片描述
演示代码如上

在这里插入图片描述
其子进程结束,COMMAND也发生变化,后缀defunct(失效)
对于OS,若存在大量僵死进程,代表大量内存被占用无法释放,之后我们会讲解如何应对这种情况。

除上述状态外,还有一种较为特殊的进程——孤儿进程
当一个进程的父进程先结束,该进程无人回收资源,此时它就是孤儿进程。
为了避免子进程结束时无人回收资源,造成内存泄漏,所以OS会让PID为1的进程(root)将其领养
在这里插入图片描述
演示代码如上
在这里插入图片描述
我们发现,在父进程死亡后,子进程的父进程更改为了1,而它也从前台运行变为后台运行


总结

进程是我们学习LINUX的重点,本篇学习了进程概念与进程状态。
之后将学习有关进程的知识,请继续关注现在想吃🧠的旗帜僵尸,我将会持续更新linux的后续学习内容
下次见

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

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

相关文章

突破传统监测模式:业务状态监控HM的新思路

作者:京东保险 管顺利 一、传统监控系统的盲区,如何打造业务状态监控。 在系统架构设计中非常重要的一环是要做数据监控和数据最终一致性,关于一致性的补偿,已经由算法部的大佬总结过就不在赘述。这里主要讲如何去补偿&#xff…

电子阅读器市场角力,AI成为关键变量

配图来自Canva可画 近年来,随着国家“书香型社会”建设政策的出台,公众的阅读需求正在逐年增加,各类读书产品和读书活动,也如同雨后春笋般涌现,人们的阅读体验日益得到丰富。比如,昨天世界读书日举行的“不…

Photoshop在启动时出现读取计算机特定首选项时出错,或者提示暂存盘已满导致打不开该如何处理

上午还能用,下午打开Photoshop时就报此错误 点击确定后,出现下图错误 首先,先试试删除设置文件。在长按shiftctrlalt的情况下用鼠标右键点击Photoshop图标,点击打开(此间别松手),就会出现下图&a…

“智慧赋能 强链塑链”|工程物资供应链管理中的数字化应用

工程项目中的供应链管理至关重要 工程建设行业是国民经济的重要支柱之一,虽然在总产值上持续保持增长态势,但近年来行业的利润总额增速已连续多年呈现下降趋势。究其原因,可以大体从两个方面来看:一是行业盈利能力出现下降&#x…

Xshell CentOs Linux命令2

上一次我们说了几个命令,文件的创建删除等,还有就是文件查看,今天我们继续看几个命令。 echo echo命令 我们看到我们在echo 后面跟一个字符串,不同会帮我们打印在屏幕上,这里我们需要补充一些东西,在Linu…

多线程常见的锁策略

目录 1.1 乐观锁 和 悲观锁 1.2 轻量级锁 和 重量级锁 1.3 自旋锁 和 挂起等待锁 1.4 互斥锁 和 读写锁 1.5 可重入锁 和 不可重入锁 1.6 公平锁 和 非公平锁 1.7 synchronized 锁的属性 一、锁策略 说到锁,Java 里面常用的锁有 synchronized ,锁…

安全防御 --- 态势感知、VPN

一、态势感知 1、概念 态势感知(SA --- Situational Awareness)是对一定时间和空间内的环境元素进行感知,并对这个元素的含义进行理解,最终预测这些元素在未来的发展状态。 作用: 态势感知能够检测出超过20大类的云上…

使用nvm(node.js version management)安装管理nodejs

鉴于目前网络上关于NVM安装NodeJS操作步骤的文章,大家都在互相借鉴,很少看到原创文章,很多操作步骤已经冗余和过时。因此,本人根据实际的前端项目开发经验,在此重新梳理了一遍目前最新的NVMNodeJS的安装步骤&#xff0…

微信小程序原生开发功能合集十二:编辑界面的实现

本章实现编辑界面的实现处理,包括各编辑组件的使用及添加数据保存数据流程的实现处理。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: https://edu.csdn.net/course/…

BOSHIDA 模块电源高低温试验箱测试原理

BOSHIDA 模块电源高低温试验箱测试原理 电源模块是可以直接贴装在印刷电路板上的电源供应器,其特点是可为专用集成电路(ASIC)、数字信号处理器 (DSP)、微处理器、存储器、现场可编程门阵列 (FPGA&#xf…

OpenShift:关于OpenShift(OKD)通过命令行的方式部署镜像以及S2I流程Demo

写在前面 因为参加考试,会陆续分享一些 OpenShift 的笔记博文内容为安装完 OpenShift, 利用 OpenShift 引擎部署一个镜像应用和一个 S2I 流程部署应用 Demo学习环境为 openshift v3 的版本,有些旧这里如果专门学习 openshift ,建议学习 v4 版…

【Idea】人工智能编程他来了,Idea集成一款和ChatGPT一样智能的编码辅助神器

文章目录 简介官方介绍功能介绍 注册使用使用方法功能说明 结尾 简介 Bito是一款建立在OpenAI和ChatGPT之上的开发辅助神器!他可以帮我们生成代码、语法提示、生成测试用例、解释代码含义、生成注释、优化代码、检测代码安全性以及学习理论知识等!我们可…

这可能是最全面的MySQL面试八股文了

什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据,列代表该行中的每个值。列上的值是有数据类型的…

Ubuntu更新软件下载更新与移除

目录 一、更新软件源 二、下载与安装软件 三、如何移除软件 四、Ubuntu商店下载软件 一、更新软件源 更新Ubuntu软件源的操作步骤,更新软件源的目的就是,将在Ubuntu官网的软件源更改到本地,也就是国内的软件源,这样的话下载安…

北邮22信通:二叉树各种遍历所有常见算法汇总

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏~ 北邮22信通_青山如墨雨如画的博客-CSDN博客 目录 1.二叉树的前序遍历 1.1递归算法 1.2非递归算法 1.2.1模板类实现栈 1.…

负载均衡的综合部署练习(LVS-DR模式+Nginx七层反向代理+Tomcat多实例)

1.实验设计 实验所满足的需求 满足某公司,想搭建一套高可用的负载均衡DR模式的集群,同时该集群收到用户访问请求时能够自主判断用户发送的请求是动态资源还是静态,依次划分进行动静分离:Nginx处理静态资源,Tomcat处理…

图的数据结构,系统学习图的基本概念、定义和建立,学会邻接矩阵、邻接表以及实现六度空间案例,遍历图的方式——广度、深度访问

1.图的定义和术语 图:G (V,E) Graph (Vertex, Edge) V:顶点(数据元素)的有穷非空集合; E:边的有穷集合。 有向图:每条边都是有方向的 无向图:每条边都是无方向的 完全图&#…

用 ChatGPT 进行阅读理解题目的问答

阅读理解出题 阅读理解题是语言学习过程中一种重要的练习方式。无论语文还是英语考试中,阅读理解题都占有相当大的分值。ChatGPT 作为一种大语言模型,在处理自然语言理解任务中具有很大的优势。广大教师和学生家长们,都可以尝试用 ChatGPT 进…

借灰姑娘的手,讲述js混淆加密的美丽

这个故事的主角是灰姑娘,她有一个重要的秘密,需要将其保护起来。但是,她发现她的网站上的 JavaScript 代码很容易被其他人阅读和修改,为了保护这个秘密,她需要采用一些混淆和加密技术。 以下是她使用的一些技术&#…

数据结构与算法学习:二叉树的后序遍历的递归与非递归实现,以及非递归实现中的流程控制的说明。

需求二叉树: 采用二叉树后序遍历非递归算法。设置一个指针p初始指向树根,p先入栈,而后使得p指向它的左孩子p->firstchild,重复操作,使得每个左孩子都依次入栈,同时初始化一个Treenode*类型的指针pre&…