四、线程
4.1进程与线程
进程具有两个特点:
- 资源所有权:进程总是具有对资源的控制权和所有权,这资源包括内存、I/O通道、I/O设备和文件等等。
- 调度/执行:进程执行时采用一个或多个程序的执行路径,不同进程的执行过程会交替进行。
为了区分这两个特点,我们通常把分派的单位称为线程或轻量级进程,而将拥有资源所有权的单位称为进程。
4.1.1多线程
多线程是指支持在一个线程内执行多个线程的能力。
在多线程环境中,进程定义为资源分配单元和一个保护单元,线程是执行的单位。与进程相关的有:
- 能容纳进程映像的虚拟地址空间
- 对处理、其他进程、文件和I/O资源的受保护访问
一个进程中可能有一个或多个线程,每个线程都有:
- 一个线程执行状态(运行、就绪等)
- 未运行时保存的线程上下文;线程可视为在进程内运行的一个独立程序计数器。
- 一个执行栈。
- 每个线程用于局部变量的一些静态储存空间。
- 与进程内其他线程共享的内存和资源的访问。
多线程的优点:
- 在已有的进程中创建一个新的进程的事件,远小于创建一个新的线程的事件。
- 终止一个线程比终止一个进程时间少。
- 同一进程内线程切换比进程间切换花费更少的时间
- 进程提高了不同的执行程序间通信的效率
为什么分离出线程?
- 原有进程概念包括”资源分配单位”和”执行体单位”,线程只是分离出阿里的执行体单位。而原油进程退化为”资源分配单位”,以及”线程的容器”。
- 分离出线程,主要目的在于提高效率。包括创建线程、线程切换、线程通信、撤销线程。此外,由于同一进程的多重线程共享同一进程资源,因此减少资源分配等分配负担。
attention:挂起一个进程,则挂起进程中的所有线程,这是由于所有线程共享同样地址空间。
4.1.2线程的功能
**线程状态**:有4种与线程状态改变相关的基本操作:
- 派生:一般情况下,在派生一个新的进程的同时也会为该进程派生一个线程。随后,进程的线程可以在同一个进程中派生出另一个线程,并未新线程提供指令指针等等并放在就绪队列中。
- 阻塞:线程需要等待一个事件时会被阻塞(保存线程的1用户寄存器、程序计数器和栈指针),处理器转而去执行另外一个就绪线程。
- 解除阻塞:发生阻塞一个线程的事件时,会将该线程转移到就绪队列中去。
- 结束:有一个线程完成后,会释放其寄存器上下文和栈。
4.2 线程分类
4.2.1分类类型
- 用户级线程
- 内核级线程
- 组合方法
4.2.2用户级线程
- 有关线程的管理工作都由应用程序来完成。
- 内核没有意识到线程的存在,即操作系统内核将镇哥哥应用程序是为同一线程。
用户级多线程相比于内核级多线程的优点:
- 进程内的进程切换不需要内核模式特权,节省模式切换的开销。
- 切换调度算法可以特定应用程序的要求,可以是应用程序专用的。不会扰乱底层操作系统的调度。
- 用户级线程可以在任何操作系统中运行。
用户级多线程相比于内核级多线程的缺点:
- 用户级线程若系统调用时被阻塞则整个都会被阻塞,则整个进程内所有线程都会被阻塞。
- 在存粹的用户级线程中,一个多线程应用程序只有一个线程可以执行。这是因为操作系统内核将其各用户视为一个执行单元,即使在多处理器系统也会是这样的,因此会影响执行速度。
- 同理,一个进程内的用户级线程再多也不会和其他进程争得更明显CPU处理事件。
4.2.3内核级多线程
Windows采用的就是内核级多线程方法。
- 内核为进程及进程内的每个进程维护上下文环境。调度由内核基于线程完成。
内核级多线程相对于用户级多线程的优点:
- 内核可以同时把同一进程中的多个线程调度到多个处理器中;
- 如果进程中的一个线程被阻塞,内核可以调度同一进程中的其他线程。
- 内核本身也可以使用多线程。
内核级多线程相对于用户级多线程的缺点:
- 同一进程中在把控制从一个线程切换到另一个线程需要到内核模式切换;
- 操作系统内核需要维护整个系统内的内核级线程结构,数据结构较为复杂操作较为复杂。
4.2.4组合方法
- 线程的创建完全在用户空间内
- 线程的带哦度和同步也在应用程序中进行
- 程序可以为特定的应用程序和机器调节内核数量,以达到整体最佳效果。
- 组合方法中,同一个应用程序中的多个线程可以在多个处理器上并行地运行,某个会引起阻塞的系统调用不需要阻塞整个进程。