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

linux进程管理,一个进程的一生(喂饭级教学)

这篇文章谈谈linux中的进程管理

一周爆肝,创作不易,望支持!

希望对大家有所帮助!记得收藏

要理解进程管理,重要的是周边问题,一定要知其然,知其所以然。看下方目录就知道都是干货!

目录

1.什么是进程管理?

2.为什么要有进程管理?

3.如何对进程进行管理?

(1)描述进程

(2)组织进程

4.查看系统中的进程

(1)命令查看

(2)文件查看

5.创建进程的两种方式

(1)./运行一个程序

(2)通过代码创建

6.父子进程与fork()

(1)父子关系

(2)系统调用fork()

(3)fork()原理

1.fork()干了什么事?

2.为什么fork()会有两个返回值?

3.为什么fork()给父进程返回子进程pid,给子进程返回0?

4.fork()之后,父子进程谁先运行?

5.如何理解同一个变量会有不同的值?

6.重新理解fork()

7.进程状态

(1)一般操作系统的进程状态

1.运行状态

2.阻塞状态

3.阻塞挂起和swap分区

(2)linux的进程状态

linux进程的休眠状态

linux僵尸进程和孤儿进程

8.进程状态切换

CUP运行队列中的进程如何调度?

9.进程的性质

1.进程的竞争性

2.进程的独立性

3.进程的并行、并发

10.进程的优先级和时间片

11.进程间切换

12.linux内核2.61CPU运行队列窥视(综合理解!)


1.什么是进程管理?

OS内核中有内存管理,进程管理,文件管理,驱动管理,OS将这四样管理起来才基本可以实现硬件和数据的自由调控,才可成为一个优质内核。

2.为什么要有进程管理?

要知道为什么要有进程管理,首先要知道进程是什么东西,这里给出进程的定义

进程的定义程序的一个执行实例,加载到内存中的程序,即正在执行的程序。进程是操作系统执行任务的基本单元,也是分配资源、处理数据和被调度的基本单元。更加通俗的理解:操作系统要做事情,进程就是一件又一件的"事情"

3.如何对进程进行管理?

在哲学的范畴,管理的本质对数据的管理,而非对具体对象的管理管理的策略是先描述,再组织。即先将被管理对象进行建模描述为抽象类型,再想好如何将每个被管理对象组织起来。

操作系统对进程的管理也是如此:

描述进程、组织进程

(1)描述进程

在操作系统中,经常将描述进程的类称为PCB(process control block)。进程的属性有很多:比如pid,ppid(父进程pid),stat(进程状态),进程优先级等等。后续慢慢学习······

struct PCB
{int pid;int ppid;int stat;......
};

(2)组织进程

进程的组织就是用高效的数据结构将进程对象组织起来,操作系统一般用双向链表将进程的PCB对象组织起来

4.查看系统中的进程

(1)命令查看

ps ajx //查看当前所有进程
ps ajx | head -1 && ps ajx | grep mybin//查看指定进程mybin

(2)文件查看

根目录下的proc目录中有当前存在的所有进程,因此这个目录是动态的。

这个目录里的各个数字目录,就是以各个进程的pid命名的。目录里面放的就是进程PCB对象的各种属性。 

5.创建进程的两种方式

(1)./运行一个程序

本质将磁盘上的可执行程序代码和数据拷贝到内存当中,为这个进程创建PCB对象,将PCB对象链入内存中管理PCB对象的双链表中(重点)

(2)通过代码创建

使用fork()函数创建当前进程的子进程。

6.父子进程与fork()

(1)父子关系

进程是有父子关系的,在一个进程中创建出新的进程,这个新的进程就被叫做那个进程的子进程。那个进程叫做新的进程父进程

(2)系统调用fork()

fork()是一个进程通过代码创建子进程的时候,所调用的系统接口。通过fork()函数,在fork()下一行处会创建一个子进程,这个子进程和父进程共同执行接下来的代码

如图:

./mybin运行之后 

体现出了fork()之后, 子进程和父进程两个执行流分别执行接下来的代码。

fork()函数

头文件#include<unistd.h>

返回值:父进程返回子进程pid,子进程返回0。

(3)fork()原理

