MIT-6.s081-OS Lab: locks

本文档记录了MIT 6.S081操作系统实验中关于内存分配器锁和缓冲区缓存的优化。实验目标是提高并发性能,通过为每个CPU设置独立的内存分配列表和锁来减少竞争。对于缓冲区缓存,采用了哈希表的分离链接策略,以提升并发访问效率。实验参考了相关代码仓库和讨论,以理解并实现并发控制策略。

代码: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
 
[root@yfw ~]# cd /opt/openfire [root@yfw openfire]# cd /tmp [root@yfw tmp]# wget https://downloads.apache.org/maven/maven-3/3.9.8/binaries/apache-maven-3.9.8-bin.tar.gz --2025-10-03 07:44:49-- https://downloads.apache.org/maven/maven-3/3.9.8/binaries/apache-maven-3.9.8-bin.tar.gz Resolving downloads.apache.org (downloads.apache.org)... 135.181.214.104, 88.99.208.237, 2a01:4f8:10a:39da::2, ... Connecting to downloads.apache.org (downloads.apache.org)|135.181.214.104|:443... connected. HTTP request sent, awaiting response... 404 Not Found 2025-10-03 07:44:50 ERROR 404: Not Found. [root@yfw tmp]# wget https://mirror.sjtu.edu.cn/apache/maven/maven-3/3.9.8/binaries/apache-maven-3.9.8-bin.tar.gz --2025-10-03 07:45:13-- https://mirror.sjtu.edu.cn/apache/maven/maven-3/3.9.8/binaries/apache-maven-3.9.8-bin.tar.gz Resolving mirror.sjtu.edu.cn (mirror.sjtu.edu.cn)... 111.186.58.212 Connecting to mirror.sjtu.edu.cn (mirror.sjtu.edu.cn)|111.186.58.212|:443... connected. HTTP request sent, awaiting response... 404 Not Found 2025-10-03 07:45:14 ERROR 404: Not Found. [root@yfw tmp]# wget https://mirrors.aliyun.com/apache/maven/maven-3/3.9.8/binaries/apache-maven-3.9.8-bin.tar.gz --2025-10-03 07:45:34-- https://mirrors.aliyun.com/apache/maven/maven-3/3.9.8/binaries/apache-maven-3.9.8-bin.tar.gz Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 124.95.175.51, 124.95.175.56, 124.95.175.52, ... Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|124.95.175.51|:443... connected. HTTP request sent, awaiting response... 404 Not Found 2025-10-03 07:45:34 ERROR 404: Not Found. [root@yfw tmp]# wget https://dlcdn.apache.org/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.tar.gz --2025-10-03 07:47:12-- https://dlcdn.apache.org/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.tar.gz Resolving dlcdn.apache.org (dlcdn.apache.org)... 151.101.2.132, 2a04:4e42::644 Connecting to dlcdn.apache.org (dlcdn.apache.org)|151.101.2.132|:443... failed: Connection timed out. Connecting to dlcdn.apache.org (dlcdn.apache.org)|2a04:4e42::644|:443... failed: Network is unreachable. [root@yfw tmp]# [root@yfw tmp]# [root@yfw tmp]# [root@yfw tmp]# [root@yfw tmp]# wget https://dlcdn.apache.org/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.zip --2025-10-03 07:50:59-- https://dlcdn.apache.org/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.zip Resolving dlcdn.apache.org (dlcdn.apache.org)... 151.101.2.132, 2a04:4e42::644 Connecting to dlcdn.apache.org (dlcdn.apache.org)|151.101.2.132|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 9278421 (8.8M) [application/zip] Saving to: 'apache-maven-3.9.11-bin.zip' apache-maven-3.9.11-bin.zi 100%[======================================>] 8.85M 20.2KB/s in 6m 47s 2025-10-03 07:57:47 (22.2 KB/s) - 'apache-maven-3.9.11-bin.zip' saved [9278421/9278421] [root@yfw tmp]# cd /tmp [root@yfw tmp]# unzip apache-maven-3.9.11-bin.zip -d /opt/ Archive: apache-maven-3.9.11-bin.zip creating: /opt/apache-maven-3.9.11/ creating: /opt/apache-maven-3.9.11/lib/ creating: /opt/apache-maven-3.9.11/boot/ creating: /opt/apache-maven-3.9.11/lib/jansi-native/ creating: /opt/apache-maven-3.9.11/lib/jansi-native/Windows/ creating: /opt/apache-maven-3.9.11/lib/jansi-native/Windows/arm64/ creating: /opt/apache-maven-3.9.11/lib/jansi-native/Windows/x86/ creating: /opt/apache-maven-3.9.11/lib/jansi-native/Windows/x86_64/ creating: /opt/apache-maven-3.9.11/bin/ creating: /opt/apache-maven-3.9.11/conf/ creating: /opt/apache-maven-3.9.11/conf/logging/ creating: /opt/apache-maven-3.9.11/lib/ext/ creating: /opt/apache-maven-3.9.11/lib/ext/hazelcast/ creating: /opt/apache-maven-3.9.11/lib/ext/redisson/ inflating: /opt/apache-maven-3.9.11/README.txt inflating: /opt/apache-maven-3.9.11/LICENSE inflating: /opt/apache-maven-3.9.11/NOTICE inflating: /opt/apache-maven-3.9.11/lib/aopalliance.license inflating: /opt/apache-maven-3.9.11/lib/asm.license inflating: /opt/apache-maven-3.9.11/lib/commons-cli.license inflating: /opt/apache-maven-3.9.11/lib/commons-codec.license inflating: /opt/apache-maven-3.9.11/lib/error_prone_annotations.license inflating: /opt/apache-maven-3.9.11/lib/failureaccess.license inflating: /opt/apache-maven-3.9.11/lib/gson.license inflating: /opt/apache-maven-3.9.11/lib/guava.license inflating: /opt/apache-maven-3.9.11/lib/guice.license inflating: /opt/apache-maven-3.9.11/lib/httpclient.license inflating: /opt/apache-maven-3.9.11/lib/httpcore.license inflating: /opt/apache-maven-3.9.11/lib/jansi.license inflating: /opt/apache-maven-3.9.11/lib/javax.annotation-api.license inflating: /opt/apache-maven-3.9.11/lib/javax.inject.license inflating: /opt/apache-maven-3.9.11/lib/jcl-over-slf4j.license inflating: /opt/apache-maven-3.9.11/lib/jspecify.license inflating: /opt/apache-maven-3.9.11/lib/org.eclipse.sisu.inject.license inflating: /opt/apache-maven-3.9.11/lib/org.eclipse.sisu.plexus.license inflating: /opt/apache-maven-3.9.11/lib/plexus-cipher.license inflating: /opt/apache-maven-3.9.11/lib/plexus-component-annotations.license inflating: /opt/apache-maven-3.9.11/lib/plexus-interpolation.license inflating: /opt/apache-maven-3.9.11/lib/plexus-sec-dispatcher.license inflating: /opt/apache-maven-3.9.11/lib/plexus-utils.license inflating: /opt/apache-maven-3.9.11/lib/slf4j-api.license inflating: /opt/apache-maven-3.9.11/boot/plexus-classworlds.license inflating: /opt/apache-maven-3.9.11/lib/jansi-native/Windows/arm64/jansi.dll inflating: /opt/apache-maven-3.9.11/lib/jansi-native/Windows/x86/jansi.dll inflating: /opt/apache-maven-3.9.11/lib/jansi-native/Windows/x86_64/jansi.dll inflating: /opt/apache-maven-3.9.11/bin/m2.conf inflating: /opt/apache-maven-3.9.11/bin/mvn.cmd inflating: /opt/apache-maven-3.9.11/bin/mvnDebug.cmd inflating: /opt/apache-maven-3.9.11/bin/mvn inflating: /opt/apache-maven-3.9.11/bin/mvnDebug inflating: /opt/apache-maven-3.9.11/bin/mvnyjp inflating: /opt/apache-maven-3.9.11/conf/logging/simplelogger.properties inflating: /opt/apache-maven-3.9.11/conf/settings.xml inflating: /opt/apache-maven-3.9.11/conf/toolchains.xml inflating: /opt/apache-maven-3.9.11/lib/ext/README.txt inflating: /opt/apache-maven-3.9.11/lib/ext/hazelcast/README.txt inflating: /opt/apache-maven-3.9.11/lib/ext/redisson/README.txt inflating: /opt/apache-maven-3.9.11/lib/jansi-native/README.txt inflating: /opt/apache-maven-3.9.11/boot/plexus-classworlds-2.9.0.jar inflating: /opt/apache-maven-3.9.11/lib/jcl-over-slf4j-1.7.36.jar inflating: /opt/apache-maven-3.9.11/lib/aopalliance-1.0.jar inflating: /opt/apache-maven-3.9.11/lib/maven-resolver-connector-basic-1.9.24.jar inflating: /opt/apache-maven-3.9.11/lib/maven-settings-builder-3.9.11.jar inflating: /opt/apache-maven-3.9.11/lib/maven-artifact-3.9.11.jar inflating: /opt/apache-maven-3.9.11/lib/maven-compat-3.9.11.jar inflating: /opt/apache-maven-3.9.11/lib/slf4j-api-1.7.36.jar inflating: /opt/apache-maven-3.9.11/lib/org.eclipse.sisu.inject-0.9.0.M4.jar inflating: /opt/apache-maven-3.9.11/lib/jspecify-1.0.0.jar inflating: /opt/apache-maven-3.9.11/lib/wagon-provider-api-3.5.3.jar inflating: /opt/apache-maven-3.9.11/lib/guice-5.1.0-classes.jar inflating: /opt/apache-maven-3.9.11/lib/maven-slf4j-provider-3.9.11.jar inflating: /opt/apache-maven-3.9.11/lib/maven-resolver-named-locks-1.9.24.jar inflating: /opt/apache-maven-3.9.11/lib/javax.annotation-api-1.3.2.jar inflating: /opt/apache-maven-3.9.11/lib/commons-codec-1.18.0.jar inflating: /opt/apache-maven-3.9.11/lib/maven-resolver-transport-http-1.9.24.jar inflating: /opt/apache-maven-3.9.11/lib/maven-resolver-spi-1.9.24.jar inflating: /opt/apache-maven-3.9.11/lib/httpcore-4.4.16.jar inflating: /opt/apache-maven-3.9.11/lib/wagon-http-3.5.3.jar inflating: /opt/apache-maven-3.9.11/lib/org.eclipse.sisu.plexus-0.9.0.M4.jar inflating: /opt/apache-maven-3.9.11/lib/jansi-2.4.2.jar inflating: /opt/apache-maven-3.9.11/lib/maven-resolver-transport-file-1.9.24.jar inflating: /opt/apache-maven-3.9.11/lib/maven-plugin-api-3.9.11.jar inflating: /opt/apache-maven-3.9.11/lib/plexus-interpolation-1.28.jar inflating: /opt/apache-maven-3.9.11/lib/maven-resolver-transport-wagon-1.9.24.jar inflating: /opt/apache-maven-3.9.11/lib/plexus-utils-3.6.0.jar inflating: /opt/apache-maven-3.9.11/lib/plexus-cipher-2.0.jar inflating: /opt/apache-maven-3.9.11/lib/plexus-sec-dispatcher-2.0.jar inflating: /opt/apache-maven-3.9.11/lib/maven-resolver-provider-3.9.11.jar inflating: /opt/apache-maven-3.9.11/lib/maven-shared-utils-3.4.2.jar inflating: /opt/apache-maven-3.9.11/lib/wagon-file-3.5.3.jar inflating: /opt/apache-maven-3.9.11/lib/guava-33.4.8-jre.jar inflating: /opt/apache-maven-3.9.11/lib/gson-2.13.1.jar inflating: /opt/apache-maven-3.9.11/lib/asm-9.8.jar inflating: /opt/apache-maven-3.9.11/lib/maven-resolver-api-1.9.24.jar inflating: /opt/apache-maven-3.9.11/lib/maven-resolver-util-1.9.24.jar inflating: /opt/apache-maven-3.9.11/lib/maven-embedder-3.9.11.jar inflating: /opt/apache-maven-3.9.11/lib/maven-settings-3.9.11.jar inflating: /opt/apache-maven-3.9.11/lib/error_prone_annotations-2.38.0.jar inflating: /opt/apache-maven-3.9.11/lib/plexus-component-annotations-2.2.0.jar inflating: /opt/apache-maven-3.9.11/lib/javax.inject-1.jar inflating: /opt/apache-maven-3.9.11/lib/maven-model-3.9.11.jar inflating: /opt/apache-maven-3.9.11/lib/failureaccess-1.0.3.jar inflating: /opt/apache-maven-3.9.11/lib/maven-builder-support-3.9.11.jar inflating: /opt/apache-maven-3.9.11/lib/maven-repository-metadata-3.9.11.jar inflating: /opt/apache-maven-3.9.11/lib/maven-resolver-impl-1.9.24.jar inflating: /opt/apache-maven-3.9.11/lib/wagon-http-shared-3.5.3.jar inflating: /opt/apache-maven-3.9.11/lib/httpclient-4.5.14.jar inflating: /opt/apache-maven-3.9.11/lib/maven-core-3.9.11.jar inflating: /opt/apache-maven-3.9.11/lib/commons-cli-1.9.0.jar inflating: /opt/apache-maven-3.9.11/lib/maven-model-builder-3.9.11.jar [root@yfw tmp]# sudo ln -s /opt/apache-maven-3.9.11 /opt/maven [root@yfw tmp]# sudo tee /etc/profile.d/maven.sh << 'EOF' > export M2_HOME=/opt/maven > export PATH=$M2_HOME/bin:$PATH > EOF export M2_HOME=/opt/maven export PATH=$M2_HOME/bin:$PATH [root@yfw tmp]# source /etc/profile.d/maven.sh [root@yfw tmp]# mvn -version Apache Maven 3.9.11 (3e54c93a704957b63ee3494413a2b544fd3d825b) Maven home: /opt/maven Java version: 1.8.0_312, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/jre Default locale: en_US, platform encoding: ANSI_X3.4-1968 OS name: "linux", version: "4.18.0-348.7.1.el8_5.x86_64", arch: "amd64", family: "unix" [root@yfw tmp]# ls /usr/lib/jvm/ | grep -i openjdk-11 java-11-openjdk-11.0.13.0.8-4.el8_5.x86_64 jre-11-openjdk-11.0.13.0.8-4.el8_5.x86_64 [root@yfw tmp]# mvn -version Apache Maven 3.9.11 (3e54c93a704957b63ee3494413a2b544fd3d825b) Maven home: /opt/maven Java version: 1.8.0_312, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/jre Default locale: en_US, platform encoding: ANSI_X3.4-1968 OS name: "linux", version: "4.18.0-348.7.1.el8_5.x86_64", arch: "amd64", family: "unix" [root@yfw tmp]# sudo tee /etc/profile.d/java-maven.sh << 'EOF' > # 设置 Java 11 为默认 JDK > export JAVA_HOME=/usr/lib/jvm/java-11-openjdk > > # 强制 Maven 使用 UTF-8 编码(解决 ANSI_X3.4-1968 问题) > export MAVEN_OPTS="-Dfile.encoding=UTF-8" > > # Maven 路径 > export M2_HOME=/opt/maven > export PATH=$JAVA_HOME/bin:$M2_HOME/bin:$PATH > > echo "✅ JAVA_HOME: $JAVA_HOME" > echo "✅ Maven home: $M2_HOME" > echo "✅ Java version: $(java -version 2>&1 | head -n 1)" > EOF # 设置 Java 11 为默认 JDK export JAVA_HOME=/usr/lib/jvm/java-11-openjdk # 强制 Maven 使用 UTF-8 编码(解决 ANSI_X3.4-1968 问题) export MAVEN_OPTS="-Dfile.encoding=UTF-8" # Maven 路径 export M2_HOME=/opt/maven export PATH=$JAVA_HOME/bin:$M2_HOME/bin:$PATH echo "✅ JAVA_HOME: $JAVA_HOME" echo "✅ Maven home: $M2_HOME" echo "✅ Java version: $(java -version 2>&1 | head -n 1)" [root@yfw tmp]# [root@yfw tmp]# # 删除旧的仅 Maven 配置(避免冲突) [root@yfw tmp]# sudo rm -f /etc/profile.d/maven.sh [root@yfw tmp]# [root@yfw tmp]# # 使用新的 java-maven.sh(上面已创建) [root@yfw tmp]# ls /etc/profile.d/java-maven.sh /etc/profile.d/java-maven.sh [root@yfw tmp]# cd ~ [root@yfw ~]# git clone https://github.com/igniterealtime/openfire-restAPI-plugin.git Cloning into 'openfire-restAPI-plugin'...
最新发布
10-04
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值