前言
操作系统浩如烟海,而进程是OS中相当重要的一个概念,在阅读了lqm老师的进程控制的pdf之后,我打算进行一些自我总结与提炼,若有笔误,恳请指正。
进程的基本概念
进程的属性
一个进程含有多个属性,进程在linux系统中有一个结构体的定义,而这个结构体里包含了很多属性,主要有:
- 进程控制块
PCB
(task_tsruct )( 在内核空间中 )(线程也有PCB!) - 内存描述符
mm_struct
(包含内存布局和相应的页表信息) - 用户台堆栈
vm_area_struct
- 函数调用栈
内存模型的中的进程映像
操作系统把磁盘上可执行文件加载到内存运行之前, 需要做很多工作, 其中很重要的一件事就是把可执行文件中的代码, 数据存放到内存 中合适的位置, 并分配和初始化程序运行过程中必须的堆栈, 所有准备工作完成之后操作系统才会调度程序起来运行
每个进程都有自己独立的地址空间(虚拟内存)
下图为内存模型中一个进程的映像,左边为低地址,主要为可执行文件的数据部分,用户进程高端位置建立了一个用户态的堆栈(stack),右边为高地址,主要为一些管理的数据结构
线程的基本概念
- 进程控制块
PCB
(task_struct) - 线程堆栈
进程间的组织关系
终端:就是terminal,就是一个计算机输入输出的设备,可以理解为你远程登录所弹出来的那个黑框框,而会话就是终端当前的状态,一个终端只能有一个会话(session)!
会话:不同用户或者同一用户的多次登录,为一个会话
在linux系统中,一个会话包含多个进程组,而一个进程组包含多个线程组
进程与线程
自从引入了进程这个概念之后,进程的任务就给分割了
- 进程 : 资源分配的基本单位
- 线程 : 处理机调度的基本单位
一个进程中可以包含多个线程,这些线程之间共享相同的进程资源
每个线程各自保留少量的资源,这些资源可以用于区分不同的线程(执行流)
- 程序指针 IP
- 函数调用栈
- 进程控制块 PCB
下面是一个多进程、多线程并发的地址空间示意图
假设我们有一块物理内存,和两个可执行程序ELF-file-x.exe 和 ELF-file-y.exe
我们知道,每个进程都有自己独立的地址空间,也就是自己的虚拟内存,而虚拟内存是通过一个多级页表与物理内存建立映射关系的
虚
拟
内
存
(
用
户
空
间
+
内
核
空
间
)
→
物
理
内
存
虚拟内存 (用户空间 + 内核空间) → 物理内存
虚拟内存(用户空间+内核空间)→物理内存
对于程序ELF-file-y,其有两个进程 P1 和 P2,其中P2进程包含两个线程P2-0和P2-1
对于程序ELF-file-x,其有一个进程 P0
对于每个进程,它们的内核空间是相同的(只不过画了很多个),每个进程或线程在内核空间中都会有自己的进程控制块task_struct
,但是只有进程才会有内存描述符mm_struct
描述的进程内存布局和相应的页表(这是因为进程有自己独立的内存空间)
任何一个进程进入它的内核空间,都可以访问到其他进程的进程控制块task_struct 和 内存描述符 mm_struct