为什么栈是有界的?

2023-12-06

在我使用过的任何平台上,堆栈大小始终是有限的。您必须在某个时刻(在程序启动之前)指定最大堆栈大小,并且它是预先分配的。为什么堆栈不能是驻留在堆内存中的链表?那么它几乎是无限的。它是当今所有计算机体系结构的固有属性吗?

我的问题与任何特定的编程语言或平台无关。这是纯粹的学术好奇心。

(如果有任何歧义的话,我所说的“堆栈”是指线程存储执行跟踪和参数的内存。)


连续存储的堆栈需要有一个已知的最大大小,以便可以直接在内存中创建多个堆栈,这样的堆栈比以链表实现的堆栈处理速度更快且更容易实现。但在 Windows 和 Linux 上,进程/线程堆栈使用虚拟内存地址空间,因此限制它们的唯一一般目的是在编程语言或编译器方面:

  • 作为断点功能 - 避免:函数的过度或意外递归,以及大值的过度复制。
  • 为了兼容性。

在通常使用的硬件架构中,没有 Stack 的表示。可以使用堆栈强制某些系统上的某些数据进入较低级别,或任何,CPU缓存,但是,嗯……,这是值得怀疑的。

  • For more words:
    • https://en.wikipedia.org/wiki/Stack_machine#Computers_using_call_stacks_and_stack_frames
    • https://en.wikipedia.org/wiki/Call_stack

Linux 和 Windows

在Linux上,进程可以使用自己的虚拟地址空间,因此至少有1个堆栈可以没有大小限制
(因此仅受以下限制:可能的地址数量和存储的数据)

  • 但是进程的附加线程需要有一个已知的最大堆栈大小,我假设它们的堆栈地址是从地址空间的另一侧开始保留的,而不是主线程堆栈的地址。
#include <sys/resource.h>

rlimit *limit = {
    .rlim_cur = RLIM_INFINITY,      // user-settable limit
    .rlim_max = RLIM_INFINITY       // system/admin limit
};
int getrlimit(RLIMIT_STACK, limit);
*limit.rlim_cur = RLIM_INFINITY;
int setrlimit(RLIMIT_STACK, limit);     // set limit for current process

在 Windows 上,没有无限堆栈空间的选项。也许是因为它的进程使用相同的虚拟地址空间,以实现兼容性或性能。或者也许是为了强制安全。

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

