并发和并行

  • 多个线程在一个核的cpu上运行,就是并发
  • 多个线程在多个核的cpu上运行,就是并行

在一个核心中,如果多个进程同时进来,那CPU时间片也是一个一个的运行。由于时间片的切换非常快,基本上都是在ms间完成的,所以进程的执行在宏观上是并发的,但是在微观上还是串行的。真正意义上的并行还是需要多个核心。

并发和并行的关系是什么

Rob Pike在一个Talk里提到了很重要的两个观点: Concurrency is not Parallelism Concurrency enables parallelism & makes parallelism (and scaling and everything else) easy 并发不是并行 并发性支持并行性&使并行性(以及伸缩性等)变得容易

前一个观点【并发】和【并行】不是一件事,我们都可以理解了。【并发】说的是处理(Deal)的方法;【并行】说的是执行(Execution)的方法。 后一个观点指的是,如果想让一个事情变得容易【并行】,先得让制定一个【并发】的方法。倘若一个事情压根就没有【并发】的方法,那么无论有多少个可以干活的人,也不能【并行】。 比如你让20个人不铺路,而是一起去拧同一个灯泡,也只能有一个人踩在梯子上去拧,其他19个人只能看着,啥也干不了。对于一个问题,能不能找到【并发】的办法,取决于问题本身。有些问题很容易【并发】,有些问题可以一部分【并发】其余的串行(比如对数组排序就是,无论怎么拆,最终也要把每个拆开的问题结果合并到一起再排序才行),有些问题则根本上就不能【并发】。找不到【并发】的方法也就意味着不管有多少CPU核心,也没法【并行】执行。 换一个极端,假如为最多20个人设计了【并发】的方法,结果来了40个人,就意味着40人里有20个人是闲着的,是浪费。也就是说【并行】的上限是由【并发】的方法的设计决定的。这就解释了你吃鸡的时候,4核CPU和8核差别不大,因为这个游戏压根就没设计成可以利用这么多个CPU核心。(BTW,但游戏被设计为能充分利用显卡的多核心)

如何理解:程序、进程、线程、并发、并行、高并发? - 大宽宽的回答 - 知乎 https://www.zhihu.com/question/307100151/answer/894486042

进程栈和线程栈

  1. 进程栈大小时执行时确定的,与编译链接无关

  2. 进程栈大小是随机确认的,至少比线程栈要大,但不会超过2倍

  3. 线程栈是固定大小的,可以使用ulimit -a 查看,使用ulimit -s 修改

  4. 一般默认情况下,线程栈是在进程的堆中分配栈空间,每个线程拥有独立的栈空间,为了避免线程之间的栈空间踩踏,线程栈之间还会有以小块guard size用来隔离保护各自的栈空间(4K大小的保护页,防止栈溢出),一旦另一个线程踏入到这个隔离区,就会引发段错误。

goruntine https://blog.csdn.net/qq_25870633/article/details/83445946 https://blog.csdn.net/weixin_40165163/article/details/90038008