MIT-6.s081-OS Lab: locks

MIT6.S081学习总结-lab8:Lock lab8 是关于锁的应用,重新设计内存分配和缓冲区分配,来增加多核并行速度 Memory allocator 物理内存分配,之前的实现里每次分配内存kalloc、释放内存kfree都需要获得全局锁kmem.lock,在多核系统里这会导致很激烈的race condition。改进时,可以考虑为每个CPU一个空闲内存列表,每次分配内存时先分配当前cpu空闲内存列表里的内存,如果不够就从其他空闲列表里‘steal’一个内存快。这样需要每个列表一个锁,可以大量减少锁的竞争。 实现: kmem修改为每个CPU一个fr 阅读详情

代码:https://github.com/RedemptionC/xv6-riscv-6s081/tree/lock

本实验主要是重新设计锁,增加并行性

分别是为kmem和bcache设计

memory allocator

https://blog.youkuaiyun.com/RedemptionC/article/details/108127655 这里对kalloc做了一点基本的分析

他的设计是所有的cpu(NCPU为8,但是实际是3个)都使用一个freelist,这样lock contention就很高

要做的改进是为每一个cpu设置一个free list,每个freelist一个锁,这样不同的cpu就能独立的进行分配

首先修改结构体的定义,改为定义一个结构体数组:

struct kmem{
  struct spinlock lock;
  struct run *freelist;
};

struct kmem kmems[3];

然后在kinit中初始化三个锁,仍然用freerange将全部内存分配给调用它的cpu

void
kinit()
{

  printf("[kinit] cpu id %d\n",getcpu());
  for(int i=0;i<3;i++)
    initlock(&kmems[i].lock, "kmem");
  freerange(end, (void*)PHYSTOP);
}

其实这里如果将全部的内存均匀的分给每个cpu的freelist,会更好,但是不管怎样,都会面临这样一个问题:当前cpu的freelist为空,但是其他cpu的freelist不为空,此时就需要向其他cpu借内存

修改kalloc

void *
kalloc(void)
{
  // printf("[kalloc] cpu id %d\n",getcpu());
  // printkmem();
  struct run *r;
  int hart=getcpu();
  acquire(&kmems[hart].lock);
  r = kmems[hart].freelist;
  if(r)
    kmems[hart].freelist = r->next;
  release(&kmems[hart].lock);
  if(!r)
  {
    // 当前cpu对应的freelist为空 需要从其他cpu对应的freelist借
    r=steal(hart);
  }
  if(r)
    memset((char*)r, 5, PGSIZE); // fill with junk
 
2020 MIT6.s081 Lab Locks 阅读详情

相关推荐

PKU-OS-Labs:北京大学OS实验室,内容取自MIT 6.828

这是成龙(Jackie Yang)在北京大学OS实验室课程中的回购。 该课程材料改编自2014 MIT 6.828。 介绍 这是我在北京大学OS实验室课程中的仓库。 北京大学操作系统实验室(荣誉课程)课程。 本课程改编自2014年MIT 6.828的内容,因此这对于其他学习类似MIT 6.828的任何课程的学生也将有所帮助。 我将其张贴在这里,以供将来参加本课程的学员参考。 在自己完成这些实验的过程中,我发现其他人的回购非常有帮助。 我希望我的作业也可以对其他人有所帮助,尤其是在以下方面: 对完成后的代码应该具有什么样的见解。 调试一个非常隐蔽的错误时要与之比较的正确版本。 编程风格的参考。 (我尝试在每个实验室中编写干净整洁的代码。希望您可以做得更好。) 同时,我不赞成以下使用此仓库的方式: 窃家庭作业的来源 希望您在完成这些实验方面有很好的经验。 如果您觉得有帮助,请别忘了

雷达信号处理中的CLEAN算法实现与优化

在信号处理领域,杂波抑制是提升目标检测性能的关键技术。CLEAN算法作为一种迭代去卷积方法,通过逐步提取最强信号分量并消除其影响,有效解决了传统方法在复杂环境下的局限性。该算法结合自适应阈值和噪声基底估计,显著提高了雷达信号处理的精度和鲁棒性。在工程实践中,CLEAN算法广泛应用于气象雷达、地物杂波抑制等场景,通过Matlab仿真可以快速验证算法性能并优化参数设置。本文重点探讨了CLEAN算法在雷达信号处理中的实现细节和优化技巧,包括距离徙动补偿、多普勒补偿等关键技术。

weixin_32430941的博客 264

RV1126开发板性能实测:网络、温度与功耗全解析

本文对RV1126开发板进行了全面的性能实测,重点分析了网络性能、温度表现与功耗特性。测试发现UDP带宽可达500Mbps,但TCP性能受限于协议栈;散热设计对持续性能至关重要,大板子在AI推理和视频推流中表现更稳定。为嵌入式开发者提供了真实的选型参考和优化建议。

d3e4f的博客 268

西门子828D/840DSL数控机床产量数据采集实战:一个C#程序员的踩坑与填坑记录

本文详细记录了C#程序员在西门子828D/840DSL数控机床产量数据采集实战中的经验与教训。从硬件连接到软件配置,再到数据读取与异常处理,文章分享了工业现场编程的特殊挑战和解决方案,特别是针对数控系统的TCP/IP通信、PLC变量地址映射及数据解析等关键技术点。

weixin_42741930的博客 596

知识推理——TransE(知识表示、知识嵌入)

知识图谱嵌入/表示方法 TransE

missyoudaisy的博客 1831

【AI平台】n8n入门2:第一个工作流,调用本地大模型

n8n是一款开源的,专注于AI工作流构建,支持灵活的自定义与集成。就是可以把大模型和其他工具联合起来,这就厉害了。而且,免费功能又强大,目前很火,来研究一下。

正经教主是个热衷于正经学习分享的教主。 4531

告别JTAG!用Artix-7和SPI Flash实现FPGA远程升级的保姆级教程

本文详细介绍了如何利用Artix-7 FPGA和SPI Flash实现FPGA远程升级(OTA)的完整方案。通过硬件连接、Vivado工程配置和STM32模拟更新等步骤,帮助开发者告别传统的JTAG烧录方式,实现高效、安全的远程固件更新,特别适用于嵌入式系统开发中的现场维护场景。

weixin_33964987的博客 364

mapbox高阶,加载倾斜摄影

本文详细介绍如何基于mapbox-gl v3.8.0版本实现倾斜摄影的加载,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 345

北斗导航 | 卫星信号捕获跟踪原理解析

卫星信号的捕获与跟踪是导航接收机的"眼睛",其性能直接决定定位精度、动态适应性和抗干扰能力。随着北斗三号全球组网完成,新一代接收机正朝着。两大核心阶段,二者共同构成定位的基础。调制,频谱主瓣宽度达4.092MHz,较传统BPSK调制抗干扰能力提升3dB[38]。的目标持续演进,在自动驾驶、精密农业等领域展现出巨大应用潜力。二维空间中搜索峰值相关能量[4]。卫星导航接收机对信号的处理可分为。北斗三号B1C/B2a信号采用。北斗三号新增的B1C信号采用。

尘世冰封的专栏 775

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: xv6 risc-v lock notes
下一篇: MIT-6.s081-OS Lab: fs
RedemptionC
博客等级 码龄11年 103粉丝 84原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值