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.总结

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

        

         

                

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

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

相关文章

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…

Android Test3 获取的ANDROID_ID值不同

Android Test3 获取的ANDROID_ID值不同 这篇文章来说明上一篇文章中说到的一个现象&#xff1a;在同一个项目中&#xff0c;创建不同的 app module&#xff0c;运行同一段测试代码&#xff0c;获取到的 ANDROID_ID 的值不同。 我也是第一次认真研究这个现象&#xff0c;这个还…

JSON 和 LabVIEW Data Types 互相转换

使用JSONtext C:\Program Files (x86)\National Instruments\LabVIEW 2021\examples\JDP Science\JSONtext JSONtext LabVIEW Data Types.vi

docker和docker-compose的版本对应关系怎么看?

docker和docker-compose的版本对应关系怎么看&#xff1f;最近在安装这两个工具&#xff0c;像知道他们的版本对应关系&#xff0c;查了不少资料才找到。 虽然 Docker 和 Docker Compose 的版本并不严格绑定&#xff0c;但是在某些情况下&#xff0c;新版本的 Docker Compose …

邮科ODM摄像头:多维度护航高铁安全系统方案解析

‌高铁作为现代交通的重要支柱&#xff0c;其安全稳定运行依赖于高效的监控体系。摄像头系统作为高铁安全管理的“视觉感知中枢”&#xff0c;凭借多场景覆盖、智能分析以及环境适应性设计&#xff0c;在行车安全、设备维护、乘客服务等方面发挥着不可或缺的作用。本文将从技术…

盒模型小全

CSS盒子模型详解 1. 定义 CSS盒子模型是用于描述HTML元素在页面中布局和表现的核心概念之一。在CSS中&#xff0c;所有HTML元素都被视为一个矩形的盒子&#xff0c;这些盒子封装了周围的HTML元素&#xff0c;并允许在其他元素和周围元素边框之间的空间放置内容。 2. 组成部分…

自定义鼠标效果 - 浏览器扩展使用教程

自定义鼠标效果 - 浏览器扩展使用教程 这里写目录标题 自定义鼠标效果 - 浏览器扩展使用教程功能特点安装方法Chrome/Edge浏览器 使用指南1. 更改鼠标光标样式2. 启用鼠标轨迹效果3. 自定义轨迹效果点状/彩虹/渐隐轨迹&#xff1a;表情轨迹&#xff1a; 管理自定义光标支持的文…

基于SpringBoot实现的课程答疑系统设计与实现【源码+文档】

基于SpringBootVue实现的课程答疑系统采用前后端分离架构方式&#xff0c;系统设计了管理员、学生、老师三种角色&#xff0c;系统实现了用户登录与注册、个人中心、学生管理、老师管理、科目类型管理、学生问题管理、老师回答管理、老师信息管理、关注列表管理、交流区、轮播图…

御微半导体面试总结

前一阵子在公司干的难受&#xff0c;所以再合肥这边面试了几家公司&#xff0c;挑一个御微半导体来说一下吧&#xff0c;公司主要是做半导体晶元测量的&#xff0c;具体啥我也不太明白。 公司产品线多&#xff0c;每条产品线配有独立的软件、结构、光学控制等人员开发语言和框…

Android Compose 自定义圆形取色盘

val Dp.toPx: Floatget() {var scale 3f // MyApplication.context.resources.displayMetrics.apply { // scale density // }return value * scale}val colors List(360) { i ->Color.hsv(360f - i, 1f, 1f) // 360到1的所有HSV颜色 }Preview …

vscode 配置 latex

下载插件 安装插件前自行安装 texlive, 按照 https://tug.org/texlive/ 要求安装 找到 settings 打开 json 文件 在 json 文件中添加如下配置 "latex-workshop.latex.tools": [{"name": "latexmk","command": "latexmk",&qu…

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(质检)

船舶质检管理现状&#xff1a;质检环节部分依赖人工检测&#xff0c;质检员依据质量标准对产品进行抽检或全检。人工质检受质检员主观因素影响较大&#xff0c;不同质检员对标准的把握可能存在差异。 一、痛点与需求 1 Arbigtec 人工经验依赖严重&#xff1a; 质检员的检测准确…

jenkins gerrit-trigger插件配置

插件gerrit-trigger下载好之后要在Manage Jenkins -->Gerrit Trigger-->New Server 中新增Gerrit Servers 配置好保存后点击“状态”查看是否正常

ubuntu24.04下 zookeeper3.8.4 集群的配置

1、环境 1.1 三台机器网络互通&#xff0c;并做hosts解析 准备三台及以上ubuntu24.04主机&#xff08;奇数&#xff09; rootzk-node01:~# hostname zk-node01rootzk-node01:~# cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 u24-server10.0.49.215 zk-node01 10.0.4…

火山引擎 veFuser:面向扩散模型的图像与视频生成推理服务框架

资料来源&#xff1a;火山引擎-开发者社区 DiT 模型与推理挑战 近年来&#xff0c;扩散模型&#xff08;Diffusion Models&#xff09;在生成式人工智能领域取得了突破性进展&#xff0c;尤其是在图像和视频生成方面表现卓越。基于 Transformer 的扩散模型&#xff08;DiT, D…

动态多目标进化算法:VARE(Vector Autoregressive Evolution)求解DF1-DF14,提供完整MATLAB代码

一、VARE简介 VARE&#xff08;Vector Autoregressive Evolution&#xff09;算法是2023年提出的一种新型的动态多目标优化&#xff08;DMO&#xff09;算法&#xff0c;旨在有效处理随时间变化的多目标优化问题。它通过结合向量自回归&#xff08;VAR&#xff09;模型和环境感…

【JavaEE】-- HTTPS

文章目录 1. HTTPS是什么&#xff1f;2. 加密是什么&#xff1f;2.1 引入对称加密&#xff08;效率高&#xff09;2.2 引入非对称加密&#xff08;效率低&#xff09;2.3 引入证书2.3.1 数据签名2.3.2 通过证书解决中间人攻击 1. HTTPS是什么&#xff1f; HTTP也是一个应用层协…

撰写脚本,通过发布/joint_states话题改变机器人在Rviz中的关节角度

撰写脚本&#xff0c;通过发布/joint_states话题改变机器人在Rviz中的关节角度 提问 为我写一个改变关节base_spherical_center_high_joint角度的python脚本吧。适用于ROS2的humble 回答 下面是一个适用于 ROS 2 Humble 的 Python 脚本&#xff0c;它会以指定频率持续发布 …

Redis : Hash类型

哈希类型 哈希类型的命令 hset 设置key指定的字段&#xff08;field&#xff09;的值&#xff08;value&#xff09; 也可以设置多组field和value hget 获得哈希中指定字段的值 如果该字段为空或者key为空则返回nil hexists 判断哈希中是否有该字段的值 如果有则会返回1…

【Chipyard】 conda 环境安装与使用

一、Conda 安装&#xff08;以 Miniconda 为例&#xff09; Conda 是一个强大的环境管理工具&#xff0c;可用于创建、隔离和管理不同的 Python/R 环境。以下是在 Ubuntu 上安装和使用的完整流程&#xff1a; 1. 下载 Miniconda 安装包 bash # 下载最新版 Miniconda3&#…