1.fork()干了什么事?

现象:fork()是系统接口,fork()之后会为父进程创建子进程,父子进程两个执行流共同执行fork()之后的代码。

本质:进程的创建,本质是将可执行程序代码和数据加载到内存中,创建PCB对象,再将PCB对象链接到管理PCB对象的双向链表中。父进程中使用fork()创建进程本质是以父进程PCB为模板创建子进程PCB,由于子进程没有从磁盘中加载代码和数据,子进程的PCB只能指向父进程的代码和数据,因此父子进程共享代码子进程可以看到父进程的全部代码,由于进程的独立性,数据会以写时拷贝的方式给到子进程。

2.为什么fork()会有两个返回值?

fork()函数在return x 之前,子进程就被创建出来了,所以不要把fork()看成一个整体,return之后父子进程两个执行流共同执行接下来的代码,return也被父子进程以不同的值返回两次

3.为什么fork()给父进程返回子进程pid,给子进程返回0?

给父进程返回子进程的pid,是为了让父进程较好的控制管理子进程,所以返回子进程的pid让父进程进行控制。子进程只需要确认自己创建成功与否,所以返回0。

4.fork()之后,父子进程谁先运行?

fork()后,父子进程都会进入CPU的执行队列中被调度,需要依赖进程PCB的调度优先级和调度器算法。

5.如何理解同一个变量会有不同的值?

父子进程共享代码,但是要保证进程的独立性数据不能共享,所以数据会以写时拷贝的方式拷贝给子进程,return两个值本质是写两次数据,子进程的数据就要写时拷贝。因此父子进程都有自己存储返回值的变量。

6.重新理解fork()

7.进程状态

(1)一般操作系统的进程状态

进程的状态指的是一个进程处在内存中某个PCB队列中所体现出来的状态。进程的状态是为了更好的让操作系统得知每个进程的实时情况所设定的。进程可以在很多PCB队列中进行排队。进程状态是PCB中的一个属性,是一个int类型的值,来表示这个进程目前的状态

1.运行状态

我们把进程的PCB在CPU的运行队列中排队的状态认定为运行状态。在CPU运行队列的进程准备被调度(取决于调度器算法)。

2.阻塞状态

当我们的进程在CPU的运行队列中被调度的时候,这个进程开始让CPU来执行它的可执行程序,这个可执行程序势必或多或少会访问到操作系统中的软硬件资源,如果此时要访问的软硬件资源还没有到位,那么这个进程的PCB就会从CPU的运行队列上剥离,去到软硬件资源的等待队列中排队,此时这个进程的状态被设置为阻塞状态

3.阻塞挂起和swap分区

硬件阻塞

当我们的进程处于阻塞状态,进程的PCB在对应软硬件资源的等待队列中排队,此时这个进程的代码数据和PCB都在内存中占用着资源,但是这个进程暂时不需要被调度,如果此时操作系统的内存资源严重不足,就会把这个进程的代码和数据交换到磁盘中的swap分区中,为内存腾出空间。此时进程就处于阻塞挂起状态。当软硬件资源就绪时,操作系统再把这部分代码和数据唤回内存中,此时进程再从软硬件资源的等待队列中剥离到CPU的运行队列中排队。

软件阻塞

用linux调试代码工具gdb来解释一下就是,gdb在调试程序的过程中要根据断点来追踪、暂停进程,要想调试一个程序的代码,gdb和这个程序必须都加载到内存当中成为进程,CPU执行代码遇到断点进程就被阻塞了,需要等待gdb这个进程的继续操作,此时这个进程就需要等待软件资源gdb的响应,而gdb又要等待诸如键盘的响应,所以进程的PCB到gdb这个进程的PCB里的等待队列里排队,gdb这个进程PCB又到键盘的等待队列里排队。当键盘响应gdb,gdb的PCB又到CPU的运行队列里排队,待调试代码的进程也到CPU的运行队列里排队。

(2)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 */   //僵尸状态
};
linux进程的休眠状态

本质就是阻塞状态(可以随时被终止)。这里还有一个深度休眠状态disk sleep(磁盘休眠)当一个进程在向磁盘上写入数据的时候,这个进程需要等待磁盘写入完毕,并把写入结果返回给进程PCB,由于这个过程中进程不可被终止(防止数据丢失)此时这个进程的状态就是深度休眠状态。

