关于线程
Linux下多线程
线程概念:
一个程序中的一条执行路线就叫做线程。线程是“一个进程内部的控制序列“。
典型的UNIX可以看成只有一个控制线程:一个进程在同一时刻只做一件事,有了控制线程后,在程序设计时可以把进程设计成在同一时刻做多件事,每个线程处理各自独立的任务。
一个进程至少都有一个线程。
操作系统的最小调度单位
本质上创建进程和线程时都会调用clone函数
创建新线程和vfork相似,都不会开辟新的物理空间,使新线程的PCB和旧线程的PCB指向同一个页目录,同一块物理空间
即使是多CPU,每次也只能有一个进程在执行
而一个进程中的多个线程可以利用多CPU同时运行
如下图:
创建子进程时子进程会指向新的页目录
而创建新线程时新线程与主线程指向同一个页目录
同一进程中多个线程共享的内容有:
- 代码段,数据段,全局变量等
- 文件描述符表
- 每种信号处理方式
- 当前工作目录
- 用户id和组id
每个线程独自拥有的内容有:
- 线程id
- 栈(进程中多个线程平分栈大小)
- 上下文(包括一组用户寄存器,程序计数器和zhan
- errno(在进程中是全局的,线程中,每个线程各有一份)
- 信号屏蔽字
- 调度优先级
线程与进程的比较:
进程是资源(CPU,内存等)分配的基本单位,它是程序执行时的一个实例
线程是程序执行时的最小单位,它是进程的一个执行流,是cpu调度和分派的基本单位
线程以库的方式提供,而进程以系统接口的方式(相比线程库更加稳定)
创建子进程会指向新的页目录,而创建新线程指向同一个页目录
多线程的优缺点:
优点:
- 创建新线程的开销是新进程的1/5
- 线程间切换更方便(进程切换时要切换整个4G空间,线程只是线程栈的切换)
- 线程占用资源少于进程
- 能充分利用多处理器并行处理
- 等待慢速IO时,可执行其他计算工作
- 计算密集型应用,在多CPU系统中可以将任务分解到多个线程
- IO密集型 IO重叠操作,多个线程分别等待不同的IO,提高性能
- 提高不同执行程序间通信的效率
缺点:
- 对信号支持不好
- gdb调试不方便
- 性能损失
- 健壮性降低
- 缺乏访问控制
相比其众多优点,它的缺点微不足道
线程的适用场景:
- 前台和后台操作(提高应用程序响应速度)
- 异步处理(备份,不需要时间检查)
- 加速执行(一个计算,另一个读取)
- 模块化程序结构