并发编程


如果逻辑控制流在时间上重叠,那么它们就是并发的(concerrent)。我们主要将并发看做一种操作系统内核用来运行多个应用程序的机制。但是,并发不仅仅局限于内核,它也可以在应用程序中扮演重要角色。使用应用级并发的应用程序被称为并发程序。构造并发程序的方法:多进程、I/O 多路复用、多线程。

应用级并发使用场景如下:
1、访问慢速 I/O 设备:当一个应用下下在等待 I/O 设备(如:磁盘)的数据到达时,内核会运行其他进程,使 CPU 保持繁忙。每个应用通过交替执行 I/O 请求来利用并发。
2、与人交互:我们总是要求计算机有同时执行多个任务的能力。例如:打印文档时,可能想要调整一下窗口大小。每次用户请求某种操作时,一个独立的并发逻辑流被创建来执行这个操作。
3、通过推迟工作以降低延迟:应用程序能够通过先推迟其他操作,然后再并发的执行这些操作,利用并发来降低某些操作的延迟。
4、服务多个网络客户端:创建一个并发服务器,为每个客户端创建一个单独的逻辑流。这就允许服务器同时为多个客户端提供服务。
5、在多核机器上进行并行计算:被划分成并发流的应用程序,通常在多核机器上比在单核机器上运行得快,因为这些流会并行执行,而不是交错执行。


基于进程的并发编程:构造并发程序最简单的方法就是通过进程。例如:在父进程中接受客户端连接请求,然后创建一个新的子进程来为每个新客户端提供服务。
基于 I/O 多路复用的并发编程:假设要求编写一个服务器,既能够响应网络客户端发起的连接请求,又能够对终端交互命令做出响应。在这种情况下,服务器必须响应两个互相独立的 I/O 事件。无论我们先等待哪个都会互相排斥。针对这种困境,使用 I/O 多路复用。让内核挂起进程,只有当一个或多个 I/O事件发生以后,才将控制返回给应用程序。

基于线程的并发编程:线程是运行在进程上下文中的逻辑流,一个进程里可以同时运行多个线程。线程由内核自动调度,每个线程都有各自的线程上下文,包括线程 ID 、栈、栈指针、程序计数器、通用目的寄存器和条件码。线程共享进程的整个虚拟地址空间的所有内容,包括它的代码、数据、堆、共享库和打开的文件。

线程与线程之间没有子父级层次结构,主线程和其他线程的区别仅在于它是第一个被创建的。多个线程组成了一个对等的线程池,一个线程可以杀死它的任何对等线程。

posted @ 2019-06-21 10:46  心随所遇  阅读(199)  评论(0编辑  收藏  举报