LearningOS / rCore-Tutorial-Guide-2024S

GNU General Public License v3.0
4 stars 3 forks source link

rCore-Tutorial-Guide-2024S/chapter8/2lock #9

Open utterances-bot opened 6 months ago

utterances-bot commented 6 months ago

锁机制 - rCore-Tutorial-Guide-2024S 文档

https://learningos.cn/rCore-Tutorial-Guide-2024S/chapter8/2lock.html

YfLi03 commented 6 months ago

let mut mutex_inner = self.inner.exclusive_access();

这里可否理解为,我们真正防止竞争的机制是 Rust Core 提供的数据结构?

shaokeyibb commented 5 months ago

楼上没搞明白啊... 我们作为操作系统层,是向下提供服务的,和用户层没关系啊,况且 exclusive_access() 只是提供内部可变性用的而已...

YfLi03 commented 5 months ago

我在考虑的是,有多个线程在多个核心上同时运行的时候,如何保证一个互斥锁不同时被两个线程获取

waterm310n commented 4 months ago

@YfLi03 我觉得应该是的,通过.inner_exclusive_access()保证不会有其它线程访问到Mutex的locked值。因为我没看到其它的特定的atomic指令。

G-keng commented 3 months ago

并不是,从最硬件层面看,我们的操作系统所有代码都是串行的,所以不存在竞争的问题。 但对于用户来讲,线程的调度是透明的,可能会产生意外的顺序问题导致数据竞争。 真正防止竞争的机制是用户手动使用系统调用加锁,防止竞争的逻辑是由用户负责的,我们的操作系统只提供了锁的接口,并不自动分析资源并保证不发生竞争。

(再说了exclusive_access是自己实现的,里面就是个borrow_mut)

YfLi03 commented 3 months ago

我的问题是:如何避免两个线程同时调用 sys_mutex_lock,导致 mutex 内部的数据结构自身出现竞争现象;

在单核的情况下,由于我们进入了 kernel mode 自然关了中断,这个是显然的;

在多核的情况下,我没有看到其他机制可以确保避免这一情况。