当前位置: 首页 > article >正文

Linux知识回顾总结----进程状态

        本章将会介绍进程的一些概念:冯诺伊曼体系结构、进程是什么,怎么用、怎么表现得、进程空间地址、物理地址、虚拟地址、为什么存在进程空间地址、如何感性得去理解进程空间地址、环境变量是如何使用的。

目录

1. 冯诺伊曼体系结构

        1.1 是什么

        1.2 结论

        1.3 操作系统

        1.4 搞管理的软件 + 计算机的结构

        1.5 总结

2. 进程的基本概念

        2.1 什么是进程        

        2.2 为什么会有进程

        2.3 见见进程

        2.4 通过系统调用查看

        2.5 fork()函数

3. 进程的状态

        3.1 为什么?

        3.2 需要了解的三个状态

               3.2.1 运行状态

                3.2.2 阻塞状态

                3.2.3 进程状态的本质

                3.2.4 挂起状态

        3.3 在Linux下的进程状态

             3.3.1 规定的几种状态

             3.3.2 进程的查看与孤儿进程

             3.3.3 僵尸进程

4.总结


1. 冯诺伊曼体系结构

        1.1 是什么

           这个体系结构在我们计算机如笔记本、服务器,都是遵守这个体系结构。主要就是三部分 CPU 、 存储器(里面存放的是物理地址)、IO设备。

        1.2 结论

          通过理解了这个结构,我们需要知道,我们的 CPU 在进行计算的时候不是直接与输入输出设备进行连接交互,是与存储器进行交互。所有的外设,有数据的载入,只能载入到内存当中。

        1.3 操作系统

         概念:任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。简单来说就是进行软硬件结合的软件。对上服务用户(提供一个良好的执行环境),对下管理好各种硬件。

        1.4 搞管理的软件 + 计算机的结构

        如何理解他是搞管理的软件?,举一个例子:在学校里面,我们见不到校长,但是校长会对我们进行管理,如何理解这个管理?就是虽然没有见面,但是校长手里有我们的各种数据、例如:学号、成绩、宿舍号、专业、挂了几科,这些数据是校长进行决策的一个依据。校长就是根据这些数据来进行决策,如果是挂的科比较多了,就要警告,处理。所以我们就相当是各种硬件(被管理者),然后校长(管理者)就是 CPU 进行决策。他是怎么拿到数据的就是通过辅导员拿到数据。

        那么管理者如何拿到数据,通过辅导员,在计算机系统中相当于驱动。

        然后我们操作系统对于用户想要进行的操作需要经过 shell(因为操作系统不相信我们用户是安全的),提供的接口来调用系统内部的函数(系统调用接口,在 LINUX 就是 c 式的接口)。对内保护自己,对外提供服务

        1.5 总结

        通过上面的例子,我可以推断出。校长进行管理一个学生的时候需要对他的信息继续描述变成一个结构体,然后将结构体通过链表或者是其他的数据结构连接到一起。所以对于同学的操作就变成对于结构体的操作。我们计算机也是需要这样的。

        所以!计算想要管理硬件需要两步:1. 首先进行描述,将相关的内容变成(struct)结构体的形式存在 2.随后进行组织,使用链表,其他高效的数据结构存放起来。

2. 进程的基本概念

        2.1 什么是进程        

              进程是:一个运行起来(加载到内存)的程序/内存当中的程序。我们先来理解一下程序,就是写在磁盘里的二进制程序。执行就要加载到内存当中。

          一个cpu计算机可能许多的程序需要被执行,所以就需要进行描述 + 组织!继续描述时需要通过 PCB(进程控制块)struct task_struct{} 。在内存当中会对于没有个程序提供一个进程控制块。

        通过上面的描述,我们对于进程的管理,转化成对于链表的增删查。进程 = 内核数据结构(表示当前进程的属性,例如:挂起、阻塞、等待等状态) + 进程对应的磁盘代码以及数据(就是相关内容,拷贝到内存)。

        2.2 为什么会有进程

        一方面:需要进行管理,一个 cpu 只能执行一个进程,所以需要进行管理继承。另外一方面

PCB 的作用就像一本进程的“身份档案+进度卡,让操作系统了解进程到达了程度了。

        2.3 见见进程

        简单的进程,在Window里面。在Linux里面可以使用 ps ajx | grep '文件名'可以查看我已经打开的进程。

        

