【Linux】深入理解进程概念
个人主页:🍝在肯德基吃麻辣烫
我的gitee:Linux仓库
个人专栏:Linux专栏
分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处
文章目录
- 前言
- 浅谈进程概念
- 1. 进程和操作系统的联系
- 2.描述进程的对象——PCB
- 深谈进程概念
- 3. 对进程的组织操作
- 总结
前言
本篇文章继上一篇的冯诺依曼体系结构和操作系统这两个软硬件的概念之后,开始讲解Linux下三座大山之一的进程
。
因为进程概念虽然不是很多,但比较难以理解,因为它离我们日常生活比较远,比较抽象,本文章以最平易近人的语言和生活中我们都熟悉的例子对进程进行剖析,希望这篇文章能进一步帮助你理解进程的概念,吃透Linux的其中一座大山。
废话不多说,我们现在开始。
浅谈进程概念
- 进程到底是什么呢?
这里给出一个比较简单的理解:
一个加载到内存的程序就叫做进程。
正在运行的程序,也叫做进程。
我们可以这样理解,进程,进:进入,程:程序,进入内存的程序,就是进程。
自从我们理解冯诺依曼之后,程序加载到内存这件事情我们就可以轻松理解。前面我们讲过,操作系统是一款进行管理的软件。 既然操作系统是软件,那就应该也会被加载到内存中运行。我们平时所说的启动电脑,就是先启动操作系统,也就是将操作系统加载到内存中。
以我的电脑为例,当打开任务管理器时,下面一览无余的任务等,这些就是进程,正在运行的程序。
1. 进程和操作系统的联系
其实,程序是一堆数据和代码,最先是被存放到磁盘中。我们知道启动电脑时,操作系统也会被加载到内存中运行,在内存中有一块空间属于操作系统自己的数据和代码。
当我们想要运行整个程序时,由于CPU只会和内存打交道,不会直接和磁盘交互,这就注定了程序想要运行必须加载到内存中,这个同时也遵守了冯诺依曼体系结构。
- 这时候我们仔细想想,只能由一个程序能加载到内存里面吗?
其实并不是,我们玩电脑的时候,会同时启动几个软件,我们会一边看b站一边登录qq和微信,一边敲代码,这些都可以同时进行。
所以,一个操作系统,是可以同时运行多个进程的!
这就像大学里面有大一的,有大二的,有在实习的,有天天在宿舍打游戏的一样,一个操作系统要想同时运行那么多个进程,就必须将进程管理起来!
- 操作系统如何管理进程呢?
还记得上篇文章那句贯穿整个Linux的话吗?
先描述,再组织
描述的过程就是让操作系统先认识进程,再将进程用一个struct
结构体描述起来,然后将众多进程全部都具体化,而对于进程的管理无非就是多一个进程,少一个进程等等这些操作,所以操作系统再将进程组织起来,就能达到管理。
2.描述进程的对象——PCB
从上面我们可以知道,任何一个程序,加载到内存时,操作系统对进程进行描述时,会把进程具象化成一个struct
结构体,而这个结构体就是PCB,全称是Process Ctrl Block:进程控制块。
怎么理解进程PCB?
- 这里有一个问题:人是怎么认识一个事物的?
假如这里有一个苹果,我们都会说,这个苹果是圆的,是红色的,大大的一个东西,还是一个甜甜的水果。
又譬如对你大学舍友的描述,长得怎么样,两个眼睛扛着两片眉毛,一个鼻子,一张嘴巴,爱好什么,喜欢做什么等等。
可以看出来,这些描述一个事物,就是通过事物本身的属性来描述的!
其实我们对一个事物本身并不了解,而是通过该事物的大量属性来了解这个事物,当属性足够多时,这一堆属性的集合,就是目标事物本身!
所以描述进程的对象——PCB,就是进程属性的集合!
到这里我们再对程序加载到内存这件事情进一步详谈:
程序加载到内存中时:
- 1.把数据和代码都加载到内存中
- 2.同时创建描述该进程的PCB对象并加载到内存中
这就像是,大学新生考上了某所学校时,要证明我真正在那所学校了,就需要在学校的教务系统录入我的名字信息等等。也许该名同学还在放暑假,可是当学校教务系统有该同学的信息时, 就表明这名同学真正的来这所大学就读了。
深谈进程概念
从前面我们可以知道,一个程序加载到内存,一是程序本身的数据和代码加载到内存,二是操作系统创建了一个PCB对象并加载到内存;
所以,单纯的数据和代码不叫进程,单纯的PCB对象也不叫进程,而是数据和代码 + 描述该进程的PCB结构体 = 进程!
1)进程的数据和代码是程序员写的
2)描述该进程的PCB结构体是操作系统维护的
可以想想,在学校中我们对学生的管理是看学生的及格率,挂科率,学分绩,宿舍号等属性进行管理的。
所以,操作系统对进程的管理并不是对数据和代码的管理,而是对描述该进程的PCB结构体进行管理!
因为这个内核PCB结构体就是该进程属性
的集合!
可是,操作系统对进程进行管理,不只是要知道该进程的属性值,还要获取进程的数据和代码。因此,在描述该进程的PCB结构体中,一定有指向该进程数据和代码的指针信息!
就像管理学生,学校老师如何通过学生的属性去获取指向学生数据的 “ 指针信息 ”?
其实就是手机号。手机号是该学生的属性值,但是这个属性可以找到学生这个人!
以上就是关于操作系统如何对进程进行描述的过程。
3. 对进程的组织操作
通过上面的信息可以知道,操作系统会对多个进程进行描述,管理这些进程的时候就管理对应描述进程的PCB对象就可以了。
在PCB结构体中大概有这些信息:
前面说过,操作系统对进程的管理方式是:
先描述,再组织。
那么该如何对那么多的进程组织起来呢?
其实我们可以再PCB结构体中再加一个指针信息:
struct PCB* next
,该指针指向下一个PCB结构体对象,如下图:
从而将操作系统对进程的管理转化成对一个链表的增删查改!
这个过程就是对进程进行组织的过程!
总结:进程 = 内核PCB数据结构 + 自己的代码和数据。
操作系统对进程的管理是先描述,再组织的过程;操作系统对进程的数据管理是被弱化的,更重要的是对进程的PCB结构体进行管理,然后将这一个个的PCB结构体连接起来,就形成了对链表的增删查改。
总结
本篇文章重点在于理解进程的概念就可以了,进程的相关内容比较多且难以理解,从进程概念入手是最合适的,后面会持续更新如何创建进程,进程的状态等详细的内容,更好地理解进程,贯穿整个Linux。
相关文章:

