进程和程序(Process and Program)

原出处:http://oss.org.cn/kernel-book/ch04/4.1.htm

----------------------------------个人理解分割线-----------------------------------

程序:存放在硬盘中的文件,指令集+数据。被组织成:正文段(指令集) + 用户数据段(数据)

进程:程序加载到内存中,分配内存空间,存放正文段(指令集) + 用户数据段(栈 + 堆) + 系统数据段(PCB等系统用到的数据结构)

 

---------------------------------我是copy分割线-----------------------------------

首先我们对进程作一明确定义:所谓进程是由正文段(text)、用户数据段(user segment)以及系统数据段(system segment)共同组成的一个执行环境


      图4.1 程序及进程的组成

 程序只是一个普通文件,是一个机器代码指令和数据的集合,这些指令和数据存储在磁盘上的一个可执行映象(Executable Image)中,所以,程序是一个静态的实体。这里,对可执行映象做进一步解释,可执行映象就是一个可执行文件的内容,例如,你编写了一个C源程序,最终这个源程序要经过编译、连接成为一个可执行文件后才能运行。源程序中你要定义许多变量,在可执行文件中,这些变量就组成了数据段的一部分;源程序中的许多语句,例如“ i++; for(i=0; i<10; i++);”等,在可执行文件中,它们对应着许多不同的机器代码指令,这些机器代码指令经CPU执行,就完成了你所期望的工作。可以这么说:程序代表你期望完成某工作的计划和步骤,它还浮在纸面上,等待具体实现。而具体的实现过程就是由进程来完成的,进程可以认为是运行中的程序,它除了包含程序中的所有内容外,还包含一些额外的数据。程序和进程的组成如图4.1所示。

程序装入内存后就可以运行了:在指令指针寄存器的控制下,不断的将指令取至CPU运行。这些指令控制的对象不外乎各种存储器(内存、外存和各种CPU寄存器等),这些存储器中保存有待运行的指令和待处理的数据,当然,指令只有得到CPU才能发挥其作用。可见,在计算机内部,程序的执行过程实际上就是一个执行环境的总和,这个执行环境包括程序中各种指令和数据,还有一些额外数据,比如说寄存器的值、用来保存临时数据(例如传递给某个函数的参数、函数的返回地址、保存变量等)的堆栈(包括程序堆栈和系统堆栈)、被打开文件的数量及输入输出设备的状态等等。这个执行环境的动态变化表征程序的运行。我们就把这个环境称作“进程”,它代表程序的执行过程,是一个动态的实体,它随着程序中指令的执行而不断地变化。在某个特定时刻的进程的内容被称为进程映象(process image)

Linux是一个多任务操作系统,也就是说,可以有多个程序同时装入内存并运行,操作系统为每个程序建立一个运行环境即创建进程,每个进程拥有自己的虚拟地址空间,它们之间互不干扰,即使要相互作用(例如多个进程合作完成某个工作),也要通过内核提供的进程间通信机制(IPC)。Linux内核支持多个进程虚拟地并发执行,这是通过不断地保存和切换程序的运行环境而实现的,选择哪个进程运行是由调度程序决定的。注意,在一些UNIX书籍中,又把“进程切换”(Process Switching)称为“环境切换”或“上下文切换”(Context Switching),这些术语表达的意思是相同的。

进程运行过程中,还需要其他的一些系统资源,例如,要用CPU来运行它的指令、要用系统的物理内存来容纳进程本身和它的有关数据、要在文件系统中打开和使用文件、并且可能直接或间接的使用系统的物理设备,例如打印机、扫描仪等。由于这些系统资源是由所有进程共享的,所以Linux必须监视进程和它所拥有的系统资源,使它们们可以公平地拥有系统资源以得到运行。

系统中最宝贵的资源是CPU,通常来说,系统中只有一个CPU,当然也可以有多个CPU(Linux支持SMP___对称多处理机)。Linux作为多任务操作系统,其目的就是让CPU上一直都有进程在运行,以最大限度地利用这一宝贵资源。通常情况下,进程数目是多于CPU数目的,这样其他进程必须等待CPU这一资源。操作系统通过调度程序来选择下一个最应该运行的进程,并使用一系列的调度策略来确保公平和高效。

进程是一个动态实体,如图4.1所示,进程实体由三个独立的部分组成:

(1)正文段(text):存放被执行的机器指令。这个段是只读的(所以,在这里不能写自己能修改的代码),它允许系统中正在运行的两个或多个进程之间能够共享这一代码。例如,有几个用户都在使用文本编辑器,在内存中仅需要该程序指令的一个副本,他们全都共享这一副本。

(2)用户数据段(user segment):存放进程在执行时直接进行操作的所有数据,包括进程使用的全部变量在内。显然,这里包含的信息可以被改变。虽然进程之间可以共享正文段,但是每个进程需要有它自己的专用用户数据段。例如同时编辑文本的用户,虽然运行着同样的程序__编辑器,但是每个用户都有不同的数据:正在编辑的文本。

(3)系统数据段(system segment):该段有效地存放程序运行的环境。事实上,这正是程序和进程的区别所在。如前所述,程序是由一组指令和数据组成的静态事物,它们是进程最初使用的正文段和用户数据段。作为动态事物,进程是正文段、用户数据段和系统数据段的信息的交叉综合体,其中系统数据段是进程实体最重要的一部分,之所以说它有效地存放程序运行的环境,是因为这一部分存放有进程的控制信息。系统中有许多进程,操作系统要管理它们、调度它们运行,就是通过这些控制信息。Linux为每个进程建立了task_struct数据结构来容纳这些控制信息。

总之,进程是一个程序完整的执行环境。该环境是由正文段、用户数据段、系统数据段的信息交织在一起组成的。

 

posted on 2015-09-11 10:33  luckygxf  阅读(5339)  评论(0编辑  收藏  举报

导航