在过去的两天里,我一直在阅读“编程艺术”第一卷。
有一个关于子例程和协同作用的主题。我很困惑。我无法理解什么时候书中说协同线是在main()之后初始化的,这与子程序不同。此外,被调用的协同线成为调用协同线的子例程。
我试着研究之前提出的问题,在这里我也了解了函数和线程的概念,在相同的背景下。这本书给出了一个使用混合计算机模型的协同线的例子。在今天的高级语言环境中,我可以使用一个关于协同和其他术语的例子,得到任何简单的伪码吗?
那么,一个相关的问题是:如何区分子例程、协同线、函数和线程?
发布于 2014-07-16 16:03:21
直到我们得到一个真正知道的人的帖子,这是我对这个问题的理解,FWIW。
子例程和函数本质上是一回事,但有一个区别:函数返回某种值(通常通过堆栈或CPU寄存器),而子程序不返回。无论是子例程还是函数,它都是一个可执行代码块,只有一个入口点。协同例程也是一个可执行代码块,就像子例程一样,它有一个入口点。然而,它也有一个或多个再入境点。稍后再谈这个。
在进入线程之前,让我们回顾一下:计算机程序(也称为进程)通常会将其内存分配组织为代码空间、堆和堆栈。代码空间存储其可执行代码的一个或多个块。堆栈存储参数、自动变量以及子例程、函数和共例程的返回地址(以及其他东西)。堆是进程可用于任何目的的大范围的内存空间。除了这些内存空间外,还有CPU寄存器,每个寄存器存储一组位。这些位可以是一个整数值、一个内存地址、一堆状态标志或其他任何东西。大多数程序员不需要对它们有太多的了解,但是他们在那里,对于CPU的操作是必不可少的。可能值得了解的是程序计数器、堆栈指针和状态寄存器,但我们不打算在这里讨论它们。
线程是一个单一的逻辑执行流程。在原始计算系统中,进程只有一个线程可用。在现代计算系统中,一个进程由一个或多个线程组成。每个线程都有自己的堆栈和CPU寄存器集(这在物理上是不可能的,但在逻辑上是虚拟的--我们将在这里略过这个细节)。但是,虽然进程的每个线程都有自己的堆栈和寄存器,但它们都将共享相同的堆和代码空间。它们也(大概)同时运行;在多核CPU中可以真正发生一些事情。因此,程序的两个或多个部分可以同时运行。
回到共同例程:正如前面提到的,它有一个或多个重返点。重新进入点意味着共同例程可以允许外部的其他代码块有一些执行时间,然后在以后的某个时间让执行时间恢复到它自己的代码块中。这意味着,每当将执行交给外部代码块时,将保留协例程的参数和自动变量(如果需要的话),然后返回到共同例程的参数和自动变量。协同例程并不是在每种编程语言中都直接实现的,尽管它在许多汇编语言中是常见的。在任何情况下,都有可能以概念性的方式实现共同例程。http://en.wikipedia.org/wiki/Coroutine有一篇很好的关于共同例程的文章。
在我看来,实现共同例程设计模式有两个主要动机:(1)克服单线程进程的局限性;(2)希望获得更好的计算性能。动机(1)很清楚,当进程必须同时处理许多事情时,其中一个线程是必须的。动机(2)可能不太清楚,因为这与系统硬件、编译器设计和语言设计的许多细节有关。我只能想象,通过减少堆栈操作、避免在子例程中重做迭代或减轻维护多线程进程的一些开销,计算工作量可能会减少。
HTH
发布于 2014-10-07 00:28:09
专注于coroutine和子例程:
Coroutines可以产生结果,这是很有趣的。
让“记住”的地方,共同例程是如此,当它再次被调用,它将继续在它停止的地方。
例如:
coroutine foo {
yield 1;
yield 2;
yield 3;
}
print foo();
print foo();
print foo();印刷品:1 2 3
注意: Coroutines可能使用返回,并且行为就像子例程一样。
coroutine foo {
return 1;
return 2; //Dead code
return 3;
}
print foo();
print foo();
print foo();印刷品:1 1 1
发布于 2017-09-30 17:11:13
我想详述一下现有的答案,并补充如下:
在一段代码的调用中存在四个主要概念:
在子程序创建和恢复与“调用”指令同时进行-一个堆栈帧被分配,参数和返回地址被推送,执行跳转到被调用的代码段。另外,分离(恢复调用者)和销毁是与“返回”指令堆栈帧被取消分配同时进行的,控制被转移到调用者(通过先前提供的返回地址),调用方被允许清除堆栈上的垃圾以选择返回值(取决于您的调用约定)。
在协同过程中,这些主要概念是独立存在、相互解耦的。您在某个时候创建一个协同线,然后您可以稍后将控制权转移到它(因此它可以给您一些结果,可能是多次),然后您可以在稍后的某个时间点销毁它。
https://stackoverflow.com/questions/24780935
复制相似问题