为什么栈是有界的? 的相关文章

  • Chunky 界面含义

    在我正在阅读的 应用程序架构设计 一书中 我发现了以下说法 为了减少往返并提高 通讯性能 设计 厚实的接口 谁能解释一下 厚重的界面 是什么意思 基本上 它是指一次调用中传输的数据量 例如 如果您想从服务器获取一组数据 而不是询问 GetR
  • Symfony2 多个应用程序和以 api 为中心的应用程序

    我正在尝试做一个以 Symfony2 为中心的应用程序 并重新使用 Web 前端应用程序的所有捆绑包 该应用程序将分为三个API FrontEnd BackEnd 以便我们可以像Service Bundle一样编码API并在整个应用程序中使
  • 当 Node.js 内部仍然依赖于线程时,它如何本质上更快?

    我刚刚观看了以下视频 Node js 简介 http www yuiblog com blog 2010 05 20 video dahl 并且仍然不明白如何获得速度优势 主要是 Ryan Dahl Node js 的创建者 曾经说过 No
  • 现在N层架构意味着什么?

    从传统意义上讲 N 层意味着将应用程序分成 层 并将每个 层 放在不同的服务器上 这样做至少有 3 个原因 维护 a 代码维护 更容易进行错误修复和功能添加 b 硬件维护 关闭一台服务器不会中断其他层的服务 性能 一台服务器的速度通常不够快
  • BL 服务:异常还是方法结果?

    最好的方法是什么 为什么 V1 try var service IoC Resolve
  • MVC 模型对象、域对象和 DTO 之间有什么区别

    MVC 模型对象 域对象和 DTO 之间有什么区别 我的理解是 MVC 模型对象 对要由相应视图显示的数据进行建模 它可能不会直接映射到域对象 即可能包含来自一个或多个域对象的数据 客户端 可能包含业务逻辑 例如 验证 计算属性等 没有持久
  • python如何表示这么大的整数?

    在C C 和Java中 整数有一定的范围 我在 Python 中意识到的一件事是我可以计算非常大的整数 例如pow 2 100 相同的等效代码 在 C 语言中 pow 2 100 显然会导致溢出 因为在 32 位体系结构中 无符号整数类型的
  • 洋葱结构与六边形结构的比较

    它们之间有什么区别 洋葱 六边形 根据我的理解 它们是相同的 它们专注于应用程序核心的领域 并且应该与技术 框架无关 如果有的话 它们之间有什么区别 另外 我认为使用其中一种架构或什至针对 N 层架构并没有真正的优势 如果做得不好 仅仅遵循
  • 如何将WCF项目平台目标更改为x86?

    我编写了一个使用第三方项目的项目 只有在 项目属性 下的 构建 下的 平台目标 设置为 X86 而不是 我的项目 中的 任何CPU 时 我才能运行它 但是 当我尝试将此第三方项目与我的 WCF 项目一起使用时 平台目标 功能不会出现在 WC
  • 在事务结束时发送事件

    我有一个服务对象的接口 如下所示 为简洁起见进行了简化 public interface ItemService public Item getItemById String itemId int version public void c
  • 存储徽章标准的最佳方式?

    我一直在考虑如何在新网站上实现类似于SO的徽章功能 存储徽章标准的最佳方式是什么 两个想法 All code 第二系统 创建一个元架构来定义徽章及其标准 在数据库中存储一些信息 并让代码查询它以找出徽章及其标准 还有更好的方法吗 Rules
  • 哪种语言(在 JVM 上运行)最适合创建 DSL?

    我们需要创建复杂的固定长度和可变长度字符串 这些字符串可能代表客户资料 订单等 你们建议使用哪种基于 JVM 的编程语言 想法是让最终用户使用此 DSL 创建字符串 所以我正在寻找验证 代码完成等 Groovy http docs code
  • 使用 Google Cloud Functions 实现微服务的 API 网关

    Inputs 例如 我们有一些服务 账户服务 产品服务 支付服务 每项服务都是一个单独的 Google Cloud Function 每个服务都有自己的 HTTP API 例如 账户服务有 https REGION FUNCTIONS PR
  • 如何以 REST方式发送 HTML 表单?

    我有一个名为 事实 的资源集合的 URI 以及该集合中每个 事实 资源的 URI 我相信 创建新 事实 的表单应该使用 GET 来请求 但我无法确定应该将其设置为哪个 URI 对集合 URI 的 GET 应返回 事实 资源 URI 的列表
  • 这叫什么类型的建筑?

    对于我当前正在开发的 Web 应用程序 ASP NET MVC 我们采用以下架构 Data Access Layer 将数据持久保存到任意数据库的逻辑 Domain 数据模型 Service Layer 业务逻辑 例如订单处理 账户管理等
  • SOA架构数据访问

    在我的 SOA 架构中 我有几个世界碳基金服务 我的所有服务都需要访问数据库 我应该创建一个专门的 WCF 服务来负责所有数据库访问吗 或者 如果我的每个服务都有自己的数据库访问权限 可以吗 在一个版本中 我在一项服务中只实例化了一个实体层
  • 就MVC模式而言,Struts 2中使用的Action是什么?

    在Struts2中 控制器将请求分派给Action Action将其传递给后端逻辑 这可以看作是一个非常大的过程 model 处理请求 JSP代表视图 Struts2中如何定义Action 肯定是not一个看法 是控制器还是模型 Strut
  • 您的 Web 服务版本控制最佳实践是什么?

    我们有 2 个独立的产品 需要通过 Web 服务相互通信 支持 API 版本控制的最佳实践是什么 I have 本文 http www ibm com developerworks webservices library ws versio
  • 使用 LINQ to SQL 的 .NET 架构的最佳设计实践(DAL 必要吗?我们真的可以使用 POCO吗?要采用的设计模式吗?)

    我避免在 net arch n 层架构上编写看起来像是另一个线程的内容 但请耐心等待 希望我和其他人一样 在选择用于企业应用程序的架构时 考虑到当今的趋势和新兴技术 仍然没有 100 满意或不清楚应采取的最佳方法 我想我正在寻求大众社区对方
  • 策略模式还是命令模式?

    假设我有一个金融交易列表 我需要针对这些交易执行一系列验证规则 一个例子是我有一笔购买产品的交易 但是首先我需要验证交易中的帐户是否有足够的可用资金 产品没有售完等 由于这些规则 交易将是标记为拒绝 并应指定错误代码 当然 我正在考虑用一个

