操作系统设计之锁的实现

1.以中断启用和中断禁止来实现锁

/*

闭锁的第一个操作是禁止中断,这是一个硬件原子操作。然后判断value是否等于FREE,如果是,就表明这个资源没有被其他进程占用,我们就

将其设置为忙,然后开中断。如果value不等于FREE,那么我们循环等待value变为FREE,循环过程中,不断的开中断和关中断,使得在启用

中断和禁止中断之间别的进程能够得以执行。

*/

void lock()

{

cli();

while(value != FREE)

{

sti();

cli();

}

value = BUSY;

sti();

}

void unlock()

{

cli();

value = FREE;

sti();

}

2.以测试指令和设置指令来实现锁

//要求所有的进程在调用unlock之前必须先调用lock,该方法效率强于方法1

int test_and_set(int x)

{

tmp = x;

x = 1;

return tmp;

}

void lock()

{

while(test_and_set(value) == 1); //value的初始值为0

}

void unlock()

{

value = 0;

}

3.以非繁忙等待、中断启用、禁止来实现锁

/*

法1和法2虽然简单、容易理解,但都有一个问题--繁忙等待,繁忙等待浪费资源,并且有可能造成死锁。我们要将其改为不让它繁忙等待,在

其拿不到锁时去睡觉,等待别人叫醒。

*/

void lock()

{

cli();

if(value == FREE)

value = BUSY;

else

{

//把该进程从就绪队列移除,并加入到等待该锁的队列中

}

sti();

}

void unlock()

{

cli();

value = FREE;

if(any task is wating for this lock)

{

//将该进程从该等待队列移除,并将其加入到就绪队列等待调度

value = BUSY;

}

sti();

}

4.以最少繁忙等待、测试与设置来实现锁

void lock()

{

while(test_and_set(guard) == 1);

if(value == FREE)

{

value = BUSY;

guard = 0;

}

else

{

//把该进程从就绪队列移除,并加入到等待该锁的队列中

guard = 0;

//switch to next task(这个不能删掉)

}

}

void unlock()

{

while(test_and_set(guard) == 1);

value = FREE;

if(any task is wating for this lock)

{

//将该进程从该等待队列移除,并将其加入到就绪队列等待调度

value = BUSY;

}

guard = 0;

}

时间: 2024-10-05 06:05:08

操作系统设计之锁的实现的相关文章

物联网技术上面临的基本问题和操作系统设计

时下,在操作系统界,有一个热得发紫的名词"物联网操作系统",但物联网和操作系统究竟是什么关系,物联网将面临什么问题,操作系统又能为其解决什么问题呢? 操作系统和其他电子产品一样,是个不断迭代.与时俱进的一个东西,由用户需求.软件积累.硬件成本等共同推动发展,反过来又激发需求.定义硬件.在物联网时代,大家都在谈论物联网操作系统,我们要分析物联网的核心问题是什么,操作系统对于物联网,能做什么,不能做什么,它如何影响操作系统设计.最后,我们会发现,物联网的核心问题中,大多数问题,操作系统会表

【转】一种新的操作系统设计

我一直在试图利用程序语言的设计原理,设计一种超越"Unix 哲学"的操作系统.这里是我的设想: 这种系统里面的程序间通信不使用无结构的字符串,而是使用带有类型和结构的数据.在这样的系统里面,Unix 和其它类似操作系统(比如 Windows)里的所谓"应用程序"的概念基本上完全消失.系统由一个个很小的"函数"组成,每个函数都可以调用另外一个函数,通过参数传递数据.每个函数都可以手动或者自动并发执行.用现在的系统术语打个比方,这就像是所有代码都是&

锁、CAS操作和无锁队列的实现

https://blog.csdn.net/yishizuofei/article/details/78353722 锁的机制 锁和人很像,有的人乐观,总会想到好的一方面,所以只要越努力,就会越幸运:有的人悲观,总会想到不好的一方面,患得患失,所以经常会做不好事.我一直把前一个当作为我前进的动力和方向,快乐充实的过好每一天. 常用的锁机制也有两种: 1.乐观锁:假设不会发生并发冲突,每次不加锁而去完成某项操作,只在提交操作时,检查是否违反数据完整性.如果因为冲突失败就继续重试,直到成功为止.而乐

Android实例-手机安全卫士(三十一)-根据指令完成相应操作二(锁屏和数据清除)

一.目标 1.实现远程锁屏和数据销毁操作: 2.初步制作“一键锁屏”应用和优化. 二.代码实现 1.在Receiver包下新建一个类(取名LockScreenReceiver)继承DeviceAdminReceiver类(是BroadcastReceiver类的一个子类),并在清单配置文件配置receiver标签 (1)在receiver标签中,增加name.permission属性,name为新建类(LockScreenReceiver)的全路径名称,permission为必须的BIND_DE

Hiver 操作 MySQL 导致锁表

Hadoop 搬迁到新集群后,操作主库 MySQL 导致了锁表...sad 具体锁表时间点  : 2016-1-14 14:31  到   2016-1-14 14:36 之间 在 oradba 的 innodbstatus 信息拿到后,还需要后续继续分析到底是哪条 SQL 锁的... 参考 Link : http://mysqllover.com/?p=431

操作系统文件建议锁与强制锁

文件锁有建议使用和强制使用之分. 建议锁又称协同锁.对于这种类型的锁,内核只是提供加减锁以及检测是否加锁的操作,但是不提供锁的控制与协调工作.也就是说,如果应用程序对某个文件进行操作时,没有检测是否加锁或者无视加锁而直接向文件写入数据,内核是不会加以阻拦控制的.因此,建议锁,不能阻止进程对文件的操作,而只能依赖于大家自觉的去检测是否加锁然后约束自己的行为:多数 Unix 和类 Unix 操 作系统使用建议型锁,有些也使用强制型锁或兼而有之. 强制锁,是OS内核的文件锁.每个对文件操作时,例如执行

【连载】redis库存操作,分布式锁的四种实现方式[三]--基于Redis watch机制实现分布式锁

一.redis的事务介绍 1. Redis保证一个事务中的所有命令要么都执行,要么都不执行.如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行.而一旦客户端发送了EXEC命令,所有的命令就都会被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令. 2. 除此之外,Redis的事务还能保证一个事务内的命令依次执行而不被其他命令插入.试想客户端A需要执行几条命令,同时客户端B发送了一条命令,如果不使用事务,则客户端B的命令可能会插入

具体CAS操作实现(无锁算法)

具体CAS操作 上一篇讲述了CAS机制,这篇讲解CAS具体操作. 什么是悲观锁.乐观锁?在java语言里,总有一些名词看语义跟本不明白是啥玩意儿,也就总有部分面试官拿着这样的词来忽悠面试者,以此来找优越感,其实理解清楚了,这些词也就唬不住人了. synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁. CAS操作的就是乐观锁,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止. 那么问题来了,什么是CAS操作? CAS是Comp

操作系统设计与实现 读笔(3)

第三章:I/O. 软件必须处理的问题:I/O硬件,I/O设备和I/O控制器的关系. I/O软件的四个层次:中断例程,设备驱动程序,设备无关I/O软件,以及在用户空间运行的I/O库和假脱机(?). 死锁概念:发生在一组进程都拥有对某些资源的互斥存取权,并且每个进程还要求仍属于该组中另一个进程的资源时. MINIX中的设备驱动程序是作为嵌入在内核中的进程来实现的. 同步闹钟任务与任务系统不是设备驱动程序但在结构上非常相似.都有一个主循环取出请求并进行处理,逐渐送回回答消息报告发生的事件.所有的任务都