原出处:http://oss.org.cn/kernel-book/ch04/4.1.htm数据结构
----------------------------------我的理解分割线-----------------------------------并发
程序:存放在硬盘中的文件,指令集+数据。被组织成:正文段(指令集) + 用户数据段(数据)编辑器
进程:程序加载到内存中,分配内存空间,存放正文段(指令集) + 用户数据段(栈 + 堆) + 系统数据段(PCB等系统用到的数据结构)函数
---------------------------------我是copy分割线-----------------------------------spa
首先咱们对进程做一明肯定义:所谓进程是由正文段(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)。htm
Linux是一个多任务操做系统,也就是说,能够有多个程序同时装入内存并运行,操做系统为每一个程序创建一个运行环境即建立进程,每一个进程拥有本身的虚拟地址空间,它们之间互不干扰,即便要相互做用(例如多个进程合做完成某个工做),也要经过内核提供的进程间通讯机制(IPC)。Linux内核支持多个进程虚拟地并发执行,这是经过不断地保存和切换程序的运行环境而实现的,选择哪一个进程运行是由调度程序决定的。注意,在一些UNIX书籍中,又把“进程切换”(Process Switching)称为“环境切换”或“上下文切换”(Context Switching),这些术语表达的意思是相同的。对象
进程运行过程当中,还须要其余的一些系统资源,例如,要用CPU来运行它的指令、要用系统的物理内存来容纳进程自己和它的有关数据、要在文件系统中打开和使用文件、而且可能直接或间接的使用系统的物理设备,例如打印机、扫描仪等。因为这些系统资源是由全部进程共享的,因此Linux必须监视进程和它所拥有的系统资源,使它们们能够公平地拥有系统资源以获得运行。blog
系统中最宝贵的资源是CPU,一般来讲,系统中只有一个CPU,固然也能够有多个CPU(Linux支持SMP___对称多处理机)。Linux做为多任务操做系统,其目的就是让CPU上一直都有进程在运行,以最大限度地利用这一宝贵资源。一般状况下,进程数目是多于CPU数目的,这样其余进程必须等待CPU这一资源。操做系统经过调度程序来选择下一个最应该运行的进程,并使用一系列的调度策略来确保公平和高效。
进程是一个动态实体,如图4.1所示,进程实体由三个独立的部分组成:
(1)正文段(text):存放被执行的机器指令。这个段是只读的(因此,在这里不能写本身能修改的代码),它容许系统中正在运行的两个或多个进程之间可以共享这一代码。例如,有几个用户都在使用文本编辑器,在内存中仅须要该程序指令的一个副本,他们全都共享这一副本。
(2)用户数据段(user segment):存放进程在执行时直接进行操做的全部数据,包括进程使用的所有变量在内。显然,这里包含的信息能够被改变。虽然进程之间能够共享正文段,可是每一个进程须要有它本身的专用用户数据段。例如同时编辑文本的用户,虽然运行着一样的程序__编辑器,可是每一个用户都有不一样的数据:正在编辑的文本。
(3)系统数据段(system segment):该段有效地存放程序运行的环境。事实上,这正是程序和进程的区别所在。如前所述,程序是由一组指令和数据组成的静态事物,它们是进程最初使用的正文段和用户数据段。做为动态事物,进程是正文段、用户数据段和系统数据段的信息的交叉综合体,其中系统数据段是进程实体最重要的一部分,之因此说它有效地存放程序运行的环境,是由于这一部分存放有进程的控制信息。系统中有许多进程,操做系统要管理它们、调度它们运行,就是经过这些控制信息。Linux为每一个进程创建了task_struct数据结构来容纳这些控制信息。
总之,进程是一个程序完整的执行环境。该环境是由正文段、用户数据段、系统数据段的信息交织在一块儿组成的。