我正在阅读“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内核虚拟机分割
通过直接读取内核内存来取出隐藏的内核模块?
期待您的回音! 谢谢。
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] 举报,一经查实,本站将立刻删除。