linux僵尸进程和孤儿进程

当一个进程的可执行程序已经在CPU上跑完了,这个进程的生命周期就结束了,此时操作系统会先将这个进程的代码和数据进行释放,暂时不会释放这个进程的PCB。为什么?由于进程退出时的退出信息会保存在进程的PCB中,而操作性系统或者父进程要得知进程的退出原因(任务完成情况),所以要在父进程或者操作系统读取到退出信息之后,进程才能完全销毁,将进程PCB也释放。linux规定:进程在退出后,进程的PCB还没有被父进程或者操作系统读取到,进程还没有完全退出的进程状态僵尸状态。如果进程一直处于僵尸状态,会导致内存泄露的问题。

上面所说,进程在退出时,PCB是由父进程来回收的。那么,如果进程退出前,父进程就已经退出了,那这个进程的PCB就没有相应的进程来回收了,此时进程的状态成为孤儿状态

8.进程状态切换

切换本质 : 进程的状态切换,本质就是进程的PCB不同队列中做不停的跳转

CUP运行队列中的进程如何调度?

9.进程的性质

1.进程的竞争性

系统进程众多,而CPU资源只有少数,甚至一个,所以进程之间是具有竞争属性的。为了高效完成任务,合理竞争相关资源,便有了进程优先级和时间片已经调度器算法。

2.进程的独立性

各个进程运行期间互不干扰,各自独立。

3.进程的并行、并发

并行:多个进程分别在多个CPU上同时运行。

并发:多个进程在单个CPU上采取进程切换的方式,在一段时间内让多个进程都得以推进。

不要用人的感知来感受CPU的处理速度,例如每个进程的时间片是0.0001秒,CPU就执行每个进程0.0001秒,在一秒的时间内,上百个进程,每个都被CPU推进了100次!CPU的运行速度之快,决定了进程并发的可行性。

10.进程的优先级和时间片

linux进程的优先级范围是60-99,默认优先级为80。优先级由默认优先级和nice值共同决定,例如:创建一个进程,这个进程的默认优先级为80,同时把nice设置为10,进程的最终优先级为80+nice=90。

时间片决定了一个进程每次使用CPU资源的最大时间限度。当一个进程使用CPU资源的时间超过时间片,进程就会自动剥离,等待下次被调度。

11.进程间切换

进程间切换指的是进程PCB在CPU运行队列中,上、下的反复过程。下去的进程要打包带走自己的寄存器数据,上来的进程要将自己的寄存器数据拷贝给寄存器硬件

12.linux内核2.61CPU运行队列窥视(综合理解!)

现在执行一个可执行程序mybin。

./mybin

 一个进程的一生开始了!

1.此时,操作系统在内存中创建这个可执行程序的PCB,并把磁盘上的代码和数据拷贝到内存中。

2.PCB放入CPU运行队列中的过期队列中等待被调度。需要等待活跃队列中的PCB全部剥离,PCB剥离需要同时带走自己的寄存器数据保存在自己的PCB中。

3.活跃队列中的PCB全部剥离,swap两队列的指针,开始按照优先级执行活跃队列(原过期队列)中的进程。每个进程让CPU执行,需要把PCB内的寄存器数据拷贝给寄存器。

4.该你执行了,CPU开始执行代码,代码中要访问软硬件资源但没有就绪,阻塞!PCB进入对应的等待队列。(剥离时带走自己的寄存器数据)

5.软硬件资源就绪,PCB被唤回CPU运行队列中的过期队列中等待被调度。

6.又轮到你了,将寄存器数据交给寄存器,继续从上次阻塞的地方开始执行。

7.时间片到了,剥离到过期队列中。

8.活跃队列中的PCB全部剥离,再swap两队列的指针。CPU开始执行过期队列中的进程。

9.又轮到你了,这次CPU在时间片结束时间内把代码执行完了,进程将要结束了。

10.父进程把你的代码和数据释放,将PCB内的退出数据读取完毕,把PCB也释放。进程Z状态。

