###一、什么是线程???###
要了解什么是多线程那得先知道什么是线程?
所谓的线程就是程序里面的一个执行线路。或者说线程是一个进程内部的控制序列。其实线程是进程模拟的(Linux环境下)所以线程也叫做轻量级进程。
###二、线程VS进程###
线程与进程之间的联系
- 进程是资源分配的最基本单位
- 线程是系统调度的基本单位(CPU是以PCB为单位调度的)
- 每一个进程中至少有一个线程
- 一个进程是一个线程组,线程组方便管理进程
- 进程是具有一个或者多个执行流的线程组
- 同一进程中的多个线程可以并发执行,在多处理的情况下可以同时并行
并行:多个处理器或者多核的处理器同时处理多个不同的任务(多个人同时吃多个面包)
并发:一个处理器同时处理多个任务(一个人吃好多面包)
进程和线程的优缺点对比: - 线程的创建销毁成本相较于进程更低
- 线程之间的数据共享很简单,进程之间的数据共享需要投入更多(比如:创建管道或者消息队列等)
- 创建线程的速度要快于创建进程
- 线程之间的上下文切换一般比进程也更短
- 线程的调度成本比进程更低(切换成本低,因为多个线程可能属于同一个进程,不需要切换页表,保存线程的数据)
- 线程之间不像进程之间是独立的,如果一个线程中出现了bug有可能会波及到其他线程甚至会导致整个进程退出
上面所对比的线程和进程的优缺点,都是因为线程之间的某些数据是共享的,一个进程中的多个线程共享,着多个线程竞争同一个宿主进程中的虚拟空间。
线程共享的数据: - 同一块地址空间,因此代码段和数据段都是共享的
- 文件描述符
- 每种信号的处理方式
- 当前的工作目录
- 用户id和组id
- 进程id和父进程id
- 文件权限
- nice值
线程之间所有的数据及资源并不都是共享的,各个线程也有他们的小隐私: - 线程id
- errno错误号
- 线程自己的栈
- 信号屏蔽字
- 实时调度策略和优先级