一、进程与线程
1.进程特点(独立性):
(1)资源所有权:一个进程包括一个存放进程映像的虚拟地址空间。
(2)调度/执行:一个进程具有一个执行状态和一个被分配的优先级,它可以被操作系统调度和分配的实体。
为了区分这两个特点:分派的单位通常称为线程或者轻量级进程,而拥有资源所有权的单位通常称为进程。
2.多线程(指操作系统在单个进程内支持多个并发执行路径的能力)
2.1在多线程环境里,进程被定义成资源分配单位和一个被保护的单位。与进程相关的有:
(1)存放进程映像的虚拟地址空间
(2)受保护地对处理器、其他进程(用于进程间通信)、文件和I/O资源的访问
2.2进程中有多个线程,每个线程有:
(1)线程执行状态
(2)在未运行时保存的线程上下文;从某种意义上看,线程可以视为进程内的一个独立操作的程序计数器
(3)一个执行栈
(4)用于每个线程局部变量的静态存储空间
(5)与进程内的其他线程共享的对进程的内存和资源的访问。
2.3线程的优点:
(1)在一个已有进程中创建一个线程比创建一个全新的进程所需时间少得多
(2)终止一个线程比终止一个进程花费时间少
(3)同一个进程内线程切换比进程间切换花费时间少
(4)线程提高了不同的执行程序间通信的效率
2.4线程功能特性
线程状态改变的4个操作
(1)派生:派生新线程时,为新线程提供指令指针和参数;新线程拥有自己的寄存器上下文和占空间,并且被放置在就绪队列中。
(2)阻塞:需要等待一个事件时,被阻塞(保存它的用户寄存器、程序寄存器和栈指针)
(3)解除阻塞:事件发生,该线程被转移到就绪队列中
(4)结束:当线程完成时,其寄存器上下文和栈都被释放
2.5一个线程的阻塞是否会导致整个进程的阻塞?(线程同步)
一个进程中的所有线程共享同一个地址空间和诸如打开的文件之类的其他资源。一个线程对资源的任何修改都会影响同一个进程中的其他线程的环境。因此需要同步线程的活动以便他们互不干涉且互不破坏数据结构。
二、线程分类
1.用户级和内核级分类
线程库是用于用户级线程管理的一个例程包,它包含用于创建和销毁线程的代码、在线程间传递消息和数据的代码、调度线程执行的代码,以及保存和恢复线程上下文的代码。
在默认情况下,应用程序从单线程开始,并且在该线程中开始运行。该应用程序及其线程被分配给一个内核管理的进程。在应用程序正在运行的任何时刻,应用程序都可以派生一个在相同进程中运行的新线程。派生线程通过调用线程库中的派生例程完成的。通过过程调用,控制权被传递给派生例程。线程库为线程创建一个数据结构,然后用某种调度算法,把控制权传递给该进程中处于就绪态的一个线程。当控制权被传递给线程库时,需要保存当前线程的上下文,然后当控制权从线程库中传递给一个线程时,将恢复那个线程的上下文。上下文实际上包括用户寄存器的内容、程序寄存器和栈指针。
2.线程调度和进程调度的关系
假设进程B在线程2中执行(a)(两个用户级线程),可能发生以下任何情况:
(1)线程2中执行的应用程序代码进行了系统调用(I/O调用),阻塞了进程B。这导致控制权转移到内核,内核启动I/O操作,把进程B置于阻塞状态,并且切换到另一个进程。在此期间,根据线程库维护的数据结构,进程B的线程2仍然处于运行状态。值得注意的是,在处理器的角度上看,线程2实际上并不是运行态,但是线程库看来,它处于运行态。(b)
(2)时钟中断把控制权传递给内核,内核确定当前正在运行的进程B已经用完了他的所有时间片。内核把进程B置于就绪态并切换到另一个进程。同时,根据线程库维护的数据结构,进程B的线程2仍然处于运行态。(c)
(3)线程2运行到需要进程B的线程1执行某些动作的一个点。此时线程2进入阻塞态,而线程1从就绪态转换到运行态。进程自身保留在运行态。(d)
在第一种情况和第二种情况中,当内核把控制切换回进程B时,线程2回恢复执行。还需要注意进程在执行线程库中的代码时可以被中断,或者是由于它的时间片用完了,或者是由于被一个更高优先级的进程所抢占。因此在中断时,进程有可能处于线程切换的中间时刻,即正在从一个线程切换到另一个线程。当该进程被恢复时,线程库得以继续运行,并完成线程切换把控制权转移给该进程中的另一个进程。
3.用户级线程的优点
(1)由于所有线程管理数据结构都在一个进程的用户地址空间中,线程切换不需要内核态特权,因此,进程不需要为了线程管理而切换到内核态,这节省了两次状态转换的开销。
(2)调度可以是应用程序相关的。可以做到位应用程序量身定做调度算法而不扰乱底层的操作系统调度程序。
(3)用户级线程可以在任何操作系统中运行,不需要对底层内核进行修改以支持用户级线程。线程库时一组供所有应用程序共享的应用程序级别的函数。
4. 用户级线程的缺点
(1)在典型操作系统中,许多系统调用都会引起阻塞。因此,当用户级线程执行一个系统调用时,不仅这个线程会阻塞,进程中所有线程都会阻塞。
(2)在一个纯粹的用户级线程中,一个多线程应用程序不能利用多处理技术。内核一次只能把一个进程分配给一个处理器,因此一次进程中只有一个线程可以执行。
5.内核级线程
5.1优点
内核为进程及其内部的每个线程维护上下文信息。调度室由内核基于线程完成的。该方法克服了用户级线程的缺点。首先,内核可以同时把同一进程中的多个线程调度到多个处理器中;再者,如果进程中的一个线程被阻塞,内核可以调度同一进程中的另一个线程。内核级线程的另一个优点是内核例程自身也是可以使用多线程的。
5.2缺点
在把控制权从一个线程传送到同一个进程内的另一个线程时,需要到内核的状态切换。
三、Linux的进程和线程管理
1.Linux任务
Linux中的进程由一个task_struct数据结构表示(进程表),包括以下信息:
状态:进程状态
调度信息
标识符
进程间通信
链接
时间和计时器
文件系统:该进程打开的任何文件的指针和指向该进程当前目录与根目录的指针
地址空间
处理器专用上下文
2.进程执行状态