段模式(segmentation)是指满足以下3个特征的内存管理模式
(1)将用户程序空间按逻辑划分为几部分,每一部分称为一段(segment),每个段内连续编制,段间则采用不连续编制。这样每个程序的逻辑地址空间是二维编制的。
(2)内存的划分与可变分区相同,但分配单位不同。可变分区以整个程序为单位划分和连续存放(即程序内部是连续存放,但是程序之间并不连续存放)。
(3)段模式分实存模式和虚存模式两种。如果要求每一个程在开始执行前都必须完整装入内存,则为实段式。否则为虚段式。
从以上段模式可以看出,在段模式中,段即是用户程序逻辑地址空间中的最大连续单位,也是用户程序在内存中存放时的最大连续单位。段的概念并不仅用于段模式,在段页式存储中也有段的概念。就广义而言,段模式的本质定义是用户程序的逻辑地址空间的最大连续单位。但不一定是用户程序在物理内存存放是的最大连续单位。而在段页式模式中,用户进程的内存最大连续空间是页。
段式和页式的区别在于如何不连续,页式是等长的划分,因而是非逻辑的。但是段式是按照进程本身进行划分的。是逻辑的。
一个逻辑地址空间就是多个段的集合,每个段有一个名字和一个长度。地址由段名和段内位移两部分组成(与这个模式相反的是页模式,用户仅说明一个单独的地址,由硬件将该地址划分为一个页号与一个位移,这种划分是程序员看不见的)。通常,段模式下一个进程的地址空间可以包含代码段。数据段和栈段。
段模式的实现
通常情况下,段模式下一个进程的地址空间可包含以下不同的段类型:
(1)代码段:包含一个进程的可执行的代码。一个进程通常有若干代码段,代码段按照子程序和函数进行划分。这种段通常被标记为只读,以确保一个进程的程序代码不能被该进程自身或其他进程修改。一个代码段可以在许多进程之共享。例如在一个Linux系统中,可能有很多用户在执行一个vi程序,但是所编辑的数据不同。操作系统将vi执行的代码放在一个代码段中,让这个代码在所有运行vi的进程之间共享。
(2)数据段:存放一个进程执行期间处理的数据。一个进程可包含若干数据段,例如可把全局变量放在一个段中,每个过程和函数的局部变量可分别单独放在一个段中,数组可以放在单独的段中。数据段通常被标为读写。有些系统中规定,数据段不能被其他进程共享,否则就会导致错误或失败。或者是不能被其他进程看到。
(3)栈段:包括进程的栈(stack)该段被标为可读可写,栈段不能与其它进程共享。
(4)共享内存段:可以被其他进程访问的段,或者说可由多个进程读写的段。例如,一个进程可写数据至共享内存段,让别的进程读取数据。一个共享内存段可以被映射到不同进程地址空间的不同虚址上。
(5)其他段类型:略了吧~~:)