异步、多线程与计算机体系结构的关系

异步与多线程的概念和区别建议看看参考文献中的《C#中异步和多线程的区别》一文

而本篇文章想在此基础上谈谈与计算机体系结构的关系

首先来张冯氏结构体系图

冯氏计算机中,CPU才是核心,而其它都可以看作外设(即外部IO)。图中没有体现内存或者说将内存也归结为外设,这其中的可能原因是早期的计算机没有内存。个人认为在现在的计算机中可以将内存与CPU看作一个整体,其它看作外部IO。

异步出现的目的是解决外设与CPU速度不匹配,而解决方案有两种

第一,硬件层面提供支持DMA功能的硬盘、显卡、网卡等等。比如DOS这种单进程的操作系统同样可以发起异步DMA操作. DMA可以让CPU发起指令后不再等待外设完成操作就可以执行下一步

第二,软件层面由操作系统提供多进程与多线程。进程是一个重量级的资源分配单位且设计成具有隔离和保护应用程序的作用,进程间的通信和调度就变得复杂和昂贵,进程间的通信一般通过IPC的方式,而进程间的调度交由操作系统负责。进程是系统分配资源的基本单位,而线程是CPU调度的基本单位。因此软件层面实现异步简单易行的方式就是多线程编程,现代操作系统下也不支持直接调用硬件异步。

一个进程中可以包含多个线程,线程间可以共享资源,也可以创建资源。其实对于CPU而言,进程与线程的区别并不大。异步编程中要解决的问题包括共享资源的同时访问以及异步的不确定性给程序流程控制带来的协调问题。

在实际编程中多线程可能是异步执行,也可以人为控制按顺序执行。或者应用场景符合异步编程特征,但是我们依然会采用同步编程,比如需要发起远程调用并得到结果后才能执行下一步。

而有些场景则不适合多线程编程,比如CPU密集型操作,线程虽然是个轻量级的调度单位,依然会有一些开销。

现代CPU已经是多核心结构,多线程可以提高CPU的利用率,让尽量多的核心可以同时利用起来。至于线程能否均等的分配到多CPU核心上以及多核心间的调度切换是OS应关注的,对于开发者而言硬件应当是透明的。

参考文献:

C#中异步和多线程的区别

猜你喜欢

转载自www.cnblogs.com/JianY/p/12035505.html
今日推荐