当前位置: 首页 > news >正文

【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

【MIT6.S081-2020Fall】Lab: locks 【MIT6.S081-2020Fall】Lab: locks内存分配实验内存分配实验准备实验目的1. 举一个例子说明修改前的**kernel/kalloc.c**中如果没有锁会导致哪些进程间竞争(races)问题2. 说明修改前的kernel/kalloc.c中锁竞争contention问题及其后果3. 解释a…...

图像压缩:Transformer-based Image Compression with Variable Image Quality Objectives

论文作者&#xff1a;Chia-Hao Kao,Yi-Hsin Chen,Cheng Chien,Wei-Chen Chiu,Wen-Hsiao Peng 作者单位&#xff1a;National Yang Ming Chiao Tung University 论文链接&#xff1a;http://arxiv.org/abs/2309.12717v1 内容简介&#xff1a; 1&#xff09;方向&#xff1a;…...

C++ 类和对象篇(四) 构造函数

目录 一、概念 1. 构造函数是什么&#xff1f; 2. 为什么C要引入构造函数&#xff1f; 3. 怎么用构造函数&#xff1f; 3.1 创建构造函数 3.2 调用构造函数 二、构造函数的特性 三、构造函数对成员变量初始化 0. 对构造函数和成员变量分类 1. 带参构造函数对成员变量初始化 2. …...

Swing程序设计(5)绝对布局,流布局

文章目录 前言一、布局管理器二、介绍 1.绝对布局2.流布局总结 前言 Swing窗体中&#xff0c;每一个组件都有大小和具体的位置。而在容器中摆放各种组件时&#xff0c;很难判断其组件的具体位置和大小。即一个完整的界面中&#xff0c;往往有多个组件&#xff0c;那么如何将这…...

linux基础知识之文件系统 df/du/fsck/dump2fs

du du [选项][目录或者文件名] -a 显示每个子文件等磁盘占用量&#xff0c;默认只统计子目录的磁盘占用量 -h 使用习惯单位显示磁盘占用量&#xff0c;如KB&#xff0c;MB或者GB -s 统计总占用量&#xff0c;不列出子目录和文件占用量 面向文件 du -a 16 ./.DS_Store 8 ./requi…...

华为云云耀云服务器L实例评测|Elasticsearch的Docker版本的安装和参数设置 端口开放和浏览器访问

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到各种问题&#xff0c;在解决问题的过程中学到不少和运维相关的知识。 本篇博客介绍Elasticsearch的Docker版本的安装和参数设置&#xff0c;端口开放和浏览器访问。 其他相关的华为云云…...

8章:scrapy框架

文章目录 scrapy框架如何学习框架&#xff1f;什么是scarpy&#xff1f;scrapy的使用步骤1.先转到想创建工程的目录下&#xff1a;cd ...2.创建一个工程3.创建之后要转到工程目录下4.在spiders子目录中创建一个爬虫文件5.执行工程setting文件中的参数 scrapy数据解析scrapy持久…...

软件工程与计算总结(二)软件工程的发展

本章开始介绍第二节内容&#xff0c;主要是一些历史性的东西~ 一.软件工程的发展脉络 1.基础环境因素的变化及其对软件工程的推动 抽象软件实体和虚拟计算机都是软件工程的基础环境因素&#xff0c;它们能从根本上影响软件工程的生产能力&#xff0c;而且是软件工程无法反向…...

Appium开发

特点 开源免费支持多个平台 IOS(苹果)、安卓App的自动化都支持 支持多种类型的自动化 支持苹果、安卓应用原生界面的自动化支持应用内嵌网络视图的自动化支持手机浏览器(Chrome)中的web网站自动化支持flutter应用的自动化 支持多种编程语言 像selenium一样&#xff0c;可以用多…...

EGL函数翻译--eglInitialize

EGL函数翻译–eglInitialize 函数名 EGLBoolean eglInitialize(EGLDisplay display,EGLInt* major,EGLInit* minor); 参数描述 参数display: EGL要初始化的显示连接。 参数major: 输出EGL的主版本号&#xff1b;参数可为空。 参数minor: 输出EGL的次版本号&#xff1b;参数可…...

二项分布以及实现

文章目录 前言所谓二项分布就是只会产生两种结果的概率 1.概念 前言 所谓二项分布就是只会产生两种结果的概率 1.概念 下面是一个二项分布的的theano实现 import numpy as np import theano import theano.tensor as T from theano.tensor.nnet import conv from theano.ten…...

css自学框架之幻灯片展示效果

