线程与进程的概念

    科技2025-06-03  27

     在单任务环境下,程序在执行中独占计算机系统的全部资源,在一个封闭的环境中运行,不会受到干扰。一个程序无论运行多少次,其运行结果和过程都是完全相同的,可以说,程序和程序的执行过程是一一对应的。程序的执行过程是由程序决定的,所以早期往往把程序和程序的执行过程当成一回事儿,并不区分。然而,在多任务环境下,程序的执行会受到其他程序的影响,比如,程序要访问某个设备,而该设备正被其他程序使用,那么前者必须暂停,直到后者用完;类似地,一个正在执行的程序也有可能因为被抢占CPU而进入就绪状态。可见,程序的执行过程不再是由程序唯一决定的,和程序不再一一对应。所以,引入一个新的概念,专门描述程序的执行过程是非常必要的。{引入}  程序的执行过程,称为线程。线程不同于程序,线程具有动态的属性,有开始和结束,而程序没有。在操作系统看来,程序只是存于文件中的指令的序列,是静态的,只有当它执行时,才在系统中拥有了线程的身份,访问内存和外设,并在执行过程中与操作系统进行互动。{线程的定义} 依据线程和CPU的关系,线程的状态可以分为五种:新建、就绪、运行、阻塞和结束。“新建”表示线程创建后,还需要等待操作系统的许可才能进入就绪状态,籍此系统可以总体上控制系统中运行线程的个数;“就绪”表示线程已经具备执行的条件,一旦被调度程序选中即可进入执行状态;“执行”表示线程正在使用CPU,线程可能因I/O请求而进入阻塞状态,也可能因时间片到而重回就绪状态;“阻塞”表示线程因等待I/O完成或某些事件而不能在CPU上执行;“结束”表示线程已经完成运行,等待善后处理。{线程状态及其转换} 为管理线程,操作系统需要一个数据结构描述线程的各种信息,如:线程的标识、状态、上下文、优先级、运行栈位置等,这个数据结构称为线程控制块(Thread Control Blick,TCB)。每个线程都有一个线程控制块,相当于线程的档案,为方便管理,操作系统往往把相同类型线程的控制块放在一个队列中,如就绪线程队列、等待打印机的线程队列等。{线程控制块} 表1 线程操作的具体内容 线程操作 具体内容 创建 建立并初始化线程控制块、为线程分配运行栈空间等 撤销 释放线程占用的所有资源 唤醒 置线程的状态为就绪、将线程控制块放入就绪队列 阻塞 置线程的状态为阻塞、将线程控制块放入阻塞队列 分派CPU 恢复线程的上下文 系统中的不同模块都需要对线程进行各种管理操作,从面向对象的观点,我们可以将关于线程的操作提炼出来,形成统一的方法,如线程的创建、撤销、唤醒、阻塞、分派CPU等,所有这些操作,都是面向线程控制块的。表1列出了操作系统针对线程所做的各项操作的详细内容。{线程操作} 并发环境下多个线程同时运行,共享系统中的资源,但他们之间不能相互干扰,操作系统解决这个问题的具体的方法就是分割。如图2所示,操作系统将内存划分成不同的区域,不同的程序使用不同的内存区域,实现了内存的保护。同样,操作系统将CPU的时间分成多个时间片,不同的程序运行在不同的时间片中,也互不干扰。外设也是像CPU一样,一个程序用完,另一个才能用。操作系统对所有程序共享的系统资源(CPU,内存),通过在时间和空间维度上的分割,实现了程序之间的共享和保护。{资源保护与共享} 从执行程序的角度看,尽管CPU时间是一段一段地分配给它的,但两次执行之间上下文是相同的,在逻辑上是连续的,并感受不到执行的不连续性;程序是通过虚拟地址空间来访问存储器的,虚拟地址到物理地址的变换是由操作系统和MMU合作完成的,程序并不知情;程序对设备的访问也是通过操作系统。由此可见,操作系统为线程的运行构造了一个虚拟运行环境,并通过时间和空间维度上的分割,实现了虚拟运行环境到物理资源的映射,各个不同的虚拟运行环境之间在资源使用上不会产生交集,参见图2。{虚拟运行环境} 线程离不开它所运行的环境,即操作系统构造的虚拟运行环境。运行在不同虚拟运行环境下的线程自然不会相互干扰。线程及其所依赖的虚拟运行环境构成了进程(process)。可见,进程就是操作系统为程序的运行而建立的一个虚拟机,也称为进程虚拟机(process virtual machine)。运行在不同进程中的线程有不同的运行环境,因而不会相互干扰,进程之间的保护是由操作系统提供保障的。运行在同一个进程中的多个线程有相同的运行环境,他们之间可以共享进程全部资源,也会相互干扰,不过同一个进程内的线程之间的保护是程序自己关注的问题。只包含一个线程的进程,现在称为单线程进程,而包含多个线程的进程称为多线程进程。同线程一样,操作系统需要建立一个数据结构描述进程的各种属性,如进程的标识、进程中包含的线程、进程的虚拟地址空间、进程占用的资源、进程的父、子进程等,这样的数据结构称为进程控制块(process control block)。{进程的概念} 进程的概念出现在上世纪60年代的早期,是并发程序设计的产物。那时的进程都是单线程进程,进程和线程的概念不加区分,也把程序的执行过程称为进程。为了提高程序的并发性,多线程进程出现了,线程的概念终于从进程中独立出来。最早提出线程概念是Victor A. V

    List item

    yssotsky[1],1967年它第一次出现在IBM OS/360系统中,不过当时被称为任务(task)。{进程、线程历史}

    Processed: 0.014, SQL: 9