进程概念详解
目录
进程是什么?
描述进程:进程控制块-PCB
task_struct
task_struct 是什么?
task_struct内容分类
组织进程
查看进程
fork创建子进程
进程状态
僵尸进程
孤儿进程
进程优先级
其他概念
进程是什么?
一般书上说:进程是运行当中的程序,是担当分配资源的实体。
那么?程序是如何被运行的呢?
我们写好程序代码后,会将程序文件存储到磁盘中,要运行一个程序,首先会将程序代码文件加载到内存中,然后由cpu去运行。
但是,只要程序被加载到内存,它就是一个完整的进程吗?进程和程序仅仅是存储位置不同吗?
当然不是,进程需要消耗资源,那么它就一定会被操作系统所进行管理。
操作系统要管理:首先要先描述,再组织。
那么操作系统如何对进程进行管理呢?
描述进程:进程控制块-PCB
当程序被加载到内存后,操作系统会为该程序创建进程控制块,简称PCB,PCB当中存储着该进程属性的集合。
所以,完整的进程是什么?
进程=程序代码数据+相关数据结构(也就是进程控制块)。
task_struct
task_struct 是什么?
task_struct 是linux当中描述进程的结构体,它存储着进程信息。
task_struct与PCB的关系就是,task_struct是一种具体的PCB,它是linux环境下具体的PCB。
task_struct内容分类
标识符:描述本进程的唯一标识,简称PID。
状态:任务状态,退出代码,退出信号等
优先级:相对于其他进程的优先级。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针 :包括程序代码和相关数据的指针,还有和其他进程共享的内存块指针。
上下文数据:进程执行时,处理器的寄存器当中该进程的数据。(下文详解)
I/O状态信息:显示的IO请求,分配给进程的IO设备和被进程使用的文件列表。
记账信息:包括处理器时间总和,使用的时钟数总和,时间限制,记帐号等。
其他信息
组织进程
每个进程都对应着一个进程控制块,操作系统将这些进程控制块用链表形式组织起来,这样对于进程的管理,就变成了对链表的增删查改。

查看进程
获取PID:getpid()
获取PPID:getppid(),PPID表示父进程的ID。
getpid(),getppid()属于系统调用,头文件为sys/types.h
我们使用的XShell软件本质就是一款命令解释器,我们输入指令后,shell不会自己去解释指令,而是会产生子进程bash去解释这条指令给内核。
为什么要这么做呢?因为如果我们输入了错误指令,产生了错误影响,不能影响我xshell运行,
就相当于某公司员工出了问题,为了不影响公司声誉,公司对外宣称该员工与公司无关。
这样即使出了问题,也不影响公司的整体运行。
这样就由bash来解释这条指令,bash进程就是该指令的父进程。


每个进程被创建后,会在/proc目录下以该进程PID为名形成目录。
我们可以通过ls /proc/pid查看该进程

下面我们通过ls -l指令查看该进程详细信息。

两个重要概念:cwd:表示当前工作目录,程序当中创建文件,默认在该目录下。
exe:表示当前执行的程序是谁。
我们也可以通过其他指令查看进程信息。
ps axj 或 ps ajx或 top


fork创建子进程
fork属于系统调用,作用是创建子进程。
fork函数有两个返回值,对于父进程返回子进程pid,对于子进程返回0


通过fork函数,可以让一个程序产生两个不同的结果。
通过fork创建的子进程,子进程的PCB以父进程为模板构建,子进程的代码完全和父进程共享,因为代码是不可以被更改的,而父子进程的数据是临时共享的,当父子进程数据要更新时,会发生写时拷贝,因为进程之间是相互独立的,为了防止一个进程数据改变时影响另一个进程,所以在数据发生改变时,对数据拷贝再更改,保证进程之间的独立性。
进程状态
下面展示linux状态源码:
/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
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状态:休眠状态,等待事件完成,可以被唤醒。
D状态:深度休眠状态,与S状态相似,但是不可被操作系统杀死。
T状态:暂停状态,无法被唤醒。
X状态:死亡状态
Z状态:僵尸状态
当进程所需资源充足,满足运行条件时,该进程的PCB会被调度模块分配到运行队列中,等待cpu运行,而其他不满足运行条件的进程,被放在等待队列中,称为挂起或阻塞状态。
但是为什么R状态并不意味着该进程一直在运行呢?
还是因为资源问题,你这个进程要运行10s,操作系统要是一直让你运行,其他进程怎么办呢?
所以,我们从资源管理器中看到很多进程占用资源,好像一直在运行,这是错误的。
看似好多进程一直在运行,其本质是操作系统根据时间片(单个进程的单次运行最长时间,灰常短),快速切换进程运行的结果。


