【Linux】进程概念 - 指南

news/2026/1/21 19:02:48/文章来源:https://www.cnblogs.com/gccbuaa/p/19513751

1、进程的概念

(1)结构体+代码数据构成进程,而不是说把可执行程序从磁盘拿到内存就是进程了,还包括描述进程的部分。

(2)在操作系统里,这个结构体叫做PCB,Linux里叫做task struct(进程控制块),是一个双链表。

(3)我的第一个进程

2、查看进程PID

(1)两种方式  ;    &&查看正在运行的进程

(2)ls /proc目录下,是各个进程的PID创建的目录

(3)exe:进程对应的可执行程序,要是删掉后,正在跑的进程还能继续,充分说明已经把exe文件从磁盘考到内存了,删除的只是磁盘上的exe文件

(4)cwd 记录当前进程的所在目录,如果在.c文件中用fopen创建一个.txt文件,这个.txt文件会自动创建在cwd指定的当前目录下。但是也可以更改进程的目录,在myprocess.c中,用chdir(新的目录),然后再用fopen打开新的文件,运行进程后查看文件,这个文件一定是在新的目录底下的。

3、杀掉进程

ctrl+c

kill  -9  进程PID号

4、父进程

进程是由父进程创建的;父进程就是bash,os会给每一个登录用户分配一个bash

下面这个就是一个bash打出来的一个字符串,为啥能卡在这里等待用户输入,scanf一样,用户输入后交给bash这个进程去解析用户的命令,因此更能理解:bash也是一个进程。

5、代码创建子进程 fork()

        像ls touch...这些都是子进程,都有一个父进程bash创建的,

执行结果如下,为啥会输出两次“进程开始运行”?

因为子进程的PCB是拷贝父进程的PCB,因此指向同一段数据和代码,一个是父进程本身,一个是子进程,都会打印自己的进程id。fork()之后的代码,父子进程都会执行。

6、fork()会有两个返回值

创建成功:①子进程PID给父进程;②0给子进程;

创建失败:返回-1

猜想下面代码运行:

实际运行结果:

解析:19811是bash进程,当前进程(父进程):1620,创建的子进程是1621

Q:

A1:因为系统中通常是1个父进程,n个子进程;父进程将来要管理多个子进程,所以拿到子进程的pid,才能区分每个子进程

A2:fork()创建一个子进程后,fork内部的最后的return语句也会被子进程运行,因此有两个返回值

A3:先理解下面的第7个小点

return 返回的也是一个值,每次也是把变量往id里写,因此会发生写时拷贝,不管谁先赋值,都可以拿到自己对应的那个id号,也就是会有两个id,因此一个id==0,另外一个id>0。更深刻的理解:父进程和子进程拿着同一个虚拟地址,但是最终找到了不同的物理地址,所以一个等于0一个大于0.

7、进程是独立的

(1)数据结构独立,因为进程等于内核数据结构

(2)代码共享,代码是只读的不影响独立性

(3)数据以写实拷贝的方式,各自私有一份,以此保证独立性

eg.有一个全局变量 gval,初始值=100;子进程每次修改gval+=10,子进程看到的结果改变;但是父进程看到的值依旧是100,这是因为写实拷贝,把gval拷贝了一份给子进程,子进程每次修改拷贝的这个gval,而不是原始的gval.

8、进程状态(粗)

(1)运行:进程在调度队列里面

(2)阻塞:把进程的PCB挂到相应的硬件设备的wait队列中,也就是该进程需要的硬件资源不满足

(3)阻塞挂起:把等待硬件资源的进程挂起

        进程在内存中等待键盘,内存中存入多个进程(PCB+代码数据),导致内存不够,把进程的代码和数据拿到磁盘的swap交换区里,内存只保留这些进程的PCB,叫做阻塞挂起。①唤出:把代码和数据拿出去②唤入:把代码和数据拿进来(到内存)

        “挂起”:就是把代码和数据“挂”到磁盘上

(4)就绪挂起,把调度队列里面的进程挂起

有一个PCB就够了,一个PCB可以在不同的数据结构里都有,其实是同一个

9、Linux进程状态(细)

(1)R:运行

(2)S:阻塞/休眠,比如scanf等待键盘输入,这个进程不被调度了。可中断休眠,浅睡眠,scanf正在等待,我们可以ctrl+C中断休眠

(3)T:暂停,①追踪状态,给程序打断点,因为进程被暂停了②ctrl+Z暂停这个进程

(4)D:阻塞,不可中断休眠,深度睡眠

(5)X:死亡状态

