请帮忙解释下内存分段的好处!

时间:2022-12-29 08:40:15
最近在看那本《The Art of Assembly Language Programming》DOS版,其中讲到内存分段的优点时提到了如下几点(英文太差,不敢乱翻):
(1)segmentation provides a powerful memory management mechanism. 
(2)It allows programmers to partition their programs into modules that operate independently of one another. 
(3)Segments provide a way to easily implement object-oriented programs. Segments allow two processes to easily share data.
但是我理解不了:
(1)内存分段与内存管理之间有什么关系?
(2)内存分段可以让程序员把程序分成相互独立的模块;
(3)内存分段还可以方便的实现面向对象编程;
这些东西我还是第一次听说(各位别笑我),请高手指点一下。

18 个解决方案

#1


强 水手 只能友情帮顶

#2


好强的书,还能跟面向对象联系起来.

#3


牛,帮顶了~~~

#4


(1)内存分段和内存分页一样都是一种内存管理技术,分段是为了权限保护,分页是为了虚拟内存.
(2)分段后,程序员可以定义自己的段,各段有独立的地址空间,象进程的地址空间互相独立一样.
(3)同一个类的实例分配在一个段中,只有该类的方法可以访问,如果其他类的方法去访问,会因为段保护而出错.可以从硬件上实现类的数据保护和隐藏

#5


看看我原来写的这篇:

http://community.csdn.net/Expert/topic/4874/4874821.xml?temp=.2047541

#6


mydo老兄,我没有从你写的文章里找的我的答案。见笑了,我主要是想通过这些问题彻底的理解段的概念。

#7


我也只是学生,说说我的想法。

1。我想第一个分段可能是由于历史的原因。古老的计算机内存小,16根地址线便可操控整个内存。但由于技术进步后,内存容量扩大,一维的地址空间无法覆盖整个内存地址,便采用分段的思想。由16位的地址空间做为段址,再加上16位的有效地址(段址偏移4位,即 段址*16 + 有效地址),便形成了20位的二维地址空间,使得16根地址线所能控制的地址范围扩大了64倍,这也是在实模式下的内存寻址方式吧。不过似乎目前pc机上分段的思想也已经被分页和段页式取代了,但我觉得它们在思想上都有很大的共通之处。

2。程序分段的好处。cpu中的段寄存器中保存了段址(base)和偏移值的上限(limit)。段址:有效地址 中,如果有效地址大于limit,便会引发异常。这样就可以限制程序不能范围当前段外的数据,不能访问其他程序的数据。总之就是不能访问它不能访问的数据。

3。面向对象的好处。对象就是一块连续的内存中的数据吧。这点跟上面一点类似。通过限制访问,就做到了private的效果吧。

#8


看不懂,太底层了

#9


集中管理比分散管理 可行性更大

#10


现在很多CPU都不分段了。。。。

#11


就算很多cpu不分段了,我觉得理解段的概念还是很有好处的。在理解了段的思想之后,我看到分页的概念后就觉得很容易理解,甚至觉得思想本质上是一样的。

看过一片文章说技术的发展虽然迅速,但其还是循序渐进的。

#12


3. 内存分段还可以方便的实现面向对象编程
----------
面向对象编程的一个主要思想就是以数据为中心,以及对数据的操作。在内存中,数据如果是独立的一段,这样与对数据的操作的程序段分开,是符合面向对象编程要求的。

#13


axx1611(long long *&ago)你要是不懂就不要说话了。看了你的好多回复。都不对!虽然热情很高。但水平欠佳。虚心点啊!
1 段是一种硬件管理功能。
2 说可以方便的进行多任务的处理。
3 面向对象编程是一种编程思想。这种程序编译出来结构很复杂。如果有mmu会很方便的。

多任务中的每个任务要互相隔离。每个任务就好像是在用一个单独的机器。但是,是在不同的内存中。你看一下操作系统原理的书吧!

#14


想了解汇编……

#15


该回复被版主删除

#16


感觉有多个原因造成分段,有硬件发展不一的原因
当然还有管理方便的原因,比如我们写代码的时候还是会用数组来定义数据而已不是一个个的变量 分段也会产生很大的浪费……

#17


1. 段是一个逻辑概念;
2. 分段与多任务没有必然的联系;
3. 分段可以使用较短的地址表达,同一段内只需要使用偏移即可,缩短了指令长度、加快访问速度(尤其在以前没有cache的处理器上更是如此);
4. 分段可以提高内存的使用效率,简化内存管理,因为不同的段在内存中是不必地址相连的。

#18


帮D

#19


(1)
x86 CPU 段有两个意义,

一个是早期实模式下,寄存器16位,地址线20位。为了用16位的寄存器寻址20位的地址,引入了段(segment)的概念,所有的段都在一个地址空间。

第二个是保护模式下,段(segmentation)强调的是分割,用来把内存分成不同的地址空间,每个段一个空间,而后通过CPU的MMU转换成实际物理地址。由于程序运行在不同的段里,根本上保护了CPU保护模式下的各个不相关的代码,所谓进程或者作业。

注意,x86 CPU的段是永远存在的,不论哪个模式,不能禁止,参看Intel开发手册。

