月泉的博客

并行和并发以及区别

月泉 并发编程

并发

并发?到底什么是并发?我也时常在问自己,什么是并发,但当我想到了现实生活中一个不太可能的例子以后,我想明白了,究竟什么是并发,这是人造的概念但规律却仿佛是神造的一般(指的产生的自然规律),在许多方面我们既是人也是神,假如有3个人去买票,售票员只有一人窗口也只有一个,这是一个排队机制还没有发现的年代,没有排队机制,给三个买票的人都取个名字,分别叫A、B、C,A要买票去北京,B要买票去上海,C要买票去杭州,于是都在柜台同时说了出来,于是面对这三个人,售票员只能选取一人进行下一步操作,于是说B你要买几点的票?B说我要买8点的票,这时候售票员又记起来还有AC,这时候又问A你要买几点的票A也说是8点,这时候售票员又问C你要买几点的票,C也是同样说道要买8点的票,在得知了这些消息后售票员又想起了B要买8点去上海的票,还没有查询,于是马上又把B8点前往目的地的票价告诉了他,于是分别想起了A、C要买票的事情,分别查询将票价告诉了他们,然后各自掏钱,售票员可能先收B的钱,然后再去收C的钱然后再收A的钱然后给A出票然后再给C出票再给B出票

我自己觉得我比喻的非常形象,比喻始终是比喻,落地到实现,来聊聊计算机的多线程并发执行

在单核情况下程序计数器这个寄存器只有一个,而同时在上面执行的也只有一个这个寄存器,这个寄存器好比我比喻描述的售票员,只有一个,同时能再它上面的指令也只有一条,这时候有程序运行了向操作系统申请了资源放入了内存,运行起来产生了进程,假设这个进程中有三个线程(可能更多,仅是比喻),分别是A、B、C线程,这些线程也是有各自的程序计数器用于标识当前线程执行的指令,在比喻中就相当于A、B、C所说的话,3个线程都想执行也没有任何同步机制的情况下,由线程调度器来调度执行,具体调度器具体调度算法,仅做比喻,线程A执行了1条指令于是马上被线程B执行了1条指令马上线程C执行了一条指令,也可能是先执行了线程A,任何线程B、C进行的交替执行,比喻中售票员想起B要买8点的票时,得要去帮B去查询执行,但是执行操作的前提是不是要先想起来B要买8点的票的这个上下文,这也就是线程的上下文切换,需要把之前线程执行的上下文又重新加载进来,综上所述这是计算机上在执行线程上的一种并发

上面又太细粒度,我在概念上在粗粒度的描述下什么叫做并发,并发实际上就是多个任务想要在同一时间上去执行,发出了委托,但实际上的执行可能是交替的也可能是并行的或者某个任务又是没有回应的,想要同一时间去执行即为“并”,同一时间发出的执行即为“发”

并行

并行是什么?到底什么是并行?先做个比喻,我们有5个人想要同时的通过一道门(可以容纳6个人并排通过),于是我们并排走在了一起,一起通过了这条门

假设我们有5个线程同时在CPU上执行那么即意味着我们必须得拥有6个核(没有5个核的CPU,当然这是人造的,你说要去造一个5核CPU也无可奈何,单核单线程的处理器情况),各个核同时对每条线程执行,即像比喻中的并排走在了一起,一起即为为“并”,行为乃至“行”

区别

并发是同时发生的状态它的对立面既是应对,应对的对立面既是发生,而并行是属于同时执行的一种运行机制

月泉
伪文艺中二青年,热爱技术,热爱生活。