打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Linux内核开发之并发控制(实例总结篇)
"小王,小王,别睡了,瞧你,咋还睡着了呢…"我催促他说.
"现在是公元前还是公元后啊,我的MM等急了没.."呵呵,看他一脸傻笑。
提醒各位路过的MM,如果没有男友的,可以联系小王,电话:拐拐拐。“什么,我的,呵呵,没办法,谁让我这有才呢..”
算算前边有关并发控制的有关内容,都到五了,一连来了十一招,今天也不好意思再卖官子了,做一个最后的实例总结篇,下一节,就要开始新的内容了哦,没赶上的可要加油了。
实例篇:1.定义带有设备并发控制方案的结构体(诸如信号量,自旋锁等,反正前边那么多了)
我是一名高手,告诉大家一个高手的习惯,就是喜欢也习惯把将某设备所使用的自旋锁,信号量等辅助手段也放到设备结构体中,就像下边这样:
struct csyncontrol_dev{ struct cdev cdev;//cdev结构体 unsigned char mem[CSYNCONTROL_SIZE]; //设备内存 struct semaphore sem; //用于并发控制的信号量}
然后,将信号量的初始化工作放到模块初始化部分里
int csycontrol_init(void){ int result; dev_t devno = MKDEV(global_major,0); //申请设备号 XXXXXX(参照前边Linux设备驱动之简单字符设备驱动(下)) csycontrol_setup_cdev(csyncontrol_devp, 0); init_MUTEX(&csyncontrol_devp->sem); //初始化信号量 XXXXXX}
以后在访问csyncontrol_dev中的共享资源时,需要首先获取这个信号量,访问完成后,随即释放掉这个信号量,比如下面的,写操作:
//csycontrol_read函数static ssize_t csycontrol_read(struct file *filp,char __user *buf, size_t size, loff_t *ppos){ XXXXXX//叉叉的感觉好爽啊,,省去了不少功夫,呵呵 if(down_interruptible(&dev->sem)) //获取信号量 { return –ERESTARTSYS; } if (copy_to_user(buf,(void *)(dev->mem + p),count)) { ret = -EFAULT; } else { *ppos += count; ret = count; printk(KERN_INFO "read %d byte(s) from %d",count,p); } up(&dev->sem); //释放信号量 return ret;}//csycontrol_writestatic ssize_t csycontrol_write(struct file *filp, const char __user *buf,size_t size, loff_t *ppos){ XXXXXX if(down_interruptible(&dev->sem)) //获取信号量 { return –ERESTARTSYS; } if (copy_from_user(dev->mem + p,buf, count)) ret = -EFAULT; else { *ppos+= count; ret = count; printk(KERN_INFO "written %d bytes(s) from %d\n", count, p); } up(&dev->sem); //释放信号量 return ret;}
//csycontrol_ioctl函数static int csycontrol_ioctl(struct inode *inodep, struct file *filp,unsigned int cmd, unsigned long arg){ struct csycontrol_dev *dev = filp->private_data; switch (cmd) { case MEM_CLEAR://清除全局内存 if(down_interruptible(&dev->sem)) //获取信号量 { return –ERESTARTSYS; } memset(dev->mem, 0,GLOBALMEM_SIZE); up(&dev->sem); //释放信号量 printk(KERN_INFO "globalmem is set to zero\n"); break; default: return - EINVAL;//其他不支持的命令 } return 0;}
代码部分也讲完了,说句真的,心里真是不平衡,前边讲了那么多,这里体现的时候它怎么就只有那两行代码呢..
最后,给小王把前面几个专题讲的各种同步机制总结比较一下(各位喜欢的话,也可以打印的哦,反正我是不会追这里要版权问题的,呵呵..)
各种同步机制的比较
类型
机制
应用场合
spinlock
使用忙等方法,进程不挂起
(1)用于多处理器间共享数据
(2)在可抢占的内核线程里共享数据
(3)自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用,比如中断上下文
信号量
阻塞式等待,进程挂起
(1)适合于共享区保持时间教长的情况
(2)只能用于进程上下文
原子操作
数据的原子访问
(1)共享简单的数据类型:整型,比特性
(2)适合高效率的场合
rwlock
特殊的自旋锁
(1)允许同时读共享资源,但只能有一个写
(2)读优先于写,读写不能同时
顺序锁
一种免锁机制,基于访问计数
(1)允许同时读共享资源,但只能有一个写
(2)写优先于读,读写不能同时
RCU
通过副本的免锁访问
(1)对读占主要的场合提供高性能
(2)读访问不必获取锁,不必执行原子操作或禁止中断
关闭中断
通过禁止中断的手段,排除单处理器上的并发,会导致中断延迟
(1)中断与正常进程共享数据
(2)多个中断共享数据
(3)临界区一般很短
“小王,我要说的,都说完了,不该说的,似乎也都说完了,从下次开始,我们就要从新的开始了----Linux设备驱动程序之阻塞/非阻塞IO,当然啦,前提是你要有下次,是不 …”
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
linux设备驱动中的并发控制
Linux 设备驱动 ====> 并发控制
嵌入式Linux之我行——S3C2440上MMC/SD卡驱动实例开发讲解(一) - 内核、驱动开发篇 -
memdev驱动试验
最简单的字符设备驱动程序
初识linux内核漏洞利用 | WooYun知识库
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服