目录
- 一、进程的概念
- 二、进程的结构和特征
- 2.1 进程的结构
- 2.2 进程的特征
- 三、线程的概念
- 四、进程和线程比较
- 五、线程的实现方式
一、进程的概念
- 程序放在磁盘上不叫做进程,只有运行起来之后才叫做进程,进程进程就是进行中的程序!
- 一次运行就会有一个进程,当再次运行的时候就会产生一个新的进程,浏览器就是这样的,而有的应用程序就不是,当已经在运行的时候再次运行会打开上次运行的程序。我们可以打开应用然后通过任务管理器进行观察就可以发现。
- 进程是
操作系统
进行资源分配和调度
的一个独立单位(或者说是基本单位)
二、进程的结构和特征
2.1 进程的结构
进程主要有控制块(PCB)、数据段、程序段三部分构成,下图当中把这三块比喻成了一个人,也就是进程。
- 控制块:操作系统就是根据PCB来区分进程的,可以理解为每个进程有一个自己的唯一编号,就好比每个人都有自己的身份证一样,每个进程的PCB都是不重复的。
- 数据段:每个进程的数据都是不一样的,并且不存在共享,可以理解为就是人的身体
- 程序段:可以理解为就是磁盘当中存储的应用,以程序员的理解其实就是应用的代码,也就是多个进程可以共享一个程序代码。再通透一点,电脑安装了一个浏览器,却可以打开多个浏览器页面,多个浏览器页面就是多个进程。
PCB的存储信息与分类
2.2 进程的特征
- 动态性:进程是程序的一次执行过程,是动态地产生、变化和消亡的
- 并发性:多个进程可以并发执行
- 独立性:独立资源分配,每个进程都有自己的内存区域。
- 异步性:不用等待别的进程处理完成所以他是异步的、相互独立的、互不干扰。
三、线程的概念
线程可以理解为就是从进程当中分裂出来的一个指令集合。一个进程可以包含多个线程。也可以只存在一条线程,并且线程不能单独存在。线程的资源是由进程进行管理的。
我们打开一个应用就是进程,然后应用当中的每一个功能就对应了一个线程。
拿qq举例:打开qq就是一个进程的运行,这个时候在任务管理器当中是可以看得到该进程的,然后打开qq里面的qq空间就是一条线程,然后跟A聊天就又是一个线程,跟B聊天就又是一个线程。
面试的时候经常会问进程线程的区别:
- 进程是操作系统
资源分配调度
的基本单位 - 线程是操作系统
运算调度
的最小单位
想不起来的时候就想一下电脑的任务管理器,任务管理器当中显示了进程,并且显示了进程占用的内存CPU等信息。也就是操作系统是给进程分配空间而并不是线程。
线程下还有一个纤程(了解即可)
- 纤程:线程是在Windows内核中实现的,操作系统会根据系统的调度算法对线程进行调度。 纤程是在用户模式下实现的,内核对纤程一无所知。 纤程是更轻量级的线程,一个线程可以包含一个或多个纤程。
Java 原生没有提供纤程支持,需要依赖于
quasar-core
的库,来创建纤程。感兴趣的可以了解一下,据说是多线程与多纤程计算耗时相比较差距是非常大的,多纤程要比多线程快的多。
线程的属性:
四、进程和线程比较
五、线程的实现方式
线程的实现分为两类:用户级线程(User-Level Thread,UTL)和内核级线程(Kernel-Level Thread, KTL)l。内核级线程又称内核支持的线程。
在用户空间完成的线程就是用户级线程、在内核空间完成的线程就是内核级线程。这里的完成,包含了线程的创建、执行、和销毁。
(1)用户级方式
操作系统提供了线程库,线程库包含了创建线程和销毁线程以及执行线程的接口。操作系统根本不知道线程这个东西,他在执行的时候是以进程装载线程指令来执行的。假如某个线程想要操作内核,这时候会通过陷入指令进行中断,一旦中断其他线程都将阻塞。优点:如果线程不访问内核,只是线程切换,效率比较高。因为所有的线程都在用户空间。
- 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。
- 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行(因为此时只有一个内核级线程)。
(2)内核级方式
内核级线程的线程控制块在内核空间,上面我们提到了进程由控制块(PCB)、数据段、程序段这三部分构成,而线程他也有,只不过线程的控制块是叫做线程控制块(TCB)。内核级方式就是将线程的控制块存放到内核当中,然后处理器直接切换控制块来完成线程的切换。这时候就完成了线程的并行。
- 优点:当一个用户级线程被阻塞后,别的用户级线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
- 缺点:一个用户进程会占用多个内核级线程,而内核级线程的切换由操作系统内核完成,需要切换到核心态,因此线程管理成本高、开销大。
本质上内核级方式和用户级方式 两者的区别就是线程的控制块到底是在用户空间还是在内核空间。
(3)特殊的组合方式
这种模型克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点,是上述两种模型的折中方案。
参考:《马士兵操作系统讲解》https://www.bilibili.com/video/BV1Ha411e7D4/