进程是指在系统中正在运行的一个应用程序线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元。对于操作系统而言,其调度单元是线程。一个进程至少包括一个线程,通常将该线程称为主线程。一个进程从主线程的执行开始进而创建一个或多个附加线程,就是所谓基于多线程的多任务。

在一个多道程序设计系统中,CPU在各进程之间切换。

较典型的进程定义有:

(1)进程是程序的一次执行。

(2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动。

(3)进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。可以把传统OS中的进程定义为:“进程是程序的运行过程,是系统进行资源分配和调度的一个独立单位”。

程序的顺序执行

程序的顺序执行:在任何时刻,机器只执行一个操作,只有在前一个操作执行完后,才能执行后继操作。它具有以下特别:资源独占性,封闭性。即程序在运行时独占全机资源。因此,这些资源的状态只能由这个运行的程序决定和改变。由于顺序程序的封闭性和可再现性,为程序员调试程序带来了很大方便。但由于资源的独占性,使得系统资源利用率非常低。

多道程序设计

多道程序设计:同一时刻内存中存放了多个作业,处理器交替运行不同的作业。提高了系统的效率,尤其是资源利用率。使得程序可以并发执行,即计算机同时运行几个程序, CPU要不断地在几个程序之间切换。在并发执行时,多个程序共享系统中的各种资源,因而这些资源的状态将由多个程序来改变,致使程序的运行失去了封闭性。程序的并发执行使得程序的执行情况不可预见,其结果不再唯一,成为一个动态的过程。而程序是一个静态的概念,不再能切实反映程序执行的各种特征(独立性、并发性、动态性)。

与线程的区别

那进程与线程的区别到底是什么?进程是执行程序的实例。例如,当你运行记事本程序(Notepad)时,你就创建了一个用来容纳组成Notepad.exe的代码及其所需调用动态链接库的进程。每个进程均运行在其专用且受保护的地址空间内。因此,如果你同时运行记事本的两个拷贝,该程序正在使用的数据在各自实例中是彼此独立的。在记事本的一个拷贝中将无法看到该程序的第二个实例打开的数据。

沙箱为例进行阐述。一个进程就好比一个沙箱线程就如同沙箱中的孩子们。孩子们在沙箱子中跑来跑去,并且可能将沙子攘到别的孩子眼中,他们会互相踢打或撕咬。但是,这些沙箱略有不同之处就在于每个沙箱完全由墙壁和顶棚封闭起来,无论箱中的孩子如何狠命地攘沙,他们也不会影响到其它沙箱中的其他孩子。因此,每个进程就像一个被保护起来的沙箱。未经许可,无人可以进出。

在Windows下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。

与程序的区别

进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;用户进程就是所有由你启动的进程。进程是操作系统进行资源分配的单位

动态性

进程是程序的一次执行过程,是临时的,有生命期的。

独立性

进程是系统进行资源分配和调度的一个独立单位。

并发性

多个进程可在处理机上交替执行。

结构性

系统为每个进程建立一个进程控制块。

实际上线程运行而进程不运行。两个进程彼此获得专用数据或内存的唯一途径就是通过协议来共享内存块。这是一种协作策略。下面让我们分析一下任务管理器里的进程选项卡。

这里的进程是指一系列进程,这些进程是由它们所运行的可执行程序实例来识别的,这就是进程选项卡中的第一列给出了映射名称的原因。请注意,这里并没有进程名称列。进程并不拥有独立于其所归属实例的映射名称。换言之,如果你运行5个记事本拷贝,你将会看到5个称为Notepad.exe的进程。它们是如何彼此区别的呢?其中一种方式是通过它们的进程ID,因为每个进程都拥有其独一无二的编码。该进程ID由Windows NT或Windows 2000生成,并可以循环使用。因此,进程ID将不会越编越大,它们能够得到循环利用。 第三列是被进程中的线程所占用的CPU时间百分比。它不是CPU的编号,而是被进程占用的CPU时间百分比。此时我的系统基本上是空闲的。尽管系统看上去每一秒左右都只使用一小部分CPU时间,但该系统空闲进程仍旧耗用了大约99%的CPU时间。

第四列,CPU时间,是CPU被进程中的线程累计占用的小时、分钟及秒数。请注意,我对进程中的线程使用占用一词。这并不一定意味着那就是进程已耗用的CPU时间总和,因为,如我们一会儿将看到的,NT计时的方式是,当特定的时钟间隔激发时,无论谁恰巧处于当前的线程中,它都将计算到CPU周期之内。通常情况下,在大多数NT系统中,时钟以10毫秒的间隔运行。每10毫秒NT的心脏就跳动一下。一些驱动程序代码片段运行并显示谁是当前的线程。让我们将CPU时间的最后10毫秒记在它的帐上。因此,如果一个线程开始运行,并在持续运行8毫秒后完成,接着,第二个线程开始运行并持续了2毫秒,这时,时钟激发,请猜一猜这整整10毫秒的时钟周期到底记在了哪个线程的帐上?答案是第二个线程。因此,NT中存在一些固有的不准确性,而NT恰是以这种方式进行计时,实际情况也如是,大多数32位操作系统中都存在一个基于间隔的计时机制。请记住这一点,因为,有时当你观察线程所耗用的CPU总和时,会出现尽管该线程或许看上去已运行过数十万次,但其CPU时间占用量却可能是零或非常短暂的现象,那么,上述解释便是原因所在。上述也就是我们在任务管理器的进程选项卡中所能看到的基本信息列。