【Linux】进程(Process)

一、什么是进程

二、进程的创建

三、进程的状态

四、僵尸进程

五、孤儿进程

六、进程的优先级 以及 并发/并行

七、进程的切换


一、什么是进程?

什么是进程呢(一)?

官方话来说:进程是一个执行实例、正在执行的程序、是系统资源分配的基本单位

按课本官方话可能有一点点的不好理解

通俗的讲:当你电脑上的程序,比如qq 你双击运行起来,此时他启动了,那么他现在就是一个进程

再深讲:当你的代码被编译链接成为一个可执行程序,这个可执行程序本质上是一个文件,是被放到磁盘里的,当双击运行,这个程序会被加载到内存,也就是大家所说的内存条,当加载到内存,
此时程序的代码会一条一条的被cpu执行,此时这个程序不再叫程序而是叫做进程

在Linux下通过指令ps aux 可以查看当前正在运行的进程

还可以通过系统目录查看当前进程

什么是进程呢(二)?

看过我前面文章里的操作系统的话,我说到了操作系统的管理

操作系统要对进程进行管理如何管理的呢?

进程再往深讲:进程就是一个结构体,这个结构体名字叫做PCB控制块

PCB控制块里面存放了进程属性的集合

PCB在Linux下就是 task_struct 名字的结构体

所谓的进程记载到内存,实际上就是PCB结构体加载到了内存

在这个PCB结构体内存放了进程的各种属性,比如进程状态、优先级、标识符、父进程标识符

程序计数器、内存指针、上下文数据、其他信息等

这些PCB结构体会被以双向链表的形式被操作系统进行管理

通过这样,操作系统可以访问所有的PCB,也就等于访问到了所有的进程,对进程的管理也就转换为了对PCB结构体的管理

当一个程序被启动变为进程,进程的代码和数据会加载到内存,然后操作系统会形成相应的PCB,

并把PCB放入链表中,而一个进程的退出,也就是从链表中删除这个节点,然后对代码和数据进行释放

总结就是:操作系统对进程的管理实际上就变成了对链表的增删改查、不管是对进程的管理,还是文件内存等,本质都是对一种数据结构的增删改查

二、进程的创建

通过系统调用可以在一个进程中再创建一个子进程

fork函数创建子进程

运行结果是每次循环会打印两行数据,第一行是该进程的Pid和PPid

第二行是子进程的Pid和PPid

我们可以发现这两个进程是父子关系,子进程的PPid=该进程的Pid

每次出现一个进程,操作系统就会为其创建一个PCB,fork函数创建的进程也不例外

为什么子进程也执行跟父进程相同的代码呢?

原因解释:子进程被创建后会共享父进程的代码数据,但是采用的是写时拷贝

什么意思呢?子进程会执行和父进程相同的代码,但是如果修改父进程的数据,他就不会共享该数据的地址了,而是为自己开辟一个空间放这个数据,这样的设计减少来了内存的浪费,只有在需要的时候才分配内存

注意点⚠️fork函数是返回两个返回值的,因为在fork函数内部就已经创建了子进程,已经分配了PCB,并且放入了cpu的调度队列,在fork函数内的return返回值前已经是两个进程在跑了,所以父子进程的执行顺序是不确定的,取决于操作系统的调度方式

如何让子进程执行自己的代码呢?

使用if进行分流即可,因为有两个返回值,而两个返回值明确区分了,=0代表是子进程,>0代表是父进程,通过if区别返回值,即可让父子进程执行不同的代码

如果返回值<0 代表创建进程失败了,可能是因为没有内存了,也可能进程创建数量达到了上限

三、进程的状态

一个进程从创建到销毁,会经历很多不同的状态

我这里直接总结了一下:

创建/新建状态:

如果一个进程在被创建的时候,比如分配PCB,比如fork函数内,那么这个进程就处于新建状态

什么是新建状态呢?就是还没有被执行

就绪状态:

当分配完PCB并且放到了cpu的调度队列,等待被cpu执行自己的代码,此时就进入了就绪状态

也就是等待被执行

运行状态:

当真正被cpu调度的时候,开始执行自己的代码,就进入了运行状态

阻塞状态:

当在程序运行中,因为某种原因阻塞,比如等待键盘输入数据,此时操作系统识别到后,会把进程放入该等待外设设备的等待队列中,然后进程进入阻塞状态,直到键盘输入数据,操作系统才会重新将进程重新放入运行队列里去等待执行

阻塞挂起状态:

什么是阻塞挂起状态呢?当内存中由于进程数量过多,内存不够的时候,操作系统会选择将一部分进程的代码和数据放入磁盘中,只在内存中保留PCB控制块,这些代码和数据会被放到磁盘中的swap分区中,这个分区的大小一般是内存的1.5倍或者2倍,当需要的时候就把代码和数据再交换会内存进行调度,这就是阻塞挂起状态

