进程

进程即为一个执行中的程序的实例,系统中的每个程序都是运行在某个进程的上下文(context)中,上下文是由程序正确运行所需的状态组成,这个状态包括存放在存储器中的程序代码和数据,它的栈、通用目的寄存器、程序计数器、环境变量以及打开文件描述符的集合。

每次用户运行一个程序,系统就会创建一个新的进程,在这个新进程的上下文中运行这个可以执行目标文件。应用程序也可以创建新进程,而且在新进程的上下文中运行它们自己的代码或其他程序。

进程提供给程序的抽象

  1. 进程使得每一个程序都好像在独立的使用处理器,提供了独立的逻辑控制流
  2. 进程使得每一个程序都好像在独立的使用存储系统,提供了私有的地址空间

1.逻辑控制流

考虑ABC三个进程,三个逻辑流的执行时交错的,每个进程轮流的使用处理器,但每个进程都好像独立地使用处理器,每次切换后继续执行时,并不改变程序的存储位置或寄存器的内容。

=====A=========B=============C======== |
     |                                 |
     |                                 |
     |                                 |
=====v================================ |
               |                       |
               |                       |
               |                       |
               |                       |
===============v====================== | time
                             |         |
                             |         |
=============================v======== |
     |                                 |
=====v================================ |
                             |         |
                             |         |
                             |         |
=============================v======== v

2.私有地址空间

进程为每个程序提供它自己的私有地址空间,一般而言,和这个空间的某个地址相关联的那个存储器字节是不能被其他程序读或写的。尽管和每个私有地址空间相关联的存储器的内容一般是不同的,但是每个这样的空间都有相同的通用结构。

                    _________________________
                    |                       |
                    |    内核虚拟存储器     |
                    | (代码、数据、堆、栈)  | ^
                    |                       | | 用户代码不可见
                    |_______________________| | 的存储器
                    |       用户栈          |
                    |     (运行时创建)      |
                    |_______________________| <-- %esp
                    |          |            |
                    |          v            |
                    |                       |
                    |          ^            |
                    |__________|____________|
                    |                       |
                    |  共享库的存储器映射区 |
                    |_______________________|
                    |                       |
                    |          ^            |
                    |__________|____________| <-- brk
                    |       运行时堆        |
                    |    (由malloc创建的)   |
                    |_______________________|
                    |       读/写段         |\
                    |    (.date、.bss)      | |
                    |_______________________| | 从可执行文件
                    |       只读段          | | 加载的
0x08048000 (32)     |(.init、.text、.rodata)| |
0x00400000 (64) --->|_______________________|/
                    |                       |
                  0 |_______________________|