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

做织梦网站时图片路径显示错误百度网页版

做织梦网站时图片路径显示错误,百度网页版,网页设计与网站建设docx,网站开发语言哪种简单【MIT6.S081-2020Fall】Lab: locks 【MIT6.S081-2020Fall】Lab: locks内存分配实验内存分配实验准备实验目的1. 举一个例子说明修改前的**kernel/kalloc.c**中如果没有锁会导致哪些进程间竞争(races)问题2. 说明修改前的kernel/kalloc.c中锁竞争contention问题及其后果3. 解释a…

【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 点结束,所以我们可以默认;两边排队的人数都足够多,当然实际中我们还可以为队伍人物增加设置一个人数信号量

伪代码展示

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

http://www.hkea.cn/news/96583/

相关文章:

  • wordpress 文章主题关键词推广seo
  • 佛山网站建设佛山网络推广代运营公司靠谱吗
  • 贵阳疫情最新消息站内seo优化
  • wordpress相关问题深圳百度关键字优化
  • 做国珍新时代 网站陕西seo顾问服务
  • 建立网站怎么做关键字搜索引擎营销的作用
  • 广州手机网站建设宁波seo优化费用
  • 怎么设置网站服务器宁德市教育局官网
  • 查看网站源代码建站可以牛排seo系统
  • 政府网站建设的基本原则百度网盘电脑版
  • 张家港网站建设福州百度快速优化
  • 兼职做网站编辑百度搜索推广开户
  • 谁告诉你j2ee是做网站的宁波网站推广找哪家公司
  • 谷歌外贸建站多少钱搭建网站教程
  • 赚钱靠普的网站关键字搜索软件
  • 建设银行深分行圳招聘网站做游戏推广一个月能拿多少钱
  • 北京网站建设及推广招聘关键词排名代做
  • 对网站建设的意见建议网络营销推广的方法有哪些
  • 爬虫网站怎么做怎样才能在百度上面做广告宣传
  • 网站页码南昌做seo的公司有哪些
  • 网络设计方案包括哪些深圳百度推广seo公司
  • 亚马逊跨境电商开店站长工具seo综合查询5g
  • 网站怎么做百度快照logo百度快照优化推广
  • 山西网站建设排名seo技术培训山东
  • 日韩系成人影片成首选网站如何优化推广
  • 网站到期续费通知搜索风云排行榜
  • 网站公司说我们做的网站服务器不够用哪个杭州seo好
  • 类似淘宝网站建设费用杭州哪家seo公司好
  • 装修网站怎样做seo专员很难吗
  • 无锡网站外包如何接广告赚钱