个人超详细总结:

四、僵尸进程

还有一种状态叫做僵尸状态 - Z

当一个进程变成僵尸进程就陷入了僵尸状态

僵尸进程:父子进程中,子进程退出,但是父进程没有回收子进程的资源,导致子进程的PCB控制块一直保留在内存,虽然子进程的代码和数据已经释放,但是PCB控制块没有释放,导致内存泄露的问题,此时子进程变成僵尸进程,使用kill命令也无法杀死

为什么会有僵尸进程呢?

因为子进程的PCB控制块内有返回值信息和状态信息,还有自己的pid

这些信息可能对于父进程是有效的,所以系统不会主动释放,而是等待父进程来回收这些资源才会

释放

僵尸进程的危害?

如果一个父进程创建了很多子进程都不回收,造成严重内存泄露问题,可用资源越来越少

如何解决僵尸进程呢?

父进程调用系统调用来进行回收,或者通过捕捉信号的方式(涉及到信号的知识)

如果已经发生僵尸进程,需要杀死父进程来让僵尸进程变为孤儿进程被系统自动领养回收

五、孤儿进程

前面提到了僵尸进程,那什么是孤儿进程呢?跟僵尸进程相反

如果父进程早于子进程退出了,此时子进程没有父亲了,就变成了孤儿进程

孤儿进程会被1号进程也就是系统领养,由系统管理回收

孤儿进程最终会被释放,而僵尸进程危害较大

六、进程的优先级 以及 并发/并行

简短总结:

七、进程的切换

简短总结:

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

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

相关文章

销售管理系统哪个好?14款软件深度对比

本文将深入对比14款销售管理系统&#xff1a;1.纷享销客&#xff1b; 2.Zoho CRM&#xff1b; 3.神州云动 CRM&#xff1b; 4.励销云 CRM&#xff1b; 5.Microsoft Dynamics 365 CRM&#xff1b; 6.悟空 CRM&#xff1b; 7.泛微 CRM&#xff1b; 8.HubSpot CRM&#xff1b; 9.…

如何从 0 到 1 开发企业级 AI 应用:步骤、框架与技巧

本文来自作者 莫尔索 的 企业级 AI 应用开发与最佳实践指南&#xff0c; 欢迎阅读原文。 大家好&#xff0c;我之前出版的《LangChain 编程&#xff1a;从入门到实践》一书获得了良好的市场反响和读者认可。近期推出了第二版&#xff0c;我对内容进行了大幅更新&#xff1a;近 …

【LLM】Openai之gpt-oss模型和GPT5模型

note gpt-oss模型代理能力&#xff1a;使用模型的原生功能进行函数调用、网页浏览&#xff08;https://github.com/openai/gpt-oss/tree/main?tabreadme-ov-file#browser&#xff09;、Python 代码执行&#xff08;https://github.com/openai/gpt-oss/tree/main?tabreadme-o…

Ubuntu 20.04 虚拟机安装完整教程:从 VMware 到 VMware Tools

目录 一、VMware的安装 1. 资源获取 1. 网盘提取 2. VMware官网&#xff0c;选择自己合适的版本&#xff0c;我下载的是16.2版本 2.安装步骤 二、Ubuntu的安装 1. Ubuntu 镜像文件官网下载 2. Ubuntu的安装步骤 第一步&#xff1a;打开刚刚安装好的VMware16.2.0&#…

【DL】最优化理论和深度学习

最优化理论是计算机科学中一个重要的概念&#xff0c;它用于帮助我们找到最优解&#xff08;即最小或最大值&#xff09;的算法。在深度学习中&#xff0c;最优化理论用于帮助深度学习模型找到最优解。训练误差&#xff08;Training Error&#xff09;&#xff1a;指模型在训练…

商品分类拖拽排序设计

商品分类、菜单项以及其他需要排序的元素常常会用到拖拽排序功能。这个看似简单的交互背后&#xff0c;其实涉及到一系列复杂的后端逻辑处理&#xff0c;尤其是在如何高效地更新数据库记录方面。本文将探讨两种常见的实现方案&#xff0c;并分析各自的优缺点&#xff0c;帮助你…

ROS机器人云实践设计申报书-草稿

ROS机器人云实践作品申报书 ROS机器人云实践设计一、项目基本信息 项目名称&#xff1a;基于ROS的移动机器人云实践平台设计与应用 申报单位&#xff1a;[具体单位名称] 项目负责人&#xff1a;[具体参与人员] 申报日期&#xff1a;[填写日期] 二、项目背景与目标 项目背景&…

Jira 根据问题类型 为 描述 字段添加默认值

