分页存储和分段存储的一些小问题解答

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/q258523454/article/details/52416412

为什么能通过0~11位的页内地址,计算出页面大小为4KB?

为什么分页存储地址空间是一维的,而分段存储却是二维的?

分页和分段存储之间的不同点又是什么?

请看下面介绍……


1.分页存储结构如下:(以下所有图片来自百度百科)



若给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址d可按右图所示公式求得:

其中,INT是整除函数,MOD是取余函数。例如,其系统的页面大小为1 KB,设A = 2170 B,则由上式可以求得P = 2,d = 122。

分页存储转换如下:



2.分段存储结构如下


分段存储转换如下:


3.问题来了,通过看书,大家也许有2个疑问:

3.1. 为什么能通过0~11位的页内地址,计算出页面大小为4KB?

3.2. 为什么分页存储地址空间是一维的,而分段存储却是二维的?

第一个问题:

首先因为计算机中一个地址默认对应八位二进制数,那么页内偏移量为12位,能表示[0]~[2^12-1]范围的数字,

其中2^12=4^10=4K,由于1位对应1个字节(操作系统一般以字节编址),所以就是4KB



第二个问题:
我们可以看到分页地址结构,你们有没有发现页号我们是不需要的,因为页面大小是固定的,所以我们可以直接由逻辑地址的大小计算出页号,例如,其系统的页面大小为1 KB,设A = 2170 B,则由上式可以求得页号为2。所以,我们实际上只需要一个1维的数据,逻辑地址大小即可.
但是分段存储的地址结构就不一样,我们必须要知道段号,以及段内地址。因为段的长度是不定的,因此我们无法像分页那样直接计算段号,因此必须要给出段号,加上段内偏移地址,就构成了二维的。即逻辑地址必须由段号+段内地址构成(二维)




 

分页存储

分段存储

不同点:

页长:固定

段长:不固定

引入:提高内存利用率

引入:满足程序员(例如:动态链接)

地址空间:一维

地址空间:二维

页号和页内偏移对用户可见

段号和段内偏移由程序员设定(对其他用户不可见)

相同点:

离散分配地址(非连续)



一字一句的纯手打!
如有错误,望批评指正!




展开阅读全文

如何实现分段存储

06-18

卡片信息/执卡人信息/应用报警信息分段表rn/*==============================================================*/rn/* Table: TB_IM_CARD_SECTION */rn/*==============================================================*/rncreate table TB_IM_CARD_SECTION (rn CARD_SECTION VARCHAR(6) not null,段号rn DB_CODE VARCHAR(20) not null,数据库标识rn CARD_AMOUNT NUMBER(7) not null,已有卡片数rn HOLDER_CARD_AMOUNT NUMBER(7) not null,已有执卡人数rn STATE CHAR(3) not null 状态rn);rn持卡人信息(XXXXXX段)rn/*==============================================================*/rn/* Table: TB_IM_CARD_HOLDER_XXXXXX */rn/*==============================================================*/rncreate table TB_IM_CARD_HOLDER_XXXXXX (rn HOLDER_SEQ VARCHAR(20) not null,持卡人流水rn HOLDER_NAME VARCHAR(64) not null,姓名rn SSN VARCHAR(10), SSNrn ID_CARD VARCHAR(18), 身份证号rn PHY_NUMBER VARCHAR(30) not null,卡片物理号rn LOG_NUMBER VARCHAR(30) not null,卡片逻辑号rn OLD_PHY_NUMBER VARCHAR(30), 原卡物理号rn OLD_LOG_NUMBER VARCHAR(30), 原卡逻辑号rn ENTRANCE_DATE CHAR(6) not null,入学年月rn 发放日期 DATE not null,发放日期rn DEAL_SEQ VARCHAR(22) not null,数据提交流水rn STATE CHAR(3) not null,状态rn constraint PK_IM_CARD_HOLDER primary key (HOLDER_SEQ)rn);rn校园卡卡片信息(XXXXXX段)rn/*==============================================================*/rn/* Table: TB_IM_CARD_XXXXXX */rn/*==============================================================*/rncreate table TB_IM_CARD_XXXXXX (rn CARD_SEQ VARCHAR(20) not null,rn PHY_NUMBER VARCHAR(30),rn LOG_NUMBER VARCHAR(30) not null,rn CARD_TYPE VARCHAR(5),rn PRO_NUMBER VARCHAR(10) not null,rn INIT_DATE DATE,rn HOLDER_SEQ VARCHAR(20) not null,rn DEAL_SEQ VARCHAR(22) not null,rn STATE CHAR(3) not null,rn constraint PK_IM_CARD primary key (CARD_SEQ)rn);rnrncomment on column TB_IM_CARD_XXXXXX.CARD_SEQ isrn'格式: YYYYMMDD+XXXXXX,后六位为序列';rnrn校园卡应用报警信息(XXXXXX段)rn/*==============================================================*/rn/* Table: TB_IM_ALARM_INFO_XXXXXX */rn/*==============================================================*/rncreate table TB_IM_ALARM_INFO_XXXXXX (rn ALARM_INFO_SEQ VARCHAR(20) not null,rn ALARM_TYPE VARCHAR(5) not null,rn HOLDER_NAME VARCHAR(60) not null,rn SSN VARCHAR(10),rn ID_CARD VARCHAR(18),rn PHY_NUMBER VARCHAR(30) not null,rn LOG_NUMBER VARCHAR(30) not null,rn ALARM_DATE DATE not null,rn DEAL_SEQ VARCHAR(22) not null,rn STATE CHAR(3) not null,rn constraint PK_IM_ALARM_INFO primary key (ALARM_INFO_SEQ)rn);rnrncomment on column TB_IM_ALARM_INFO_XXXXXX.ALARM_TYPE isrn'黑名单、卡数据篡改、卡伪造、卡复制等';rn请问如何实现分段存储, 论坛

