- 论坛徽章:
- 0
|
竞态:就是当有几个进程同时抢用一个资源,就会产生竞态,表示同时在抢占一个资源的状态
//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 |
|