MIT 6.S081---Lab: locks

Memory allocator (moderate)

  1. 修改kernel/kalloc.c,修改kmem声明并定义结构体数组:
    在这里插入图片描述
  2. 修改kernel/kalloc.c中的kinit函数,对kmemList进行初始化:
    在这里插入图片描述
  3. 修改kernel/kalloc.c中的kfree函数,获取当前的cpuid并将释放的内存添加到对应的freelist:
    在这里插入图片描述
  4. 修改kernel/kalloc.c中的kalloc函数,当前cpu的list为空时,从其他cpu的freelist获得:
    在这里插入图片描述
    测试结果如下:
    在这里插入图片描述
    在这里插入图片描述

Buffer cache (hard)

1.修改kernel/buf.h,添加时间字段:
在这里插入图片描述
2. 修改kernel/bio.c,添加NBUCK宏定义,代表哈希表桶的数量:
在这里插入图片描述
3. 修改kernel/bio.c,添加结构体buck并修改binit进行初始化,初始化过程中将当前buffer加入到对应哈希桶的哈希列表中:
在这里插入图片描述
4. 修改kernel/bio.c中的struct bcache结构体,删除head(这是因为可以用ticks来判断时间戳大小来释放buffer就不用自己维护lru链表了):
在这里插入图片描述
5. 修改kernel/bio.c中的bget函数(前半段逻辑相同,后半段获取当前最小的ticks并将其加入对应的哈希桶的链表当中):

static struct buf*
bget(uint dev, uint blockno)
{struct buf *b;uint64 num = blockno % NBUCK;acquire(&(hashtable[num].lock));// Is the block already cached?for(b = hashtable[num].head.next; b != &hashtable[num].head; b = b->next){if(b->dev == dev && b->blockno == blockno){b->refcnt++;release(&(hashtable[num].lock));acquiresleep(&b->lock);return b;}}release(&(hashtable[num].lock));struct buf* min_buf = 0;for (b = bcache.buf; b < bcache.buf + NBUF; ++b) {if (b->refcnt == 0) {if (min_buf == 0) {min_buf = b;} else {if (b->ticks < min_buf->ticks) {min_buf = b;}}}}acquire(&(hashtable[num].lock));min_buf->dev = dev;min_buf->blockno = blockno;min_buf->valid = 0;min_buf->refcnt = 1;min_buf->ticks = ticks;min_buf->next = hashtable[num].head.next;min_buf->prev = &hashtable[num].head;hashtable[num].head.next->prev = min_buf;hashtable[num].head.next = min_buf;release(&(hashtable[num].lock));acquiresleep(&min_buf->lock);return min_buf;panic("bget: no buffers");
}
  1. 修改kernel/bio.c中的brelse函数(注意将其在对应的桶中的链表中删除掉):
    在这里插入图片描述

  2. 修改kernel/bio.c中的bpin、bunpin函数:
    在这里插入图片描述
    测试结果如下:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#编程技巧--2

1.使用泛型: 泛型允许你编写更加灵活和可重用的代码&#xff0c;同时提高类型安全性。 C# 中的泛型功能允许你编写更加灵活和可重用的代码&#xff0c;并且可以增加类型安全性。通过使用泛型&#xff0c;你可以编写适用于不同类型的代码&#xff0c;而无需为每种类型单独重写代…

C语言知识点总结00-C语言知识点目录

专栏主页&#xff1a; 数据结构算法程序设计基础C语言知识点总结https://blog.csdn.net/seeker1994/category_12585732.html 最优算法100例00-最优算法100例目录 数据结构知识点总结00-知识点目录 ...... C语言知识点目录 程序设计基础C语言知识点总结 1 概述 2 数…

CSS 【详解】响应式布局(明天内容)

响应式布局&#xff1a; 同一页面在不同的屏幕上有不同的布局&#xff0c;即一套代码自适应不同的屏幕。 常用 单位&#xff1a; 像素&#xff08;px&#xff09;&#xff1a;像素是最常用的长度单位&#xff0c;它表示屏幕上的一个物理像素点。例如&#xff0c;width: 200px; …

Java学习笔记------常用API(二)

Object 无有参构造 public Object() 空参构造 成员方法&#xff1a; public String toString() 返回对象的字符串表示 public boolean equals(object obj) 比较两个对象是否相等 Object默认用号比较地址值&#xff0c;需要重写才能比较属性值 protected O…

ROS2(Cpp或Python)机器学习路径选择三维模拟平衡车及YOLOv8视觉消息

要点 机器人运动几何和运动学&#xff0c;Python短代码简述 ROS2创建包&#xff0c;使用C和Python创建以下任务&#xff1a;创建发布者和订阅者并使用CMake编译&#xff0c;创建ROS2启动文件&#xff0c;创建自定义消息和Turtlebot3服务节点&#xff0c;使用ROS2组件编译视觉管…

使用Anaconda创建Python指定版本的虚拟环境

由于工作的需要和学习的需要&#xff0c;需要创建不同Python版本的虚拟环境。 比如zdppy的框架&#xff0c;主要支持的是Python3.8的版本&#xff0c;但是工作中FastAPI主要使用的是3.11的版本&#xff0c;所以本地需要两套Python环境。 决定使用Anaconda虚拟环境管理的能力&…

【小白学机器学习8】统计里的自由度DF=degree of freedom, 以及关于df=n-k, df=n-k-1, df=n-1 等自由度公式

目录 1 自由度 /degree of freedom / df 1.1 物理学的自由度 1.2 数学里的自由度 1.2.1 数学里的自由度 1.2.2 用线性代数来理解自由度&#xff08;需要补充&#xff09; 1.2.3 统计里的自由度 1.3 统计学里自由度的定义 2 不同对象的自由度 2.1 纯公式的自由度&#…

xss.haozi.me靶场“0x0B-0x12”通关教程

君衍. 一、0x0B 实体编码绕过二、0x0C script绕过三、0x0D 注释绕过四、0X0E ſ符号绕过五、0x0F 编码解码六、0x10 直接执行七、0x11 闭合绕过八、0x12 闭合绕过 一、0x0B 实体编码绕过 我们首先构造payload进行测试&#xff1a; 这里我们可以看到全部转为了大写&#xff0c…

华为OD机试真题-模拟目录管理-2024年OD统一考试(C卷)

题目描述: 实现一个模拟目录管理功能的软件,输入一个命令序列,输出最后一条命令运行结果。 支持命令: 1)创建目录命令:mkdir 目录名称,如mkdir abc为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作。此命令无输出。 2)进入目录命令:cd 目录名称, 如cd …

Linux 配置安装ftp 运维工程师必备技能难度***

访问控制 [rootstation02 ~]# vim /etc/vsftpd/vsftpd.conf anonymous_enableNO //是否允许匿名用户登录 local_enableYES //是否允许本地用户登录 write_enableYES //是否允许写&#xff08;全局&#xff09; local_umask022 …

2024年3月份实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

使用折半法判断一个数据是否在一个数组中

import java.util.*; /** * E类包含了main方法&#xff0c;用于执行程序。 */ public class E { /** * 程序的主入口函数。 * param args 命令行参数&#xff08;未使用&#xff09; */ public static void main(String args[]){ // 初始化起…

Milvus的向量索引(内存索引)

版本: v2.3.x官网: https://milvus.io/docs/index.md 一、简介 Milvus 支持的各种类型的内存索引、每种索引最适合的场景以及用户可以配置以获得更好搜索性能的参数。索引是有效组织数据的过程&#xff0c;它通过显着加速大型数据集上耗时的查询&#xff0c;在使相似性搜索变…

一台GTX1080显卡的怪兽,我可不能错过这个机会!

标题&#xff1a;我花了30块钱买了一台电脑主机。 这个配置能赚钱吗&#xff1f; 1. 收购惊喜 那是一个阳光明媚的下午&#xff0c;我在水管修理店里闲逛。 突然&#xff0c;一位老顾客手里拿着一台旧电脑主机匆匆走了进来。 他说&#xff1a;“小王&#xff0c;你能帮我看看…

【算法训练营】周测3

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 如果需要答案代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 考题11-3 题目描述 输入格式 输出格式 输出到标准输出。 若可以通关&…

STM32的GPIO初始化配置-学习笔记

简介&#xff1a; 由于刚开始没有学懂GPIO的配置原理&#xff0c;导致后面学习其它外设的时候总是产生阻碍&#xff0c;因为其它外设要使用前&#xff0c;大部分都要配置GPIO的初始化&#xff0c;因此这几天重新学习了一遍GPIO的配置&#xff0c;记录如下。 首先我们要知道芯片…

力扣701. 二叉搜索树中的插入操作

思路&#xff1a;往二叉搜索树中插入一个值&#xff0c;树的结构有多种符合的情况&#xff0c;那我们可以选一种最容易的插入方式&#xff0c;反正只需要插入一个值而已&#xff0c;我们不难发现&#xff0c;不管插入什么值&#xff0c;都可以安排插入到叶子节点上。 再利用二叉…

传统SessionID,Cookie方式与SringSecurity+JWT验证方式

在Spring Boot框架中&#xff0c;可以使用Spring Session来处理会话管理。Spring Session允许开发者在不同的存储后端&#xff08;如Redis、数据库等&#xff09;之间共享和管理会话状态。通过Spring Session&#xff0c;开发者可以轻松地实现会话管理、会话失效以及跨多个节点…

Redux Toolkit

本文作者为 360 奇舞团前端开发工程师 阅读本文章前&#xff0c;需要先了解下 redux 的基本概念与用法&#xff0c;Redux Toolkit 是建立在 Redux 基础之上的工具包&#xff0c;因此需要对 Redux 的基本概念有一定的了解&#xff0c;包括 Action、Reducer、Store、Middleware 等…

彻底解决 ModuleNotFoundError: No module named ‘torch_scatter‘

之前做实验报了一个错误&#xff0c;卡了很久。 具体就是这行代码 from torch_scatter import scatter_add 这个torch_scatter是非官方的库&#xff0c;经常安装失败&#xff0c; 找了很多的安装方法&#xff0c;都不好使&#xff0c;特别是对新版的pytorchcuda环境 机缘巧…