本文了解了并发性和并行性的区别,并给出了具体实现方法:任务的说明
图:
任务是把左边的柴堆都搬到右边燃烧,每个任务包括三个过程。 打柴、运柴、添柴烧火。
这三个进程分别对应于一个函数。
geting func get
func carry { carrying }
func unload { unloading }
串行模式
序列表示所有任务都是按照优先级顺序进行的。 麦片意味着只有把柴火装上之后才能运柴火。 送到之后才能取下柴火。 然后,在完成所有这三个步骤后,可以进行下一个步骤。
与稍后介绍的并行相比,串行一次只能获取一个任务来执行该任务。
假设这堆柴火必须搬运四次,当你写下以下代码时,就会进入串行非同时性模式。
for(I=0; i4; I ) {
get () )。
嘉莉()
unload () )
}
或者,将三个进程的代码全部组合到一个函数中也是如此。
func task {
获取
嘉莉ing
取消加载
}
for(I=0; i4; I ) {
task () )
}
两个都是串行的代码模式。 画的说明:
并行模式
并行是指能够同时获取多个任务,并同时执行获取的任务。 并行模式相当于将一个长队列划分为多个短队列,因此并行可以缩短任务队列的长度。
并行化的效率在代码级别上高度依赖于多进程/多线程代码,而在硬件方面则依赖于多核CPU。
因为单进程/单线程只运行一个进程/线程,所以尽管正在同时执行获取的多个任务,实际上该进程/线程会在多任务之间切换以执行它,或者执行它因此,单进程/线程并行化比串行效率低。
对于多进程/多线程,每个进程/线程都可以执行各自捕获的任务。 这是真正的并行处理。
但是,还必须考虑硬件级别的CPU核心数量。 如果只有单核CPU,则从硬件角度看,该单核CPU一次只能执行一项任务。 上述多进程/多线程并行处理也不是真正意义上的并行处理。 多核CPU,而且多进程/多线程并行,才是真正意义上的并行。
下图是多进程/多线程(两个工作者)的并行处理。
同时并行
合并是表示多个任务同时涌入的情况的现象。
例如,同时有500个http请求涌向web服务器。 事实上,在操作系统中执行的进程对CPU来说也是同时发生的。 这意味着所有等待执行的进程都需要CPU。
区分并行很简单,并行是现象,并行是执行模式,是处理并行现象的一种方案。
有时会将并发视为一项任务。 例如,500个并发计数意味着500个任务,这500个任务可以通过单进程/单线程方式处理。 在这种情况下,您可以看到并行不并行的模式(coroutine是典型的并行不并行),并以多进程/多线程方式处理。 在这种情况下,表示同时并行模式。
要解决大并发问题,通常将大任务分解为多个小任务。 因为它可能从其中一个小任务开始执行:
小任务可能已经执行了多次,而且下一个任务还没有开始。 在这种情况下,一般使用队列等数据结构来存储各个小任务的成果
在还没有做好第一步的准备时,就有可能执行第二步。 在这种情况下,一般是复用或异步方式,例如在准备好发生事件通知后才执行某个任务等
这些小任务可以在多进程/多线程中并行执行,也可以在单进程/单线程中执行。 在这种情况下,很可能需要结合复用来提高效率
看图很容易理解:
上图将一个任务中的三个步骤取柴、搬运、撤柴分为独立的小任务。 有拿柴火的老鼠、搬柴火的老鼠、拆柴烧火的老鼠。
如果上图中的所有鼠标都相同,则串行并行。 如果是不同的多个鼠标,则是并行并行并列的。
总结
并行和串行:
序列:一次只能获取一个任务
并行:可以同时以多进程/多线程获取多个任务,并以多进程或多线程同时执行这些任务
注意事项:
对于单进程/单线程并行,效率比串行低
只有单核cpu无法提高多进程并行处理的效率
从任务队列的角度来看,同时从队列获取和执行多个任务相当于将一个长任务队列变为短队列
同时执行:
同时性是指一次流入多个应该处理的任务的现象
这些任务可能并行执行,也可能串行执行
解决大规模并发性的一种思路是将大任务分解为多个小任务。
通过多个进程/多线程并行执行这些小任务
这里介绍用单进程/单线程复用来执行这些小任务。 感谢您关注懒惰的编程c.lanmit.com。
本文地址: https://c.lanmit.com/czxt/Linux/345.html