这一节&#xff0c;我自学了焦点图效果(自动播放&#xff0c;圆点控制)&#xff0c;首先看一下效果&#xff1a; 下面我们还是老思路&#xff0c;css展示学习三个主要步骤&#xff1a;一是CSS代码&#xff0c;二是Javascript代码&#xff0c;三是Html代码。 一、css代码主要如…...

坦克世界WOT知识图谱三部曲之爬虫篇

文章目录 关于坦克世界1. 爬虫任务2. 获取坦克列表3. 获取坦克具体信息结束语 关于坦克世界 《坦克世界》(World of Tanks, WOT)是我在本科期间玩过的一款战争网游&#xff0c;由Wargaming公司研发。2010年10月30日在俄罗斯首发&#xff0c;2011年4月12日在北美和欧洲推出&…...

Idea上传项目到gitlab并创建使用分支

Idea上传项目到gitlab并创建使用分支 1 配置git 在idea的setting中&#xff0c;找到git&#xff0c;配置好git的位置&#xff0c;点击Test按钮显示出git版本号&#xff0c;则说明配置成功。 2 项目中引入git Idea通过VCS&#xff0c;选择Create Git Repository 在弹出的对话框…...

3D孪生场景搭建:参数化模型

1、什么是参数化模型 参数化模型是指通过一组参数来定义其形状和特征的数学模型或几何模型。这些参数可以用于控制模型的大小、形状、比例、位置、旋转、曲率等属性&#xff0c;从而实现对模型进行灵活的调整和变形。 在计算机图形学和三维建模领域&#xff0c;常见的参数化模…...

最短路径专题6 最短路径-多路径

题目&#xff1a; 样例&#xff1a; 输入 4 5 0 2 0 1 2 0 2 5 0 3 1 1 2 1 3 2 2 输出 2 0->1->2 0->3->2 思路&#xff1a; 根据题意&#xff0c;最短路模板还是少不了的&#xff0c; 我们要添加的是&#xff0c; 记录各个结点有多少个上一个结点走动得来的…...

【Linux】Linux常用命令—文件管理(上)

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…...

【Python】基于OpenCV人脸追踪、手势识别控制的求生之路FPS游戏操作

【Python】基于OpenCV人脸追踪、手势识别控制的求生之路FPS游戏操作 文章目录 手势识别人脸追踪键盘控制整体代码附录&#xff1a;列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 视频&#xff1a; 基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 手…...

约束优化算法(optimtool.constrain)

import optimtool as oo from optimtool.base import np, sp, pltpip install optimtool>2.4.2约束优化算法&#xff08;optimtool.constrain&#xff09; import optimtool.constrain as oc oc.[方法名].[函数名]([目标函数], [参数表], [等式约束表], [不等式约数表], [初…...

如何查看postgresql中的数据库大小?

你可以使用以下命令来查看PostgreSQL数据库的大小&#xff1a; SELECT pg_database.datname as "database_name", pg_size_pretty(pg_database_size(pg_database.datname)) AS size_in_mb FROM pg_database ORDER by size_in_mb DESC;这将返回一个表格&#xff0…...

使用python-opencv检测图片中的人像

最简单的方法进行图片中的人像检测 使用python-opencv配合yolov3模型进行图片中的人像检测 1、安装python-opencv、numpy pip install opencv-python pip install numpy 2、下载yolo模型文件和配置文件&#xff1a; 下载地址&#xff1a; https://download.csdn.net/down…...

项目进展(三)-电机驱动起来了,发现了很多关键点,也遇到了一些低级错误,

一、前言 昨天电机没有驱动起来&#xff0c;头发掉一堆&#xff0c;不过今天&#xff0c;终于终于终于把电机驱动起来了&#xff01;&#xff01;&#xff01;&#xff01;&#xff0c;特别开心&#xff0c;哈哈哈哈&#xff0c;后续继续努力完善&#xff01;&#xff01;&…...

目标检测算法改进系列之Backbone替换为RepViT

RepViT简介 轻量级模型研究一直是计算机视觉任务中的一个焦点&#xff0c;其目标是在降低计算成本的同时达到优秀的性能。轻量级模型与资源受限的移动设备尤其相关&#xff0c;使得视觉模型的边缘部署成为可能。在过去十年中&#xff0c;研究人员主要关注轻量级卷积神经网络&a…...

学习 Kubernetes的难点和安排

Kubernetes 技术栈的特点可以用四个字来概括&#xff0c;那就是“新、广、杂、深”&#xff1a; 1.“新”是指 Kubernetes 用到的基本上都是比较前沿、陌生的技术&#xff0c;而且版本升级很快&#xff0c;经常变来变去。 2.“广”是指 Kubernetes 涉及的应用领域很多、覆盖面非…...