在Linux 中我先书写一个进程,然后再Xshell中显示一下,如下图所示:可以见简单的看到有一个进程正在执行。

        2.4 通过系统调用查看

        可以使用两个系统的函数,来查看当前进程的标识符 pid(当前进程进程) 与 ppid(父进程);  pid 很好理解,我们为什么需要有 ppid ,因为一个进程做的事情怎么样了,肯定是需要有一个 leader 知道他干的怎么样了,如何就需要给当前进程一个 ppid(父进程)。

        2.5 fork()函数

        fork()是调用系统函数,实现创建一个子进程。他有两个返回值一个,对应不同的进程有不同的返回值,例如:如果是子进程返回0,对于父进程返回他的子进程(为什么要这样?因为父亲就一个爹,所以不需要特别的说明,但是父进程有好几个孩子,所以需要返回一个孩子的pid,说明是自己的大儿子,还是二儿子过来然我抱一下);

代码表示的结果为:

#include <sys/types.h>
#include <unistd.h>
int main()
{// printf("pid: %d\n", getpid());// printf("ppid: %d\n", getppid());int ret = fork();if(ret == 0){printf("ret:%d\n", ret);printf("我是子进程,我的pid为:%d, ppid:%d\n",getpid(), getppid());}else{printf("ret:%d\n", ret);printf("我是父进程,我的 pid 为:%d, ppid为:%d\n",getpid(), getppid());}return 0;
}

到这里很多的同学,可能会有点疑惑为:为什么一个变量ret,会同时进行两次打印,也就是为什么会有两个结果。这个就跟进程有很大关系。

        可以这么理解,我们的子进程,在创建的时候会进行写时拷贝,开辟一模一样一样的空间,将父进程的部分内容拷贝过来,然后进行调用,通过管理PCB(struct结构体),经过页表,就会单独的进行子进程的代码与数据。

3. 进程的状态

        3.1 为什么?

        想要了解正在运行着的进程是什么意思?就要明白进程的状态。我们为什么有要对进程有状态的规定呢?

        因为一个cpu只能进行一个进程其他的进程就需要进行等待的操作,所以其他的进程就要处于等待或者是其他的状态。对于这个进程我们要能够区分两个概念,就是一个是操作系统哲学当中的进程状态的概念,以及真正的在 Linux 当中使用的两个概念。

        3.2 需要了解的三个状态

               3.2.1 运行状态

                  一个 cpu 就有一个运行状态,一个进程以 PCB 的形式存放在这个cpu的运行队列里面。

                3.2.2 阻塞状态

                  CPU的运行队列中,在运行一个程序的时候不只是需要访问 CPU 还需要访问外设,但是外设又因为速度相比 CPU 比较慢所有需要在外设中重新开辟一个队列,将接下来可能会运行的程序存放到这个队列里面,这样的操作就叫做堵塞状态。

                3.2.3 进程状态的本质

                     本质就是进程 PCB 结构体在不同的队列之中。我们所说的进程是运行状态不是进程正在运行,而是存放在 Running 这个结构体里面(这个结构体有head*指针,指向进程控制块)。在其他的状态也是这样。

                3.2.4 挂起状态

                由于内存的空间是有限的所以,遇到内存空间爆满的时候就需要,将一些 PCB 对应的核心代码放到存盘。等到需要的时候再将它取出(概括来说就是数据的换入、换出。)。        

        3.3 在Linux下的进程状态

             3.3.1 规定的几种状态

                为了方便好看,这里就不再进行码字,直接放上这张图片。Linux 里面的进程相当于是对于操作系统里面进程的详细化,实例化。

                

                还有的状态为:+R,+S。有没有 + 号的区别在于 有 + :表示前台进程,输入其他命令不会显示的命令行上,无 + : 表示后台进程,当进程在进行的时候,可以在命令行上使用其他的指令。(相当于有 + 之后变成了高级模式不能执行其他的指令,个人理解可能有错🐱)

        3.3.2 进程的查看与孤儿进程

            我们想要查看进程可以使用 ps axj | grep。进行查看状态。接下来我会写一个程序来体现进程状态。我写一个持续打印的代码,其中的状态是 S+,阻塞状态,为什么会这样?因为使用外设打印的非常的慢,所以当 CPU 发出指令的时候外设的打印对列布满了进程,每个进程都处于等待的状态之中。

           我们先来感性的理解一下什么是孤儿进程:从字面意思可以看出,孤儿就是没有父亲,也就是没有ppid,这里的没有是指父亲创建子进程后父进程被杀掉了,但是他的子进程还在运行中等待着子进程的回收。但是我们的进程是由 PID = 1(是由操作系统提供的) 的所以这个子进程会被 PID = 1 进程进行领养(使用 kill -9 杀死父进程)。从图中可以看到父进程消失了,然后子进程的ppid 变成 1,被领养了。此时这个子进程就变成了孤儿进程。

          3.3.3 僵尸进程

                是什么:感性 + 理性理解:僵尸进程就是父进程创建了一个子进程,然后子进程去执行操作,但是子进程退出了,但是父进程没有回收子进程的信息,也就是 Z 状态。好比:父母让我们去买酱油,最后父母是需要知道我到底买没买上,我最后的结果是什么,如果不告诉的化就会造成僵尸进程。解决为使用 wait(),来回收子进程,判断子进程的信息,比如是正常退出,还是有异常退出,信息都存放在wait对应的参数列表里面。

                 这个僵尸状态的解决,到后面会进行讲解,此处不进行过多描述。从图片中可以看出进入了僵尸状态。

