我们常说:“进程是资源分配的基本单位,线程是CPU调度的基本单位。一个进程可以有若干个线程,每个线程会进程的部分资源”。 那么系统中一个进程会占用哪些资源呢?其中哪些是线程共享的,哪些是线程独有的呢?
进程占用的资源
为了实现进程模型,操作系统维护着一张表格,即 进程表 。每个进程占用一个进程表项(有些作者称这些表项为进程控制块)。该表包含了进程状态的重要信息,包括程序计数器、堆栈指针、内存分配状况、所打开文件的状态、账号和调度信息,以及其它在进程由运行态转换到就绪态或阻塞态时必须保存的信息。从而保证该进程随后能再次启动,就像从未被中断过一样。
下图给出了进程表的一些关键字段:
从上图我们可以看出进程占用的资源包括:
地址空间
全局变量
打开的文件
子进程
信号量
账户信息
线程占有的资源
栈
寄存器
状态
程序计数器
下图第一列给出了在一个进程中所有线程共享的内容,第二列给出了每个线程自己的内容。
## 线程共享的资源
代码段
数据段
堆
动态链接库
进程打开的文件描述符
信号的处理器
进程的当前目录
进程的用户ID和进程组ID
线程独有的内容
(线程上下文:栈、程序计数器、栈指针、运行过程中使用到的寄存器)
线程ID
寄存器组的值
线程的栈
错误返回码
线程的信号屏蔽器
线程优先级
打赏