在操作系统的学习中,我们经常会遇到诸如进程、线程、进程上下文和线程上下文等语义,但具体是什么意思,相信大家也时常被绕晕。今天就具体讲解一下关于进程、线程及一些相关术语的解释。
进程
操作系统资源分配的基本单位
,也就是指计算机中已执行的程序。
- 在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,
进程
是程序的基本执行实体; - 在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中,进程本身不是基本执行单位,而是
线程
的容器。 - 程序本身只是指令、数据及其组织形式的描述,相当于一个名词,
进程
才是程序(那些指令和数据)的真正执行实例
.
进程上下文
进程上下文
就是表示进程信息
的一系列东西,包括各种变量、寄存器以及进程的运行的环境。这样,当进程被切换后,下次再切换回来继续执行,能够知道原来的状态。
拿Linux进程
举例:
----进程的运行环境主要包括:
1.进程空间中的代码和数据、各种数据结构、进程堆栈和共享内存区等。
2.环境变量:提供进程运行所需的环境信息。
3.系统数据:进程空间中的对进程进行管理和控制所需的信息,包括进程任务结构体以及内核堆栈等。
4.进程访问设备或者文件时的权限。
5.各种硬件寄存器。
6.地址转换信息。
由上可知,进程的运行环境是动态变化的,尤其是硬件寄存器的值以及进程控制信息是随着进程的运行而不断变化的。在Linux中把系统提供给进程的的处于动态变化的运行环境总和称为进程上下文。
线程
操作系统能够进行运算调度的最小单位
。
- 大部分情况下,它被包含在进程之中,是进程中的实际运作单位。
- 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
- 线程是独立调度和分派的基本单位。
线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。 - 同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
线程上下文
进程的上下文的多数信息都与地址空间的描述有关。进程的上下文使用很多系统资源,而且会花费一些时间来从一个进程的上下文切换到另一个进程的上下文。同样的,线程也有上下文。
当线程被抢占时,就会发生线程之间的上下文切换。
如果线程属于相同的进程,它们共享相同的地址空间,因为线程包含在它们所属于的进程的地址空间内。这样,进程需要恢复的多数信息对于线程而言是不需要的。尽管进程和它的线程共享了很多内容,但最为重要的是其地址空间和资源,有些信息对于线程而言是本地且唯一的,而线程的其他方面包含在进程的各个段的内部。
线程上下文与进程上下文对比
上下文内容 | 进程 | 线程 |
---|---|---|
指向可执行文件的指针 | × | |
栈 | × | × |
内存(数据段和堆) | × | |
状态 | × | × |
优先级 | × | × |
程序IO的状态 | × | |
授予权限 | × | |
调度信息 | × | |
审计信息 | × | |
文件描述符 | × | |
文件读/写指针 | × | |
寄存器组 | × | × |