进程与线程的区别
当我们把代码编译链接生成后的可执行文件,装载到内存中进行运行,这个运行中的实例就是进程。
同一个可执行文件,可以有多个进程实例。而且,每个进程之间的内存资源都是相互独立、互不影响的。
换句话解释就是,进程是操作系统进行资源调度和内存分配的基本单位。
这些进程独享的资源,包括有代码、打开的文件、堆、栈、存放全局变量的数据段 以及一些内核内部使用的数据,比如运行状态等。
现代的操作系统都是会并发处理多任务的,所以必然会同时处理多个进程,那就必然需要进行进程的切换。而切换进程,意味着,需要将进程独占的那些资源都进行切换。
那由于进程管理的资源较多,相对切换的成本开销就较大了。这也是引入线程的概念的原因,线程是进程的一个子任务,是用来作为操作系统进行任务调度的最小单位。
首先线程是相对进程更轻量级的存在,
单个进程的线程间共享的资源包括:
- 代码段
- 全局数据段和静态数据段
- 栈区
理论上,栈区是属于线程是有的。
但是实际上,不同线程的栈区并没有严格的隔离机制来进行保护。
因此,如果一个线程拿到来自另一个线程栈帧上的指针,那么该线程就可以改变另一个线程的栈区,也就是说,
这些线程可以任意膝盖本属于另一个线程中的变量。
- 堆区
- 打开的文件描述符
- 命令行参数
- 信号处理函数
- 进程ID、进程组ID
线程独占的资源有:(即线程上下文)
- 线程的栈区 栈指针?(用来指向栈顶吗?)
- 程序计数器(一种寄存器)
- 函数运行使用的寄存器(保存部分局部变量之类)
- TLS(Thread Local Storage)
保存进程的信息的地方 称为PCB,进程控制块。
保存线程的信息的地方,就是TCB,线程控制块。
PCB存储的信息包括各种资源信息:内存地址空间信息、所有打开的文件、所有的I/O设备信息,
此外,还有进程描述符(即进程的标识,进程id),进程的运行状态,对应的用户描述符,各种寄存器的信息,以及进程的优先级(操作系统用来进行调度的算法需要)等信息。
TCB就相对少一点,除了线程描述符,也会记录对应的进程描述符,还有栈、寄存器等相关信息。