什么是线程
线程是进程中的一条执行流,也是计算机调度的基本单位。在linux平台下,线程是由进程模拟实现的,故该线程也叫做轻量级进程,且线程被操作系统用pcb描述并管理。
线程与进程
- 一个进程中至少有一个线程,也可以有多个线程,所以进程又称线程组。多线程是共享同一个进程地址空间的。
- 进程是操作系统分配资源的最小单位,线程是计算机cpu调度的最小单位。
- 进程有父子之分,线程不分父子,最多只能说有主从之分。
线程的优缺点
优点:
- 创建/销毁一个线程比创建/销毁一个进程的开销要小。因为不用额外创建(销毁)虚拟地址空间。
- 线程占用资源更少
- 线程间通信非常简单方便,因为线程间共享虚拟地址空间。不用想进程那样还要用管道/消息队列/共享内存
- 线程间的调度切换比进程要容易。
- 能够充分利用多处理器的并行数量
- 在计算密集型应用,可以将任务分配给多个线程。
- 在I/O密集型应用,可以将I/O操作重叠,线程同时等待不同的I/O操作。
缺点
- 因为线程间数据访问变得容易,访问数据的安全控制问题更加突出(posix信号量/互斥锁)
- 倘若一个线程因异常崩溃,整个进程都会退出。
- 多线程的程序编码难度增加
线程的优缺点都是根据共享虚拟地址空间二而产生的。但是并不是说线程所有的东西都共享,每个线程都有自己的栈区,如果线程间共享栈区,那么就会造成调用栈混乱。且线程是计算机cpu调度的基本单位,所以在cpu切换线程时,线程都要保存自己的上下文信息在pcb中,这个也是独有的。
线程id与进程id
线程的pcb结构如下:
struct task_struct {
...
pid_t pid;
pid_t tgid;
...
struct task_struct *grou