(6)Z:僵尸状态,为了获取退出信息(PCB)!子进程退出后,父进程获取子进程信息之前,该进程处于僵尸状态。

(7)内存泄漏问题:进程一旦退出,哪怕程序中的代码本身会有内存泄漏。比如new 后没有delete,但是进程退出后,就不会有内存泄漏问题。有问题的是常驻内存的进程,比如操作系统本身,这个就需要用户手动去解决。

(8)slab技术:方便创建进程的task_struct,这些task_struct可以被复用

10、孤儿进程

父进程退出后,剩子进程了?下面是一个父进程先于子进程退出的代码,读者可以思考会发生什么

结果如下,父进程是02,子进程是03,父进程退出后,子进程的PPID变成了1 ,此时就是孤儿进程了。父母不在了,被1(孤儿院)领养。要是不被领养,等到子进程进入僵尸态的时候,没人管他,子进程信息没人回收,就会造成内存泄漏,所以必须有1系统去管理。孤儿进程就变成后台进程了,不能在终端用ctrl+c中断,只能kill

11、进程优先级

(1)PRI(默认80不变)+NI(偏置值,用户可以修改)

(2)改进程的优先级:

注意nice值,也就是在80的基础上能偏移多少,往左80-20=60,往右80+19=99

并发:只有一个CPU,只是进程切换的非常快,导致用户感觉像是多个CPU,但其实是顺序执行

12、进程切换

(1)寄存器就是CPU内部的临时空间

(2)具体

进程A切换走的时候,会把CPU内所有寄存器的内容拷贝一份(硬件上下文数据)带走,进程A回来的时候用这个数据再恢复一次寄存器中的值。

把硬件上下文数据保存到task_struct

(3)调度要做的:①切换②选择进程

(4)进程优先级其实有140个,前100是实时优先级,后40是分时优先级。前100个我们用不到,比如实时操作系统,在汽车刹车,工业生产流水线上必须用实时优先级,不能等时间片分配到才去响应。

(5)问题:既然进程的默认优先级是80,想要修改进程的优先级,为啥不直接修改80为60,而是需要Nice=-20来设置优先级为60?

  • 明确 O (1) 调度器的核心机制:active/expired 队列

       进程先都在active指向的strcut rqueue_elem中所维护的队列,当这个队列里的进程都运行完之后,会交换active和expired的指针,再去运行expired指向的strcut rqueue_elem中的进程,这样保证了局部按照FIFO的规则调度进程上CPU,因为要是有一个进程在60,它运行完后还要继续运行,把它再次挂到60上,那后续的90的进程一直得不到CPU,就会处于饥饿状态,因此需要expired。这就是O(1)调度器的核心机制。

  •   “默认优先级 80(实际 120)” 是队列分组的基准,不能直接改

        比如当前这个进程优先级是80,在cpu上运行到时间片截止,但进程还没运行完,此时若想提高该进程的优先级,一定是Nice=-20,使得这个进程从active进程expired后,在expired队列里,可以利用Nice值将进程挂在60的队列里;但要是直接修改基准值为60,那么expired里的所有进程默认都是60了。

13、环境变量

(1)存储:环境变量在bash这个进程里面存着,被bash去维护的;即环境变量在bash进程的上下文里。bash进程启动的时候会加载.bash_profile(配置文件),要是把自己的文件路径添加进去之后,下一次打开bash直接就能运行自己的命令了。

(2)两张表,bash中会有两张表,一张环境变量表,一张命令行参数表(存储用户的命令行输入的参数),但这两张表存储的都是字符串。

(3)用户登录时,就有bash进程启动,bash进程会维护这两张表。首先拿着用户命令行输入的命令去找命令行参数表去解析命令,二一个就是根据用户当前的地址去查看环境变量表中的PATH有没有用户的地址,有的话用户就可以直接执行当前的命令了。因此,指令的查找工作,是由bash自己完成的。

(4)更多环境变量

HISTSIZE=1000用户用上下键,找到历史的1000条命令

bash用环境变量了,其实就是用户用了。

(5)和环境变量相关的命令

(6)通过代码获取环境变量

#include
int main(int argc, char *argv[], char *env[]){int i = 0;for(; env[i]; i++){printf("%s\n", env[i]);}return 0;}

bash进程把环境变量传递给env[];

其实系统在执行代码的时候,main函数并不是入口,而是_start函数,它会调用main函数,下面图中的arg_count表示main函数的参数个数

        上面获取环境变量的这个代码是code.c文件,运行./code.c也就是bash的一个子进程,那么利用export添加环境变量之后,运行code.c文件,打印出来的env环境变量就会多出来自己添加的,也就是环境变量能够被子进程继承。

