页式地址变换——虚地址的计算方法(手写笔记)(操作系统题目解析)

先来看看网上的一道例题(其实网上有解析,但我第一遍没反应过来……所以把现在的理解写下来,以防之后又迷了)
题目一:有一系统采用页式存储管理,有一作业大小是8KB,页大小为2KB,依次装入内存的第7、9、A、5块,试将虚地址0AFEH转换成内存地址。
先来明确一下地址结构的分布
在这里插入图片描述前一部分为页号 P,后一部分为位移量 W(或称为页内地址)。
也就是说页号占虚地址的高位部分,页内地址占虚地址的低位部分

题目有两种出题的方式,一种是给你的虚地址不是十进制,可能是十六进制,八进制等,就比如上面的这题

题目给出的虚拟地址是十六进制,为什么是十六进制呢,看0AFEH,最后一个字母是H
在这里插入图片描述

所以我们要先转换为2进制
在这里插入图片描述

由此我们可以得到题目中的二进制为
0000 1010 1111 1110

然后我们看向页的大小,题目中页的大小为2kb,即2048也就是2的11次方。同理如果页的大小是1kb,也就是1024即为2的10次方

按照本题的2的11次方来从右往左数11位
0000 1010 1111 1110会被分为
010 1111 1110 与 0000 1

前面说过页号P占虚地址的高位部分,页内地址W占虚地址的低位部分
所以这里W=010 1111 1110, P=0000 1=1

根据题目中的前提——依次装入内存的第7、9、A、5块
在这里插入图片描述

页号P=1,查表可得块号为9,而9的二进制是1001,表首地址为0
将1001放在页内地址W=010 1111 1110的前面
0100 1010 1111 1110(前面位数不够可以补零)
将上面这行二进制转换为16进制即为4AFEH(最后一个H代表是十六进制)

总结一下就是

第一步,将虚地址转换成二进制的数;
第二步,按页的大小分离出页号和位移量(低位部分是位移量,高位部分是页号);
第三步,根据题意产生页表,将位移量直接复制到内存地址寄存器的低位部分;
第四步,以页号查页表,得到对应页装入内存的块号,并将块号转换成二进制数填入地址寄存器的高位部分,从而形成内存地址。

题目还有可能直接给你十进制的数字,这时候可以套公式得出结果

若给定一个逻辑地址空间中的地址为 A,页 面的大小为 L,则页号 P 和页内地址 d 可以由下面的式子得出
在这里插入图片描述
INT是整除函数,MOD 是取余函数
通俗的讲就是

页 号(整除)=虚地址 / 页大小
位移量(取模)=虚地址 mod 页大小
根据题意产生页表;
以页号查页表,得到对应页装入内存的块号
内存地址=块号×页大小+位移量

再来看例题
题目二:有一系统采用页式存储管理,有一作业大小是8KB,页大小为2KB,依次装入内存的第7、9、10、5块,试将虚地址7145转换成内存地址。

根据公式

P=7145/2048=3(只取整数)

W=7145 mod 2048=1001(取余数)
按照页表查询
页号 块号
0 …… 7
1 …… 9
2 …… 10
3 …… 5

页号P为3,查询到块号为5,又因为页大小为2kb即2048
所以最终结果是5*2048+1001=11241

  • 67
    点赞
  • 211
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
好的,我可以帮你这三个方法解析。 1. Call 方法 Call 方法是 JavaScript 中函数对象的一个方法,它可以在指定的 this 值和参数列表的前提下,调用一个函数。 Call 方法的基本思路是: - 把当前函数设为指定的 this 值; - 执行当前函数,并把参数列表传递进去; - 返回当前函数执行的结果。 下面是一个简单的实现: ```javascript Function.prototype.myCall = function(context, ...args) { // 首先要判断传入的 context 是否为 null 或 undefined,如果是,那么 this 指向全局对象 window context = context || window; // 将当前函数设为传入的 context 的方法 context.fn = this; // 执行当前函数,并将参数列表传递进去 let result = context.fn(...args); // 删除当前函数作为 context 的方法 delete context.fn; // 返回当前函数执行的结果 return result; }; ``` 使用示例: ```javascript function greet(name) { console.log(`Hello, ${name}! My name is ${this.name}.`); } const person = { name: 'John' }; greet.myCall(person, 'Alice'); // 输出:Hello, Alice! My name is John. ``` 2. Apply 方法 Apply 方法和 Call 方法类似,只不过它的参数列表是一个数组或类数组对象。 Apply 方法的基本思路是: - 把当前函数设为指定的 this 值; - 执行当前函数,并把参数列表传递进去; - 返回当前函数执行的结果。 下面是一个简单的实现: ```javascript Function.prototype.myApply = function(context, args) { // 首先要判断传入的 context 是否为 null 或 undefined,如果是,那么 this 指向全局对象 window context = context || window; // 将当前函数设为传入的 context 的方法 context.fn = this; // 执行当前函数,并将参数列表传递进去 let result = context.fn(...args); // 删除当前函数作为 context 的方法 delete context.fn; // 返回当前函数执行的结果 return result; }; ``` 使用示例: ```javascript function add(a, b) { return a + b; } const numbers = [1, 2]; console.log(add.myApply(null, numbers)); // 输出:3 ``` 3. Bind 方法 Bind 方法会创建一个新的函数,它的 this 值被绑定到传入的参数上。新函数被调用时,它的 this 值将永久地被绑定到传入的参数上,不会再被改变。 Bind 方法的基本思路是: - 把当前函数保存起来,以便后面返回一个新的函数; - 返回一个新的函数,这个新函数的 this 值被绑定到传入的参数上; - 当新函数被调用时,它会调用原函数,并把传入的参数和绑定的 this 值一起传递进去。 下面是一个简单的实现: ```javascript Function.prototype.myBind = function(context, ...args1) { // 保存当前函数 const fn = this; // 返回一个新的函数 return function(...args2) { // 调用原函数,并绑定 this 值和参数列表 return fn.call(context, ...args1, ...args2); }; }; ``` 使用示例: ```javascript const person = { name: 'John', greet(name) { console.log(`Hello, ${name}! My name is ${this.name}.`); } }; const greet = person.greet.myBind({ name: 'Alice' }, 'Bob'); greet('Charlie'); // 输出:Hello, Bob! My name is Alice. ``` 以上就是 Call、Apply、Bind 方法的基本实现和解析

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一纸春秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值