【Linux】进程概念篇
程序运行起来的实例操作系统通过PCB(进程控制块)管理进程linux的PCB就是task_struct虚拟地址空间是一个mm_struct结构体,是操作系统向进程描述一个完整的、连续的线性地址空间。进程看到的地址都是“假内存”,而真实的地址由内存管理,给进程营造一种假象,认为自己独占了整块连续的内存。
【Linux】进程概念篇
一.操作系统&五大硬件单元
1.冯诺依曼结构(基础认知)
- 五大部件:
输入设备、输出设备、存储器、运算器、控制器(后两者组成CPU) - 核心特点:
指令和数据同一存储
按顺序执行 - 本质:
所有软件最终都是在内存中运行的(CPU不直接和硬盘、键盘打交道,所有数据必须先加载到内存。)
2.操作系统目的
- 操作系统本质是一个“管理软件”,核心目标:
管理硬件资源:
CPU(调度)
内存(分配)
磁盘(文件系统)
为用户提供接口:
系统调用(System Call)
shell命令
总结:OS=管理资源+提供接口 - 管理的本质:“先描述,再组织”
描述:用C语言的结构体(如struct)把资源(如进程)的属性记下来
组织:用链表、红黑树等数据结构把这些结构体串起来,方便管理和查找
3.库函数vs系统调用


二.进程概念
1.什么是进程
- 程序运行起来的实例
- 操作系统通过PCB(进程控制块)管理进程
- linux的PCB就是task_struct
2.PCB包含什么(描述信息)
- 进程ID(PID)
- 程序计数器(PC)
- 寄存器信息
- 内存信息
- 文件描述符
- 状态(运行/阻塞等)
PCB=进程的“身份证+全部信息“
三.进程控制
1.进程创建
- fork()函数:
功能:创建一个子进程
特点:
① 调用一次,返回两次
父进程中返回子进程的PID(>0)
子进程中返回0
如果子进程创建失败,父进程返回-1
② 写时拷贝:虽然子进程看似复制了父进程的数据,但最初它们共享物理内存。只有当某一方试图修改数据时,系统才会真正分配新内存进行拷贝,这是一种优化技术。 - vfork()函数:
子进程和父进程共享地址空间
子进程先执行,直到子进程调用exec或exit退出时,父进程才运行
风险:容易破坏父进程 - 创建流程:
· 分配PCB
· 分配资源
· 初始化上下文
· 加入调度队列
2.进程终止
- 正常退出:
① exit():一个库函数,会执行一些清理工作(如刷新缓冲区),然后调用系统调用退出。
② _exit():一个系统调用,直接清理进程,不刷新缓冲区。 - 异常退出:如段错误、指令错误等,通常由信号导致。
- return:在main函数中,return相当于调用exit。
3.进程等待
- 干什么:父进程等待子进程结束,并回收其资源(主要是PCB)
- 如何等待:
wait:阻塞等待任意一个子进程结束
waitpid:可以指定等待某个子进程,也可以非阻塞等待
四.进程状态
Linux内核中,进程的状态定义在task_struct的state字段中。
1.Linux的七种进程状态
- R(Running):进程正在运行或在就绪队列中等待
- S(Sleeping):可中断睡眠(最常见)
- D(Disk Sleep):不可中断睡眠(通常在等IO)
- T(Stopped):被信号暂停(如Ctrl+Z)
- t(Tracing stop):被调试器暂停
- Z(Zombie):僵尸进程
- X(Dead):已死亡(基本看不到)
2.状态转换

3.僵尸进程
- 定义:子进程退出了,但父进程没有调用wait()或waitpid()来获取它的退出状态而变成的一种进程。
- 危害:进程的资源(如内存、文件描述符等)已经释放,但task_struct还存在,占用内核资源,如果产生大量僵尸进程,会导致系统无法创建新进程。
- 解决方法:父进程调用wait()或waitpid(),或捕捉信号 SIGCHLD。
4.孤儿进程
- 定义:父进程先退出,子进程还在运行。
- 处理:孤儿进程会被1号进程(init或systemd)“收养”,由1号进程负责回收它的资源。
5.守护进程
- 定义:长期在后台运行,脱离终端控制,默默提供某种服务的进程。
- 例子:守护进程名称通常以d结尾,例如sshd(负责ssh连接)、httpd(负责Web服务)
五.环境变量
1.概念
用于存储系统或用户配置信息的变量,以键值对形式存在,通常具有全局属性(如PATH、HOME)。
2.相关命令
Bash:
env:查看当前环境变量,或为单次命令临时设置环境
export:将变量“导出”,使其能被后续的子进程继承
3.函数接口
C:
getenv():获取环境变量的值;
setenv():设置环境变量;
unsetenv():删除环境变量;
4.特性
子进程继承父进程的环境变量,本质在用户空间。
六.虚拟地址空间
1.什么是虚拟地址空间
虚拟地址空间是一个mm_struct结构体,是操作系统向进程描述一个完整的、连续的线性地址空间。
进程看到的地址都是“假内存”,而真实的地址由内存管理,给进程营造一种假象,认为自己独占了整块连续的内存。
2.为什么要使用虚拟地址空间
-
提高内存利用率
通过分页机制,将不连续的物理内存碎片拼凑起来给进程使用,让进程感觉内存是连续的。
程序没运行到的代码不需要加载到内存,节省空间。 -
增加访问控制
操作系统可以在页表或段表中设置权限位。例如将代码段设为“只读/可执行”。
如果程序试图写入代码段(比如病毒注入),CPU会直接拦截并报错(段错误),保护系统安全。 -
实现进程隔离
每个进程都有自己独立的虚拟地址空间,互不干扰。
进程A崩溃不会导致进程B也崩溃,也不会破坏OS内核的数据。
3.如何通过虚拟地址找到物理内存
- 分段式内存管理
原理:将内存划分为不同的逻辑段,如代码段、数据段、堆栈段。每个段有基地址和界限。
寻址:逻辑地址 = 段基址 + 偏移量。
缺点:容易产生外部碎片(内存空隙太多,无法利用)。 - 分页式内存管理
原理:将虚拟内存和物理内存都切割成固定大小的块(通常为4KB),虚拟的叫“页”,物理的叫“页帧”。
寻址:通过页表来建立虚拟页号和物理页帧号的映射关系。
优点:解决了外部碎片问题,内存利用率高。 - 段页式内存管理
原理:结合上述两者。先分段(逻辑划分),段内再分页(物理管理)。
流程:逻辑地址 -> 段表 -> 页表 -> 物理地址。
七.程序替换
1.含义
- 概念:用一个新的程序替换进程正在运行的程序。
- 关键点:进程ID不变,原程序数据清空,替换为新程序数据。
2.如何替换
在Linux/Unix系统中,程序替换是通过exec系列函数实现的。
- 常见函数
C:
execl
execlp
execle
execv
l:参数以列表形式传递。
v:参数以指针数组形式传递。
p:可以使用环境变量PATH来查找可执行文件。
e:可以传递新的环境变量。
- 特点:
不创建新进程
替换当前进程代码和数据
PID不变
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)