今天刚毕业的新人问我关于多线程的问题,由于我也没有理解透彻,一时没有解释清楚,如今细想类比蕃茄炒蛋,整理了下:安全
IIS是一个天生的多线程程序。
比如,一个订单请求过来,就放出一个厨师作蕃茄炒蛋,再来一个新订单,再放一个厨师出来作蕃茄炒蛋。厨师作完菜,就回房休息。
由于是多个CPU,多核,能够安排N个厨师同时干活。每一个厨师参照同一份菜谱(程序代码)作菜,各自记下本身的步骤。
若是仍是嫌上菜速度太慢,那就要修改菜谱,原来的菜谱是对针对一口锅写的,如今咱们拿来两口锅。
原来的菜单相似于这样:
第一步:准备好一只蛋,和一只蕃茄。
第二步:把蛋放在锅里烧1分钟+,起锅拿出蛋。
第三步,把蕃茄放在锅里烧1分钟+,混入炒蛋。
第四步,翻炒1分钟后起锅。多线程
改进后的新菜单相似于这样:
第一步:准备好一只蛋,和一只蕃茄。
第二步:同时点火两口锅,分别放入蛋和蕃茄,各烧1分钟+。
第三步,看蛋先熟仍是蕃茄先熟,先熟的食材的锅先安排熄火。
第四步,待慢热的另外一个食材也烧熟后,将两种食材混和翻炒,而后起锅。线程
如今每一个厨师拿到新的菜谱后开工,工做效率明显提高了,每份蕃茄炒蛋大约省下1分钟的时间。指针
值得注意的是,厨师们仍是只参考同一份菜谱,并无各自复印,但他们各自干活时会记下各自的工做进度(指令指针和私有变量)。
两口锅工做时,锅里的食材不同,进度不同,可是仍是参考同一份菜谱,各自关注锅内食材的成熟度(指令指针和私有变量)。
厨房的排风扇,水龙头,电灯,燃气,是全部人共享的。
电灯你们都用,下班后最后走的那我的关灯,不会冲突,没有问题。
燃气分别为每口锅各自提供接入,各自开关,不会冲突,没有问题。
水龙头每一个人都要用到,并且一个水龙头你们共用,只能一我的接水,这就很容易发生水资源抢占的问题。
最糟糕的状况时,我正准备接水的时候,别人高处截流,致使我一直接不到水,结果鸡蛋炒糊了,油锅都起火了,这就很不安全了。
因此多线程程序会额外引入资源分配,线程同步的问题。
一般的作法是,协调好厨师们用水的方式,好比约定排队取水,先到先得,用完即走。资源