本次分享就到这里,如果对大家有用的话,希望程序猿们可以三连支持一下,会继续分享知识,加油!

相关文章:

linux进程管理,一个进程的一生(喂饭级教学)

这篇文章谈谈linux中的进程管理。 一周爆肝&#xff0c;创作不易&#xff0c;望支持&#xff01; 希望对大家有所帮助&#xff01;记得收藏&#xff01; 要理解进程管理&#xff0c;重要的是周边问题&#xff0c;一定要知其然&#xff0c;知其所以然。看下方目录就知道都是干货…...

【SA8295P 源码分析 (四)】51 - QNX NFS Server + Android NFS Client 完整配置

【SA8295P 源码分析】51 - QNX NFS Server + Android NFS Client 完整配置 一、QNX 侧 NFS Server 修改:ip 为 192.168.118.21.1 配置拷贝 nfsd、rpcbind 到 /mnt 目录下1.2 配置 exports1.3 为NFS 共享目录挂载镜像1.4 修 startup.sh 开机自启动 nfsd Server1.5 关闭 QNX 防火…...

2023年10月23日--10月29日(主攻光追视频教程)

最好每周完成一样&#xff0c;将来每月完成一样&#xff0c;有成就感。也免得周末迷茫。 光锥目前还有56节&#xff0c; 周二到周五每天4小节。周六日每天20小节&#xff0c;应该可以完成。 即&#xff1a; 周二&#xff1a;9.5-9.8 周三&#xff1a;9.9-10.3 周四&#xff1a…...

【Python语言速回顾】——函数模块类与对象

目录 引入 一、函数 1、函数概述 2、参数和返回值 3、函数的调用 二、模块 1、模块概述 2、模块应用实例 三、类与对象 1、面向对象概述 2、类 3、类的特点 引入 为了使程序实现的代码更加简单。需要把程序分成越来越小的组成部分&#xff0c;3种方式——函数、对象…...

【JavaEE】Java的多线程编程基础知识 -- 多线程篇(2)

Java多线程编程基础知识 一、多线程的创建二、Thread类常用的方法和API2.1 Thread 的几个常见的属性2.2 start 启动一个线程2.3 终止一个线程2.4 等待一个线程-join()2.5 线程休眠函数 -sleep() 三、线程状态3.1 观察所有线程的状态3.2 线程状态和线程转移的意义 四、线程安全&…...

MFC Windows 程序设计[330]之表头控件例程(附源码)

MFC Windows 程序设计[330]之表头控件例程 程序之美前言主体运行效果核心代码逻辑分析结束语程序之美 前言 MFC是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Wind…...

SettingsIntelligence

Android Settings 系列文章&#xff1a; Android Settings解析SettingsIntelligenceSettingsProvider 首语 Android Settings中搜索功能帮助我们可以快速访问设置项&#xff0c;进行自定义设置&#xff0c;以得到更佳的使用体验。Android Settings搜索的实现实际不在Setting…...

C#WPF Prism框架区域管理应用实例

本文实例演示C#WPFPrism框架区域管理应用实例 目录 一、Prism框架区域 二、不使用Prism框架的RegionManager 三、使用Prism框架的RegionManager 一、Prism框架区域...

LabVIEW基于机器视觉的钢轨表面缺陷检测系统

LabVIEW基于机器视觉的钢轨表面缺陷检测系统 机器视觉检测技术和LabVIEW软件程序&#xff0c;可以实现轨道工件的表面质量。CMOS彩色工业相机采集的图像通过图像预处理、图像阈值分割、形态分析、特征定位和图案匹配进行处理和分析。图形显示界面采用LabVIEW软件编程设计&…...

Qt程序的发布和打包,任何电脑都可以安装

## 1. Qt程序的发布 当Qt程序编写完成通过IDE编译就可以得到对应的可执行程序,这个可执行程序在本地运行是完全没有问题的(因为在本地有Qt环境,程序运行过程中可以加载到相关的动态库),但是如果我们想把这个Qt程序给到其他小伙伴使用可能就会出问题了,原因如下: 对方电…...

MD5生成和校验

