程序
——计算机指令的集合,它以文件形式存储在磁盘上。
进程
——通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动。
组成部分:
- 操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程统计信息的地方
- 地址空间。它包含所有可执行模块或dll模块的代码数据。它还包含动态内存分配的空间,如线程堆栈和堆分配空间。
特点:
进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程地址空间中的代码。
系统赋予每个进程独立的虚拟地址空间(由磁盘空间转换而成),对于32位进程来说,这个地址空间是4GB。每个进程有它自己的私有空间。进程A可能有一个存放在它的地址空间中的数据结构,地址是0x1234567,而进程B则有一个完全不同的数据结构存放在B的地址空间也为0x1234567中。当进程A中运行的线程访问地址为0x1234567中的内存时,这些线程访问的是进程A的数据结构。即进程中的线程只能访问所属进程的内存空间。
4GB是一个虚拟的地址空间,只是内存地址的一个范围。在你成功访问数据而不会出现非法访问之前,必须赋予物理存储器或者将物理存储器映射到各个部分的地址空间。
4GB虚拟地址中,2GB是内核方式分区,供内核代码、设备驱动程序、设备I/o高速缓存、非页面内存池的分配和进程页面表等使用。其余2GB属于用户方式分区,这个分区是进程的私有地址空间所在的地方。一个进程不能读取、访问、写入或以任何方式访问驻留在该分区中的另一个进程的数据。对于所有应用程序来说,该分区是维护进程的大部分数据的地方。
进程与程序的区别
- 进程是资源申请、调度和独立运行的单位。因此,它使用系统中的运行资源。
- 程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位。因此,程序不占用系统的运行资源。
线程
——若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程地址空间中的代码。
组成:
- 线程的内核对象。操作系统用它来对线程实施管理,内核对象也是系统用来存放系统统计信息的地方。
- 线程堆栈。它用于维护线程在执行代码时需要的所有参数和局部变量。
特点:
当创建线程时,系统创建一个线程内核对象。该线程内核对象不是线程本身而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。
线程总是在某个进程环境中创建,系统从进程的地址空间中分配内存供线程的堆栈使用。新线程运行的进程环境与创建线程的环境相同,因此新线程可以访问进程的内核对象的所有句柄、进程中的所有内部和在这个相同的进程中的所有其他线程的堆栈。这使得单个进程的多个线程确实能够非常容易的相互通信。
线程只有一个内核对象和一个堆栈,保留的记录很少,因此所需内存也不多。
操作系统为每一个运行线程安排一定的CPU时间——时间片。系统通过一种循环的方式为线程提供时间片,线程在自己的时间片中运行。因为时间片相当短,给用户的感觉就好像线程是同时运行的。如果计算机拥有多个CPU,线程就能真正意义上的并发执行了。
进程与线程的关系
当创建一个进程时,操作系统会自动创建这个进程的第一个线程,称为主线程。此后,该线程可以创建其他线程。
单个进程可能包含若干个线程,这些线程都“同时”执行进程地址空间中的代码。
线程比进程占用资源少
进程切换需要交换整个地址空间,线程的切换只是一个执行环境的改变,因此效率高。