前言
进程和线程是操作系统课程、互联网行业面试中出现频率很高的一个考点,用百度随便一搜,就会出现成百上千篇关于二者区别或联系的介绍,其中的一些将二者的区别一一罗列,条理分明,但不知为什么,我看完后还是对二者云里雾里,今天抛开笔试、面试不谈,好好分析一下进程和线程的关系。
进程和线程分别是什么
在一些早期传统的操作系统中,并没有线程的概念,那时人们只知道进程。而进程可以说是:
1)一个正在被执行的程序;(从运行的角度看)
2)在计算机中执行的一个程序的实例;(从实例化的角度看)
3)由可执行的程序代码、相关数据资源、程序上下文、保存过程调用参数和地址的栈所组成的一个实体。(从组成的角度看)
从中,我们可以看出进程的两个主要特点:1)它可以被处理器调度执行;2)它拥有执行所需的资源。人们将这两个特点独立划分,并将可以被处理器执行的特点抽象出来,就形成了线程的概念。当一个进程一次只想做一件事时,线程的概念并不明显,而当一个进程需要同时或交替完成好几个任务时,就会使得线程的概念(即被处理器调度和执行的基本单元)从进程的概念(即拥有资源的基本单元)凸显出来。当然,正如题目中所强调的,进程与线程实际上并不是两个对立的概念,我更愿意把线程称为是进程可以被处理调度执行这一特点的抽象。
为什么需要线程
肯定是因为引入线程的概念有诸多优势才需要线程的。
1)首先,在进程内部创建一个线程,比另外再创建一个新的进程要省不少时间。具体来讲(这部分具体来讲可以选择跳过),创建一个进程,a)首先需要为其分配唯一的进程标识符;b)然后给进程分配存储空间,这就包括上面提到的分配程序代码、相关数据、用户栈以及进程控制块(程序上下文);c)接着需要初始化进程控制块;d)然后将进程放到合适的位置,即就绪、阻塞队列中;e)最后还要创建或扩充其他数据结构。而创建一个线程呢,由于线程共享其所属进程的数据资源,它只需要一个线程控制块(包括线程标识符)、一个独立的栈就够了。
2)相应地,销毁一个线程也比销毁一个进程要省不少时间。
3)在同一进程中的线程间进行切换要比在不同进程间进行切换省不少时间。具体来讲(这部分具体来讲可以选择跳过),切换一个进程,a)首先需要将当前处理器的状态信息保存到程序上下文中;b)然后改变正在执行的进程的状态(运行态变为就绪态或阻塞态等);c)将该进程的进程控制块移到相应的就绪等待队列中;d)选择另一个进程执行;e)将该被选择的进程的状态改成运行态;f)更新内存管理的数据结构;g)将该被选择的进程的程序上下文恢复到处理器;
4)由于同一进程内的线程共享内存和文件,提高不同程序执行时的通信效率。
结语
可以看出,上面并没有讲进程和线程之间的区别,以及联系,而只是在介绍什么是进程,什么是线程,为什么要引入线程,我觉得这样可能会对二者的关系有更深入的了解。