7-2 页面置换算法--LRU (50 分)

最后

权威指南-第一本Docker书

引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。

总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。

image

image

image

image

关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

2.这个算法每次处理的置换页面号,我们依然用队列进行处理,但是我们要注意的是

我们在如果这个页号已经在内存中存在,那么就要就要将其

debug:解决运行时错误

1.将int类型转换成string类型没问题

2.[178781373];非结构体数组范围问题

3.最后一行有空行无问题 z

*/

#include<bits/stdc++.h>

using namespace std;

int N,M;//N代表页面大小 M代表物理块数

int cnt = 0;

struct Node{

int block; //块

string page; //页

int priority;//优先级

}node[100];

bool sort_priority(Node a,Node b){

return a.priority < b.priority;

}

void printSate(){

cout << “物理块号 页号” << endl;

for(int i = 0; i < M; i++){

for(int j = 0; j < M; j++){

if(i == node[j].block){

cout << node[j].block << ’ ';

cout << node[j].page << endl;

}

}

}

}

void outResult(int address){

int pageNumber = address/N; //页号

int pageMigration = address%N; //页内偏移

stringstream st; //这是为了将int类型转换成 string 类型

st << pageNumber;

string str = st.str();

int temp1 = 0,temp2 = 0;

cout << “页号:”<< pageNumber <<" 页内偏移:" << pageMigration << endl;

//遍历内存的物理块中是否有该页号

for(int i = 0; i < M; i++){

if(node[i].page == str){

temp1 = 1;

}

if(node[i].page == “void”){ //统计有空闲的位置

temp2++;

}

}

//在内存的时候

if(temp1 == 1){

cnt++;

//这个时候因为块中已有该页 我们遍历整个结构体数组 找到 该页号 将新的优先级赋值给它

for(int i = 0; i < M; i++){

if(node[i].page == str){

node[i].priority = cnt;

}

}

sort(node,node+M,sort_priority);//按照优先级重新排序

printSate();

}

//不在内存的时候 ,且内存中还有空间

if(temp1 == 0 && temp2 > 0){

cout << “该页不在内存中,调入!” << endl;

//更新物理块中的页号状态

for(int i = 0; i < M; i++){

if(node[i].page == “void”){

node[i].page = str;

cnt++;

node[i].priority = cnt;

break;

}

}

sort(node,node+M,sort_priority);//按照优先级重新排序

printSate();

}

//当不在内存的时候,内存中没有空间

if(temp1 == 0 && temp2 == 0){

cout << “已无空闲物理块,置换!” << endl;

cnt++;

//这个时候就覆盖结构体数组当中的首个元素的 页号

node[0].page = str;

node[0].priority = cnt;

sort(node,node+M,sort_priority);//按照优先级重新排序

printSate();

}

}

int main(){

int logicAddress;

cin >> N >> M;

for(int i = 0; i < M; i++){

node[i].block = i;

node[i].page = “void”;

}

while(1){

cin >> logicAddress;

if(logicAddress != -1){

outResult(logicAddress);

}else{

break;

}

}

}

//1024 3

//1

//1056

//2096

//3175

//-1

在这里插入图片描述

四:PTA显示运行时错误(但算法没问题)

===================================================================================

这个是显示运行时错误,我在其中用了优先队列,如果你看过我前面几篇博客的话,我在分支限界当中,用的也是优先队列,所以在做这道题的时候,考虑到优先级的问题,我就自然而然想到了用优先队列来做,但是我是万万没想到,用优先队列会出现运行时错误,查阅资料显示 优先队列有时会抛出异常,我觉得可能是这个原因。但还是记录错误码 毕竟也是劳动成果!!

/**

思路:

1.基本和上道题一样,但是我们在处理这个页面置换算法的时候用的是 LRU

最近最久未使用的思想进行置换页面

2.这个算法每次处理的置换页面号,我们依然用队列进行处理,但是我们要注意的是

我们在如果这个页号已经在内存中存在,那么就要就要将其

debug:解决运行时错误

1.将int类型转换成string类型没问题

2.[178781373];非结构体数组范围问题

3.最后一行有空行无问题 z

*/

#include<bits/stdc++.h>

using namespace std;

int N,M;//N代表页面大小 M代表物理块数

int cnt = 0;

struct Node{

int block; //块

string page; //页

int priority;//优先级

}node[100];

bool operator<(const Node& a,const Node& b){

return a.priority > b.priority;

}

priority_queueq;

void printSate(){

cout << “物理块号 页号” << endl;

for(int i = 0; i < M; i++){

cout << node[i].block << ’ ';

cout << node[i].page << endl;

}

}

void outResult(int address){

int pageNumber = address/N; //页号

int pageMigration = address%N; //页内偏移

stringstream st; //这是为了将int类型转换成 string 类型

st << pageNumber;

string str = st.str();

int temp1 = 0,temp2 = 0;

cout << “页号:”<< pageNumber <<" 页内偏移:" << pageMigration << endl;

//遍历内存的物理块中是否有该页号

for(int i = 0; i < M; i++){

if(node[i].page == str){

temp1 = 1;

}

if(node[i].page == “void”){ //统计有空闲的位置

temp2++;

}

}

//在内存的时候

if(temp1 == 1){

cnt++;

//这个时候因为块中已有该页 我们遍历整个结构体数组 找到 该页号 将新的优先级赋值给它

for(int i = 0; i < M; i++){

if(node[i].page == str){

node[i].priority = cnt;

}

}

// cout << “*****************” << endl;

// for(int i = 0; i < M; i++){

// cout << node[i].priority << endl;

// }

//

//更新node[i]中的优先级,因为这时候,优先队列中的结点的优先级是跟结构体中优先级是不一致的

for(int i = 0; i < M; i++){

Node node2 = q.top(); q.pop();

int num1 = node2.block;

int num2 = node2.priority;

for(int i = 0; i < M; i++){ //我们更新优先队列中的结点的优先级,同时当出现重复页号的时候,这时就要更新结构体中的块号所对应的优先级

if(num1 == node[i].block && node[i].page != str){//我们刚更新的页的优先级是 比不需要用队列中的优先级更新的,因为比队列中的优先级要高

node[i].priority = num2;

}

}

}

for(int i = 0; i < M; i++){

q.push(node[i]);

}

// cout << “********************” << endl;

// while(!q.empty()){

// Node node2 = q.top(); q.pop();

// cout << node2.block <<’ '<< node2.page <<" "<< node2.priority << endl;

// }

printSate();

}

//不在内存的时候 ,且内存中还有空间

if(temp1 == 0 && temp2 > 0){

cout << “该页不在内存中,调入!” << endl;

//更新物理块中的页号状态

for(int i = 0; i < M; i++){

if(node[i].page == “void”){

node[i].page = str;

cnt++;

node[i].priority = cnt;

q.push(node[i]);

break;

}

}

printSate();

}

//当不在内存的时候,内存中没有空间

if(temp1 == 0 && temp2 == 0){

cout << “已无空闲物理块,置换!” << endl;

Node newnode = q.top();

q.pop();

cnt++;

Node node1;

node1.block = newnode.block; //淘汰页面的块号 也是新来页号的块号

node1.page = str;//新来页号

node1.priority = cnt; //新统计的页号优先级最高

q.push(node1);

for(int i = 0; i < M; i++){

if(node1.block == node[i].block){ //根据物理块号更新 新的页号

node[i].page = str;

}

}

printSate();

}

}

最后:学习总结——MyBtis知识脑图(纯手绘xmind文档)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

image

除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

age = str;

}

}

printSate();

}

}

最后:学习总结——MyBtis知识脑图(纯手绘xmind文档)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

[外链图片转存中…(img-TRvECHYw-1715799411692)]

除此之外,前文所提及的Alibaba珍藏版mybatis手写文档以及一本小小的MyBatis源码分析文档——《MyBatis源码分析》等等相关的学习笔记文档,也皆可分享给认可的朋友!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java实现秒杀系统@Controller @RequestMapping("seckill")//url:/模块/资源/{id}/细 /seckill/list public class SeckillController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private SeckillService seckillService; @RequestMapping(value="/list",method = RequestMethod.GET) public String list(Model model){ //获取列表页 List list=seckillService.getSeckillList(); model.addAttribute("list",list); //list.jsp+model = ModelAndView return "list";//WEB-INF/jsp/"list".jsp } @RequestMapping(value = "/{seckillId}/detail",method = RequestMethod.GET) public String detail(@PathVariable("seckillId") Long seckillId, Model model){ if (seckillId == null){ return "redirect:/seckill/list"; } Seckill seckill = seckillService.getById(seckillId); if (seckill == null){ return "forward:/seckill/list"; } model.addAttribute("seckill",seckill); return "detail"; } //ajax json @RequestMapping(value = "/{seckillId}/exposer", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) @ResponseBody public SeckillResult exposer(@PathVariable("seckillId") Long seckillId){ SeckillResult result; try { Exposer exposer =seckillService.exportSeckillUrl(seckillId); result = new SeckillResult(true,exposer); } catch (Exception e) { logger.error(e.getMessage(),e); result = new SeckillResult(false,e.getMessage()); } return result; } @RequestMapping(value = "/{seckillId}/{md5}/execution", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"} ) @ResponseBody public SeckillResult execute(@PathVariable("seckillId")Long seckillId,

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值