随机推荐

  • ZF2 apigility - 我们如何验证 json 数据中的集合

    如何使用 Apigility 获取经过验证的 json 值 例如 我需要验证user id under users集合在以下json数据中 log type split food meal type Break Fast meal date
  • 我可以在oracle中从月到日更改范围间隔分区吗

    我有一个表 其分区如下并具有数百万行数据 表大小为 120 GB PARTITION BY RANGE Read time INTERVAL NUMTOYMINTERVAL 1 MONTH 现在我想用现有数据和未来数据更改为这种分区策略 表
  • 使用 JMS 发送消息在退出时挂起

    我正在尝试创建一个 Java 应用程序客户端项目 该项目将 JMS 消息发送到 Glassfish 服务器上的队列 问题是应用程序发送消息后 它在应该退出时挂起 消息传输成功 但由于某种原因应用程序没有退出 我尝试过调试该应用程序 并且可以
  • 当使用 get-content 回显到屏幕时,如何使 powershell 能够解释 ansi 颜色代码?

    我有一个日志文件 其中包含各种文本周围的 ansi 颜色代码 我使用 powershell 语言命令将其回显到控制台 get content logfile log wait 这样我就可以看到最新的日志更改 但是 所有 ansi 颜色代码都
  • 从 WooCommerce 中的所有优惠券中排除产品

    我在互联网上进行了搜索 但尽管有无数人问这个问题 但似乎没有任何答案 有什么办法可以从所有优惠券中排除特定产品吗 我知道你可以在优惠券级别上做到这一点 但这相当混乱 特别是因为很多人都有自动优惠券 几个人创建优惠券等 TLDR 任何使产品排
  • 制作一个位于内容区域之外的 div,但在浏览器窗口缩小时不会导致水平滚动条出现

    假设您有一个网站 其正文背景颜色为红色 内容区域为白色背景 宽度为 1 000 像素 现在 假设您希望内容区域上有一个投影 该投影在内容区域和红色背景的交界处最暗 并且当它从左侧离开左侧和从右侧离开右侧时变得不那么不透明 它基本上看起来像这
  • 未捕获的异常“Swift_TransportException”,消息为“无法与主机 smtp.gmail.com 建立连接 [连接超时 #110]”

    我已经在谷歌中搜索过它并尝试了这里的所有建议堆栈溢出但我仍然得到致命错误 我在用SwiftMailer用于发送和email to GMAIL 它在我的本地主机上完美运行 但是当我上传它并尝试时它给了我一个致命错误 这是我的代码的一部分 re
  • 如何给请求设置Tag并从Response Volley异步请求中获取?

    我有一个带有多个 REST Api 的 Android 应用程序 API 使用 Volley 库进行管理 响应正在得到 并且运行良好 但是当我发出异步请求时 我无法识别每个请求的响应 我的请求方法是这样的 private void http
  • 调整输入文本区域的大小

    我想创建一个自动增长的文本区域 所以我使用this指导 它运行良好 但有一个小问题 当您插入大文本并删除它们时 文本区域的大小超出了应有的大小 每插入一个字符 大小就会减少 1 2 像素 因此插入几个字符后 高度就会再次恢复正常 要重新创建
  • 什么是连续内存块?

    就像标题一样 什么是连续内存块 这是一个由 5 个字节组成的连续内存块 从位置 1 到位置 5 它表示内存中在一起的字节 浅蓝色 它们之间没有间隙字节 白色 这是一组不连续的感兴趣的五个字节 它被分成三组字节 黄色 在位置 4 和 6 处有
  • 回发后下拉不保留所选值

    我正在使用经典的 asp 我有一个下拉列表 用户可以选择然后按提交 他们按下提交后 下拉列表将返回默认值 而不是他们选择的值 无论如何 是否可以在回发之间保持下拉状态 而不是返回默认状态 如果需要可以发布代码示例 谢谢 您必须根据用户发布的
  • 重定向在 unix 内部是如何工作的

    让我们举个例子 我有一个名为 a out 的可执行文件 它包含将一些文本打印到 printf 的 STDOUT cos 的二进制信息 所以当我给出 a out 时 我在控制台 STDOUT 上看到 printf 的输出 假设我在控制台中执行
  • KeyguardManager FLAG_DISMISS_KEYGUARD 服务

    当屏幕打开时 我想检查电源按钮是否激活了它 如果是 它将自动关闭键盘保护并运行吐司 当屏幕关闭时 键盘保护将重新启用 代码到这里为止都有效 但是 当屏幕关闭时 我按下 音量调高 按钮 屏幕就会打开 但它进入检测到 电源 按钮被按下的循环 这
  • ORA-00911: 无效字符 Toad

    我用的是蟾蜍11 5 当我运行多个 truncate 语句时 它给出一个错误ORA 00911 无效字符 truncate table employees truncate table employees edit history trun
  • 如何在 IIS7 中设置应用程序的默认页面?

    我将 Web 应用程序部署到 IIS7 一切正常 但是 我希望它自动转到 www xxxxxx com views root default aspx 而不是输入真正的起始页的 url 我该怎么做呢 只需转到 web config 文件并添
  • 允许 python 子进程的多个输入

    我有一个与几年前提出的问题几乎相同的问题 有两个输入的 Python 子进程收到了一个答案但没有实施 我希望这份报告可以帮助我和其他人澄清问题 如上所述 我想使用 subprocess 来包装一个需要多个输入的命令行工具 特别是 我想避免将
  • sizeof() 如何通过引用参数传递

    我将一个数组传递给函数并尝试查找该数组的长度 但结果却出乎意料 有人可以解释一下吗 int main int array 10 0 func array return 0 void func int arr printf length of
  • 使用 Vue.js 在 .then 函数中输入错误

    我有一个获取请求来检测用户是否是管理员 我的问题是我想使用显示一个按钮v if检查它是真是假 默认情况下该值设置为false Data 然后我们得到了按钮 And the then in beforeCreate 你需要使用一个箭头函数以保
  • Go 中的 int 字符串? [复制]

    这个问题在这里已经有答案了 我真的认为这会很简单 string myInt 看来不是 我正在编写一个函数 它接受一个整数切片 并将每个整数附加到一个字符串中 并在每个整数之间添加一个分隔符 这是我的代码 func xis Int16Slic
  • 为什么栈是有界的?

    在我使用过的任何平台上 堆栈大小始终是有限的 您必须在某个时刻 在程序启动之前 指定最大堆栈大小 并且它是预先分配的 为什么堆栈不能是驻留在堆内存中的链表 那么它几乎是无限的 它是当今所有计算机体系结构的固有属性吗 我的问题与任何特定的编程