程序进程多任务线程
1.程序
程序(program)是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。
2.进程
进程(process)是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。进程是操作系统资源分配和处理器调度的基本单位,拥有独立的代码、内部数据和运行状态。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单地说,一个进程就是一个运行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源,如CPU时间、内存空间、文件、输入输出设备的使用权等。换句话说,当程序在运行时,将会被操作系统载入内存中(占有内存空间),并且启动它的工作(运行的时候,就是占有CPU时间),然后就变成了所谓的“进程”。如每一个正在Windows操作系统上运行的程序,都可以视为一个进程。
每个进程之间是独立的,除非利用某些通信管道来进行通信,或是通过操作系统产生交互作用,否则基本上各进程不知道(不需要,也不应该知道)彼此的存在。这就像是在 Windows 系统中,运行了记事本程序后,又运行画图程序,系统中就会出现两个进程。如果需要,可以通过Windows所提供的剪贴板功能在它们之间传递数据,但除此之外,一起运行它们和先后运行它们是没有什么差别的。
3.多任务
多任务(multitask)是指在一个系统中可以同时运行多个进程,即有多个独立运行的任
务,每一个任务对应一个进程。每个进程都有一段专用的内存区域,即使是多次启动同一段程序产生不同的进程也是如此。所谓同时运行的进程,其实是指由操作系统将系统资源分配给各个进程,每个进程在CPU上交替运行。每个进程占有不同的内存空间,内存消耗很大,这使系统在不同的程序之间切换时开销很大,进程之间的通信速度很慢。
4.线程
对于完全不相关的程序而言,在同时执行时,彼此的进程也不会做数据交换工作,而可以完全独立地运行。但是对于同一程序所产生的多个进程,通常是因为程序设计者希望能加快整体工作的效率,运用多个进程协同工作。但在进程的概念中,进程是操作系统资源分配和处理器调度的基本单位,每一个进程的内部数据和状态都是完全独立的,所以即使它们是同一个程序所产生,也必须重复许多的数据复制工作,而且在交换彼此数据时,也要再使用一些进程间的通信机制。为了减少不必要的系统负担,引入了线程(thread)的概念,将资源分配和处理器调度的基本单位分离。进程只是资源分配的单位,我程是处理器调度的基本单位。一个进程包含一个以上线程,一个进程中的线程只能使用该进程的资源和环境。
所谓的线程,其实与程进相似,也是一个执行中的程序,但线程是一个比进程更小的执行单位。对每个线程来说,它都有自身的产生、运行和消亡的过程,所以,线程也是一个动态的概念。一个进程在其执行过程中可以产生多个线程,形成多条执行路径。但是与进程不同的是,线程不能独立存在,必须存在于进程中。由于同类的多个线程是共享同一块内存空间和一组系统资源,因此系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为负担轻的进程(light-weight process)。由于同一进程的各个线程之间可以共享相同的内存空间,并利用这些共享内存来完成数据交换、实时通信及必要的同步工作,因此各线程之间的通信速度很快,线程之间进行切换所占用的系统资源也较少。
同一个进程中的不同线程,各有各的“程序代码执行位置”,但却分享进程中的各项资源,如程序区段、数据区段,已打开的文件等。所以,线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会互相影响。从另一角度说,进程属于操作系统的范畴,主要是在同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内同时执行一个以上的程序段。
为了进一步说明线程的概念,现举一个生活中的例子来加以说明。煮晚餐的整个过程可以看成是一个进程,在煮晚餐的时候,先从冰箱拿出菜来,之后便开始洗菜、切菜……一步一步地完成之后,便开始一道一道地烧菜,完毕之后再开始煮汤。整个过程以顺序的方式来完成晚餐,而整个过程就是一个进程。然而仔细想想这种一步一步地以顺序的方式完成所要做的工作,就会觉得这样做的效率太低了。因为等汤煮好之后,之前所烧的菜不是都凉了吗?所以说按顺序来完成工作的话,效率相当低。如果能在一定的时间内同时进行好几个工作,那么效率就会大幅提高,这就是多线程的概念,它利用“时间分享”(time sharing)的概念来进行工作。也就是说,可以一边洗菜、切菜,一边烧菜或煮汤。在同一时间段内同时进行好几项工作,这就是多线程的概念。
综上可知,所谓多线程就是同时执行一个以上的线程,一个线程的执行不必等待另一个线程执行完后才执行,所有线程都可以发生在同一时刻。但操作系统并没有将多个线程看作多个独立的应用去实现线程的调度和管理以及资源分配。
注意:多任务与多线程是两个不同的概念,多任务是针对操作系统而言的,表示操作系统可以同时运行多个应用程序,而多线程是指一个进程而言的,表示在一个进程内部可以同时执行多个线程。