泛谈Linux操作系统中有描述操作系统的相关概念,对进程的理解有帮助。
本片博客会粘贴部分代码,想要了解更多代码信息,可访问小编的GitHub关于本篇的代码
进程概念
- 课本概念:程序的一个执行实例,正在执行的程序等
- 内核观点:担当分配系统资源(CPU时间,内存)的实体
- 一个具有以下特征的活动单元:一组指令序列的执行,一个当前状态和相关的系统资源的集合。
站在操作系统的角度看进程是PCB(进程控制块:每一个进程的描述都是一个结构体)
进程控制块PCB
Linux下的PCB有它专有的名字task_struct, task_struct内容包括
- 标示符: 描述本进程的唯一标示符,用来区别其他进程。、
- 进程状态:运行状态(R)、可中断睡眠状态(S)、不可中断死亡状态(D)、停止状态(T)、僵尸状态(Z)
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程在自己的时间片用完后,会把进程当前状态存储在PCB中,以供下次再次被CPU处理。单核CPU任何时刻都只有一个进程在被处理,进程在Run状态表明当前进程可被CPU调度。
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
虚拟地址空间
物理寻址和虚拟寻址
一个系统的进程共享内存和CPU资源,为了更加有效地管理内存并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟内存。
虚拟内存为每一个进程提供了一个一致的地址空间,从而简化了内存管理,它保护了每个进程的地址空间不被其它进程破坏。
物理地址:计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每一个字节都对应唯一的物理地址。
物理寻址:CPU访问内存的最自然的的方式就是使用物理地址,这种方式被称为物理寻址,早期的PC使用物理寻址。
Linux下虚拟内存地址空间如图所示
页表:虚拟地址空间实际是一个结构体struct_mm
记录虚拟地址与物理地址之间的映射关系
内存的访问控制
通常情况下父子进程代码共享,数据也共享,当有一方写操作时,便以写时拷贝的方式各自备有了数据段。