运行队列进程处于R状态,而等待队列进程处于S或D或T状态。
当系统负载高时,资源不够用,操作系统可能会杀掉S状态,而D状态进程处于深度睡眠,不可中断,即使你是操作系统也无法给他杀掉(D状态就是爷,不干事,你也管不了我)。
到这里,问题又来了,既然操作系统不让进程一直运行,一直在切换,那么我怎么知道你这个程序运行到哪一步呢?
因为只有一份寄存器,所以进程在离开时,要将数据拷贝一份,再下次回来运行的时候,再把数据拷贝回寄存器,然后接着运行。
这种与进程强相关的临时数据就被称作上下文数据。
T状态 :

我们可以通过发送SIGSTOP 使进程进入T状态,也就是发送SIGCONT使进程退出T状态。

我们可以发现退出T状态后S少了+号,这表示该进程由前端运行变成后端运行,后端运行时,我们可以输入命令,而前端不行。
X,Z状态:
当程序执行完毕,直接退出是不行的!操作系统需要知道你这个程序是正常结束,还是非正常结束,要是没有这一步,万一出错,谁背锅?
所以,在程序执行完毕后,该进程会先进入Z状态,也就是僵尸状态,此时由父进程读取其退出码,
读取完毕后,进入X状态,也就是死亡状态,接着才被操作系统释放。
我们无法观测到X状态,因为一进入X状态,该进程立马就被释放了。
僵尸进程
处于僵尸状态的进程就是僵尸进程。
下面举一个例子:父进程一直处于运行态,不读取子进程退出码,此时子进程就会一直处于僵尸状态。


那么,僵尸进程有什么危害呢?
僵尸状态必须一直持续,直到父进程读取它的退出码。
僵尸状态也需要被维护。维护僵尸状态就是要维护它的数据信息,PCB。
那么一直不回收就是造成内存资源浪费,造成内存泄漏。
孤儿进程
子进程没噶,父进程先噶,此时子进程会被1号进程接管。
这种进程就叫孤儿进程。


进程优先级
进程优先级,表示cpu资源分配的先后。
优先级高,先分配。
通过优先级,可以极大提高系统性能。
查看系统进程优先级:ps -al
进程优先级为PRI,值越小优先级越高。
而NI表示nice值,表示优先级修正值。
默认PRI为80
PRI(new)=PRI(old)(默认为80)+ NI
NI有40哥级别,-20到19.

修改nice值:top指令 进入后按r

