子程序、协程、函数和线程之间的区别?

2024-01-10

过去两天我一直在阅读《编程艺术》第一卷。

有一个关于子程序和协程的主题。 我很困惑。我不明白书上说协程是在 main() 之后初始化的,这与子例程不同。此外,被调用的协程成为调用协程的子例程。

我尝试研究之前在这里提出的问题,在相同的上下文中我也了解了函数和线程的概念。 本书给出了一个使用 MIX 计算机模型的协程示例。 我可以使用有关当今高级语言上下文中的协程和其他术语的示例来获得任何简单的伪代码吗?

那么,一个相关的问题:如何区分子例程、协程、函数和线程?


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

子例程和函数本质上是同一件事,但有一个区别:函数返回某种值(通常通过堆栈或 CPU 寄存器),而子例程则不然。无论是子例程还是函数,它都是一组可执行代码,只有一个入口点。协同例程也是一块可执行代码,并且就像子例程一样,它有一个入口点。然而,它也有一个或多个重新进入点。稍后会详细介绍这一点。

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

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

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

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

HTH

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

子程序、协程、函数和线程之间的区别? 的相关文章

  • 序列化和封送处理有什么区别?

    我知道就几种分布式技术 例如 RPC 而言 使用了术语 编组 但不明白它与序列化有何不同 它们不是都将对象转换为一系列位吗 Related 什么是序列化 https stackoverflow com questions 633402 wh
  • “精化”的反义词是什么

    在世界上通用编程的概念细化很常见 特别是给定一个概念C1 那么我们说一个概念C2提炼C1如果它提供了所有功能C1甚至可能更多 怎么称呼逆关系呢 因此 如果C2是一个细化C1 then C1是一个什么C2 语言学中有两个术语定义了本主题中讨论
  • VSCode 上的 pwa-node 类型启动配置是什么?

    我注意到 VSCode 为 npm 调试生成的默认启动配置 通过 NPM 启动 默认将配置类型设置为 pwa node 添加 通过 NPM 启动 配置 生成的配置类型 我搜索了一下 但没有找到它的含义 也许与渐进式网络应用程序有关 有谁知道
  • Python 中的模块和包有什么区别?

    Python 中的模块和包有什么区别 也可以看看 包 和 模块 有什么区别 https stackoverflow com questions 3680883 whats the difference between package and
  • “编译时分配的内存”到底是什么意思?

    在 C 和 C 等编程语言中 人们经常提到静态和动态内存分配 我理解这个概念 但 所有内存在编译时都被分配 保留 这句话总是让我感到困惑 据我理解 编译是将高级 C C 代码转换为机器语言并输出可执行文件 编译文件中的内存是如何 分配 的
  • 经常使用很少定义的术语:左值

    什么是左值 An lvalue是一个可以分配给以下对象的值 lvalue rvalue 它是 左值 或 左手值 的缩写 基本上就是left of the 符号 即您分配的值 作为一个例子 什么是not左值 即仅右值 printf Hello
  • 这第二个新的是什么?

    第二行是什么 在回答另一个问题时看到的 int x new int 1 int y new x int 第二行之后 x 和 y 具有相同的值 指向相同的位置 y x 和第二行有什么区别 它像构造函数还是什么 It s 安置新 http en
  • 缓存与分页

    所以我在上计算机体系结构课 我想我很难区分缓存和页面 我能想到的唯一解释是 页面是操作系统欺骗程序的方式 让程序在指定的内存区域中完成所有工作 而高速缓存是硬件欺骗操作系统从指定区域读取数据的方式 记忆区域 而实际上并非如此 操作系统是否指
  • 什么是多字节字符集?

    术语 多字节 是指其字符可以 但不必 宽于 1 个字节的字符集 例如 UTF 8 还是指在任何情况下都宽于 1 个字节的字符集 例如 UTF 16 换句话说 如果有人谈论多字节字符集 这意味着什么 该术语含糊不清 但在我的国际化工作中 我们
  • C# 4.0 的新“命名参数”功能不应该称为“命名参数”吗?

    我想这种命名可能有历史原因 而且其他语言也有类似的功能 但在我看来 参数在 C 中总是有一个名称 参数是未命名的参数 或者选择这个术语有什么特殊原因吗 哦 你想要论点 抱歉 这是参数 参数是左边大厅里的两扇门
  • pycharm中的源和资源根是什么?

    我正在开发一个关于 NLP 的项目 我有一个很大的语料库和一些代码 我想在我的项目中将它们分开 但我想知道选择正确的名称是什么 数据与代码就像汇编中的数据段和代码段 或者 来源和资源正如我的一位朋友所坚持的那样 这是正确的术语 我还在 py
  • 惰性求值和短路求值有什么区别?

    来自维基百科 惰性评估 http en wikipedia org wiki Lazy evaluation is 在编程语言理论中 惰性求值或按需调用是 延迟表达式求值的求值策略 直到需要它的值为止 短路评估 http en wikipe
  • 多处理和并行处理之间的比较

    有人能告诉我多处理和并行处理之间的确切区别吗 我有点困惑 感谢您的帮助 多重处理 多重处理是使用两个或多个中央处理单元 单个计算机系统中的 CPU 该术语还指 系统支持多个处理器和 或的能力 在他们之间分配任务的能力 并行处理 在计算机中
  • 交互设计、视觉设计、网页设计、UX设计、UI设计、UI开发之间有什么区别? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 交互设计 视觉设计 网页设计 UX设计 UI设计 UI开发之间有什么区别 BTB 下面找到的链接回答了 UI 与 UX 的问题 htt
  • 柯里化和部分应用有什么区别?

    我经常在互联网上看到各种抱怨 认为其他人的柯里化示例不是柯里化 而实际上只是部分应用 我还没有找到关于什么是部分应用或者它与柯里化有何不同的合理解释 似乎存在普遍的混乱 等效的示例在某些地方被描述为柯里化 而在其他地方则被描述为部分应用 有
  • 网络中的端口是什么? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在学习java网络 我不清楚什么
  • 网站和网络应用程序有什么区别? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我很难自己找出网站和网络应用程序之间的区别 在我看来 网站指向特定页面 而 Web 应用程序更像是内容和信息的某种 门户 但我遇到的问题是 仍然
  • 什么是对象分解?

    我试图理解对象分解的含义 并在互联网上阅读了很多内容 但每个资源都用大量我无法理解的关键字进行讨论 因此 这些资源希望您了解一些术语 我需要一些从头开始列出分解基础知识的东西 它不仅仅是将设计分解为对象吗 如果没有 任何描述将不胜感激 提前
  • 什么是 API 密钥? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如今 我几乎在每个跨服务应用程序中都看到这个词 API 密钥到底是什么以及它的用途是什么 另外 公共 API 密钥和私有 API 密钥
  • CSS 属性名称中的“font-”与“text-”

    CSS 属性名称中使用的术语 文本 和 字体 有什么区别 它们的含义是否相同 或者以以下开头的 CSS 属性名称之间是否存在语义差异font 和一个开头text 例如 为什么我们有这些 CSS 属性 font size 34px text

随机推荐