一、线程的引入
进程中引入线程的三个原因:
- 应用的需要:
- 三个线程的字处理软件:一个负责键盘的输入;一个负责排版;一个负责保存。
- 典型的应用: Web服务器:
1.从客户端接收网页的请求(Http协议)
2.从磁盘上检索相关网页,读入内存
3.将网页返回给对应的客户端。
构造服务器的三种方法:
模型 | 特性 |
多线程 | 有并发、阻塞系统调用 |
单线程进程 | 无并发、阻塞系统调用 |
有限状态机 | 有并发、非阻塞系统调用、中断 |
- 开销的考虑
- 进程的相关操作:时间、空间开销大,限制了并发度提高
- 线程的开销小(创建和撤销一个线程花费时间少,两个线程切换花费的时间少;线程之间相互通信无需调用内核(同意进程内的线程共享内存和文件))
- 性能的考虑
二、线程的基本概念
1. 进程的两个基本单位
- 资源的拥有者:进程还是资源的拥有者
- COU调度单位:线程继承了这一属性
其实就是在同一进程中增加了多个执行序列(线程)
2. 线程的属性
- 有标识符的ID
- 有状态及状态转换--需要提供一些操作
- 不运行时需要保存的上下文: 有上下文环境包括程序计数器等寄存器
- 有自己的栈和栈指针
- 共享所在进程的地址空间和其他资源
- 可以创建和撤销另一个线程: 其实程序开始时以一个单线程的进程方式运行的
三、线程机制的实现
1.线程的实现
- 用户级线程
- 核心级线程
- 混合-两者结合的方法
1.1 用户级线程
- 在用户空间建立线程库:提供一组管理线程的过程
- 运行时系统(Run-time system):完成线程的管理工作(操作线程表)
- 内核管理的还是进程,不知道线程的存在
- 线程切换不需要内核态特权
- 例如 UNIX: POSIX线程库---PTHREAD
- POSIX(Porttable Operating System Interface)
- 多线程编程接口,以线程库方式提供给用户(Pthread_create,Pthread_exit,Pthread_join,Pthread_yield,Pthread_attr_init,Pthread_attr_destory)
用户级线程的优缺点:
优点:
- 线程切换快
- 调度算法是应用程序特定的
- 用户级线程可运行在任何操作系统上(只需要实现线程库)
- 内核只将处理器分配给进程。同一进程中两个线程不能同时运行于两个处理器上
- 大多数系统调用是阻塞的,因此,由于内核阻塞进程,故进程中所有线程也被阻塞
1.2 核心级线程
- 内核管理所有线程管理,并向应用程序提供API接口
- 内核维护进程和线程的上下文
- 线程的切换需要内核的支持
- 以线程为单位进行调度
- 例如 windows
1.3 混合模型
- 线程的创建在用户空间完成
- 线程的调度等在和心态完成
- 例如 Solaris
- 其实就是多个用户级线程多路复用多个内核级线程
1.4 一个概念
可再入程序(可重入):可被多个进程同时复用的程序,具有一下性质:
- 它是纯代码的,即在执行过程中自身不噶边;
- 调用它的进程应该提供数据区