一、认识进程
先感性地认识一下,进程是载入内存中进行处理的程序,是程序的一次执行过程。
需要了解,程序是什么?程序是指令序列的集合,平时存放在外存,是一堆静态的代码。当用户需要它时,CPU就将这段程序调入内存运行起来,它就变成了动态的进程。
可以理解为,进程就是动起来的程序。那么想让原本静态的程序动起来,还需要什么东西来驱动呢?也就是说,进程都包含哪些部分。回答这个问题,还涉及到“进程实体”的概念。
进程实体(进程映像)由
程序段
、数据段
、PCB
三部分组成。而进程,是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
Tip:进程实体也是静态的,是那三部分的一个集合;而进程更强调动态过程。一般情况下,不严格区分“进程”和“进程实体”,可以认为进程实体简称为进程。
详细认识认识上述的三部分。
- 程序段:就是一段程序,由多条指令组成,比如读、写、跳转。
- 数据段:程序运行时使用、产生的运算数据,如全局变量、局部变量、宏定义的常量等就存放在这里。
- PCB:Process Control Block,进程控制块,用于管理进程。它唯一标志着进程的存在。创建进程,就是创建进程实体中的PCB,撤销就是撤销进程实体中的PCB。
PCB既然肩负着管理重任,必然存放着很多用于管理进程的信息,用一张图简单了解。
总的来说,程序 + 所需的数据 + 大管家PCB = 进程实体,进程实体动起来的过程就是进程。
二、认识线程
首先要有个概念,引入线程是为了增加系统的并发度。可以将线程看作是轻量级的进程。但与真正的多进程不同的是,对于同一进程的多个线程,系统只为该进程分配资源,由这些线程共享。
线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程。
很重要的一句话:
进程是分配资源(打印机、内存空间地址等)的最小单位,而线程是调度的最小单位。
线程又分为以下两种:
- 用户级线程:这些线程的管理工作(包括线程切换)由应用程序负责,操作系统看不到
- 内核级线程:线程的管理由操作系统负责,线程切换需要在核心态下才能完成
三、多线程
并不是说一个进程包含多个线程就叫多线程了。多线程是指计算机在同一时间能够执行多于一个线程,这要求该计算机必须拥有多核心处理器,实现真正的“并行运算”。
四、二者联系与区别
联系
- 二者都有
运行
、就绪
、阻塞
状态。
- 运行状态:进程/线程既有所需资源,又被分配到CPU;
- 就绪状态:进程/线程所需的资源到位,但是没被分配到CPU;
- 阻塞状态:进程/线程所需的资源没有到位。
- 一个线程只能属于一个进程,而一个进程可以拥有多个线程(至少一个),其中一个是主线程。
区别
- 进程是系统分配资源的最小单位,意思就是系统不会为线程单独分配资源,多个线程共享它们共同的进程的资源。
- 因为线程更加轻量,所以线程的创建和销毁的代价更小,切换线程(同一进程的)也比切换进程的开销更少。
- 同一进程的线程之间因为共享资源,所以通信非常方便,而不同进程间的线程通信时需要用到“进程间通信”,比较复杂。