单线程计算机上的异步方法



记忆中程序的解剖结构指出,在过程的Memory-mapped segment中映射了库(dlls等)。现在,当一个进程运行并调用库的函数时,我相信线程的program counter (PC)更改为函数代码在内存映射段中的位置,然后在执行完成后,返回到code-segment。如果函数是同步的,这是有道理的,因为我们等待函数调用完成,然后在code segment中向前移动。

现在,考虑一个异步编程模型。库说mysql.dll已加载在memory-mapped segment中,主代码在DLL中称为异步功能。异步函数意味着线程PC在代码中向前移动,并且当呼叫的异步过程完成时,线程会得到呼叫。但是,在这种情况下,异步过程在线程的地址空间内。线程只能具有一个开始在DLL中执行该函数的PC。因此,代码段中的主要程序停滞不前。

这使我相信异步程序在单线程系统中不好,因为在异步函数完成之前,该程序不能向前推进。如果允许多个线程,则MySQL.dll可以产生一个新线程(将具有自己的PC)并将控件返回到code-segment中的呼叫者。code-segment中的PC将继续前进,因此,我们可以看到一些并行化。

我知道我在某个地方错了,因为在单线程系统(例如:javascript)中,异步编程很有可能。。我有疑问。这些可能/可能不是我混乱的根源: -

  • 每个库是与链接过程共享地址空间还是有自己的地址空间?
  • 如果库有自己的地址空间,则意味着它是一个单独的过程。这是否意味着在库中调用功能和库调用回调,涉及IPC机制?

编辑:上面的问题可能会令人困惑。因此,我将在此处使用一些符号来解释主要情况。

线程只能有一台PC。假设是一个单线程环境。Process P1具有线程T1。说P1,引用异步函数的库L1。加载过程中的L1将映射到P1的内存映射段。现在,当T1中的代码调用L1的异步函数时,T1的PC(程序计数器)移至L1段以执行异步函数。一台PC不能在两个地方。因此,直到异步功能完成之前,T1才继续进行。那么,异步如何在单个螺纹环境中受益?

"但是,在这种情况下,异步过程在线程的地址空间内"

想这是什么意思?同步和异步的一个过程都有多个指示:程序对抗指向始终不超出线程的地址范围(不是空间)的代码,而堆栈框架和堆栈顶级指针始终属于线程的地址范围和仅在运行过程时使用。

因此,从地址的角度来看,同步案例与同步案例没有什么不同。

和地址空间始终属于一个过程,而不是库或线程。每个库和线程每个占据公共地址空间的零件(范围) - 仅使它们可以一起工作。

updt

"当T1中的代码调用L1的异步函数时,T1的PC(程序计数器)移至L1段以执行异步函数" - "不,不是的。当PC移动时,这是一个同步调用。异步调用是安排一项任务,该任务以后执行异步程序。参见https://en.wikipedia.org/wiki/asynchronous_method_invocation

最新更新