
在传统操作系统中,资源和独立调度的基本单位都是进程。引入线程的操作系统中,线程成为了独立调度的基本单位,而进程则拥有了资源的基本单位。这二者之间的关系与切换,便构成了多任务操作系统的重要基石。
根据操作系统内核对线程的感知程度,我们可以将线程分为内核线程和用户线程两大类。
在多线程操作系统中,不同的系统实现了不同的线程模型。有的系统实现了用户级线程,有的则实现了内核级线程。
在用户级线程中,线程的管理工作全由应用程序完成,内核意识不到线程的存在。此类线程仅存在于用户空间中,创建、撤销、同步与通信等功能无须利用系统调用来实现。用户进程利用线程库来控制用户线程。这样的设计让线程切换速度更快,但由于处理器时间片分配以进程为单位,因此每个线程的执行时间相对较短。
相对地,内核级线程则是由操作系统负责管理和调度的。这些线程驻留在内核空间,与用户空间中的线程有明确的映射关系。它们的创建、撤销、切换等操作都需要内核直接实现。这样的设计让所有线程都能在全系统范围内竞争资源,但同时也带来了更高的系统开销。
用户级线程的特点在于其轻量级和快速切换的特性,每个进程都可以定制自己的调度算法,灵活性较高。而其缺点则是在遇到I/O或页面故障引起的阻塞时,会阻塞整个进程乃至其内部的所有线程。
内核级线程的优点则在于它们能更好地利用多处理器系统的优势,当一个线程被阻塞时,内核可以选择运行另一个进程中的线程。所有能阻塞线程的系统调用都以系统调用的形式实现,这使得系统能够更有效地管理资源。
在实际的多线程应用中,也有一些系统采用了用户级与内核级的组合实现方式。这种模型中,应用程序中的多个用户级线程被映一些内核级线程上,由操作系统进行调度和同步。这样的设计结合了两种实现方式的优点,既能保证灵活的调度算法,又能利用内核级线程的资源管理优势。
至于POSIX标准的引入,为用户提供了更大的灵活性。它定义了两种不同作用域的线程:一种是仅与同进程中的其他线程竞争资源的PTHREAD_SCOPE_PROCESS;另一种是在全系统范围内竞争资源的PTHREAD_SCOPE_SYSTEM。通过设置不同的作用域和绑定状态,程序员可以更精确地控制线程的调度和资源分配。
多线程的实现方式多种多样,每种方式都有其适用的场景和优缺点。在设计和实施多线程应用时,需要根据具体需求和系统环境来选择合适的实现方式。
