进程(process)和线程(thread) 是所有学习计算机行业人员绕不过去的两个基本概念,但是它们却十分的抽象,十分不容易理解.
最近总结了一个例子来解释一下,可能要好一点.
1.我们知道,CUP是一个计算机的核心,它就像一个工厂一样,只要启动计算机,它就会一刻不停的运动.我这样假设,这个工厂的名字是xxx工厂,这个工厂里面有5个车间,车间门牌号是,"1","2","3","4","5",每个车间的标准配置(注意,是一个车间的配置)是有10个工人,有一个厕所,有一个三个床位的卧室,一个一次性可以容纳5个人的餐厅.
2.我们假设,这个工厂只能自己发电使用,这样电量就十分有限,每次只能供工厂内的一个车间正常运行.(cpu一次只能执行一个任务)(任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。)
3.我们假设,
星期一:
给车间"1"供电,现在"车间1"正常运行,这个车间生产的是茶叶蛋,它里面只有一个工人
这时候我们就可以这样认为:
一个车间就是一个进程.(一个任务至少有一个进程,每个进程都是拥有空间的或者说资源)
一个工人就是一个线程(线程不具有空间或者说资源) ,这个车间有一个工人,煮茶叶蛋他一个人就可以搞定.(一个进程中至少要有一个线程).
4.
星期二:
给车间"2"供电,现在"车间2"正常运行,这个车间生产的是国产红旗轿车,它里面有10个工人
这时候我们就可以这样认为:
一个车间就是一个进程.(一个任务至少有一个进程)
一个工人就是一个线程 ,这个车间有10个工人,生产一辆红旗轿车,需要多人共同合作才能完成.(一个进程可以包含多个线程)
生产一辆汽车是一件很累的事情,谁累了,就可以到卧室中躺一会休息一下.因为这个卧室是车间的,也就是说这件这10个工人都可以进去--------------(一个进程的内存空间是共享的,每个线程都是可以访问这些共有的内存的)
工作的时候,大家肯定有要上厕所的时候,可是厕所的空间是有限的呀,每次只能容纳一个人,只有你用完出来之后别人才能用.----------------(一个线程使用某些共享的内存是时,其他线程必须等待它使用完了,才能使用)
我们都知道,上厕所的时候,内部都会有一把锁.在计算机中,这把锁是在外边的.
我要蹲坑,于是进入厕所,然后锁上门(别问我怎么把外面的锁锁起来的),后来的人看到厕所上锁了,就会知道里面有人,就会在门口排队,等锁打开了我出来,才能再进去.--------------------这就是"互斥锁"(Mutual exclusion)缩写-Mutex,作用是防止多个线程同时读写某一块共享的内存区域.
而卧室,一次只能容纳3个人,如果有5个人想休息,那么只能进去3个人,剩下的2个就只能在外面等待.(一些内存,只能给固定数目的线程使用).但是剩下的2个人也很想休息,于是也进去,这时候就会产生多个线程互相冲突.怎么解决呢?
很简单:我们给这个卧室的门口放三个门卡(算是一个标志吧),进去一个人,就取走一个门卡,出来的时候放回原处.这样,后面来的人,如果发现门卡没有了,就会排队.------------------------这样的方法就是"信号量"(Semaphore)
其实,互斥锁也是信号量的一种特殊情况,因为互斥锁简单,效率高.所以当保证资源独占的时候,采用这种设计.