【LittleXi】【MIT6.S081-2020Fall】Lab: locks

2023-10-06 00:15

本文主要是介绍【LittleXi】【MIT6.S081-2020Fall】Lab: locks,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【MIT6.S081-2020Fall】Lab: locks

  • 【MIT6.S081-2020Fall】Lab: locks
  • 内存分配实验
    • 内存分配实验准备
    • 实验目的
    • 1. 举一个例子说明修改前的**kernel/kalloc.c**中如果没有锁会导致哪些进程间竞争(races)问题
    • 2. 说明修改前的kernel/kalloc.c中锁竞争contention问题及其后果
    • 3. 解释acquire和release中push_off/pop_off的作用
    • 4. 对上页实验内容的实现思路、代码设计、测试结果
      • 实验思路
      • 代码设计
      • 测试结果
    • 同步互斥实验目标
      • Q1:关系分析,请写出题目中存在的互斥和同步的关系
      • Q2:上述关系可以抽象为几个进程? 写出伪代码描述和实现思路
        • 伪代码展示

【MIT6.S081-2020Fall】Lab: locks

内存分配实验

内存分配实验准备

环境配置

  • commit lab0的代码

git commit -am lab0

  • 切换到lock分支

git fetch

git checkout lock

make clean

  • make; make qemu并执行kalloctest观察锁竞争情况

实验目的

1. 为每个CPU维护一个空闲页面链表,每个链表都有自己的锁**

​ → 不同CPU上的分配和释放可以并行执行

2. 当某个CPU的空闲页面用尽时,需要借用另一CPU的空闲页面**

​ → 虽然“借用”时可能引入锁竞争,但这种情况较少发生

​ 完成实验后,需通过kalloctest的3个测试 (测试时间可能较长)

1. 举一个例子说明修改前的kernel/kalloc.c中如果没有锁会导致哪些进程间竞争(races)问题

答:

  1. Double Free问题:如果没有锁来保护释放内存的操作,多个进程可能会同时尝试释放同一块内存。这可能导致内存被释放多次,破坏内存管理的一致性。当后续的内存分配请求发生时,可能会分配到之前已经被释放但未及时回收的内存块,从而导致不可预测的错误和安全问题。
  2. 内存泄漏问题:如果没有锁来保护内存分配的操作,多个进程可能会同时尝试分配内存。这可能导致内存分配失败,因为内存池可能在分配之前已经被其他进程用尽。此时,一些进程可能无法获得所需的内存,导致内存泄漏。
  3. 数据不一致性问题:如果多个进程同时修改内存池的数据结构,没有适当的锁来同步这些操作,就可能导致数据结构的损坏,从而破坏了内存管理的一致性。
  4. 性能问题:没有适当的锁来管理内存池,可能导致竞争条件,降低了系统的性能。竞争条件会导致进程等待或频繁地重试内存分配/释放操作,从而增加了系统的负载和延迟。

2. 说明修改前的kernel/kalloc.c中锁竞争contention问题及其后果

答:

1、修改前的kalloc.c代码中,只有一个内核内存分配器(kmem),这会导致在很多线程想要获取锁,想要CPU 调度分配内存的时候造成拥塞情况,导致大量的线程获取锁失败,使得程序运行效率降低。

3. 解释acquire和release中push_off/pop_off的作用

答:“acquire” 和 “release” 中的 “push_off” 和 “pop_off” 是通常用于实现中断禁用(中断屏蔽)的操作。这些操作通常在多任务操作系统中用于确保获取锁或释放锁的相关代码的原子性执行,以防止并发执行的任务相互干扰。

4. 对上页实验内容的实现思路、代码设计、测试结果

实验思路

1、为每个CPU维护一个空闲页面链表,我们可以通过修改kalloc.c代码中的kmem结构体,修改为长度为NCPU的结构体数组,再init函数中,初始化8个结构体中的锁,进行free操作的时候,注意获取当前CPU的id,然后对对应id的CPU进行释放

实现的核心代码:

struct
{struct spinlock lock;struct run *freelist;
} kmem[NCPU];

2、当其它CPU空闲的时候,我们怎样借用其它CPU来完成任务呢?我们可以进行一个简单的for循环遍历,当发现这个CPU是空闲的,那么我们就可以借用这个CPU

