Linux设备驱动中的并发控制
并发与竞态
解决竞态问题的途径是保证对共享资源的互斥访问。
访问共享资源的代码区域称为临界区,临界区需要以某种互斥机制加以保护。中断屏蔽、原子操作、自旋锁和信号量等是Linux设备驱动中可采用的互斥途径。
中断屏蔽
中断屏蔽将使得中断与进程之间的并发不再发生,而且,由于Linux内核的进程调度等操作都依赖中断来实现,内核抢占进程之间的并发也就得以避免了。但是,需要注意是的是长时间的中断是危险的,有可能导致数据丢失或着系统崩溃。
local_irq_disable()和local_irq_enable()都只能禁止和使能本CPU内的中断,不能解决SMP多CPU引发的竞态。
local_irq_save(flags)除了进行禁止中断操作以外,还保存目前CPU的中断位信息,local_irq_restore(flags)进行相反的操作。
如果只想禁止中断的底半部,应使用local_bh_disable(),使能底半部使用local_bh_enable()。
原子操作
原子操作指的是在执行过程中不会被别的代码路径所中断的操作。
Linux内核提供了一系列函数来实现内核中的原子操作,这些函数又分为两类,分别针对位和整型变量进行原子操作。
整型原子操作
1. 设置值 void atomic_set(atomic_t *v,int i); Atomic_t v = ATOMIC_INT(0);
2. 获取值 atomic_read(atomic_t *v);
3. 加减 void atomic_add(int i,atomic_t *v); void atomic_sub(int i,atomic_t *v);
4. 自增自减 void atomic_inc(atomic_t *v); void atomic_dec(atomic_t *v);
5. 操作测试 int atomic_inc_and_test(atomic_t *v); int atomic_dec_and_test(atomic_t *v); int atomic_sub_and_test(int i, atomic_t *v);
操作后测试其值是否为0,为0返回true,否则返回false。
6. 操作返回int atomic_inc_and_return(atomic_t *v); int atomic_dec_and_return(atomic_t *v); int atomic_sub_and_return(int i, atomic_t *v); int atomic_add_and_return(int i, atomic_t *v);
操作后返回新值。
位原子操作
1. 设置位 void set_bit(nr,void *addr); 设置addr地址的第nr位,即将位写1。
2. 清除位 void clear_bit(nr,void *addr); 将位写为0。
3. 改变位 void change_bit(nr,void *addr); 将位进行反置。
4. 测试位test_bit(nr,void *addr); 返回第nr位。
5. 测试操作int test_and_set_bit(nr,void *addr); int test_and_clear_bit(nr,void *addr); int test_and_change_bit(nr,void *a
相关文档:
由于 Linux 良好的用户权限管理体系,病毒往往是 Linux 系统管理员最后才需要考虑的问题。以往,Linux 上的杀毒软件主要是为企业的邮件和文件服务器所设计的。如今,随着 Linux 桌面用户数量的增长,桌面用户在受益于 Linux 系统对病毒较强的天然免疫力的同时,也需要杀毒软件清理从网络或U盘带来的WIndows病毒。尽管那些 ......
网上看到到的方法,记录以备用。
在英文Locale下的Ubuntu
无法正常显示XP下GBK编码的中文
编辑/etc/environment文件
添加LC_CTYPE="zh_CN.GBK"一行
如下:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games"
LANG="en_US.UTF-8"
LANGU ......
無論是在Linux還是在Unix環境中,make都是一個非常重要的編譯指令。
不管是自己進行項目開發還是安裝應用軟體,我們都經常要用到make或make install。利用make工具,我們可以將大型的開& ......
前天开机实然没有声音了,怎么弄也不行,在论坛挂了一个帖子,到现在也没有人回复。昨天妈妈过生日我回妈家去了,今天才回来。我打开机器盼望能好起来,结果还是没有声音。
1、在控制台下有声音
control+alt+f1切换到控制台,之后mplayer /mnt/wine/music/*.mp3 结果有声音
2、创建新用户有声音
useradd - ......