Linux多线程(二)之进程vs线程
文章目录
- Linux进程VS线程
- 进程和线程
- 进程的多个线程共享
- 关于进程线程的问题
- 重谈地址空间
- Linux线程周边的概念
Linux进程VS线程
进程和线程
-
进程是资源分配的基本单位(进程是承担分配系统资源的基本实体)
执行流也是资源!线程是进程内部的执行流资源!
-
线程是操作系统调度的基本单位
-
线程共享进程数据,但也拥有自己的一部分数据:
线程ID
一组寄存器(线程的上下文数据)!!!!!!
栈!!!!!!
errno
信号屏蔽字
调度优先级
进程的多个线程共享
同一地址空间,因此Text Segment
、Data Segment
都是共享的,
如果定义一个函数,在各线程中都可以调用,
如果定义一个全局变量,在各线程中都可以访问到,
除此之外,各线程还共享以下进程资源和环境:
文件描述符表!!
每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)
当前工作目录
用户id和组id
进程和线程的关系如下图:
关于进程线程的问题
如何看待之前学习的单进程?
具有一个线程执行流的进程
重谈地址空间
如何理解资源分配给各线程?
线程分配资源的本质
就是分配地址空间的范围!
如果不做划分就是各线程共享的!
Linux线程周边的概念
线程 vs 进程
线程比进程要更轻量化(why?)
a.创建和释放更加轻量化(生死问题)
创建线程只要把PCB
创建
创建进程要创建PCB
、地址空间、页表、申请物理内存、构建映射等
线程释放PCB
进程就要释放创建、申请的资源
b.切换更加轻量化(运行问题)
运行的代码变少了(线程只需要运行进程的一部分代码)
线程切换不需要切换页表、不需要切换地址空间等(局部切换)
线程在执行就是进程在执行。CPU里有一个硬件级别的缓存(cache
)
线程切换的时候,虽然上下文在切换,但是cache里的热数据基本不变或者更新少量。
进程切换的时候,cache里的热数据就要丢弃,需要重新缓存新的数据。
(冷数据->热数据需要时间)
线程也会有时间片,线程的时间片来源于进程,
时间片也是资源,所以合理分配给线程,
线程不能在进程中重新申请时间片,只能在进程中获取。