实现的核心代码

  if (!r){for (int j = 0; j < NCPU; j++){if (i != j){// 尝试获取锁acquire(&kmem[j].lock);if (kmem[j].freelist){// 如果获取到了,那么就分配,并退出r = kmem[j].freelist;kmem[j].freelist = r->next;release(&kmem[j].lock);break;}release(&kmem[j].lock);}}}

代码设计

// Physical memory allocator, for user processes,
// kernel stacks, page-table pages,
// and pipe buffers. Allocates whole 4096-byte pages.#include "types.h"
#include "param.h"
#include "memlayout.h"
#include "spinlock.h"
#include "riscv.h"
#include "defs.h"void freerange(void *pa_start, void *pa_end);extern char end[]; // first address after kernel.// defined by kernel.ld.struct run
{struct run *next;
};struct
{struct spinlock lock;struct run *freelist;
} kmem[NCPU];void kinit()
{for (int i = 0; i < 8; i++)initlock(&kmem[i].lock, "kmem");freerange(end, (void *)PHYSTOP);
}void freerange(void *pa_start, void *pa_end)
{char *p;p = (char *)PGROUNDUP((uint64)pa_start);for (; p + PGSIZE <= (char *)pa_end; p += PGSIZE)kfree(p);
}// Free the page of physical memory pointed at by pa,
// which normally should have been returned by a
// call to kalloc().  (The exception is when
// initializing the allocator; see kinit above.)
void kfree(void *pa)
{struct run *r;if (((uint64)pa % PGSIZE) != 0 || (char *)pa < end || (uint64)pa >= PHYSTOP)panic("kfree");// Fill with junk to catch dangling refs.memset(pa, 1, PGSIZE);r = (struct run *)pa;int i = r_tp();push_off();acquire(&kmem[i].lock);r->next = kmem[i].freelist;kmem[i].freelist = r;release(&kmem[i].lock);pop_off();
}// Allocate one 4096-byte page of physical memory.
// Returns a pointer that the kernel can use.
// Returns 0 if the memory cannot be allocated.
void *
kalloc(void)
{struct run *r;push_off();int i = r_tp();acquire(&kmem[i].lock);r = kmem[i].freelist;if (r)kmem[i].freelist = r->next;release(&kmem[i].lock);if (!r){for (int j = 0; j < NCPU; j++){if (i != j){// 尝试获取锁acquire(&kmem[j].lock);if (kmem[j].freelist){// 如果获取到了,那么就分配,并退出r = kmem[j].freelist;kmem[j].freelist = r->next;release(&kmem[j].lock);break;}release(&kmem[j].lock);}}}pop_off();if (r)memset((char *)r, 5, PGSIZE); // fill with junkreturn (void *)r;
}

测试结果

请添加图片描述

同步互斥实验目标

Q1:关系分析,请写出题目中存在的互斥和同步的关系

答:同步关系包含互斥关系

1、店面的窗口属于临界区资源,且煎饼果子占用了该窗口后,即将该临界区资源上锁,鸡蛋灌饼不能再占用该临界区资源,反之亦然,此过程既体现了同步关系又体现了互斥关系

2、同学们排队购买早餐,并且根据自己的需求站成了两队,体现出来同步关系,不至于让整个队伍乱掉,有序地进行,去获取窗口上的资源,符合FIFO思想、同学们位于同步阻塞态,但是当8点后,没买到的同学到其它窗口去了,又体现出来非阻塞态

Q2:上述关系可以抽象为几个进程? 写出伪代码描述和实现思路

答:上述几个关系可以抽象为4个进程

实现思路:

1、可以先定义四个wait函数,分别表示煎饼果子等待篮子为空,鸡蛋灌饼等待篮子为空,第一支队伍等待鸡蛋灌饼被添上,第二支队伍等待煎饼果子被添上,然后在主函数中fork四个线程,宏观并行跑这四个函数,知道到达早上8点收摊位置

2、因为题目说每天都会出现从一开始就排队直到 8 点结束,所以我们可以默认;两边排队的人数都足够多,当然实际中我们还可以为队伍人物增加设置一个人数信号量

伪代码展示

请添加图片描述
请添加图片描述
请添加图片描述

这篇关于【LittleXi】【MIT6.S081-2020Fall】Lab: locks的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/152358

相关文章

sqli-lab靶场学习(一)——Less1

前言 最近一段时间想切入安全领域,因为本身有做数据库运维工作,就打算从sql注入方向切入。而sql注入除了学习日常书本上的概念外,需要有个实践的环境,刚好看到sqli-lab这个靶场,就打算先用这个来学习。 安装部署 网上很多关于安装部署的教程,很简单。本人是下载PHPStudy进行部署的。由于sqli-lab是用php5版本,现在很多一体化环境(我用wamp)的php都是7版本。我试过

会议记录|MAS Lab 年度组会记录

前言:本篇博客记录 20240831 MAS Lab 第一次大组会要点。 “预测未来最好的方式就是创造它” —— 面向对象之父 Alan Kay 张老师提及 The MIT Media Lab (中国多媒体大会上了解到的这个实验室),用技术带动产业发展、创造生态。 产业布局 未来产业的新赛道将是各领域与AI的强强联合 国家人工智能学院……京津冀:基础研究长三角:商业模式

MIT 6.5940 EfficientML.ai Fall 2023: Lab 1 Pruning

EfficientML.ai Lec 3 - Pruning and Sparsity (Part I) MIT 6.5940, Fall 2023, Zoom 本文是EfficientML.ai Fall 2023课程作业1练习答案,在本次练习里将会对经典的分类神经网络进行剪枝处理,减少模型大小和延迟。The goals of this assignment are as fo

CSAPP Data Lab

CSAPP 的第一个 Lab,对应知识点为书中的第 2 章(信息的表示与处理),要求使用受限制的运算符和表达式实现一些位操作。主要分为两个部分:整数部分和浮点数部分。其中整数部分限制较多,比较偏重技巧性,部分题个人认为很有难度。而浮点数部分则比较基础,主要考察对 IEEE 754 标准的熟悉程度,代码较长,但思路相对简单。 bitXor 思路 使用德-摩根定律进行推导,推导过程如下: 代

MIT6.S081最详解析与归纳——lab10:mmap

Lab10主题:mmap (一)前置知识:mmap(1)VMA(2)mmap (二)Lab:mmap(1)前置工作(2)实现sys_mmap()(3)实现pagefault(4)实现sys_munmap(5)脏页位设置(六)其它函数的小修改 (三)感言 (一)前置知识:mmap (1)VMA VMA(Virtual Memory Area) 代表虚拟内存区域,它描述了一个进程

Wireshark Lab: TCP v7.0

Wireshark Lab: TCP v7.0 1. Capturing a bulk TCP transfer from your computer to a remote server 步骤 打开浏览器,在url中输入http://gaia.cs.umass.edu/wiresharklabs/alice.txt ,然后右键点击另存为下载文本。 访问http://gaia.cs.um

CSE12 Lab 4: Simple CSV File Analysis

This file shows the stock returns from an investment portfolio over a year. The “A” column contains the stock name and the “B” column indicates the returns in USD (You can assume that there are no

brew install opencv@2 时报错 Error: Can't create update lock in /usr/local/var/homebrew/locks!

解决方案,报错里已经说明了: 我的解决方案: sudo chown -R "$USER":admin /usr/local   stackoverflow上的答案 I was able to solve the problem by using chown on the folder: sudo chown -R "$USER":admin /usr/local Also you'

6.S081的Lab学习——Lab8: locks

文章目录 前言一、Memory allocator(moderate)提示:解析 二、Buffer cache(hard)解析: 三、Barrier (moderate)解析: 总结 前言 一个本硕双非的小菜鸡,备战24年秋招。打算尝试6.S081,将它的Lab逐一实现,并记录期间心酸历程。 代码下载 官方网站:6.S081官方网站 安装方式: 通过 APT 安装 (De

Java中synchronized与java.util.concurrent.locks.Lock区别

相同点:Lock能完成synchronized所实现的所有功能 区别:Lock比synchronized更精确的线程语义和性能;chronized会自动释放锁,而Lock需要程序员手动释放,而且必须在finally从句中释放。Lock更强大的功能,如tryLock方法可以非阻塞方式去拿锁: import java.util.concurrent.locks.Lock;import jav