环境变量的全局性:就因为孙子也可以拿到环境变量

(7)通过系统调用获取或设置环境变量

#include 
int main(){printf("%s\n", getenv("PATH"));return 0;}

如果我想写一个程序,只让我自己zrx这个用户能跑,其他人都不行,那就用bash获取USER的环境变量,然后用if else语句去判断当前用户是不是zrx,是的话执行相应的代码,不是的话就不能执行,走else的这个语句。这也解释了为啥环境变量是全局的可以被子进程使用的,就是为了让子进程做自己想要做的特殊操作的。

(8)用char**environ获取环境变量,直接指向环境变量表

推荐法2

(9)本地变量 

14、程序地址空间

实际是虚拟地址空间,并不是物理的地址空间,也叫做进程地址空间

有一份全局变量,子进程对其进行++,父进程不改,子进程读出来的数据在++,父进程不变,很正常,这是进程间独立的体现,有两份全局变量,但是从父进程和子进程去打印出来的变量的地址却是一模一样的,所以说明了这个地址是虚拟地址而不是物理地址。

解释:子进程继承了父进程的虚拟地址和页表,因此同一份虚拟地址在刚开始的时候映射到的物理地址是一样的,但是子进程要修改变量的话,就会发生写时拷贝,子进程页表虚拟地址对应的物理地址会发生改变,如下图所示,变成了223344,即给子进程新开了一个物理内存空间,共子进程去修改内容。

操作系统要对进程的虚拟地址空间做管理,也就是一个结构体,里面保存了每个空间的其实地址和结束地址

虚拟地址空间是一个结构体struct mm_struct

为什么需要有虚拟地址空间?

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

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

相关文章

深圳昊客网络|外贸社媒GEO推广代运营公司/服务商:排名前十机构哪好点?

在全球贸易加速数字化的2026年,深圳这座“外贸第一城”正迎来新一轮洗牌。据深圳海关最新数据,全市外贸企业已突破15万家,但超六成中小企业仍深陷“高投入、低转化”的推广困局——独立站无人问津、谷歌关键词排名遥…

收藏必备!大模型知识蒸馏技术调研:黑盒、白盒与混合方法全解析

文章调研了大模型知识蒸馏近年工作,分为黑盒和白盒两种类型。黑盒蒸馏在工业界应用更广,白盒蒸馏在学术界研究较多。文章介绍了代表性文献,包括DeepSeek-R1、MiniPLM等黑盒方法,以及DistilQwen2.5等黑白盒结合方法,并讨…

LangChain多智能体架构全解析:5种模式实战+收藏级代码实现

本文详解LangChain多智能体系统架构,介绍Subagents、Handoffs、Skills、Router和Custom workflow五种实现模式,并通过搜索智能体案例展示两种实际应用方案。多智能体系统通过群体智能突破单智能体能力边界,适合复杂、动态、大规模任务场景&am…

热销榜单:2026年高口碑企业加密软件评测公司口碑排行榜单,数据防泄露系统机构推荐

