一、引入多线程技术的动机

在传统的操作系统中,进程是系统进行资源分配的基本单位,按进程为单位分给存放其映象所需要的虚地址空间、执行所需要的主存空间、完成任务需要的其他各类外围设备资源和文件。同时,进程也是处理器调度的基本单位,进程在任一时刻只有一个执行控制流,通常将这种结构的进程称单线程(结构)进程(single threaded process) 。 首先来考察一个文件服务器的例子,当它接受一个文件服务请求后,由于等待磁盘传输而经常被阻塞,假如不阻塞可继续接受新的文件服务请求并进行处理,则文件服务器的性能和效率便可以提高,由于处理这些请求时要共享一个磁盘缓冲区,程序和数据,要在同一个地址空间中操作。这一类应用非常多,例如,航空售票系统需要处理多个购票和查询请求,这些信息都与同一个数据库相关;而操作系统在同时处理许多用户进程的查询请求时,都要去访问数据库所在的同一个磁盘。对于上述这类基于同数据区的同时多请求应用,用单线程结构的进程难以达到这一目标,即使能解决问题代价也非常高,需要寻求新概念、提出新机制。随着并行技术、网络技术和软件设计技术的发展,给并发程序设计效率带来了一系列新的问题,主要表现在:

这就迫切要求操作系统改进进程结构,提供新的机制,使得应用能够按照需求在同一进程中设计出多条控制流,多控制流之间可以并行执行,多控制流切换不需通过进程调度;多控制流之间还可以通过内存区直接通信,降低通信开销。这就是近年来流行的多线程(结构)进程(multiple threaded process) 。如果说操作系统中引入进程的目的是为了使多个程序能并发执行,以改善资源使用率和提高系统效率,那么,在操作系统中再引入线程,则是为了减少程序并发执行时所付出的时空开销,使得并发粒度更细、并发性更好。这里解决问题的基本思路是:把进程的两项功能--“独立分配资源”与“被调度分派执行”分离开来,前一项任务仍由进程完成,它作为系统资源分配和保护的独立单位,不需要频繁地切换;后一项任务交给称作线程的实体来完成,它作为系统调度和分派的基本单位,会被频繁地调度和换,在这种指导思想下,产生了线程的概念。 传统操作系统一般只支持单线程(结构)进程,如 MS-DOS 支持单用户进程,进程是单线程的;传统的 UNIX 支持多用户进程,每个进程也是单线程的。目前,很多著名的操作系统都支持多线程(结构)进程,如: Solaris、 Mach、 SVR4、 OS/390、 OS/2、 WindowNT、 Chorus 等; JAVA 的运行引擎则是单进程多线程的例子。许多计算机公司都推出了自己的线程接口规范,如 Solaris thread 接口规范、 OS/2 thread 接口规范、Windows NT thread 接口规范等; IEEE 也推出了 UNIX 类操作系统的多线程程序设计标准 POSIX 1003.4a。事实上,线程概念不仅局限于操作系统中,在程序设计语言、数据库管理系统和其他一些应用软件中,也通过引入线程来改善系统和应用程序的性能,可以相信多线程技术在程序设计中将会被越来越广泛地采用。

二、多线程环境中的进程与线程

1、多线程环境中的进程概念

1、多线程环境中的进程概念在传统操作系统的单线程进程中,进程和线程概念可以不加区别。下图 给出了单线程进程的内存布局和结构,它由进程控制块和用户地址空间,以及管理进程执行的调用/返回行为的系统堆栈或用户堆栈构成。一个进程的结构可以划分成两个部分:对资源的管理和实际的指令执行序列。显然,采用并发多进程程序设计时,并发进程之间的切换和通信均要借助于操作系统的进程管理和进程通信机制,因而,实现代价较大,而较大的进程切换和进程通信代价,又进一步影响了并发的粒度。

单线程进程的内存布局

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5619bf38-9630-4ce6-b29a-681c557c2499/20181028224101761.png

设想是否可以把进程的管理和执行任务相分离,如下图 所示,让进程是操作系统中进行保护和资源分配的单位,允许一个进程中包含多个可并发执行的控制流,这些控制流切换时不必通过进程调度,通信时可以直接借助于共享内存区,每个控制流称为一个线程,这就是并发多线程程序设计。

管理和执行相分离的进程

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1d8ba0ea-02b9-4ad8-89fe-46fe4395cbfb/20181028224115611.png

多线程进程的内存布局如下图所示,在多线程环境中,仍然有与进程相关的内容是 PCB 和用户地址空间,而每个线程除了有独立堆栈,以及包含现场信息和其他状态信息外,也要设置线程控制块 TCB(Thread Control Block)。线程间的关系较为密切,一个进程中的所有线程共享其所属进程拥有的资源,它们驻留在相同的地址空间,可以存取相同的数据。例如,当一个线程改变了主存中一个数据项时,如果这时其他线程也存取这个数据项,它便能看到相同的结果。

多线程进程

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/fa2456b1-9acd-4366-8383-2ed5c21039f4/20181028224715148.png

最后,给出多线程环境中进程的定义:进程是操作系统中进行保护和资源分配的基本单位。它具有: