1 / 52
文档名称:

第5章 并发和竞态.ppt

格式:ppt   大小:1,277KB   页数:52页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

第5章 并发和竞态.ppt

上传人:977562398 2022/7/3 文件大小:1.25 MB

下载得到文件列表

第5章 并发和竞态.ppt

相关文档

文档介绍

文档介绍:第5章 并发和竞态
第一页,共52页。
原子操作
考虑将整数变量加1的操作i++怎么实现?
得到当前变量i的值并且拷贝到一个寄存器中
将寄存器中的值加1
把i的新值写回到内存中
设i为全局变量,初始值为7,有两个线程欲对其施行negative; otherwise false.
int atomic_add_return(int i, atomic_t *v)
Atomically add i to v and return the result
int atomic_sub_return(int i, atomic_t *v)
Atomically subtract i from v andreturn the result.
int atomic_inc_return(int i, atomic_t *v)
Atomically increment v by one and return the result.
int atomic_dec_return(int i, atomic_t *v)
Atomically decrement v by one and return the result.
int atomic_dec_and_test(atomic_t *v)
Atomically decrement v by one and return true if zero; false otherwise.
int atomic_inc_and_test(atomic_t *v)
Atomically increment v by one and return true if the result is zero; false otherwise.
第七页,共52页。
原子操作
2. 原子位操作
atomic_t 类型在进行整数算术操作时是不错的. 但是当你需要以原子方式操作单个位时, 它无法工作。 为此, 内核提供了一套函数来原子地修改或测试单个位,整个操作发生在单步内, 没有中断(或者其他处理器)能干扰
原子位操作执行很快, 因为它们使用单条机器指令来进行操作, 而在任何低层平台做的时候不用禁止中断
位操作函数在 <asm/> 中声明
位操作是对内存地址进行的操作,参数是一个指针和一个位号,指针指向内存地址,位号指明操作的位
第八页,共52页。
原子操作
位操作接口:
void set_bit(nr, void *addr);
设置 addr 指向的数据项的第 nr 位.
void clear_bit(nr, void *addr);
清除 addr 指向的数据项的第nr位.
void change_bit(nr, void *addr);
翻转指定的位.
第九页,共52页。
原子操作
test_bit(nr, void *addr);
返回指定位的当前值.
int test_and_set_bit(nr, void *addr);
设置指定的位,并返回其原先的值
int test_and_clear_bit(nr, void *addr);
清除指定的位,并返回其原先的值
int test_and_change_bit(nr, void *addr);
翻转指定的位,并返回其原先的值
第十页,共52页。
原子操作
例 可以使用位操作来管理一个锁变量以控制对某个共享数据项的访问。假定这个位是 0时锁空闲,非零时锁忙。
while (test_and_set_bit(nr, addr) != 0) wait_for_a_while();


if (test_and_clear_bit(nr, addr) == 0) something_went_wrong();
共享数据项
第十一页,共52页。
1
3
2
4
第5 章 并发和竞态
原子操作
自旋锁
信号量
scull的缺陷
在scull中使用信号量
5
第十二页,共52页。
自旋锁
自旋锁是一个互斥设备, 它只能有 2 个值:“上锁”和“解锁”. 它通常实现为某个整数值中的单个位. 希望获取特定锁的代码测试相关的位, 如果锁是可用的, 这个“上锁”位被置位并且代码继续进入临界区;相反, 如果这个锁已经被别人获得, 代码进入一个忙循环中反复检查这个锁, 直到它变为可用. 这个循环就是自旋锁的“自旋”部分。自旋意味着“抱着CPU空转”
也可不“自旋”,即让出CPU,自已睡眠等待,钥匙放出来时让别人唤醒。此即为“信号量”,其可被称为“睡眠锁”
自旋锁与信号量孰