【Linux】深入理解进程概念
个人主页:🍝在肯德基吃麻辣烫 我的gitee:Linux仓库 个人专栏:Linux专栏 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处 文章目录 前言浅谈进程概念1. 进程和操作系统的联系2.描述进程的对象——PCB …...

Java课题笔记~ AspectJ 的开发环境(掌握)
AspectJ 的开发环境(掌握) (1) maven 依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></depe…...

机器学习参数调优
手动调参 分析影响模型的参数,设计步长进行交叉验证 我们以随机森林为例: 本文将使用sklearn自带的乳腺癌数据集,建立随机森林,并基于泛化误差(Genelization Error)与模型复杂度的关系来对模型进行调参&…...
[Java基础]面向对象-关键字分析:this,static,final,super
系列文章目录 【Java基础】Java总览_小王师傅66的博客-CSDN博客 [Java基础]基本概念(上)(标识符,关键字,基本数据类型)_小王师傅66的博客-CSDN博客 [Java基础]基本概念(下)运算符,表达式和语句,分支,循环,方法,变量的作用域,递归调用_小王师傅66的博客-CSDN博客 [Java基础]…...

数据结构初阶--二叉树的顺序结构之堆
目录 一.堆的概念及结构 1.1.堆的概念 1.2.堆的存储结构 二.堆的功能实现 2.1.堆的定义 2.2.堆的初始化 2.3.堆的销毁 2.4.堆的打印 2.5.堆的插入 向上调整算法 堆的插入 2.6.堆的删除 向下调整算法 堆的删除 2.7.堆的取堆顶元素 2.8.堆的判空 2.9.堆的求堆的…...
NVM Command学习
ubuntu系统安装nvme-cli,可以在应用层发起命令。 sudo apt install nvme-cli$ sudo nvme --help nvme-1.9 usage: nvme <command> [<device>] [<args>]The <device> may be either an NVMe character device (ex: /dev/nvme0) or an nvme …...

TCP Socket 基础知识点(实例是以Java进行演示)
本篇根据TCP & Socket 相关知识点和学习所得进行整理所得。 文章目录 前言1. TCP相关知识点1.1 双工/单工1.2 TCP协议的主要特点1.3 TCP的可靠性原理1.4 报文段1.4.1 端口1.4.2 seq序号1.4.3 ack确认号1.4.4 数据偏移1.4.5 保留1.4.6 控制位1.4.7 窗口1.4.8 校验和1.4.9 紧…...

openCV图像读取和显示
文章目录 一、imread二、namedWindow三、imshow #include <opencv2/opencv.hpp> #include <iostream>using namespace std; using namespace cv;int main(int argc,char** argv) {cv::Mat img imread("./sun.png"); //3通道 24位if (img.empty()) {std:…...
requests 方法总结
当使用 requests 库进行接口自动化测试时,以下是一些详细的步骤和方法总结: 1. **安装 requests 库**:首先,确保你已经安装了 requests 库。可以使用 pip 命令进行安装:pip install requests。 2. **导入库**&#x…...
Go语言删除文本文件中的指定行
GO语言删除文本文件中的指定行 1. 思路2. 处理文件3. 处理后的文本文件 1. 思路 假设现在有一个文本文件,我们需要删除文件中乱码的行。我们可以使用go的os库来处理文件,遍历整个文件然后将除过乱码的行写入一个新文件,以此来实现我们的需求…...

Arthas GC日志-JVM(十八)
上篇文章说jvm的实际运行情况。 Jvm实际运行情况-JVM(十七) Arthas介绍 因为arthas完全是java代码写的,我们直接用命令启动: Java -jar arthas-boot.jar 启动成功后,选择我们项目的进程。 进入我们可用dashboard…...

ISC 2023︱诚邀您参与赛宁“安全验证评估”论坛
8月9日-10日,第十一届互联网安全大会(简称ISC 2023)将在北京国家会议中心举办。本次大会以“安全即服务,开启人工智能时代数字安全新范式”为主题,打造全球首场AI数字安全峰会,赋予安全即服务新时代内涵…...

分享一个计算器
先看效果: 再看代码(查看更多): <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>计算器</title><style>* {box-sizing: border-box;}body…...
Android 13 Launcher——长按图标弹窗背景变暗
目录 一.背景 二.修改代码 一.背景 客户定制需要长按图标弹窗让其背景变暗,所以需要进行定制,如下是定制流程,本篇是接上篇https://gonglipeng.blog.csdn.net/article/details/132171100 的内容 二.修改代码 主要代码逻辑在ArrowPopup中的reorderAndShow方法和closeCom…...
Elasticsearch概述和DSL查询总结
目录 Elasticsearch概述 1. 什么是Elasticsearch 2. 作用 3. 特点 DSL(Domain Specifit Language)特定领域语言: 概念和作用 查询代码总结 最后附项目准备 1.创建搜索工程(maven工程) 2.配置文件 application…...

扩展卡尔曼滤波器代码
文章目录 前言问题状态向量和观测向量加性噪声的形式状态方程及求导观测方程及求导状态初始化过程噪声和观测噪声卡尔曼滤波过程code 前言 卡尔曼滤波器在1960年被卡尔曼发明之后,被广泛应用在动态系统预测。在自动驾驶、机器人、AR领域等应用广泛。卡尔曼滤波器使…...

9:00开始面试,9:08就出来了,这问题问的实在是····
外包工作3年,今年裸辞跳槽,很幸运的是找到了下家,不过 自从加入到这家公司,每天不是在加班就是在加班的路上,薪资倒是给的不少,所以我也就忍了。没想到6月一纸通知,所有人都不许加班࿰…...

揭秘:5个美国程序员与日本程序员的差异
大家好,这里是程序员晚枫。想了解更多精彩内容,快来关注程序员晚枫 今天以美国和日本程序员为例,给大家分享一下国外程序员的生活。 以下是五个美国程序员和日本程序员的的区别: 工作方式:美国程序员通常更注重自由和…...
Springboot实现简单JWT登录鉴权
登录为啥需要鉴权? 登录需要鉴权是为了保护系统的安全性和用户的隐私。在一个 Web 应用中,用户需要提供一定的身份信息(例如用户名和密码)进行登录,登录后系统会为用户生成一个身份令牌(例如 JWT Token&am…...
C++设计模式创建型之工厂模式整理
一、工厂模式分类 工厂模式属于创建型模式,一般可以细分为简单工厂模式、工厂模式和抽象工厂模式。每种都有不同的特色和应用场景。 二、工厂模式详情 1、简单工厂模式 1)概述 简单工厂模式相对来说,在四人组写的《设计模式------可复用面…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...