在2026年的企业加密软件评测中,各家公司以其卓越的服务和产品质量脱颖而出,形成了较为明显的口碑差距。评测依据包括易用性、安全性及用户反馈等多个维度,整体展示了各大公司的综合实力和市场表现。例如,中安网脉(…

2026年腐殖酸钾优质厂家推荐指南适配多场景

2026年腐殖酸钾优质厂家推荐指南 一、行业背景与筛选依据 据《2025-2030年中国腐殖酸肥料行业发展白皮书》数据,国内腐殖酸肥料市场年复合增长率达8.2%,其中腐殖酸钾因兼具养分补给与土壤调控功能,市场需求占比提升…

TDengine 字符串函数 GROUP_CONCAT 用户手册 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

亚马逊、敦煌网商家突围必备!自养号测评补单提升店铺排名销量秘籍

在跨境电商领域,otto、wayfair、亚马逊、速卖通、阿里国际站、敦煌网、虾皮、lazada、美客多等平台已然成为众多卖家逐鹿的战场。在这些平台上,产品的排名与销量,就如同企业的生命线,直接决定着卖家在全球市场中的竞争力与盈利水平…

【强烈收藏】7天打造AI知识库:每天10分钟,把你的经历变成可复用的知识资产

这是一款7天知识库搭建打卡营,每天仅需10分钟,通过双线并行方式(明线学工具,暗线显化经验),帮助知识工作者从零开始建立个人知识库系统。课程无需技术基础,强调"先完成再完美"原则&am…

十大防脱生发品牌排行榜评测,秋冬脱发严重,防脱育发液哪个牌子效果最好?

导语:脱发诱因包括营养失衡、精神压力或不当护发等。通过简单自测和日常调整,我们可逆转早期脱发,重拾自信风采。 观察每日掉发量‌:用宽齿梳梳头,收集掉落头发统计。正常每天脱落‌50-100根‌属生理范围。如果连…

【必看收藏】2023年RAG最新突破!12种前沿架构深度解析,让大模型不再胡说八道

文章介绍了12种最新的RAG高级架构与方法,包括Mindscape-Aware RAG、基于超图记忆的多步RAG、基于共现统计的动态RAG等。这些方法针对长文档处理、减少幻觉、多模态知识构建、安全防御等方面进行创新,每项研究均提供论文链接和部分代码链接,展…

深圳昊客网络|社媒外贸GEO外贸推广代运营公司/服务商:排名前十机构哪好点?

2026 年外贸出海竞争白热化,海外社媒 GEO 推广成为企业破局的关键。在深圳众多代运营机构中,排名前十的服务商各有特色,但真正能实现 “精准引流 + 高效转化” 的,往往离不开硬核技术支撑。其中,深圳昊客网络凭借…

止痒防脱洗发水怎么选?2026实测最有效榜单,国货黑马逆袭出圈

面对货架上琳琅满目的止痒防脱洗发水,不少人陷入选择困境:标注“强效止痒”的产品可能刺激头皮,主打“温和固发”的又见效缓慢;看似成分相似的单品,实际使用效果却天差地别。更令人困扰的是,多数人盲目跟风购买网…

2026年全网热议的活动搭建品牌推荐,帮你提升活动效果

在选择活动搭建服务时,了解几个知名公司的优势十分重要。一方面,青岛音象恒文化传媒有限公司以其杰出的舞美工程策划闻名于业内,提供高水准的设备和专业服务。另一方面,华彩则凭借其创新的设计和优质服务,在客户中…

c4d.python克隆体缓存操作 割草代码--支持事件回滚

import c4d from c4d import utilsdef GetClonerCache(cloner_obj, doc):# 强制更新文档缓存(确保克隆体已计算)doc.ExecutePasses(None, True, True, True, c4d.BUILDFLAGS_NONE)# 获取克隆对象的缓存根节点cache_root cloner_obj.GetCache()if cache_…

东瀛匠心・数智绿筑 2026:日本展台设计搭建的精密范本

开篇:日本展台搭建的匠心基因与合规使命 2026 年的日本会展业,正由两大核心事件重塑行业规则:9 月爱知・名古屋亚运会配套展会首次采用 “赛事 + 产业” 双展模式,带来 “轻量化搭建 + 文化展示” 的精准需求;1 月…

Arthas使用 - 倾听

1. Arthas 介绍 Arthas 是阿里巴巴开源的 Java 诊断工具,用于:实时监控线上应用(无需重启) 快速定位 CPU、内存、线程问题 分析方法执行耗时、参数、返回值 支持 JDK 6+(包括 JDK 21)✅ 核心优势:通过 JVM Atta…

2026年苏州昆山AI推广/geo优化公司/服务商哪家好?TOP5哪家好?看实战合规与本土适配

据苏州AI产业研究院2025年度《苏州GEO服务行业发展白皮书》显示,苏州TOB制造业及本地生活服务领域GEO服务渗透率达72.3%,其中合规性与本土产业适配能力成为企业选型首要考量,占比分别达81.2%、76.5%。伴随苏州装备制…

阿里上新 AI 平台「呜哩」,生图生视频免费开放!

今天发现一个新 AI 生图、生视频平台,阿里做的「呜哩 AI」。不多说,重点就是:现在用不要钱。免费用!免费用!免费用!01.呜哩一下,让对话长出新世界呜哩(Wuli) 是阿里巴巴推…

大模型基础概念解析——优化

前言 大模型(LLM)正面临类似的挑战。一个拥有数百甚至数千亿参数的模型,其“原生态”存在几个核心痛点: 巨大的计算和内存开销:训练需要成千上万的GPU数月时间,推理(使用)时也需要昂…

Shiro反序列化漏洞一站式综合利用工具

工具介绍 ShiroExploit,是一款Shiro反序列化漏洞一站式综合利用工具。 工具功能 1、区分ShiroAttack2,采用分块传输内存马,每块大小不超过4000。 2、可打JDK高版本的shiro,确保有key、有gadget就能rce。 3、依托JavaChains动态…