求一个分页存储``````

04-08

小弟我现在正在写个分页存储``````思路是这样的```````比如我要查第31-60条数据时,我会先查TOP60的数据``````然后再用NOT IN 排除掉 前30条 就能取到第31-60条的数据了```````我用存储定义了 页数的变量``````现在有2个问题了rn1. select top @fir*30 * ...... select top ((@fir-1)*30) * @fir 为页数 如果查第1-30条的时候 会抛一个 rn 消息 1060,级别 15,状态 1,过程 pageFen,第 6 行rn TOP 子句中的行数必须是整数。rn2. 这是我SQL的原码 各位高淫该觉得怎么改``````````rn[code=SQL]rnalter PROCEDURE pageFenrn@firstp intrnasrnset nocount onrn beginrn select Top (@firstp*30) * from(select tb_Result.ResultAccount,tb_CompanyInfo.CompanyNamern ,tb_Result.MoneyIn,tb_Result.SpecialMoneyIn rn ,tb_Result.MoneyDate,tb_Result.AuditPerson,tb_Result.AuditTimern ,tb_Result.InputPerson,tb_Result.InputTime from tb_Result left outer joinrn tb_CompanyInfo on tb_Result.ResultAccount=tb_CompanyInfo.CompanyCode rn where tb_Result.MoneyDate >='2011-03-01' and tb_Result.MoneyDate<='2011-03-20') as m rn where ResultAccount not in (select top ((@firstp-1)*30) * from (select tb_Result.ResultAccount,tb_CompanyInfo.CompanyNamern ,tb_Result.MoneyIn,tb_Result.SpecialMoneyIn rn ,tb_Result.MoneyDate,tb_Result.AuditPerson,tb_Result.AuditTimern ,tb_Result.InputPerson,tb_Result.InputTime from tb_Result left outer joinrn tb_CompanyInfo on tb_Result.ResultAccount=tb_CompanyInfo.CompanyCode rn where tb_Result.MoneyDate >='2011-03-01' and tb_Result.MoneyDate<='2011-03-20') as n )rn endrnexec pageFen 2rn[/code]rn3. 就帮忙回答下这2个问题 不胜感激 什么GRIDVIEW啊 分页控件 我都会用````````但我希望自己写分页``````谢谢了`````` 论坛

没有更多推荐了,返回首页