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
 
ConcurrentHashMap是Java标准库中的线程安全版本的哈希表,它在处理并发修改时采用了一套复杂的机制来避免冲突并保证数据的一致性。以下是ConcurrentHashMap处理并发冲突的主要策略: 1. **分离链表**(Separate Chaining):每个桶(bucket)不是一个简单的列表,而是由多个链表组成,每个链表对应哈希表的一个槽位。当多个元素映射到同一个槽位时,它们会被添加到对应的链表中。这使得在高并发环境下,虽然单个链表可能很长,但由于是分开管理的,不会相互影响。 2. **锁分段**(Lock Striping):ConcurrentHashMap采用了分段锁的设计,即桶是被分成多个独立的部分,每个部分有自己的锁。这意味着读操作可以并行进行,只有写入操作需要获取相应的锁。这就大大提高了并发性能,因为大部分读取操作不需要阻塞。 3. **无锁读**(Read/write Locks):在某些情况下,读操作是互斥的,但写操作则不是。ConcurrentHashMap使用了乐观锁(CAS)和失败快速重试的策略,使得读操作几乎总是非阻塞的。只有在遇到冲突时(比如尝试更新的值已经被其他线程修改),才会进入锁竞争。 4. **Cas操作**(Compare-and-Swap):ConcurrentHashMap利用原子性的Cas操作来检查和更新数据,如果发现数据已被其他线程更新,就回滚操作并重试,减少了锁的竞争次数。 5. **写时复制**(Write-Skipping):当读取到某个值时,如果该值被其他线程修改,新读取到的是旧值的一个副本,而不是直接引用。这是因为在读取过程中已经对原值进行了锁定,所以修改后的值还未传播到其他观察者。 总的来说,ConcurrentHashMap通过以上策略结合,能够在并发环境中高效地处理冲突,实现了高性能的同时保持数据一致性。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值