鱼C论坛

 找回密码
 立即注册
楼主: _nosay丶

虚拟空间,物理空间

[复制链接]
 楼主| 发表于 2012-7-4 11:27:29 | 显示全部楼层

是不是这样理解:内存像一个客栈,进程就像是房客,不断有新的来,旧的走,操作系统是房东,他见缝插针,每次有新的住客过来,他把已经离开的房客的房间“指引”给新的房客,这个房间的地址就是实际物理地址,那么虚拟地址呢,跟定在这个房客身上,但具体是什么?(这个理解是从你“显然在某个瞬间,某个程序正在使用的内存不可能非常大”这句话得到的启示,就是说一个程序中的malloc不是同时调用的,而是运行到这个malloc的时候才会申请内存,free的时候,它住过的房间就可以给别的房客用,再malloc的时候,就相当于它又回到客栈,但操作系统不管,他只管做生意赚钱,他不管是不是之前来过的,他都当于新来了一个客人,为他找空间的房间,理解的怎么样

明天帮忙回答第三个问题的时候,可不可以附带回答这个问题:总内存4GB,一般是实际内存2GB+从硬盘上划出来的2GB虚拟内存,所以“某个游戏程序使用的4GB=实际内存0.5GB+硬盘上3.5GB“这句话又勾引我问出这样的问题,这个3.5GB不是超过了硬盘“相助”的2GB吗,我知道从硬盘分多大的空间作为虚拟内存是可以设置的,另外一点我不明白,目前大众的CPU寻址都不能超过4GB,虚拟内存设置大了也没用,那么这个数字可设置是为了以后高端的CPU准备的吗?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-4 11:27:51 | 显示全部楼层
仰望天上的光 发表于 2012-7-4 09:49
回复累得要死,Tzdner_C 你来当版主吧,多回答问题也能把学到的知识巩固下。

哥。。。我只会汇编和C,这是C++和C论坛,所以很多问题我解决不了,还有俺也是处于学习阶段。。。学习压力挺大的,还有半年毕业了。。。开始上班了,闲时间多了,再说{:1_1:}    发现这里还是你能镇的住,懂底层,懂开发。。。基础扎实。。。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-4 11:35:49 | 显示全部楼层
仰望天上的光 发表于 2012-7-4 09:51
8086   20根地址线好不好?不学8086你难道直接就明白其它CPU的结构?

8086学习过,4GB说成64位二进制,8086说成1G寻址能力,这两天在梦游。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-4 11:37:15 | 显示全部楼层
_nosay丶 发表于 2012-7-3 22:56
每个进程都占有4G内存,是能寻址4G,不是拥有,就是说可利用的4G空间放那里是固定不变的,每个进程都有能 ...

我现在正好正在学习windows保护模式。。。你想想,不是每个电脑的物理内存都是4G啊,还有1G的2G的,我用的本本是512M的:loveliness:。。。那4G如何实现?程序员编程是不是还要根据自己的实际物理内存来编程?所以操作系统就用这样的分段分页机制来用4G的虚拟内存映射到物理内存,每一个物理地址有可能对应很多个线性地址,但是每一个线性地址最多只能对应一个物理地址。   这个你若学会分页机制的话就会明白,也就是为什么物理内存是1G,虚拟地址是4G。当然若你的物理内存正好是4G的话,或许只有地址编号变化了。。。实际是真的0xFFFFFFFF,返回的是0xFFFFFFFF.(当然是假设)。      
张银盔的一本书《软件调试》。。。。。。讲的挺详细,你可以去看看
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-4 11:40:04 | 显示全部楼层
仰望天上的光 发表于 2012-7-4 09:44
现代操作系统的一个特点就是支持多任务,就是说很多个程序可以同时运行,就像你可以一边玩游戏,一边听音 ...

你太负责任了。。。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-4 13:24:56 | 显示全部楼层
Tzdner_C 发表于 2012-7-4 11:37
我现在正好正在学习windows保护模式。。。你想想,不是每个电脑的物理内存都是4G啊,还有1G的2G的,我用的 ...

“我用的本本是512M的:loveliness:“这句话,让我胡想连篇到如下内容:

虚拟内存是从硬盘是划分的,并且划分的大小可以自由设置,拿你的本本举例。
① 如果你将虚拟内存大小配置成0,即你机器总内存大小=你本本实际内存大小512MB+你设置的虚拟内存大小0MB=512MB,那么虚拟地址转换成真实的物理地址后,范围就在这512MB内,每个进程都有权力用0x00000000-0xFFFFFFFF这个范围内的虚拟地址,这叫“独占”,只不过表示它们可以拿这个范围内的任意一个地址去找真实的地址,但最终能不能找到,就要看这512MB被占用的情况了
② 如果你将虚拟内存大小配置成512MB,那么你机器内存大小=512MB+512MB,那么进程拿着虚拟地址就可以在1G空间里找真实的物理地址了,从硬盘划分的虚拟内存,被使用时,与内存条是没有区别的对吧?

我理解的对不对
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-4 14:30:39 | 显示全部楼层
仰望天上的光 发表于 2012-7-4 09:51
8086   20根地址线好不好?不学8086你难道直接就明白其它CPU的结构?

失误。。。是20根地址线,记得好像是通过地址加法器去实现的寻址1M吧。。。80386以后是都兼容了8086的很多结构,但是确实扩展了太多太多的东西。。。我学过8086,但是现在学80386的时候,发现曾经学过的东西对我没有起到作用。。。所以这样说,例如8086段寄存器16位的,80386以后成了96位,还有在修改段寄存器的时候,一些很复杂很复杂的东西都相差太大。GDT表,IDT表(也就是16位的中断向量表吧。)32位是中断门。TSS表。。。。其中结构很多都已经面目全非。。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-4 14:33:55 | 显示全部楼层
_nosay丶 发表于 2012-7-4 13:24
“我用的本本是512M的“这句话,让我胡想连篇到如下内容:

虚拟内存是从硬盘是划分的,并 ...

你可否在理解虚拟内存的时候,不要把硬盘啦进来。。。硬盘那个虚拟内存,跟保护模式的虚拟内存是纯粹的两个概念。。。完全不相干的两种东西。。。。若你问的是硬盘的那个虚拟内存,那么去百度。。。若你问的是保护模式的4G的虚拟内存跟物理内存的关系,那就不要扯硬盘。。。两码事。。。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-4 15:27:38 | 显示全部楼层
Tzdner_C 发表于 2012-7-4 14:33
你可否在理解虚拟内存的时候,不要把硬盘啦进来。。。硬盘那个虚拟内存,跟保护模式的虚拟内存是纯粹的两 ...

好,知道是两码事了.
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-5 14:50:44 | 显示全部楼层
_nosay丶 发表于 2012-7-4 11:27
是不是这样理解:内存像一个客栈,进程就像是房客,不断有新的来,旧的走,操作系统是房东,他见缝插针, ...

大概是这样的,假设一个客栈只有10个房间。这10个房间相当于内存。
一个人来了,说要预定100个房间,因为他有100个朋友,一人住一间。
操作系统就好比是老板。老板知道这100个人同时最多只有2个人可能同时在客栈。所以黑心的老板同意给这个人100个房间,并分配了房间号1~100(虚拟地址),实际上老板只准备給他们分配2个房间

结果,
第1个人来了(虚拟地址为1),老板给他1号房间(物理地址),并宣称这是1号房间(虚拟地址)
第2个人来了(虚拟地址为2),老板给他2号房间(物理地址),并宣称这是1号房间(虚拟地址)

第1个人走了。
第3个人来了(虚拟地址为3),老板给他1号房间(物理地址),并宣称这是3号房间(虚拟地址)
第2个人走了。
第4个人来了(虚拟地址为4),老板给他2号房间(物理地址),并宣称这是4号房间(虚拟地址)
...

最后这100个人认为他们住进了不同的房间。编号为1~100
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-5 14:53:38 | 显示全部楼层
所以“某个游戏程序使用的4GB=实际内存0.5GB+硬盘上3.5GB“这句话又勾引我问出这样的问题,这个3.5GB不是超过了硬盘“相助”的2GB吗,

某个时刻,某个程序正在使用的内存空间你认为最多有多少?我觉得有1KB就了不起了。在这里暂时不理会虚拟内存
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-5 15:00:56 | 显示全部楼层
③差的操作系统,程序员需要的数据指的是什么?是程序员写的程序需要的数据,还是程序
本身?如果是程序本身的话,运行的时候要加载到内存我理解,但是“有些算法让80%的数据
已经从硬盘载入内存了”这句话我不理解,我不是想问它怎么让80%数据已经载入内存了,而
是想问这80%数据到底是谁的80%数据,如果能帮忙举个例子最好了,非常感谢。(看完你回
答的第三句,想问的问题)


假设一个程序需要访问遍历100个连续的数字,这些数字存放在硬盘上。
一般来说,刚开始,这些数据并没有被调入内存(我们假设运气不是很好)
所以操作系统遇到读第一个数的指令的时候,知道要把一些数据从硬盘调入内存了。但是,操作系统当前仅仅知道需要的是第一个数,并不知道这100个数都需要。所以很差的操作系统仅仅从硬盘调了这一个数字到内存。接下来访问第2个数字的时候,悲催了还要继续从硬盘调数字到内存。
好的操作系统一般会把需要的数据以及该数据周边的数据一起调到内存里(有研究表明,一个程序访问了一个数据也很可能将要访问该数据周边的数据),这样仅需访问硬盘一次,后面的数据就都在内存里了。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-5 21:44:26 | 显示全部楼层
100个房间的例子举的太形象了

#include <stdio.h>

int main()
{
        char *p1 = "hello";
        char *p2 = NULL;
       
        p2 = "hello";

        printf("p1: 0x%08x, p2: 0x%08x\n", (int)p1, (int)p2);

        //*p1 = 'c';
        getchar();

        return 0;
}

结果:
p1: 0x00422030, p2: 0x00422030

我想请教:p1 = "hello"这一句执行到底是什么样的过程?

内存不可能事先那么巧就在0x00422030这个地址对应的位置放了一个“hello”,那是不是就要从硬盘读入一个“hello”到内存的某个位置,再把这个地址赋给p1? 但不合理啊,又怎么能保证硬盘中就一定有“hello”,即使有,单单的一句char *p1="hello"就要劳师动众去搜索硕大的硬盘,那是什么场面,所以我得出一个结论,“程序需要访问遍历100个连续的数字,差的系统可能是一个一个的调入内存,好的操作系统可能100个一下子就调入内存”这句话,后半句我理解,但前半句我理解错了,那么应该如何理解呢,求赐教?

我银荡的作出这样的猜测:有一块很小范围的内存只有操作系统才可以调戏,普通的程序动不了它,即“hello”所在的地方,具体范围多大我也不晓得,当程序执行到char *p = "hello"这句时,操作系统就去这块范围搜索,如果遇巧搜索到了,把地址赋给p,如果没搜索到,操作系统在这个范围找一块地址,自己写上“hello”,再把这个地址赋给p,如果我猜测的是对的,那么100个连续的数操作系统也可以这样搞呀,为什么要从硬盘调入?

以上猜的如果是错的,请别见笑,我只是想表达出我想问的问题。

小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-5 21:47:41 | 显示全部楼层
Tzdner_C 发表于 2012-7-4 14:33
你可否在理解虚拟内存的时候,不要把硬盘啦进来。。。硬盘那个虚拟内存,跟保护模式的虚拟内存是纯粹的两 ...

你不是说每天会告诉我一点的吗,今天没有,是不是想偷懒 ?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-5 21:51:26 | 显示全部楼层
_nosay丶 发表于 2012-7-5 21:47
你不是说每天会告诉我一点的吗,今天没有,是不是想偷懒 ?

你没鱼币。。。人回答没动力:lol
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-5 22:32:11 | 显示全部楼层
明天要出差,明天就不回答你的问题了,今天先回答你的疑问吧。你举的例子,一般情况下,这么小的内存就能装下的东西,全部都装在内存里,没有硬盘什么事。但在极其特殊的情况下
如程序执行到
int main()
{
        char *p1 = "hello";
        char *p2 = NULL;
      
        p2 = "hello";
的时候,突然另一个优先级别非常高的程序急需几乎所有的内存来处理一些紧急情况。
那么这时候与这个程序有关的一片内存里的所有数据将被写到硬盘的某块区域。
等高优先级的程序用完真实内存。这个程序再把自己的状态恢复到之前的情况(恢复的信息之前都被写到硬盘里了)
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-5 22:40:20 | 显示全部楼层
Tzdner_C 发表于 2012-7-5 21:51
你没鱼币。。。人回答没动力

鱼币又不能买肯德基,汉宝宝
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-6 10:08:45 | 显示全部楼层
_nosay丶 发表于 2012-7-5 22:40
鱼币又不能买肯德基,汉宝宝 。

建议你去查查资料。。。弄清楚什么叫虚拟地址,线性地址,物理地址,;逻辑地址,有效地址。。。。。再来讨论。。。。。。。还有千万不要把硬盘扯进来说事,没有任何意义的事情,之所以有硬盘,是我们的应用程序的文件全部存放在硬盘这个外存储器上,当我们启动应用程序的时候,操作系统会到硬盘把需要的文件加载进内存,交给CPU去处理。。。。。。。。。如果真正的要讨论一个进程在占有的内存,那么跟硬盘没有半点关系。。。。不要想当然的认为虚拟内存4G,若物理内存是2G,不够就从硬盘拉进来2G凑数(也就是你眼里所谓的虚拟内存)。。。。完全错误的理解。。。。我曾经也这样认为过。。。。大错而特错的说法,理解。。。。
在我眼里,谁敢说他汇编牛,我就问他一句  你若能给我解释清楚CPU在执行 mov eax,ds:[ebx]这条汇编指令的时候具体都做了哪些事情。。。。。牛就真的牛。。。。。。要回答这个问题  真正理解虚拟内存或者虚拟地址是个什么东西是最起码的基础。。。。  
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-6 22:31:04 | 显示全部楼层
Tzdner_C 发表于 2012-7-6 10:08
建议你去查查资料。。。弄清楚什么叫虚拟地址,线性地址,物理地址,;逻辑地址,有效地址。。。。。再来 ...

这段话值很多鱼币  
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-7 14:39:24 | 显示全部楼层
_nosay丶 发表于 2012-7-6 22:31
这段话值很多鱼币  。

关键是你一个也没给。。。:Q

评分

参与人数 1鱼币 +1 收起 理由
网友 + 1

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 20:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表