在上学的时候,老师讲到进程与线程的时候可能是这样讲的:
- 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单元,是应用程序运行的载体。
- 线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。
那个时候为了考试我都背下来了,但是心里想说:what?这都是些什么东西? 下面让我来试着用更通俗的语言来给你说说进程、线程、互斥锁、信号量的那些事。
一、房子与居住者
我们可以将自己平时住的房子类比为一个进程,每一个房间及其占用者比喻为一个线程。房子本身并不会做任何的事情,但是线程是房子里面每一个活跃的人,他们平时洗衣、做饭、看电视……,就像线程执行自己的代码一样在运行着。
单线程
单线程就是一个叫做“进程”的房子里面,只住了你一个人,你可以在这个房子里面任何时间去做任何的事情。你是看电视、还是玩电脑,全都有你自己说的算。想干什么干什么,想什么时间做什么就什么时间做什么。
多线程
但是如果你处在一个“多人”的房子里面,每个房子里面都有叫做“线程”的住户:线程1、线程2、线程3、线程4,情况就不得不发生变化了。假如这些线程是你的老婆、孩子、父母。
- 父母老人午睡的时候你不能开音响
- 老婆要看“甄嬛传”,你就不能看球赛
- 孩子没睡觉,你就别想看书
- ……
多线程出现这些问题的根本原因在于”共享资源“:时间、电视、厕所、厨房……等等。那我们下面来看看,如何处理协调使用这些"共享资源"?
二、锁(互斥锁)
在多线程编程中有”锁”的概念,在你的房子里面也有锁。如果你的老婆在上厕所并锁上门,她就是在独享这个“房子(进程)”里面的公共资源“卫生间”,如果你的家里只有这一个卫生间,你作为另外一个线程就只能先等待。
线程对锁的占用是有优先级的,就像在你的家里也有优先级。当你家只有一个卫生间的时候,孩子、老婆、你同时要去上厕所,通常来说 你的优先级是1,你老婆的优先级是100,你孩子的优先级是255。需要说明的是:数值越小优先级越低。但是不同的情况下会有不同的优先级调度算法,关键核心因子是优先级设置与等待时间,如果你确实等待了很长时间,老婆孩子可能看你快憋不住了,让你先去使用洗手间也是可以的。
三、信号量
现在让我们从卫生间走入厨房,首先我们要明确的一点是:厨房里面可以有一个人,也可以有多个人。
那我们怎么控制使用“厨房”这个公共资源的人数(线程数)?一个比较好的方法就是使用信号量。
“信号量”在编程术语中使用单词semaphore,那什么是“信号量”?信号量就好比你家厨房入口架子上摆了三把锅:
- 如果你的孩子热奶拿走一把,你的老婆热汤拿走一把,你的妈妈做菜拿走一把,你想煮面条就没有锅了。当你看到这种情况,你就不会进入厨房了,也就说厨房按照“锅的数量”作为信号量,只能容纳三个人(线程)。
- 当你的老婆热完汤之后,把锅重新放回架子上,你就可以去获得一个锅,你就可以进入厨房了。
所以说:当信号量总数为1的时候,也就是你家只有一把锅,此时信号量作用就等同于互斥锁。
四、专业点好么
来一张专业点的图,别让您误会我是讲故事的。讲技术,我可是认真的!
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。