标签:多处理器 快速 地址 特性 任务切换 上下文 优点 task 相关
计算机术语中的"并发",指的是在单个系统里同时执行多个独立的活动,而不是顺序的一个接一个的执行。
对于单核CPU来说,在某个时刻只可能处理一个任务,但它却不是完全执行完一个任务再执行一个下一任务,而是一直在任务间切换,每个任务完成一点就去执行下一个任务,看起来就像任务在并行发生,虽然不是严格的同时执行多个任务,但是我们仍然称之为 并发(concurrency)。
真正的并发是在在多核CPU上,能够真正的同时执行多个任务,称为 硬件并发(hardware concurrency)。
并发并非没有代价,在单核CPU并发执行两个任务需要付出上下文切换的时间代价。如下图:
假设A和B两个任务都被分成10个大小相等的块,单核CPU交替的执行两个任务,每次执行其中一块,其花费的时间并不是先完成A任务再完成成B任务所花费时间的两倍,而是要更多。这是因为系统从一个任务切换到另一个任务需要执行一次上下文切换,这是需要时间的(图中的灰色块)。上下文切换需要操作系统为当前运行的任务保存CPU的状态和指令指针,算出要切换到哪个任务,并为要切换的任务重新加载处理器状态。然后将新任务的指令和数据载入到缓存中。
将应用程序分为多个独立的、单线程的进程,他们可以同时运行。
这些独立的进程可以通过常规的进程间通信机制进行通信,如管道、信号、消息队列、共享内存、存储映射I/O、信号量、套接字等。
缺点:
优点:
线程很像轻量级的进程,但是一个进程中的所有线程都共享相同的地址空间,线程间的大部分数据都可以共享。线程间的通信一般都通过共享内存来实现。
优点:
缺点:
主要原因有两个:任务拆分和提高性能。
在编写软件的时候,将相关的代码放在一起,将无关的代码分开,这是一个好主意,这样能够让程序更加容易理解和测试。将程序划分成不同的任务,每个线程执行一个任务或者多个任务,可以将整个程序的逻辑变得更加简单。
在两种情况下,并发能够提高性能。
当然,也并非线程越多系统的性能就越好,线程的数量要根据具体的处理器数量来决定。假设只有一个处理器,那么划分太多线程可能会适得其反。因为很多时间都花在任务切换上了。
并发和并行:
并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
并发(concurrency):指在同一时刻只能有一条指令执行,但多个任务指令被快速的轮换执行,使得在宏观上具有多个任务同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个任务快速交替的执行。
Erlang 之父Joe Armstrong 曾经以人们使用咖啡机的场景为例描述了这两个术语:
C++ 11标准加入了对多线程的支持。并且,在C++ 14和C++ 17标准中又对并发编程机制进行了增强。
GCC 对于C++特性的支持请参见这里:C++ Standards Support in GCC。
C++标准与相应的GCC版本要求如下:
C++版本 | GCC版本 |
---|---|
C++11 | 4.8 |
C++14 | 5.0 |
C++17 | 7.0 |
默认情况下编译器是以较低的标准来进行编译的,如果希望使用新的标准,你需要通过编译参数-std=c++xx
告知编译器,例如:
g++ -std=c++17 file.cpp -o program
标签:多处理器 快速 地址 特性 任务切换 上下文 优点 task 相关
原文地址:https://www.cnblogs.com/xiaojianliu/p/12630324.html