微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linux内核互斥

我正在阅读“Linux设备驱动程序第3版”,关于并发性和竞争条件的章节。 有一个我不完全明白的例子。 他们正在讨论内核编程中的一种常见模式,当需要在当前线程之外启动活动(例如,新内核线程或用户进程,请求现有进程或基于硬件的动作)时,请等待该活动完成。 不是非常有效的解决scheme的例子是:

struct semaphore sem; init_MUTEX_LOCKED(&sem); start_external_task(&sem); down(&sem);

然后他们build议外部任务在工作完成时调用(&sem)。

我不明白为什么我们不能这样做:

struct semaphore sem; down(&sem); start_external_task(&sem);

为什么需要在locking状态下创build互斥锁,然后在任务启动后获取互斥锁?

Linux内核空闲循环

操作系统如何知道物理内存的真实大小?

4GB / 4GB内核虚拟机分割

通过直接读取内核内存来取出隐藏的内核模块?

在FreeBSD 10.1上添加新的系统调用

期待您的回音! 谢谢。

linux内核源码中的“current”是什么?

在Linux上直接从内核访问用户内存

检查虚拟内存地址的有效性

Moxa RealTTY模块在Linux内核3.16上的编译错误

内核模块将不会链接 – 找不到符号mutex_lock_nested

当你调用()时,你的线程将被阻塞,直到另一个线程发出信号。 由于另一个线程尚未启动,线程将无限期地阻塞。 这就是为什么你需要先启动线程,然后调用down()来阻塞,直到线程完成。

如果线程在调用down()之前完成,那没关系,因为信号量将被发信号,down()将简单地清除信号并返回。

在第一个例子中,down(&sem)将等待external_task调用(&sem)并有效地暂停主线程,直到任务完成。 在你的代码中,down()会永久锁定主线程,因为没有任何任务要调用()

电话:

init_MUTEX_LOCKED(&sem);

在“互斥模式”中创建一个新的信号量,初始化为0.这意味着调用down()将会被阻塞。 相应的电话:

init_MUTEX(&sem);

将创建一个信号量初始化为1。

在第一个示例中,将信号量初始化为0,创建external_task,然后调用down()阻塞,直到调用up()为止。

在第二个示例中,您不初始化信号量,调用down()阻止执行,并且没有可以调用up()来解除阻止的external_task运行。 创建external_task的调用因此从未达到。

顺便说一句,init_MUTEX_LOCKED初始化信号量的过程在内核版本2.6.37中被删除了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