咱们的CPU是分时运行的。能够同时运行多个程序,可是同一时间只能运行一个,可是切换的很快,就会给人的感受是同时运行多个程序。一个CPU能够运行3个程序,那多核的CPU就能够运行更多的程序。编程
进程也能够给优先级,多分配一些CPU。安全
当这个程序执行完了,或者分配给他的CPU执行时间用完了,那它就要被切换出去,等待下一次CPU的临幸。在被切换出去的最后一步工做就是保存程序上下文,由于这个是下次他被CPU临幸的运行环境,必须保存。多线程
先加载程序A的上下文,而后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,而后开始执行B,保存程序B的上下文。并发
进程和线程就是这样的背景出来的,两个名词不过是对应的CPU时间段的描述,名词就是这样的功能。异步
进程就是包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文。线程
若是咱们把进程比喻为一个运行在电脑上的软件,那么一个软件的执行不多是一条逻辑执行的,一定有多个分支和多个程序段,就比如要实现程序A,实际分红 a,b,c等多个块组合而成。进程
这里a,b,c的执行是共享了A的上下文,CPU在执行的时候没有进行上下文切换的。这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,是更细小的CPU时间段。内存
计算机的核心是CPU,它承担了全部的计算任务。它就像一座工厂,时刻在运行。资源
一个车间开工的时候,其余车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。同步
进程就比如工厂的车间,它表明CPU所能处理的单个任务。任一时刻,CPU老是运行一个进程,其余进程处于非运行状态。
一个车间里,能够有不少工人。他们协同完成一个任务。
线程就比如车间里的工人。一个进程能够包括多个线程。
每间房间的大小不一样,有些房间最多只能容纳一我的,好比厕所。里面有人的时候,其余人就不能进去了。这表明一个线程使用某些共享内存时,其余线程必须等它结束,才能使用这一块内存。
一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁",防止多个线程同时读写某一块内存区域。
一个软件能够开启多个进程,共同工做。
附上多线程编程的概念。
这儿先讲一个场景。这个场景是这样子的,山上有座庙(进程),庙里住了不少小和尚和老和尚(线程),固然隔壁山上也有不少尼姑妹子。小和尚和老和尚们天天都须要下山挑水喝。这些个和尚有刚上山的(就是有点傻的),有比较聪明的,也有闹过矛盾的。场景,人物呢,大概就是这么个样子。俗话说的好,有人的地方就有江湖。这些个小和尚,老和尚都不是很安分,为了天天的这个挑水工做闹了不少不少的矛盾,也犯过不少傻。下面对挑水工做全部发生的状况作个详述:
1)刚上山的小和尚挑水,就是比较傻的那个,和别人都不认识,天天挑水都本身一我的,一次挑一桶水,一天下来发现挑的水根本不够喝。(串行)
2)和尚里面有个力气大的,和别人关系很差,每次挑水能挑三桶左右,一天下来,发现挑的水勉强够喝。 (并发)
3)和尚里面有几个关系好的,力气也比较大,每次挑水都一块儿去,每一个人都能挑两桶左右,一天下来,发现挑的水不只够喝,还有时间帮隔壁山尼姑妹子挑水。 (并行)
4)在水井里打水,有个专门的妹子负责打水,比较傻的那个小和尚每次都盯着打水的妹子,还随时随地看水桶装满没有(同步);固然,有傻的,也有聪明的,这个聪明的和尚在妹子打水的时候,就伺机在一旁休息,水打满之后,妹子都过来告诉他。(异步)
5)水井里有一天没水了,傻和尚看见水井里没水之后,在水井边上一直等着,等有水了再挑回去(阻塞);聪明和尚呢,看见水井里没水了,一点都不犹豫的回去了。(非阻塞)
6)又有一天,那闹过矛盾的两个和尚挑水,正好狭路相逢,谁也不让谁过去,一直僵持着。(死锁)
7)寺庙里厨房空间有限,每次只能进去必定数量的和尚,当厨房满了之后,其余人只能在外面等着,直到里面的人出来。这个实现的方法是,厨房门口挂了不少锁,每一个人进去之后都拿走一把锁,出来之后把锁挂上,这样外面的人就能够知道厨房里面人满没满。(信号量)
下面解释下多线程。仍是上面的例子,在这个寺庙里面,若是天天都由那个新来的傻子和尚挑水喝,确定是不行的,有的喝没得喝咱且不说,你让他累死了咋整。况且寺庙里那么些个空着的水桶那么些个不干活的人闲着也是闲着。因此多线程的意思就是多个线程一块儿去协同完成一个任务,经过充分去共享资源来达到提高效率的一种编程思想。固然,在这个过程当中会遇到不少麻烦,好比会碰上死锁的问题,同时去争抢同一个资源的问题等等。为了解决这个问题,使用加锁这个方法避免,固然,使用锁,会在必定的程度上印象执行的效率,咱们须要在效率和安全之间寻找一个平衡点。