免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 973 | 回复: 0
打印 上一主题 下一主题

linux driver 竞态 信号量 锁 等待对列 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-09 10:31 |只看该作者 |倒序浏览
竞态:就是当有几个进程同时抢用一个资源,就会产生竞态,表示同时在抢占一个资源的状态
//http://blog.chinaunix.net/u1/40912/showart_497651.html
解决的办法1:
    #include
    采用信号量,当为1是表示资源可用,为0表示资源不可用
    信号量初始化:
    sema_init(&scull_devices.sem, 1); //;注册一个信号量,初始化为1,表示可用。
    (占有)获取信号量:
    if (down_interruptable(&dev->sem)) return -ERESTARTSYS;  (信号量指针)
    释放信号量:没有释放出来怎么办?
    up(信号量指针)up会唤醒所有正在等待这个信号量的进程.假若此时有进程在等待这个信号量
    另外因为使用信号量会导致进程睡眠,所以在中断处理中不能适用信号量。
解决的办法2:
  #include
   定义1:
   spinlock_t mylock = SPIN_LOCK_UNLOCKED
  定义2:
  spin_lock_init(&my_lock);
  得到锁
   spin_lock(spinlock_t *my_lock)
   spin_unlock(spinlock_t *my_lock)
   自锁不会导致休眠
   
对read调用存在一个问题,就是当设备无数据可读时,解决的方法有两种,一是不阻塞直接读失败跳出。 二就是阻塞读操作,进程进入睡眠,等待有数据时唤醒。
这里探讨一下阻塞型IO,处理睡眠和唤醒。
睡眠就是当一个进程需要等待一个事件时,应该暂时挂起,让出CPU,等事件到达后再唤醒执行。
处理睡眠的方法是把进程加入到等待队列中去
定义1:
#include
wait_queue_head_t my_queue;
init_waitqueue_entry(&my_queue);动态定义 初始化
静态全局的等待队列
DECLARE_WAIT_QUEUE_HEAD(my_queue);
interruptible_sleep_on(&my_queue);//有问题应用
wait_event_interruptiable(&my_queue);
wake_up_interruptiable(&my_queue);



   







本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/68521/showart_681824.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP