同步机制实验报告_Nachos Lab3

本文详述了在Nachos操作系统实验中,对同步机制的深入理解和实践,涉及信号量、锁和条件变量。通过实现生产者消费者问题,展示了同步机制在多线程环境中的应用,探讨了同步互斥的挑战与解决方案。
摘要由CSDN通过智能技术生成

内容一:总体概述

通过本次实习,了解同步的原理及其实现方法。信号量及PV操作是一种经典的同步方法,通过P和V操作在进程间传递一个整数值。为了解决信号量机制带来的程序编写困难、效率低等不足,出现了管程机制,这是一种高级的同步机制。管程类似于面向对象中的类,进程只能通过调用管程中的过程来间接的访问管程中的数据结构。同时,管程的进入是互斥的,管程中设置了条件变量以解决同步问题,一个进程或线程可以等待在条件变量上,但在此之前要先释放管程的锁。进程可以通过发送信号将等待在条件变量上的进程或线程唤醒。对条件变量的操作有wait和signal操作。

 

【用简洁的语言描述本次lab的主要内容;阐述本次lab中涉及到的重要的概念,技术,原理等,以及其他你认为的最重要的知识点。这一部分主要是看大家对lab的总体的理解。

         要求:简洁,不需要面面俱到,把重要的知识点阐述清楚即可。】

内容二:任务完成情况

任务完成列表(Y/N

 

Exercise1

Exercise2

Exercise3

Exercise4

完成情况

Y

Y

Y

Y

 

具体Exercise的完成情况

         Exercise1

调研Linux中实现的同步机制

        

在Linux中进行多线程开发,同步是不可避免的一个问题。在POSIX标准中定义了三种线程同步机制:Mutexes(互斥量),ConditionVariable(条件变量)和POSIX Semaphores(信号量)。

同步互斥的实现要依赖于院子操作,linux内核中原子操作定义在include/asm/atomic.h文件中,它们都使用汇编语言实现,因为C语言并不能实现这样的操作。原子操作主要用于实现资源计数,很多引用计数(refcnt)就是通过原子操作实现的。原子操作类型定义如下:

typedef struct { volatile int counter; } atomic_t;

         volatile修饰字段告诉gcc不要对该类型的数据做优化处理,对它的访问都是对内存的访问,而不是对寄存器的访问。原子操作API包括:atomic_read、atomic_set、atomic_add等。

         Linux内核的信号量在概念和原理上与用户态的System V的IPC机制信号量是一样的,但是它绝对不可能在内核之外使用,因此它与System V的IPC机制信号量毫不相干。信号量在创建时需要设置一个初始值,表示同时可以有几个任务可以访问该信号量保护的临界资源。对信号量操作的API有DECLARE_MUTEX(name)、DECLARE_MUTEX_LOCKED(name)、sema_init(sem,val)、init_MUTEX()等。

         自旋锁。自旋锁与互斥锁类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁。信号量适用于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用,而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。操作自旋锁的API有spin_lock_init()、DEFINE_SPINLOCK()、SPIN_LOCK_UNLOCKED、spin_trylock()、spin_lock()等。

         大内核锁。大内核锁本质上也是自旋锁&

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值