这节将会讲述异步编程的相关概念。

如果你没有经历过传统的实时编程,对异步编程方式可能会有些陌生,不过你可能一直都在使用异步编程技术。例如UNIX系统中的脚本命令,均已经设计为异步工作方式。

1.2.1 UNIX是异步的

在任何UNIX操作系统中,进程间彼此异步地执行,即使只有一个处理器。的确,直到现在要给UNIX写一个异步执行的程序还是比较困难的,但是UNIX一直让你相当容易的执行异步操作。例如你通过管道将一个命令的输出定位到另一个命令的输入时,就是启动了几个独立的程序,它们彼此通过管道进行同步。

时间就是同步机制

在很多情形下,你会在一系列过程中提供同步,即使你还没有意识到。例如你编写源代码,再执行编译命令,这个过程总会有一些顺序,而这些顺序同步机制就是时间,这就是实际中的同步。

UNIX中的管道和文件可以是同步机制

在其它情况下,可能用到更为复杂的软件同步机制。例如在输入 ls|more命令时,实际上是将ls的结果定向到more命令的输入,通过设定好的数据依赖性来描述进程间的同步。shell环境会启动这两个程序,这两个程序是并发或者并行执行的,但是more命令在接收到ls的输出之后才可以进一步工作。

UNIX进程包含了需要执行代码的所有信息,所以可以异步执行。操作系统可以保存一个进程的状态而执行其它进程不会收到任何不良影响。任何通用意义的异步执行都必须让操作系统可以任意切换它们足够的状态,但UNIX进程还包括与执行环境不直接相关的附属状态信息,如地址空间和文件描述符

线程就是进程里足以执行代码的部分。在大多数操作系统中,这意味着线程需要包括以下内容:当前指令的位置指针(通常成为计数器或PC)栈顶指针(SP)通用寄存器浮点或地址寄存器。线程还包括像处理器状态和协处理器寄存器等数据。线程不包括进程的其他数据,如地址空间和文件描述符。一个进程中的所有线程共享文件和内存空间,包括程序文本段和数据段

线程比进程更简单

可以将线程理解为减负的进程,精干、简单、快速。系统在线程间的切换速度大大高于进程间的切换,这很大程度上由于线程共享了地址空间。

当系统进行进程切换时,与进程相关的所有硬件状态都会失效。有些可能随着环境的切换过程而改变,如数据缓存和虚拟内存转换入口可能需要刷新。即使不需要立刻刷新,但是这些数据对于新进程而言是没有价值的,每个进程都有独立的虚拟内存空间。

线程使程序不同部分间的高带宽通信更加容易。你不用担心管道之类的消息传递机制或者在不同地址空间共享内存地址的一致性。同步更快,编程更加自然。

1.2.2 世界是异步的

在大自然的世界里,更多的事情发生是异步的。

文档更新时间: 2018-08-26 13:46   作者:李彪