目录
概念:
- 线程是CPU的基本调度单位,在进程内部运行。在内核中,进程是分配系统资源的基本实体。
- 在Linux系统中没有线程,只有轻量级进程(没有单独设计PCB)。
- Linux系统没有struct thread结构体,原因是系统统一用PCB表示执行流,就不用单独给线程设计数据结构和调度算法
创建线程的函数:
上图可以看见创建了两个线程,但是俩线程的pid却是一样的。
pid和lwp一样的线程叫做主线程。操作系统调度线程时根据LWP来调度
有多进程为什么还需要有多线程?
- 线程的创建成本比进程的低,但一个线程运行崩溃会影响其他线程
- 线程删除仅仅只需要销毁一个tcp即可,但进程的销毁需要销毁pcb,页表,地址空间等
- 进程切换需要切换页表,地址空间等等,但线程不用,线程的调度成本低
线程调度的成本为什么低?(面试)
热数据: 高频访问的数据、极其重要的文件
在CPU中存在一个cache,用于存放热数据,在进程切换时,不仅要切换地址空间,页表,上一个进程cache的热数据也要做清空然后重新加载该进程的热数据。但线程是共享地址空间,CPU 中cache的数据每个线程都有可能用上,就不需要清空cache中的数据重新加载。
进程与线程的区别:
- 进程是资源分配的基本单位
- 线程是调度的基本单位
- 线程共享数据,但也有自己的数据:
1.线程ID 2.一组寄存器(硬件的上下文数据) 3.栈 (线程在运行时会形成各种临时变量,这些临时变量会被每个线程保存在自己的栈区) 4.信号屏蔽字 5.errno 6.调度优先级- 多个线程之间共享以下资源:
- 文件描述符
- 每种信号的处理方式
- 当前的工作目录
- 用户id和组id