- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
void
sema_down (struct semaphore *sema)
{
old_level = intr_disable ();
while (sema->value == 0)
{
list_push_back (&sema->waiters, &thread_current ()->elem);
thread_block ();
}
sema->value--;
intr_set_level (old_level);
}
void
sema_down (struct semaphore *sema)
{
old_level = intr_disable ();
while (!lock cmpxchg(1,0)) // it is just pseudocode-idea
{
list_push_back (&sema->waiters, &thread_current ()->elem);
thread_block ();
}
intr_set_level (old_level);
}
old_level = intr_disable ();
.它关闭了中断,但仅在该 CPU 的上下文中至关重要。
list_push_back
有问题.它也必须是安全的多线程。但是,我们不能使用互斥锁使其安全,因为我们现在才实现它!
spinlocks
或 lock-free structures
? 最佳答案
是的,在 SMP 中,多个 CPU 可以执行相同的代码,即使是在 Ring 0。
每个 CPU 都是对称的,因此它可以执行与其他 CPU 相同的代码路径(包括内核代码),除非软件实现某种同步。
Linux内核也面临这个问题,最初实现了一个不太好的解决方案:A Big Kernel Lock在进入和退出内核时获取和释放。
这不是一个好的解决方案,因为一次只有一个 CPU 可以执行内核代码,但它实现起来很快,并且相当于您列出的第一项。
更好的解决方案是在整个内核中使用更精细的锁。
由于是内核实现了示例中所示的互斥锁或信号量等休眠锁,因此它不能依赖这些原语本身1,并且必须使用自旋锁或其他更简单的锁定形式。
幸运的是,这不是问题,当争用较少或关键路径非常短(如更新列表)时,自旋锁(和 its variants)实际上比互斥锁更好。
你可以看看mutex_init从Linux上看到,一个spinlock是用来同步等待任务队列的。
49 void
50 __mutex_init(struct mutex *lock, const char *name, struct lock_class_key *key)
51 {
52 atomic_set(&lock->count, 1);
53 spin_lock_init(&lock->wait_lock);
54 INIT_LIST_HEAD(&lock->wait_list);
55 mutex_clear_owner(lock);
56 #ifdef CONFIG_MUTEX_SPIN_ON_OWNER
57 osq_lock_init(&lock->osq);
58 #endif
59
60 debug_mutex_init(lock, name, key);
61 }
关于multithreading - 多处理器架构和 Ring 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39591858/
我想知道 dpdk 是如何绕过内核的。用户空间应用程序如何访问 NIC 空间。 dpdk访问网卡用什么工具?我知道,dpdk 使用 uio_pci_generic 或 igb_uio 或 vfio-p
我一直在学习有关 Windows 驱动程序开发的基础知识,我一直在寻找术语 Ring 0 和 Ring 3。这些是指什么?它们与内核模式和用户模式相同吗? 最佳答案 Linux x86 环使用概述 了
我被引导相信 Pedestal 是 Ring 的替代品,但是从所有示例中我看到 Pedestal 实际上使用了 Ring。这是最令人困惑的!我是否需要了解并了解 Ring 的工作原理才能有效使用 Pe
我复制了一些在 compojure 1.1.18 和其他旧库中工作的旧代码,但使用最新版本我无法让它工作。 这是我的 minimal example code复制自 the minimal examp
为什么 golang 中的列表/环类型为单个项目使用额外的结构 Element/Ring 而不是 interface{} ?我假设有一些好处,但我看不到。 编辑:我的意思是询问 api,而不是关于在实
FileNotFoundException Could not locate ring/util/request__init.class or ring/util/request.clj on cla
使用 Ring 的 Jetty 适配器,如果我的请求太大,我会收到 413: FULL HEAD 错误。我将它追踪到一个名为 headerbuffersize 的属性,但是当我尝试在 run-jett
上下文 我刚刚得到http://blog.jayfields.com/2011/02/clojure-web-socket-introduction.html工作。 我还可以使用ring + comp
我正在尝试创建文本文件的精确副本,并且我正在使用循环缓冲区。 我使用的写入方法是: void addItem(CircularBuffer *cBuff, BufferItem *cbItem) {
void sema_down (struct semaphore *sema) { old_level = intr_disable (); while (sema->value == 0)
我的问题是,如果已经读取了 Ring 请求的正文,我该如何惯用地读取它? 这是背景。我正在为 Ring 应用程序编写一个错误处理程序。当发生错误时,我想记录错误,包括重现和修复错误可能需要的所有相关信
我正在制作一个 Messenger 机器人,并使用 Ring 作为我的 http 框架。 有时我想在机器人发送的消息之间应用延迟。我的期望是使用 Thread/sleep 是安全的,因为这将使事件线程
我在 Emacs 中有以下代码可以删除突出显示区域中的换行符: (defun remove-newlines-in-region () "Removes all newlines in the r
我是 Ring(以及一般的 Clojure 服务器端编程)新手。我有一个基于 Ring 的应用程序,在“开发模式”下运行良好,即它可以监听 localhost:3000 并做出适当的响应。作为部署此应
如何生成监听给定端口的独立环 uberjar ? 开发时,我使用以下 leiningen/ring 命令启动我的应用程序,我可以在其中指定端口: lein with-profile dev ring
我在 Emacs 中有以下代码可以删除突出显示区域中的换行符: (defun remove-newlines-in-region () "Removes all newlines in the r
我有一个任务 - 电话响起时立即更改铃声音量。例如:检测到有来电后,我需要将铃声音量设置为 0(静音),并且还应禁用振动器(如果尚未禁用)。然后当我需要执行另一个代码时会有延迟(startComput
我需要创建带间隙的圆形。 我正在创建一个代表时钟的进度条。 12 个间隙,每个间隙分配给小时数。 这正是我想要实现的目标。 (死星上的外环) 到目前为止,这是我的代码: 在activity.xml
我已经定义了一个简单的环形可绘制对象,将其用作按钮背景。这是我的做法: /> 我在相对布局中使用它,如: round_button 是我定义圆环的 xm
根据这个相关问题(Boost Polygon Serialization)。我正在尝试使用 Boost 序列化多边形。我现在遇到的问题是,我正在尝试使用自定义 X、Y、点的多边形来编译示例,但编译器在
我是一名优秀的程序员,十分优秀!