一、 进程和线程
进程有两个特点:
资源所有权:一个进程包括一个存放进程映像的虚拟地址空间, 进程拥有对资源的控制或所有权,包括内存、I/O 通道、I/O设备和文件等。避免进程之间发生不必要的与资源相关的冲突。
调度/执行:一个进程具有一个执行状态和一个被分配的优先级,它是一个可以被操作系统调度和分派的实体。
(1)多线程
多线程是指操作系统在单个进程内支持多个并发执行路径的能力。
进程被定义成资源分配的单位和一个被保护的单位。对于进程而言,有上述两个特点,对于线程而言,有:
线程的执行状态(运行、就绪等)
在未运行时保存的线程上下文(数据和代码)
一个执行栈
用于每个线程局部变量的静态存储空间。
与进程内的其他线程共享的对进程的内存和资源的访问。
每个进程都有一个独立的栈,还有独立的控制块用于包含寄存器值、优先级和其他与线程相关的状态信息。进程中所有的线程共享该进程的状态和资源,他们驻留在同一块地址空间中,并且可以访问到相同的数据。当一个线程改变了内存中的一个数据项时,其他线程在访问这一数据项时能够看到变化后的结果。
(2)线程的优点
在一个已有进程中创建一个新线程比创建一个全新进程所需的时间要少很多。
终止一个线程比终止一个进程花费时间少。
同一进程内线程间切换比进程间切换花费的时间少。
线程提高了不同的执行程序间通信的效率。独立进程间的通信需要内核的介入。
(3)线程功能特性
线程状态:线程的关键状态有就绪,运行,阻塞态。如果一个进程被换出,则其所有线程都应被换出。
线程状态改变的基本操作:
派生:新线程拥有自己的寄存器上下文和栈空间,且被 放在就绪队列中。
阻塞:
解除阻塞
结束:当一个线程结束时,寄存器上下文和栈空间都被释放。
二、 线程实现方式
1、 用户线程(由进程管理):
优点:
线程切换不需要内核态特权,不需要为线程管理而切换到内核态,节省了两次状态转换的开销(从用户态到内核态,再从内核态到用户态)
调度可以是应用程序相关的。不扰乱低层的操作系统的调度程序。
缺点:
线程的系统调用会引起阻塞,以至于整个进程都会被阻塞。
内核一次只把一个进程分配给一个处理器,因此一次进程中只有一个线程可以执行。
改进措施:
不让线程阻塞:行不通,因为需要修改操作系统。
不让线程调用阻塞操作。
在进程阻塞后想办法激活受阻进程的其他进程。调度器激活,让操作系统在进行进程切换时先不切换,而是通知受阻的进程执行系统,并问其是否还有别的线程可以执行。
2、 内核级线程(由操作系统管理),即将线程控制块存放在操作系统内核空间。
优点:
内核可以同时把同一个进程中的多个线程调度到多个处理器中
进程中如果有一个线程被阻塞,内核可以调度同一个进程中的另一个线程。
缺点:
线程切换涉及到内核的状态切换,效率低
使用内核线程级线程多线程技术会比使用进程有明显的速度提高,使用用户级进程比内核级别又有提高。
总结:
1、 进程是资源分配的基本单位,线程是调度的基本单位。进程是在CPU上实现共享,对CPU的操作只有操作系统内核来完成的。线程是在用户程序的地址空间进行共享的。所以必须由编码人员来自己设计。
2、 线程共享的资源有地址空间、全局变量、文件、子进程等。但程序计数器不能共享,因为每个线程的执行序列不一样。同理,寄存器也不能共享,栈也不能共享。
3、 现代操作系统的线程实现模型
用户态的执行系统负责内部线程在非阻塞时的切换;内核态的操作系统负责阻塞线程的切换,在分配线程时,我们可将需要执行阻塞操作的线程设为内核态线程,而不会执行阻塞操作的线程设为用户态线程。