背景: jira 8.16 想要为问题类型为 需求 的问题默认增加描述字段默认值 想都没想直接根据之前添加缺陷类型时描述默认值的方式去添加(系统字段--描述--上下文和默认值--添加上下文), 结果不随我愿, 系统默认的这个功能不能根据问题类型切换而切换不同的默认值, 只能设置 1 个…

深度学习(5):激活函数

ss激活函数的作用是在隐藏层引入非线性&#xff0c;使得神经网络能够学习和表示复杂的函数关系&#xff0c;使网络具备非线性能力&#xff0c;增强其表达能力。一、常见激活函数1、sigmoid激活函数的作用是在隐藏层引入非线性&#xff0c;使得神经网络能够学习和表示复杂的函数…

洛谷 小 Y 拼木棒 贪心

题目背景上道题中&#xff0c;小 Y 斩了一地的木棒&#xff0c;现在她想要将木棒拼起来。题目描述有 n 根木棒&#xff0c;现在从中选 4 根&#xff0c;想要组成一个正三角形&#xff0c;问有几种选法&#xff1f;答案对 1097 取模。输入格式第一行一个整数 n。第二行往下 n 行…

飞算JavaAI的“盾牌”计划:手撕Spring Security + JWT认证链

一、飞算JavaAI&#xff1a;智能时代Java开发的“全能引擎” 1.1 飞算JavaAI&#xff1a;重新定义Java安全开发的“技术革命”在数字化浪潮席卷全球的今天&#xff0c;Java作为企业级应用开发的首选语言&#xff0c;其安全性需求随着业务复杂度的提升而呈指数级增长——从用户认…

大语言模型提示工程与应用:大语言模型进阶提示工程技术

高级提示词使用 学习目标 掌握大语言模型中进阶提示工程技术的原理与应用&#xff0c;包括零样本/少样本提示、思维链推理、知识生成等核心方法&#xff0c;提升复杂任务解决能力。 相关知识点 零样本与少样本提示思维链提示技术高级推理技术 学习内容 1 零样本与少样本提…

【从零开始java学习|第五篇】项目、模块、包、类的概念与联系

目录 一、概念与作用&#xff1a;从宏观到微观的层级拆分 1. 项目&#xff08;Project&#xff09;&#xff1a;最外层的 "大容器" 2. 模块&#xff08;Module&#xff09;&#xff1a;项目的 "功能子单元" 3. 包&#xff08;Package&#xff09;&…

kernel pwn 入门(四) ret2dir详细

介绍 ret2dir 是哥伦比亚大学网络安全实验室在 2014 年提出的一种辅助攻击手法&#xff0c;主要用来绕过 smep、smap、pxn 等用户空间与内核空间隔离的防护手段&#xff0c; 原论文见此处&#xff1a; ret2dir原文论文 参考&#xff1a;kernel pwn入门到大神 ret2dir ret2di…

n阶常系数齐次线性微分方程的含义

微分方程 (Differential Equation): 含义&#xff1a; 包含未知函数及其导数&#xff08;或微分&#xff09;的方程。例子&#xff1a; dy/dx 2x&#xff08;未知函数是 y(x)&#xff0c;导数是 dy/dx&#xff09;, dy/dt 2 dy/dt y 0&#xff08;未知函数是 y(t)&#xff…

hexo + github 搭建个人博客

hexo github 搭建个人博客环境配置部署环境配置部署 所需环境&#xff1a; 跳过github邮箱注册。 右键点击桌面空白处&#xff0c;选择 “Git Bash Here”&#xff0c;输入以下命令设置用户名和邮箱&#xff1a; git config --global user.name "GitHub用户名" g…

ERFA库全面指南:从基础概念到实践应用

ERFA库全面指南&#xff1a;从基础概念到实践应用 ERFA&#xff08;Essential Routines for Fundamental Astronomy&#xff09;作为天文学计算领域的重要开源库&#xff0c;为开发者提供了处理天文时间、坐标系转换和星体位置计算等核心功能。本文将深入探讨ERFA库的技术细节…

STM32 HAL库串口的功能实现与改进

目录 概述 1 CubeMX配置串口参数 1.1 STM32CUB配置参数 1.2 生成代码 2 核心代码介绍 2.1 初始化函数 2.2 中断函数 2.3 重要的用户函数 2.4 实现用户接口函数 3 接收数据函数的优化 3.1 HAL库接收函数的缺陷 3.2 改进接收函数 概述 在STM32开发中使用HAL库操作串…

DBA | SQL 结构化查询语言介绍与学习环境准备

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ]&#x1f4e2; 大家好&#xff0c;我是 WeiyiGeek&#xff0c;一名深耕安全运维开发&#xff08;SecOpsDev&#xff09;领域的技术从业者&#xff0c;致力于探索DevOps与安全的融合&#xff08;Dev…

day39_2025-08-13

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中 展平操作&#xff1a;除第一个维度batchsize外全部展平 dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练…