概念
进程
进程的定义
进程是操作系统结构的基础;是一次程序的执行;是一个程序及其数据在处理机上顺序执行时所发生的活动;是程序在一个数据集合上运行的过程,它是操作系统进行资源分配和调度的一个独立单位。
如果文字觉得抽象,直接上图。
![]()
通过查看“Windows任务管理器”中的列表,完全可以将运行在内存中的exe文件理解成进程,进程是受操作系统管理的基本运行单元。
进程的特征
- 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
- 并发性:任何进程都可以同其他进程一起并发执行;
- 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
- 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。
进程的结构特征:程序+数据+进程控制块(PCB)
进程的状态及转换
- 就绪(Ready)状态:进程已分配到处CPU以外的所有必要资源,只要再获得CPU,便可立即执行。
- 执行(Running)状态:进程已获得CPU,其程序正在运行。(任何时候,只有一个进程处于执行状态。)
- 阻塞(Block)状态:正在执行的进程由于发生某事件(如I/O请求,申请缓冲区失败等)暂时无法继续执行时的状态,亦即进程的执行受到阻塞。
- 创建(New)状态:进程创建工作尚未完成,不能被调度运行。
- 终止(Exit)状态:当一个进程到达了自然结束点,或是出现了无法克制的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。
线程
操作系统中的术语,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
线程可以理解成是在进程中独立运行的子任务。比如,QQ.exe运行时就有很多的子任务在同时运行。再如,好友视频线程、下载文件线程、传输数据线程、发送表单线程等,这些不同的任务或者说功能都可以同时运行,其中每一项任务完全可以理解成是“线程”在工作,传文件、听音乐、发送图片表情等功能都有对应的线程在后台默默地运行。
线程特点
轻型实体:线程中的实体只拥有一点必不可少的、能保证独立运行的资源。
线程的实体包括程序、数据和TCB。线程是动态概念,它的动态特性由线程控制块TCB(Thread Control Block)描述。TCB包括以下信息:
(1)线程状态。
(2)当线程不运行时,被保存的现场资源。
(3)一组执行堆栈。
(4)存放每个线程的局部变量主存区。
(5)访问同一个进程中的主存和其它资源。
用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。独立调度和分派的基本单位:在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。
- 可并发执行:多个线程可并发执行。
- 共享进程资源:在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。
进程是指一段正在执行的程序。而线程有时候也被称为轻量级进程,是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段和堆空间)即一些进程级的资源(例如打开的文件),但是各个线程拥有自己的栈空间,进程与线程的关系如图1所示。
具体而言,线程共享的内容包括代码段、数据段、堆空间、进程打开的文件描述符、进程的当前目录以及进程的用户ID和组ID。
线程独占的资源班阔栈,线程ID、寄存器的值、错误返回码以及线程的信号屏蔽码。具体内存如下:
- 线程ID:每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标识线程。
- 线程的栈:栈是保证线程独立运行所必需的。线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以,线程必须拥有自己的函数栈,使得函数调用可以正常执行,不受其他线程的影响。
- 错误返回码:不同的线程应该拥有自己的错误返回码变量。
- 线程的信号屏蔽码:由于每个线程所感兴趣的信号不同,所以,线程的信号屏蔽码应该由线程自己管理,但所有的线程都共享同样的信号处理器。
- 线程的优先级:由于线程需要像进程那样能够被调度,那么就必须要有可供调度使用的参数,这个参数就是线程。
进程与线程的关系
- 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;
- 资源分配给进程,同一进程的所有线程共享该进程的资源;
- 处理机分给线程,即真正在处理机上运行的是线程;
- 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程指的是进程内的一个执行单元,也是进程内的可调度实体。
进程和线程的相同点
- 二者都具有ID、一组寄存器、状态、优先级以及所要遵循的调度策略;
- 每个进程都有一个进程控制块,线程也拥有一个线程控制块;
- 线程和子进程共享父进程中的资源;
- 线程和子进程独立于它们的父进程,竞争使用处理器资源;
- 线程和子进程的创建者可以在线程和子进程上实行某些控制,例如创建者可以取消、挂起、继续和修改线程和子进程的优先级;
- 线程和子进程可以改变其属性并创建新的资源。
进程和线程的不同点
- 线程是进程的一部分,一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个线程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的;
- 启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所花费的时间也远远小于进程间切换所花费的时间;
- 系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),同一个进程内的线程可以共享进程的资源。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且还很不方便。而一个线程的数据可以直接为其他线程所用,这不仅快捷,而且方便;
- 与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了;
- 进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。
多线程
优点
- 无须跨进程边界;
- 程序逻辑和控制方式简单;
- 所有线程可以直接共享内存和变量等;
- 线程方式消耗的总资源比进程方式少。
缺点
- 每个线程与主程序共用地址空间,受限于2GB地址空间;
- 线程之间的同步和加锁控制比较麻烦;
- 一个线程的崩溃可能影响到整个程序的稳定性;
- 达到一定的线程数程序后,即使再增加CPU也无法提高性能。例如Windows Server 2003,大约1500个线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;
- 线程能够提高的总性能有限,而且线程多了以后,线程本身的调度也很烦琐,需要消耗较多的CPU。
多进程
优点
- 每个进程互相独立,不影响主程序的稳定性,子进程崩溃也没关系;
- 通过增加CPU,就可以容易扩充性能;
- 可以尽量减少线程加锁/解锁的影响,即使线程运行的模块算法效率低,也可极大提高性能;
- 每个子进程都有2GB 地址空间和相关资源,总体能够达到的性能上限非常大。
缺点
- 逻辑控制复杂,需要和主程序交互;
- 需要跨进程边界,如果有大数据量传送,就不太适用,适合于小数据量传送、密集运算、多进程调度开销比较大;
- 最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然,也可以利用多线程+多CPU+轮询方式来解决问题。
程序、进程、线程的定义与关联关系
术语 | 定义与描述 |
---|---|
程序 | 一组指令的有序结合,是一个静态没状态的文本 |
进程 | 具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单元 |
线程 | 进程的一个实体,是CPU调度和分派的基本单元,是比进程更小的能独立运行的基本单元。本身基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(例如程序计数器、一组寄存器和栈),一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行 |