当前位置: 首页 > 设备

操作系统中锁的实现

发布日期:2019-05-08 11:06:30 | 编辑:it技术发展网| 阅读次数:

在为了保证数据操作的一致性多线程编程,操作系统引入了一个锁定机构,以确保代码的关键部分的安全。通过锁定机构,以确保在多芯多线程环境中,在某一时间点,只有一个线程进入代码的临界部分,以保证在操作数据的临界区域一致性。

锁定机构的特征是它的同步原语是原子操作。那么操作系统是如何保证这些原子同步原语做?

操作系统已经能够建立同步原语类似的锁,因为硬件已经为我们提供了一些原子操作,如:中断禁用和启用(中断启用/禁用),并加载到存储器(加载/存储)测试提供(测试和集)的命令。禁止中断这种操作是硬件的步骤,中间不能插入其他操作。同样,为了使中断指令,测试和硬件设置步骤。硬件,软件这些原子操作,我们可以建立一个原子操作:锁定,睡眠和唤醒,信号灯等。

1。要启用和禁用中断实现锁

为了防止一段代码在另一方法的过程中被插入,有必要考虑在单个处理器上,一个线程在通路的执行过程中切换。我们知道,要切换进程上下文切换必须发生上下文切换只有两种可能:

①一个线程自愿放弃CPU并转移控制到操作系统调度器(由操作系统来实现调用产量等)

②线程被迫放弃CPU失控(通过中断实现)

原语的执行过程中,我们不会放弃对CPU的控制,因此,以避免开关过程中,我们不应该打断原始的执行过程中发生。因此,使用禁用中断,不要让系统自动调用CPU的通话,可以防止切换的过程中,一组动作将成为一个原子操作。

锁定中断使能和禁止:

锁()

{

禁止中断

而(值!= FREE)

{

使能中断//能够抢占其他线程,从而改变的值的值

只禁用之间的两行语句int?rrunpt //,其他过程只需要抓住机遇

}

值= BUSY

能中断

}

解锁中断允许和禁止:

开锁 ()

{

禁止中断

值=免费

允许中断

}

2。提供给测试指令来实现锁

原子操作:(设置操作)将被写入到指定的存储单元1,(读取操作)返回原始值的指定存储单元中,我。?。之前写入的内容1的新值。

测试和设置指令:

t?st_and_set(x)的

{

TMP = X

X = 1

返程(TMP)

}

test_and_set(x)的操作被写入到变量x 1,其中x和返回之前写入值1。

使用测试和设置指令来实现锁:

(值的初始值0,这意味着锁是否是打开。)

锁()

{

而(test_and_lock(值)== 1){} //已被执行的每一操作之后原子可以被抢占

}

如果锁是打开的,我。e。的值是0,则返回值是0,则指令值被设置为1时,锁定和退出循环。

如果锁是关闭的,我。e。时,该值为1,则,返回值是1,则循环继续。直到成功锁定。

使用测试和设置指令来实现解锁:

开锁 ()

{

值= 0 //因为它被分配0,可直接在总线上产生时不会中断包裹没有问题

}

3。非忙等待,中断使能和禁止锁来实现

前两个锁实现是比较简单的,但是有一个问题,那就是,有一个忙等待。繁忙等待资源的浪费,我们预计,以改善前两种方法。提高思维:不是忙等待,你不能就当去床上,等待别人的唤醒锁。

锁定操作方式看:

锁()

{

禁止中断

如果(值==免费)

{

值=忙

}

其他

{

添加锁定等待队列

切换到下一个线程

}

能中断

}

使用非高峰等待中断禁用和启用,以实现锁定操作的释放:

开锁 ()

{

禁止中断

值=自由

如果(有线程等待锁)

{

移动就绪队列

值=忙

}

能中断

}

但也有这种方法的问题:因为切换到另一个程序后,程序不能再次执行,那么中断的背部能不能执行指令。而我们在中断的过程中在禁令之下切换到另一种状态,如果另一个进程不执行中断使能或放弃CPU到另一个线程,系统锁定。

该解决方案是不中断锁定操作使能,却留下另一个线程使能中断。

换句话说,我们要求所有的线程遵守以下公约:

①所有线程的承诺线程切换,当你拨打电话将被中断,留在禁用状态。

②重新启用从中断返回的所有线程的承诺将开关。

因此,使用非高峰等待中断禁用和启用,以实现锁的正确操作如下:

这里注意,开关代表线程切换; 启用中断,禁止在系统调用(锁和产量)内实现,即通过操作系统来实现。

4。最不繁忙的等待,测试和设置,实现锁

使用测试和锁定设置,实现不可能完全避免忙等待,我们的目标是尽量减少等待时间。

我们的中心思想是:我们只是执行的操作与忙等待锁定对于,如果不这样做会放弃CPU。

使用使用一个额外的变量后卫,以确保只有一个线程获取价值及其操作。

锁()

{

而(test_and_set(后卫)){}

如果(值==免费)

{

值=忙

后卫= 0

}

其他

{

添加锁定等待队列

后卫= 0

线程切换

}

}

开锁 ()

{

而(test_and_set(后卫)){}

值=自由

如果(有等待锁的其他线程)

{

移动就绪队列

值=忙

}

后卫= 0

}

我们学会了如何使用中断禁止,测试和设置两个硬件原语来实现软件锁定原语。比较这两种方式,显然是在测试和配置更容易,因此使用更常见。此外,测试和设置另一个优点是,你可以在多CPU环境下工作,但不能中断启用和禁用。

本文链接:操作系统中锁的实现

上一篇:德阳小伙微商创业 带领团队5个月销售千万元

下一篇:新手必读学电脑系列:电脑综合学习

友情链接:

学佛 大悲咒念诵 心经讲解

Copyright © 2017 it技术发展网 版权所有 All Rights Reserved. 网站地图

苏ICP备18043316号