这一次,真正明白进程与线程
引言
作为软件工程师,进程与线程应该是我们必备的知识了,从年年各大企业的面试题就能看出来!
必考题:进程与线程的区别
小生本学期学习了操作系统这门课,最大的收获就是学会了这道“必考题”。
最开始觉得自己学明白了,自己写本文的时候,才觉得这里牵扯到好多东西。
操作系统
什么是操作系统?
说到操作系统,大家一定都不会陌生,我们用的手机内置了Android
/iOS
操作系统,我的开发用的电脑,Mac OS
、Linux
、Windows
等操作系统。
操作系统的非官方描述:操作系统是管理计算机硬件与软件资源的系统软件。
发展史
想真正明白进程与线程,我们需要了解一下计算机操作系统的历史。
手工操作阶段
最原始的时候,计算机没有操作系统,只有单独的机器,像下面这样:
以一个现代人的眼光来看:没有操作系统,这个机器怎么用啊?反正给我一堆硬件,我是不能让这些硬件跑起来。
前人们也是非常厉害的。他们使用记录有程序和数据的卡片(前期用卡片,后来逐渐发展为使用打孔纸带)去操作机器。
程序读入机器后,机器就开始工作直到程序停止。据说图灵能非常熟练地用这种方法操作Manchester Mark I
机器。
缺点
- 用户独占全机
CPU
速度快,需等待人工操作,资源利用率低
批处理操作系统
为了解决人工操作速度远慢于CPU
的问题,引入了脱机输入/输出系统。
计算机能够自动地、成批地处理一个或多个用户的作业,这就不需要手工输入了,这就快了。
单道批处理操作系统
每次只加载一道作业到内存中执行。
多道批处理操作系统
每次加载多道作业到内存中并发执行,各个作业轮流使用处理机和其他系统资源,最终依次完成。
在内存中同时存放多道相互独立的程序,这些程序共享系统资源,在操作系统的控制下交替在CPU上执行。
以后发展的操作系统,我们就不需要知道了,了解到这就足够了。
进程与线程
程序并发执行
程序并发执行时,多道程序共享系统资源,此时,程序的运行失去了封闭性。
程序在并发执行时,是多个程序共享系统中的各种资源,因而这些资源的状态将由多个程序来改变,致使程序的运行失去了封闭性。这样,某程序在执行时,必然会受到其它程序的影响。
当多个程序并发执行时,我们期望的是运行变快,增加系统吞吐量。
但是,就如该图一样,某些程序必须在某些程序执行之后才可继续执行,不能让这个程序想执行就执行,我们要对其进行控制。
为了更方便地进行控制,我们就引入了进程的概念。
进程
在早期,进程是资源分配与调度的基本单位。
引入进程,我们发现解决了上述的问题,可以对I1
、I2
等等都建立进程,并按我们想法的前趋图对进程执行进行约束,达到我们预期的效果。
然后程序对我们的进行进行调度,以达到并发执行的效果。
然后怎么控制就是PV
操作,信号量,进程同步与互斥,这就不属于本文的范围了,大家可以自行学习。
进程不足
又过了好多年,人们发现最初的进程设计得有些缺点。
原始进程两特点:
- 资源分配的基本单位。
- 调度的基本单位。
所以,在仅有进程的系统中,想实现并发,需要进行下列操作:
- 创建进程:创建进程
PCB
,并为它分配资源。 - 撤销进程:回收系统资源,撤销
PCB
。 - 进程切换:从一个进程环境切换到另一个进程环境。
还是这个图为例,我需要创建12
个进程,然后进行进程控制,让它们并发执行。
创建进程12
次,分配12
次资源,分配资源消耗了大量的资源。
因为进程间的资源相互独立,所以进程间切换是资源的切换,开销相当大。
程序结束时,撤销12
次资源,回收资源时也有很大的开销。
我们有没有一种方法,可以减少创建、撤销以及切换的开销呢?
然后,引入了线程的概念。
线程
进程是携带资源的,切换时开销太大,所以我们需要将资源分配与调度分开来。
在现代操作系统中,进程是资源分配的基本单位,线程是调度的基本单位。
一个进程中有多个线程,多个线程共享该进程的资源,CPU
直接调度线程。
还是这张图,如果我们创建1
个进程,12
个线程会怎么样?
程序运行开始,创建一个进程,分配资源1
次。
创建12
个线程,注意,这里是在进程内创建线程,所以,线程无需分配资源,直接使用其进程的资源即可,这开销就非常少了。
12
个线程并发执行,这12
个线程是共享一块系统资源,所以在线程切换时,是不需要切换资源的,开销大大减少。
撤销时呢?撤销线程12
次,撤销进程,回收资源1
次。
总结
所以,这就是进程与线程的发展,了解了这些历史,我想那些答案再也不用背了吧?
CPU
的一个核心只能执行一个线程,多个核心可以并发执行,但线程并行数最多不超过核心数。
4
核的,在不添加新技术的情况下,最多并行4
个线程。
嗯?Core i7
不是4
核8
线程吗?为什么英特尔的4
个核心能跑8
个线程?
这就是英特尔大名鼎鼎的超线程技术,它将处理机核心中未利用的资源利用起来,再模拟出一个核心,虽然是4
核心的处理机,所以在用户看来,该CPU
有8
个逻辑核心。
在桌面端很有用,但是到了服务器端,超线程技术会有些问题。这只是我看了很多篇关于服务器端批判超线程的运维博客之后的看法,待日后,我们再对该技术进行讨论。