gpt4 book ai didi

terminology - subroutine , co-routine , function 和 thread 之间的区别?

转载 作者:行者123 更新时间:2023-12-03 11:05:09 25 4
gpt4 key购买 nike

在过去的两天里,我一直在阅读 The Art of Programming, vol 1。
有一个关于子程序和协程的话题。
我很困惑。我不明白什么时候书上说协程是在 main() 之后初始化的,不像子例程。此外,被调用的协程成为调用协程的子程序。
我尝试在这里研究先前提出的问题,在相同的上下文中我也开始了解函数和线程的概念。
本书给出了一个使用 MIX 计算机模型的协程示例。
在当今高级语言的上下文中,我可以使用有关协程和其他术语的示例来获得任何简单的伪代码吗?
所以,一个相关的问题:如何区分子程序、协程、函数和线程?

最佳答案

在我们得到真正了解的人的帖子之前,这是我对这个问题的理解,FWIW。

子程序和函数本质上是相同的,但有一个区别:函数返回某种值(通常通过堆栈或 CPU 寄存器),而子程序不返回。无论是子程序还是函数,它都是一个可执行代码块,只有一个入口点。协程也是一个可执行代码块,和子程序一样,它有一个入口点。但是,它也有一个或多个重新进入点。稍后再谈。

在讨论线程之前,让我们回顾一下:计算机程序,也称为进程,通常会将其内存分配组织成代码空间、堆和堆栈。代码空间存储其可执行代码的一个或多个 block 。堆栈存储子程序、函数和协同程序(以及其他东西)的参数、自动变量和返回地址。堆是进程可用于任何目的的广泛开放的内存空间。除了这些内存空间之外,还有 CPU 寄存器,每个寄存器都存储一组位。这些位可以是一个整数值、一个内存地址、一堆状态标志或其他任何东西。大多数程序员不需要对它们有太多了解,但它们就在那里并且对 CPU 的运行至关重要。可能值得了解的是程序计数器、堆栈指针和状态寄存器,但我们不打算在这里讨论它们。

线程是单个逻辑执行流。在原始计算系统中,只有一个线程可供进程使用。在现代计算系统中,一个进程由一个或多个线程组成。每个线程都有自己的堆栈和一组 CPU 寄存器(这通常在物理上是不可能的,但实际上是在逻辑上实现的——我们将在这里跳过一个细节)。然而,虽然进程的每个线程都有自己的堆栈和寄存器,但它们都将共享相同的堆和代码空间。它们也(可能)同时运行;可以在多核 CPU 中真正发生的事情。所以你的程序的两个或更多部分可以同时运行。

回到协程:如前所述,它有一个或多个重入点。重新进入点意味着协同程序可以允许其自身之外的一些其他代码块有一些执行时间,然后在将来的某个时间让执行时间恢复到它自己的代码块内。这意味着每当执行让给外部代码块然后返回到协同程序的执行时,协同程序的参数和自动变量都会被保留(并在需要时恢复)。协同例程并不是在每种编程语言中都直接实现的,尽管它在许多汇编语言中很常见。在任何情况下,都可以以概念方式实现协同程序。 http://en.wikipedia.org/wiki/Coroutine 上有一篇关于协程的好文章.

在我看来,实现协程设计模式有两个主要动机:(1)克服单线程进程的限制; (2) 希望获得更好的计算性能。动机 (1) 清楚地了解进程何时必须同时处理许多事情,而单个线程是必须的。动机(2)可能不太清楚,因为它与系统硬件、编译器设计和语言设计的许多细节有关。我只能想象,通过减少堆栈操作、避免在子例程中重做初始化或减轻维护多线程进程的一些开销,可以减少计算工作量。

高温高压

关于terminology - subroutine , co-routine , function 和 thread 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24780935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com