其他概念
竞争性:进程数目多,而cpu只有几个,甚至一个,所以进程之间具有竞争属性,为了高效运行,便有了优先级。
独立性:多个进程之间,独立享受资源,运行期间互不干扰。
并发性:多个进程在一个cpu下通过切换,不同时运行,一段时间内,让多个进程都得以推进。
并行性:多个进程在多个cpu下分别执行,同时运行。
相关文章:
进程概念详解
目录 进程是什么? 描述进程:进程控制块-PCB task_struct task_struct 是什么? task_struct内容分类 组织进程 查看进程 fork创建子进程 进程状态 僵尸进程 孤儿进程 进程优先级 其他概念 进程是什么? 一般书上…...
C语言基础——指针
文章目录一、指针1.指针的意义2.指针类型表示3.一些操作3.1打印1个变量地址3.2通过地址查看改地址的内容以及修改改地址的内容3.3操作某个空间 -- 4个字节,给他赋值为100,只知道该空间的地址0x8000 00004.指针变量的定义5.指针类型的大小6.指针变量的使用6.1 指针变…...
反序列化渗透与攻防(二)之Java反序列化漏洞
Java反序列化漏洞 反序列化漏洞 JAVA反序列化漏洞到底是如何产生的? 1、由于很多站点或者RMI仓库等接口处存在java的反序列化功能,于是攻击者可以通过构造特定的恶意对象序列化后的流,让目标反序列化,从而达到自己的恶意预期行为,包括命令执行,甚至 getshell 等等。 …...
优先级队列的模拟实现(仿函数)
目录: 1.priority_queue接口的实现(先建大堆) 1.push 加 向上调整的实现 2.pop 3.迭代器区间的构造 2.仿函数 3.仿函数优化我们的优先级队列 -------------------------------------------------------------------------------------------…...
Python pandas和numpy用法参考(转)
以下是转载:Python pandas用法 - 简书介绍 在Python中,pandas是基于NumPy数组构建的,使数据预处理、清洗、分析工作变得更快更简单。pandas是专门为处理表格和混杂数据设计的,而NumPy更适合处...https://www.jianshu.com/p/840ba1…...
mysql数据库的在线数据备份与数据恢复
MySQL是一种常用的关系型数据库管理系统,它支持在线备份和恢复数据。在线备份指的是在MySQL数据库运行时备份数据,而不会中断或影响现有的数据库服务。在本文中,我们将介绍MySQL数据库的在线数据备份和恢复的原理和操作步骤。 一、备份原理 …...
Vue3自定义指令之前端水印功能实现
一、前置知识 — Vue 中的自定义指令 先来说说 vue2和vue3中自定义全局指令的区别 相同点:指令的应用场景,原理是一致的; 不同点:生命周期钩子函数名,指令定义的格式不一样。 vue2中自定义全局指令: 定义…...
文章生成器写出来的原创文章
文章生成机器人 文章生成机器人是一种基于人工智能技术和自然语言处理算法的程序,可以自动地生成高质量、原创的文章。 文章生成机器人的优点如下: 提高工作效率:文章生成机器人能够在较短的时间内自动帮助用户生成大量的文章,提…...
2023年全国最新高校辅导员精选真题及答案49
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 76.气质就是我们平常所说的脾气秉性。 答案:正确 77.社会心理通常是通过社会…...
【STL十】关联容器——set容器、multiset容器
【STL十】关联容器——set容器、multiset容器一、set简介二、头文件三、模板类四、set的内部结构五、成员函数1、迭代器2、元素访问3、容量4、修改操作~~5、操作~~5、查找6、查看操作六、demo1、查找find2、修改操作insert3、修改操作erase、clear七、multisetset和multiset会根…...
什么是Node.js
文章目录什么是Node.js简介常用命令Node内置模块Node.js和JavaScript的区别什么是Node.js 简介 Node.js是一个基于Chrome V8引擎的JavaScript运行环境。它允许开发者使用JavaScript编写服务器端代码,而不仅仅是浏览器端的代码。Node.js的出现使得JavaScript可以在…...
比GPT-4 Office还炸裂,阿里版GPT全家桶来袭
疯狂3月的那一天,一切还历历在目。 微软突然在发布会上放出大招,用Microsoft 365 Copilot掀起了办公软件革命。 而今天,阿里也放出一枚重磅炸弹——阿里版的Copilot也要来了! 并且比微软更彻底的是,阿里全系产品也都…...
mysql 建表约束
主键约束 -- 主键约束 -- 使某个字段不重复且不得为空,确保表内所有数据的唯一性。 CREATE TABLE user (id INT PRIMARY KEY,name VARCHAR(20) );-- 联合主键 -- 联合主键中的每个字段都不能为空,并且加起来不能和已设置的联合主键重复。 CREATE TABLE …...
在Vue项目中使用tinymce富文本编辑器
TinyMC编辑器简介 TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。跟其他富文本编辑器相比,有着丰富的插件,支持多种语言,能够满足日常的业务需求并且免费。 TinyMCE的优势: 开源可商用,基于LGPL2.1 插…...
GPT-4 和ChatGPT API的定价分析
OpenAI发布了他们的ChatGPT新机器学习模型GPT-4。GPT-4是GPT-3的一大进步,GPT-3是当前ChatGPT免费版本(GPT 3.5 Turbo)所运行的模型的基础,今天我们也来凑个热点,研究一下它们的定价 GPT-4新的功能 GPT-4可以在对话中使用图像,并…...
基于html+css的盒子展示2
准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…...
【持续更新篇】SLAM视觉特征点汇总+ORB特征点+VINS前端
Harris角点 opencv函数 cornerHarris提取输入图像的Harris角点 检测原理 检测思想:使用一个固定窗口在图像上进行任意方向的滑动,对比滑动前后的窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有较大灰度变化…...
【C语言】初阶指针(指针及其类型以及野指针)
简单不先于复杂,而是在复杂之后。 目录 1. 指针是什么? 2. 指针和指针类型 2.1 指针-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 1. 指针是什么? 指针理解的两个要点: 1. 指针是内存中最小…...
UDS统一诊断服务【六】访问时序参数0X83服务
文章目录前言一、访问时序参数服务介绍二、数据格式2.1 请求报文2.2 子功能2.3 响应三、举例前言 本文介绍UDS统一诊断服务的访问时序参数0X83服务,希望能对你有所帮助 一、访问时序参数服务介绍 这个服务我目前在项目中没怎么用到过,先来看看ISO14229…...
Linux应用编程(文件属性与目录)
本章将会讨论如下主题内容。 ⚫ Linux 系统的文件类型; ⚫ stat 系统调用; ⚫ 文件各种属性介绍:文件属主、访问权限、时间戳; ⚫ 符号链接与硬链接; ⚫ 目录; ⚫ 删除文件与文件重命名。 一、Linux 系统中…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