4.总结

        以上是对于进程状态的回顾,下一章将会讲解进程的优先级以及进程的切换🥵🥵🥵。这个文章用于我的学习记录,如果是有其他的错误还请批评指正。如果对你有帮助还请给我点个赞👍👍👍。     

        

         

                

相关文章:

Linux知识回顾总结----进程状态

本章将会介绍进程的一些概念&#xff1a;冯诺伊曼体系结构、进程是什么&#xff0c;怎么用、怎么表现得、进程空间地址、物理地址、虚拟地址、为什么存在进程空间地址、如何感性得去理解进程空间地址、环境变量是如何使用的。 目录 1. 冯诺伊曼体系结构 1.1 是什么 1.2 结论 …...

Linux 进程管理学习指南:架构、计划与关键问题全解

Linux 进程管理学习指南&#xff1a;架构、计划与关键问题全解 本文面向初学者&#xff0c;旨在帮助你从架构视角理解 Linux 进程管理子系统&#xff0c;构建系统化学习路径&#xff0c;并通过结构化笔记方法与典型问题总结&#xff0c;夯实基础、明确方向&#xff0c;逐步掌握…...

【异常】极端事件的概率衰减方式(指数幂律衰减)

在日常事件中,极端事件的概率衰减方式并非单一模式,而是取决于具体情境和数据生成机制。以下是科学依据和不同衰减形式的分析: 1. 指数衰减(Exponential Decay) 典型场景:当事件服从高斯分布(正态分布)或指数分布时,极端事件的概率呈指数衰减。 数学形式:概率密度函数…...

Git 使用大全:从入门到精通

Git 是目前最流行的分布式版本控制系统&#xff0c;被广泛应用于软件开发中。本文将全面介绍 Git 的各种功能和使用方法&#xff0c;包含大量代码示例和实践建议。 文章目录 Git 基础概念版本控制系统Git 的特点Git 的三个区域Git 文件状态 Git 安装与配置安装 GitLinuxmacOSWi…...

奈飞工厂官网,国内Netflix影视在线看|中文网页电脑版入口

奈飞工厂是一个专注于提供免费Netflix影视资源的在线播放平台&#xff0c;致力于为国内用户提供的Netflix热门影视内容。该平台的资源与Netflix官网基本同步&#xff0c;涵盖电影、电视剧、动漫和综艺等多个领域。奈飞工厂的界面简洁流畅&#xff0c;资源分类清晰&#xff0c;方…...

Python基于蒙特卡罗方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融投资中&#xff0c;风险管理是确保资产安全和实现稳健收益的关键环节。随着市场波动性的增加&#xff0c;传统…...

【bat win系统自动运行脚本-双击启动docker及其它】

win系统自动化运行脚本 创建一个 startup.bat右键编辑&#xff0c;输入以下示例 echo off start "" "C:\Program Files\Docker\Docker\Docker Desktop.exe"timeout /t 5docker start your_container_namestart cmd /k "conda activate your_conda_e…...

SpringBoot离线应用的5种实现方式

