假设有很多程序在同一时间运行。
运行的每个可执行程序是否在RAM中有其自己的代码,数据和堆栈段,或者是整个RAM分成4个段,并且每个段都保存每个程序的相应段。每个程序在内存中都有其自己的分段段(代码,堆栈,数据)吗?
回答
这取决于两个因素:
- 您的部署架构
- 您的操作系统,如果你是在x86上常见的主流的Linux,Windows上运行的运行您的程序
,BSD则
- 每个进程都有它自己的私有虚拟RAM
- 所有段文本(代码),堆,数据是在相同的逻辑地址空间(虚拟RAM段)
历史86被设计成具有的能力,以支持分段存储器,但操作系统从未使用它和对它的支持最初在AMD64中下降了。尽管最近的处理器再次支持它用于虚拟化和虚拟机管理程序。 Userland应用程序通常在今天不分割的情况下部署
那么这意味着每个程序都有一定量的内存,例如100 MB,并且程序会将这100 MB划分为堆栈,数据和代码段? – user1660982
@ user1660982或多或少。现在每个程序都有256TB的虚拟RAM(在原始状态下不可用)。程序代码自动放置在某处,并调用请求内存('mmap'和family)将您的新内存映射放置在尚未使用的虚拟空间中的任何位置。操作系统通常决定放置新映射的位置,但是您的程序可能会提示它想要的位置。 –
你甚至可以争辩说,每个程序是“唯一的”给予128TB的VRAM,因为内核将占用另一半,但是这又是依赖于操作系统的 –
简短的回答:这取决于硬件和操作系统运行它的。
通常,每个进程都有自己的虚拟内存空间,为它似乎像在计算机上运行的唯一进程的假象。该虚拟内存空间被操作系统划分为代码/数据/堆栈段(这些通常具有固定/通用地址)。
至于物理内存的使用,这完全取决于操作系统 - 它可以使用的RAM不同的部分,因为它为所欲为,而节目甚至不知道这件事。
这个问题是操作系统特定的,而不是C特定的。
一般来说,操作系统在每个进程中维护一个执行上下文,该执行上下文包含堆栈和运行时标志,但是如何在不同系统之间分配malloc
之类的内存。
为您不妨深入钻研的malloc
documentation.
- 1. 每个线程都有自己的堆栈吗?
- 2. 每个进程都有自己的内核堆栈,对吧?
- 3. BSS,堆栈,堆,数据,代码/文本 - 其中每个内存都在哪里启动?
- 4. 用于查找程序的堆段或堆栈段大小的代码片段
- 5. 在linux中,所有内核进程共享相同的内核堆栈,每个用户进程都有自己的堆栈,对吗?
- 6. 堆VS数据段VS堆栈分配
- 7. 每个php-fpm池都有自己的内存池吗?
- 8. 堆栈分配过程及其数据段的占用情况
- 9. 堆,堆栈和数据段在同一个汇编程序上吗?
- 10. 每个应用程序是否都实现了自己的网络堆栈?
- 11. 每个'HttpRequest'在ASP.NET中都有自己的线程吗?
- 12. 我会在这段代码后最终耗尽堆栈内存吗?
- 13. C++堆栈数据结构。这段代码有什么问题?
- 14. 如何运行两个片段,每个都有自己的AsyncTasks
- 15. 每个用户都有自己的数据库表吗?
- 16. 两个片段之间的通信,每个片段都有自己的活动
- 17. 是所有的程序代码加载到内存的文本\代码段\段
- 18. 程序的每一行都有自己的地址吗?
- 19. 每个存储库都有自己的hg serve实例吗?
- 20. 密码salt应该存储在数据库的自己的字段中吗?
- 21. C程序的堆栈和堆内存
- 22. 内存中的堆栈实际上是一个堆栈吗?
- 23. 多缓存可以有自己的etags标记堆栈吗?
- 24. 如果大部分数据都堆在堆栈上,堆栈内存的主要重要性/作用是什么?
- 25. 每个进程都有自己的stdin,stdout和stderr吗?
- 26. 每个进程都有自己的页表吗?
- 27. Visual studio 2010 - 数据段和堆栈内存相同
- 28. 为什么堆栈或堆段中的代码可以执行?
- 29. 每个GAE实例是否有其自己的内存缓存?
- 30. 内存分配,堆栈和堆栈
如何它Hardware的处理和操作系统视,好了,硬件和操作系统的不同更多的信息。但通常是的,每个进程都有自己的代码,堆,堆栈等。 –
在[Apollo引导计算机](http://en.wikipedia.org/wiki/Apollo_Guidance_Computer)中,所有进程都使用相同的内存。 –
一般吗?来吧,我们不是在说99.9%吗?具有特定的例外情况,如共享内存等。一般来说,程序不能在每个处理空间运行的同时进行修改。 – Jiminion