分类:
2012-12-18 19:49:44
原文地址:数据同步 作者:zhanglong71
Linux内核中的数据同步
1.内核控制路径的三种执行环境:
1>异常
2>中断
3>可延迟函数(中断的的下半部分bottom half)
2.在内核环境下,如何选择自旋锁,信号量及中断禁止三种
2.1异常时的数据访问保护
1>异常处理时,最常见的就是系统调用,此时的CPU运行在内核态为用户进程提供服务。此竟争条件可通过信号量避免。
2>访问per-cpu变量时,还要禁用抢占。
信号量工作方式在单处理器上系统和多处理器系统上完全相同。
2.2中断时的数据访问保护
1>在单处理器环境中只有一个中断的“上半部分”访问时。中断都相对自己串行地执行,无需同步。
2>在单处理器环境中有多个中断的“上半部分”访问时,要关中断。
3>多处理器环境下,多个中断可访问时,要关中断,并加上自旋锁。
2.3可延迟函数(软中断和tasklet)中的数据访问保护
1>单处理器上不存在竞争问题
2>多处理器系统上,软中断访问的数据使用自旋锁
3>多处理器系统上,仅由一种tasklet访问的数据结构不需要保护
4>多处理器系统上,被多种tasklet访问需要用自旋锁保护
2.4.异常和中断时的数据访问保护
1>单处理器系统上,关闭中断
2>多处理器系统上,关闭本地中断,加上自旋锁(可用紧循环和down_trylock代替自旋的功能)
2.5.异常和可延迟函数中的数据访问保护
1>单处理器系统上,关闭本地中断,加上自旋锁
2>多处理器上加上自旋锁
2.6.中断和可延迟函数中的数据访问保护
1>关闭本地中断
2>多处理器上,加上自旋锁
2.7.异常,中断和可延迟函数中的数据访问保护
1>关闭本地中断,加上自旋锁