(2)
理由同上,每个段都是不同的地址空间。由于段会增加编程的困难,以及32位CPU段的大小是4G,足够大。所以,win32程序抽象出了一个flat memeory model,一个程序的所有模块都在一个段里,这样普通编程人员看到的是一个4G的连续空间。会觉得没有段的概念。所以,段虽然用来分模块,但少有操作系统这么做。

(3)
可以假设不分段。那么所有进程都在一个地址空间。也就是回到了DOS。再看看windows的虚拟内存的概念。

#1


强 水手 只能友情帮顶

#2


好强的书,还能跟面向对象联系起来.

#3


牛,帮顶了~~~

#4


(1)内存分段和内存分页一样都是一种内存管理技术,分段是为了权限保护,分页是为了虚拟内存.
(2)分段后,程序员可以定义自己的段,各段有独立的地址空间,象进程的地址空间互相独立一样.
(3)同一个类的实例分配在一个段中,只有该类的方法可以访问,如果其他类的方法去访问,会因为段保护而出错.可以从硬件上实现类的数据保护和隐藏

#5


看看我原来写的这篇:

http://community.csdn.net/Expert/topic/4874/4874821.xml?temp=.2047541

#6


mydo老兄,我没有从你写的文章里找的我的答案。见笑了,我主要是想通过这些问题彻底的理解段的概念。

#7


我也只是学生,说说我的想法。

1。我想第一个分段可能是由于历史的原因。古老的计算机内存小,16根地址线便可操控整个内存。但由于技术进步后,内存容量扩大,一维的地址空间无法覆盖整个内存地址,便采用分段的思想。由16位的地址空间做为段址,再加上16位的有效地址(段址偏移4位,即 段址*16 + 有效地址),便形成了20位的二维地址空间,使得16根地址线所能控制的地址范围扩大了64倍,这也是在实模式下的内存寻址方式吧。不过似乎目前pc机上分段的思想也已经被分页和段页式取代了,但我觉得它们在思想上都有很大的共通之处。

2。程序分段的好处。cpu中的段寄存器中保存了段址(base)和偏移值的上限(limit)。段址:有效地址 中,如果有效地址大于limit,便会引发异常。这样就可以限制程序不能范围当前段外的数据,不能访问其他程序的数据。总之就是不能访问它不能访问的数据。

3。面向对象的好处。对象就是一块连续的内存中的数据吧。这点跟上面一点类似。通过限制访问,就做到了private的效果吧。

#8


看不懂,太底层了

#9


集中管理比分散管理 可行性更大

#10


现在很多CPU都不分段了。。。。

#11


就算很多cpu不分段了,我觉得理解段的概念还是很有好处的。在理解了段的思想之后,我看到分页的概念后就觉得很容易理解,甚至觉得思想本质上是一样的。

看过一片文章说技术的发展虽然迅速,但其还是循序渐进的。

#12


3. 内存分段还可以方便的实现面向对象编程
----------
面向对象编程的一个主要思想就是以数据为中心,以及对数据的操作。在内存中,数据如果是独立的一段,这样与对数据的操作的程序段分开,是符合面向对象编程要求的。

#13


axx1611(long long *&ago)你要是不懂就不要说话了。看了你的好多回复。都不对!虽然热情很高。但水平欠佳。虚心点啊!
1 段是一种硬件管理功能。
2 说可以方便的进行多任务的处理。
3 面向对象编程是一种编程思想。这种程序编译出来结构很复杂。如果有mmu会很方便的。

多任务中的每个任务要互相隔离。每个任务就好像是在用一个单独的机器。但是,是在不同的内存中。你看一下操作系统原理的书吧!

#14


想了解汇编……

#15


该回复被版主删除

#16


感觉有多个原因造成分段,有硬件发展不一的原因
当然还有管理方便的原因,比如我们写代码的时候还是会用数组来定义数据而已不是一个个的变量 分段也会产生很大的浪费……

#17


1. 段是一个逻辑概念;
2. 分段与多任务没有必然的联系;
3. 分段可以使用较短的地址表达,同一段内只需要使用偏移即可,缩短了指令长度、加快访问速度(尤其在以前没有cache的处理器上更是如此);
4. 分段可以提高内存的使用效率,简化内存管理,因为不同的段在内存中是不必地址相连的。

#18


帮D

#19


(1)
x86 CPU 段有两个意义,

一个是早期实模式下,寄存器16位,地址线20位。为了用16位的寄存器寻址20位的地址,引入了段(segment)的概念,所有的段都在一个地址空间。

第二个是保护模式下,段(segmentation)强调的是分割,用来把内存分成不同的地址空间,每个段一个空间,而后通过CPU的MMU转换成实际物理地址。由于程序运行在不同的段里,根本上保护了CPU保护模式下的各个不相关的代码,所谓进程或者作业。

注意,x86 CPU的段是永远存在的,不论哪个模式,不能禁止,参看Intel开发手册。

(2)
理由同上,每个段都是不同的地址空间。由于段会增加编程的困难,以及32位CPU段的大小是4G,足够大。所以,win32程序抽象出了一个flat memeory model,一个程序的所有模块都在一个段里,这样普通编程人员看到的是一个4G的连续空间。会觉得没有段的概念。所以,段虽然用来分模块,但少有操作系统这么做。

(3)
可以假设不分段。那么所有进程都在一个地址空间。也就是回到了DOS。再看看windows的虚拟内存的概念。

#20