【MATLAB源码-第42期】基于matlab的人民币面额识别系统(GUI)。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 基于 MATLAB 的人民币面额识别系统设计可以分为以下步骤&#xff1a; 1. 数据收集与预处理 数据收集&#xff1a; 收集不同面额的人民币照片&#xff0c;如 1 元、5 元、10 元、20 元、50 元和 100 元。确保在不同环境、不…...

【软件测试】软件测试的基础概念

一、一个优秀的测试人员需要具备的素质 技能方面&#xff1a; 优秀的测试用例设计能力&#xff1a;测试用例设计能力是指&#xff0c;无论对于什么类型的测试&#xff0c;都能够设计出高效的发现缺陷&#xff0c;保证产品质量的优秀测试用例。这就需要我们掌握设计测试用例的方…...

Docker-mysql,redis安装

安装MySQL 下载MySQL镜像 终端运行命令 docker pull mysql:8.0.29镜像下载完成后&#xff0c;需要配置持久化数据到本地 这是mysql的配置文件和存储数据用的目录 切换到终端&#xff0c;输入命令&#xff0c;第一次启动MySQL容器 docker run --restartalways --name mysq…...

五种I/O模型

目录 1、阻塞IO模型2、非阻塞IO模型3、IO多路复用模型4、信号驱动IO模型5、异步IO模型总结 blockingIO - 阻塞IOnonblockingIO - 非阻塞IOIOmultiplexing - IO多路复用signaldrivenIO - 信号驱动IOasynchronousIO - 异步IO 5种模型的前4种模型为同步IO&#xff0c;只有异步IO模…...

用nativescript开发ios程序常用命令?

NativeScript是一个用于跨平台移动应用程序开发的开源框架&#xff0c;允许您使用JavaScript或TypeScript构建原生iOS和Android应用程序。以下是一些常用的NativeScript命令&#xff0c;用于开发iOS应用程序&#xff1a; 1、创建新NativeScript项目&#xff1a; tns create m…...

6.Tensors For Beginners-What are Convector

Covectors &#xff08;协向量&#xff09; What‘s a covector Covectors are “basically” Row Vectors 在一定程度上&#xff0c;可认为 协向量 基本上就像 行向量。 但不能简单地认为 这就是列向量进行转置&#xff01; 行向量 和 列向量 是根本不同类型的对象。 …...

wordpress 目录模板/网站排名软件有哪些

这篇分享Python中计算pandas的DataFrame各列相关系数方法&#xff0c;以及介绍如何检验DataFrame两列之间相关系数的显著性。 eg: >>>df.head()Guba XQ BCI Count Value 0 0.021 0.098 0.175 0.077 0.057 1 0.031 0.097 0.192 0.087 0.069 2 0.018 0.101 0.193 0.0…...

wordpress购物网站/安卓优化大师旧版本下载

在web应用中&#xff0c;存在用户发起请求但必须等待服务端响应后才允许继续进行交互的情况&#xff08;最典型的例子就是一个复杂表单的提交&#xff0c;如果在服务端未响应前不禁用用户的操作&#xff0c;一方面可能导致重复提交增加服务端处理压力&#xff0c;另一方面则可能…...

wordpress按钮插件/北京百度关键词优化

面向过程是一件事“该怎么做”&#xff1a;所谓的过程就是一步一步地执行。也就是说&#xff0c;在遇到问题时&#xff0c;我们所关注的是分析解决问题的步骤&#xff0c;然后用函数把这些步骤一步一步的实现&#xff0c;使用的时候一步一步的调用就可以了。 面向对象是一件事…...

html5 网站建设方案/佛山关键词排名效果

Material Design 系列 Material Design UI方案使用讲解Material TextInputLayout使用详解Material ShapeableImageView 使用详解 ShapeableImageView前言属性&方法样式控制关于Stroke总结博客创建时间&#xff1a;2022.08.23 博客更新时间&#xff1a;2022.08.05 以Andro…...

网站建设 中企动力成都/上海网络推广

Scala.Actor这段时间系统的学习了Scala&#xff0c;编程思想上可谓收获不少&#xff0c;想从里面挑些值得写的东西分享给大家&#xff0c;Scala的Actor 可谓这门语言的一个亮点&#xff0c;函数式编程核心价值在于多核编程&#xff0c;所以就打算说说这个Actor&#xff0c;总结…...

网站正在建设中中文模板/网络宣传怎么做

这篇是在下周一写的(2013-01-28)&#xff0c;写迟了一天&#xff0c;不过以后都会按时完成的。 这周不算太忙&#xff0c;还是很轻松的&#xff0c;工作上主要是开始开发新功能了&#xff0c;需求上的理解花费的时间比较多一点&#xff0c;不过你如果认真&#xff0c;细心&…...