关闭

linux内核驱动同步、异步、并发

标签: linux kernel
394人阅读 评论(0) 收藏 举报
分类:


本博客内容会不定期更新

--------------------------------------------------------------------Miscellaneous------------------------------------------------

        所谓临界区(临界段)就是访问和操作共享数据的代码段,一行C语言可能含有多条汇编指令,原子操作就是将多行C语言的执行等效成一条需要更长时间的汇编指令,在这期间不会被任何外界中断。将这些指令集等效于不可分割的一部分。

自旋锁,在单处理器上,编译的时候,并不会加入自旋锁。它仅仅被当作做一个设置内核抢占机制是否被启用的开关。如果禁止内核抢占,那么在编译时自旋锁会被完全剔除出内核。自旋锁是不可递归的。linux内核实现的自旋锁是不可递归的,这点不同于自旋锁在于其他操作系统中的实现。所以如果你试图得到一个你正持有的锁,你必须自旋,等待你自己释放这个锁。但你处于自旋忙等嗲中,所以你永远没有机会释放锁,于是你自己被自己锁死。千万小心自旋锁。

自旋锁可以使用在中断处理程序中,在中断中不能使用信号量,可能会导致休眠。在中断处理程序中使用自旋锁,一定要在获取锁之前,首先禁止本地中断

------------------------------------------------------------------------Miscellaneous-----------------------------------------------

信号量

1、definition

struct semaphore sem;

2、initialization

void sema_init(struct semapjore *sem,int value);

讲信号量sem的值初始化为value;

3、获取信号量

void down(struct semaphore * sem);

该函数会可能导致进程休眠,在获取不到信号量的情况下会导致进程休眠,因此信号量不一起在中断上下文中使用。

int dowm_interruptible(struct semaphore *sem);

该函数功能与down()函数类似,不同之处为,因为down而进入休眠转态的进程不能被信号打断,但因为down_interruptible而进入睡眠状态的进程能被信号打断,信号也会导致该函数返回,这时候函数的返回值非0;

int down_trylock(struct semaphore *sem);

该函数尝试获得信号量sem,如果能立刻获得,它就获得该信号量并返回0,否则,返回非0值,它不会导致调用者睡眠,可以在中断上下文中使用。


在使用down_interruptible()获得信号时,对返回值一般会进行检查,如果非0,通常立即返回-ERESTARTSYS 如:

if(down_interruptible(&sem))

return -RESTARTSYS;


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3376次
    • 积分:222
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条