在当今高度依赖网络的环境中&#xff0c;离线应用的价值日益凸显。无论是在网络不稳定的区域运行的现场系统&#xff0c;还是需要在断网环境下使用的企业内部应用&#xff0c;具备离线工作能力已成为许多应用的必备特性。 本文将介绍基于SpringBoot实现离线应用的5种不同方式。…...

js 比较两个对象的值,不相等就push对象的key

在JavaScript中&#xff0c;比较两个对象&#xff08;object&#xff09;的值并找出不相等的key&#xff0c;可以通过多种方法实现。下面是一些常用的方法&#xff1a; 方法1&#xff1a;使用JSON.stringify 这种方法适用于简单的对象&#xff0c;其中对象的值是基本类型或可…...

SQL 注入开放与修复

开发&#xff1a; SQL 注入是一种数据库攻击手段。攻击者通过向应用程序提交恶意代码来改变原 SQL 语句的含义&#xff0c; 进而执行任意 SQL 命令&#xff0c;达到入侵数据库乃至操作系统的目的。 例如&#xff1a;下面代码片段中&#xff0c;动态构造并执行了一个 SQ…...

【学习记录】Office 和 WPS 文档密码破解实战

文章目录 &#x1f4cc; 引言&#x1f4c1; Office 与 WPS 支持的常见文件格式Microsoft Office 格式WPS Office 格式 &#x1f6e0; 所需工具下载地址&#xff08;Windows 官方编译版&#xff09;&#x1f510; 破解流程详解步骤 1&#xff1a;提取文档的加密哈希值步骤 2&…...

AGV|无人叉车工业语音播报器|预警提示器LBE-LEX系列性能与接线说明

LBE-LEX系列AGV|无人叉车工业语音播报器|预警提示器&#xff0c;涵盖LBE-LEI-M-00、LBE-LESM-00、LBE-LES-M-01、LBE-LEC-M-00、LBE-KEI-M-00、LBE-KES-M-00、LBE-KES-M-01、LBE-KEC-M-00等型号&#xff0c;适用于各种需要语音提示的场景&#xff0c;主要有AGV、AMR机器人、无人…...

【电路笔记】-变压器电压调节

变压器电压调节 文章目录 变压器电压调节1、概述2、变压器电压调节3、变压器电压调节示例14、变压器电压调节示例25、变压器电压调节示例36、总结变压器电压调节是变压器输出端电压因连接负载电流的变化而从其空载值向上或向下变化的比率或百分比值。 1、概述 电压调节是衡量变…...

多层PCB技术解析:从材料选型到制造工艺的深度实践

在电子设备集成度与信号传输要求不断提升的背景下&#xff0c;多层PCB凭借分层布局优势&#xff0c;成为高速通信、汽车电子、工业控制等领域的核心载体。其通过导电层、绝缘层的交替堆叠&#xff0c;实现复杂电路的立体化设计&#xff0c;显著提升空间利用率与信号完整性。 一…...

(33)课54:3 张表的 join-on 连接举例,多表查询总结。数据库编程补述及游标综合例题。静态 sqL与动态sqL(可带参数)

&#xff08;112&#xff09;3 张表的 join-on 连接举例 &#xff1a; &#xff08;113&#xff09; 多表查询总结 &#xff1a; &#xff08;114&#xff09;数据库编程补述 &#xff1a; 综合例题 &#xff1a; 以上没有动手练习&#xff0c;不知道这样的语法是否…...

Vue3 hooks

export default function(){ let name; function getName(){ return name; } return {name,getName} } use it ----------------------------------------------- import useName from hooks/useName const {name,getName} useName(); 这段代码展示了一个自定义 Vue3钩…...

centos挂载目录满但实际未满引发系统宕机

测试服务器应用系统突然挂了&#xff0c;经过排查发现是因为磁盘“满了”导致的&#xff0c;使用df -h查看磁盘使用情况/home目录使用率已经到了100%,但使用du -sh /home查看发现实际磁盘使用还不到1G&#xff0c;推测有进程正在写入或占用已删除的大文件&#xff08;Linux 系统…...

KKCMS部署

目录 账号 网站目录 快看CMS使用手册 http://10.141.19.241/kkcms/install/ 常规思路&#xff1a;页面点点观察url变化&#xff0c;参数 常规思路&#xff1a;点一个功能模块抓包看什么东西&#xff0c;正确是什么样&#xff0c;错误的是什么样&#xff0c;构造参数。 账号…...

NamedParameterJdbcTemplate 使用方法及介绍

NamedParameterJdbcTemplate是 Spring 框架中用于数据库操作的核心类之一&#xff0c;它拓展了JdbcTemplate&#xff0c;通过封装实现命名参数特性&#xff0c;相比传统占位符?&#xff0c;命名参数可读性和维护性更强&#xff0c;能有效避免参数顺序混淆问题。 一、核心支持…...

【web笔记】JavaScript实现有动画效果的进度条

文章目录 1 实现效果2 实现代码 1 实现效果 2 实现代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"utf-8"><style>#progress {width: 300px;height: 20px;border-radius: 0; /* 移除圆角 */-webkit-appearance…...

安装最新elasticsearch-8.18.2

1.环境我的环境是linux麒麟服务器 (安装 es 7.8以上 java环境必须11以上,可以单独配置es的java目录) 2.下载 官网的地址:下载 Elastic 产品 | Elastic Download Elasticsearch | Elastic Elasticsearch 入门 | Elasticsearch 中文文档 文档 3.我下载的是8.18的 Elasti…...

大数据学习(129)-Hive数据分析

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

React 进阶特性

1. ref ref 是 React 提供的一种机制,用于访问和操作 DOM 元素或 React 组件的实例。它可以用于获取某个 DOM 元素的引用,从而执行一些需要直接操作 DOM 的任务,例如手动设置焦点、选择文本或触发动画。 1.1. 使用 ref 的步骤 1. 创建一个 ref:使用 React.createRef 或 …...

Polarctf2025夏季赛 web java ez_check

第一次自己做出一个java&#xff0c;值得小小的记录&#xff0c;polar的java真得非常友好 反编译jar包&#xff0c;一眼就看到有个/deserialize 路由&#xff0c;接受base64的序列化数据&#xff0c;base64解码后 经过一次kmp检查&#xff0c;再由SafeObjectInputStream来反序列…...

vue3+el-table 利用插槽自定义数据样式

<el-table-column label"匹配度" prop"baseMatchingLevel"><template #default"scope"><div :style"{ color: scope.row.baseMatchingLevel > 0.8 ? #00B578 : #FA5151 }">{{ scope.row.baseMatchingLevel }}&l…...

跑通 TrackNet-Badminton-Tracking-tensorflow2 项目全记录

&#x1f4dd; 跑通 TrackNet-Badminton-Tracking-tensorflow2 项目全记录 git clone https://github.com/Chang-Chia-Chi/TrackNet-Badminton-Tracking-tensorflow2.git TrackNet-Badminton-Tracking-tensorflow2 conda create --prefix /cloud/TrackNet-Badminton-Tracking-…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(八)

uboot启动异常及解决 网络问题及解决 打开STM32CubeMX选中ETH1 - A7NS&#xff08;Linux&#xff09;Mode&#xff1a;RGMII&#xff08;Reduced GMII&#xff09;勾选ETH 125MHz Clock Input修改GPIO引脚如图所示 Net: No ethernet found.生成代码后&#xff0c;修改u-boot下…...

CodeBuddy一腾讯内部已有超过 85% 的程序员正在使用de编程工具

大家好&#xff0c;我是程序员500佰&#xff0c;目前正在前往独立开发路线&#xff0c;我会在这里分享关于编程技术、独立开发、技术资讯以及编程感悟等内容。 如果本文能给你提供启发和帮助&#xff0c;还请留下你的一健三连&#xff0c;给我一些鼓励&#xff0c;谢谢。 本文直…...

PHP 表单 - 验证邮件和URL

PHP 表单 - 验证邮件和URL 引言 在Web开发中&#xff0c;表单是用户与网站交互的重要途径。一个功能完善的表单不仅可以收集用户数据&#xff0c;还能提高用户体验。在表单设计中&#xff0c;验证邮件地址和URL是常见的需求。本文将详细介绍如何在PHP中实现邮件和URL的验证&a…...

leetcode238-除自身以外数组的乘积

leetcode 238 思路 可以在不使用除法的情况下&#xff0c;利用前缀积和后缀积来实现解答 前缀积&#xff1a;对每个位置&#xff0c;计算当前数字左侧的所有数字的乘积后缀积&#xff1a;对每个位置&#xff0c;计算当前数字右侧的所有数字的乘积 结合这两种思想&#xff0…...