(1)
最大的区别
- 过程时零碎资源分配的最小单位
- 线程时 cpu 操作和调度的最小单位,实质是一组寄存器的状态,是操作系统对寄存器状态的形象
(2)
从创立和切换以及通信老本来说:
** 线程的创立老本远远低于过程
- 因为线程中蕴含的数据量少于过程,线程只须要执行相干的数据即可,如,pc, 寄存器,栈,执行状态 **
上下文切换老本 过程远大于线程
- 过程的上下文不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包含了内核堆栈、寄存器等内核空间的状态。
- 线程上下文切换线程部分存储 (TLS) , 栈和寄存器等
- 这两种上下文切换的解决都是通过操作系统内核来实现的。
- 内核的这种切换过程随同的最显著的性能损耗是将寄存器中的内容切换出。
过程中的线程共享地址空间,过程间的通信的代价远大于线程间的通信
- 得设立管道,共享队列,信号,信号量,socket
(3)
在同一个过程中的线程有共享的和独有的资源
https://cloud.tencent.com/dev…
线程之间独有的资源有
栈区
- 同时函数运行时须要额定的寄存器来保留一些信息,像局部局部变量之类,这些寄存器也是线程公有的,一个线程不可能拜访到另一个线程的这类寄存器信息。
- 所属线程的栈区、程序计数器、栈指针以及函数运行应用的寄存器是线程公有的。这些信息有一个对立的名字,就是线程上下文,thread context。
TLS -> Thread Local Storge
- 寄存在该区域中的变量是全局变量,所有线程都能够拜访他是全局的,然而每个线程在拜访的时候都会存储一份成为本人的局部变量,批改就不会相互影响了
- 尽管看上去所有线程拜访的都是同一个变量,但该全局变量独属于一个线程,一个线程对此变量的批改对其余线程不可见。
- 实现原理相似有一个全局的词典,词典的 key 是线程 id,value 就是共享的全局变量的正本。
http://blog.hacksmeta.com/201…
线程共享的资源
代码区
- 编译后的代码
数据区
- 全局变量,动态变量。
堆区
- C/C++ 中用 malloc 或者 new 进去的数据就寄存在这个区域,只有晓得指针,任何一个线程都能够拜访指针指向的数据,因而堆区也是线程共享的属于过程的资源。
栈区
- 如果一个线程能拿到来自另一个线程栈帧上的指针,那么该线程就能够扭转另一个线程的栈区,也就是说这些线程能够任意批改本属于另一个线程栈区中的变量。
动态链接库
- 动静链接的局部生成的库就是咱们相熟的动态链接库,在 Windows 下是以 DLL 结尾的文件,在 Linux 下是以 so 结尾的文件。
文件
- 如果程序在运行过程中关上了一些 文件,那么过程地址空间中还保留有关上的文件信息,过程关上的文件也能够被所有的线程应用,这也属于线程间的共享资源。