MD5生成和校验 2021年8月19日席锦 任何类型的一个文件&#xff0c;它都只有一个MD5值&#xff0c;并且如果这个文件被修改过或者篡改过&#xff0c;它的MD5值也将改变。因此&#xff0c;我们会对比文件的MD5值&#xff0c;来校验文件是否是有被恶意篡改过。 什么是MD5&#xff…...

PostgreSQL 正则表达式匹配字段

在 PostgreSQL 数据库中&#xff0c;可以使用 ~ 和 !~ 操作符进行正则表达式的匹配和否定匹配。还可以使用 :: 操作符进行正则表达式的模式匹配。 例如&#xff0c;假设我们有一个名为 users 的表&#xff0c;其中有一个名为 email 的字段&#xff0c;我们可以使用以下 SQL 语句…...

关于iterm2的美化

iterm2 美化 笔者公司最近给发了一个新 M1 mac pro&#xff0c;所以一些软件需要重新安装。其中比较麻烦就是iterm2的一个美化工程 &#xff0c; 由于每次安装的效果都不尽相同所以这次写一个博客来记录一下 安装的过程 。 全程高能开始&#xff1a; 使用brew 来安装 iterm2 …...

Hook原理--逆向开发

今天我们将继续讲解逆向开发工程另一个重要内容--Hook原理讲解。Hook&#xff0c;可以中文译为“挂钩”或者“钩子”&#xff0c;逆向开发中改变程序运行的一种技术。按照如下过程进行讲解 Hook概述Hook技术方式fishhook原理及实例符号表查看函数名称总结 一、Hook概述 在逆…...

做数据可视化,谨记三大要点

数据可视化报表就是“一图胜千言”的最佳例子。数据可视化&#xff0c;也就是将数据图形化、图表化&#xff0c;以良好的视觉效果呈现数据&#xff0c;达到发现、分析、预测、监控、决策等目的。要想做出一份优秀的数据可视化报表&#xff0c;那就要在做报表时谨记三大要点&…...

软件设计原则-接口隔离原则讲解以及代码示例

接口隔离原则 一&#xff0c;介绍 1.前言 接口隔离原则&#xff08;Interface Segregation Principle&#xff0c;ISP&#xff09;是面向对象设计中的一个原则&#xff0c;提倡使用多个专门的接口&#xff0c;而不使用单一的大接口。它最早由Robert C. Martin在其《敏捷软件…...

yolov8x-p2 实现 tensorrt 推理

简述 在最开始的yolov8提供的不同size的版本&#xff0c;包括n、s、m、l、x&#xff08;模型规模依次增大&#xff0c;通过depth, width, max_channels控制大小&#xff09;&#xff0c;这些都是通过P3、P4和P5提取图片特征&#xff1b; 正常的yolov8对象检测模型输出层是P3、…...

Type Script的变量类型

Typescript 的重要特性之一就是数据有类型了。 常见的类型如&#xff1a;字符串、数值、布尔等都有了明确的定义。 变量声明的格式 let 变量名:类型 初始值&#xff1b;字符型 let str:string "abc";数值型 数值型也支持不同的进制&#xff0c;用前缀区分 支持 整…...

系统架构师备考倒计时13天(每日知识点)

1. 数据仓库四大特点 面向主题的。操作型数据库的数据组织面向事务处理任务&#xff0c;各个业务系统之间各自分离&#xff0c;而数据仓库中的数据是按照一定的主题域进行组织的。集成的。数据仓库中的数据是在对原有分散的数据库数据抽取、清理的基础上经过系统加工、汇总和整…...

20 | Spring Data JPA 中文文档

Spring Data JPA 中文文档 1. 前言 Spring Data JPA 为 Jakarta Persistence API&#xff08;JPA&#xff09;提供 repository 支持。它简化了需要访问JPA数据源的应用程序的开发。 1.1. 项目元数据 版本控制: https://github.com/spring-projects/spring-data-jpaBug跟踪:…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

shell脚本质数判断

shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数&#xff09;shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数&#xff09; 思路&#xff1a; 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...

StarRocks 全面向量化执行引擎深度解析

StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计&#xff0c;相比传统行式处理引擎&#xff08;如MySQL&#xff09;&#xff0c;性能可提升 5-10倍。以下是分层拆解&#xff1a; 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...