问题标签 [preemption]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 切换到用户模式时,非抢占式内核和抢占式内核有什么区别?
我正在阅读“了解 Linux 内核,第 3 版”,在第 5 章“内核抢占”一节中,它说:
所有进程切换均由
switch_to
宏执行。在抢占式和非抢占式内核中,当进程完成某个内核活动线程并调用调度程序时,就会发生进程切换。但是,在非抢占式内核中,当前进程不能被替换,除非它即将切换到用户模式。
我仍然看不出非抢占式内核和抢占式内核之间的区别,因为您需要等待当前进程切换到用户模式。
假设有一个进程p在内核模式下运行,并且其时间片到期,则scheduler_tick()
调用 p 并设置pNEED_RESCHED
的标志。但是只有当p切换到用户模式时才会调用(对吗?)。schedule()
那么如果p永远不会切换到用户模式呢?
如果它切换到用户模式,但在scheduler_tick()
设定的时刻NEED_RESCHED
和实际切换到用户模式的时刻p之间需要“很长”的时间——那么它使用的时间超过了它的量?
arduino - 自动驾驶汽车的抢占式调度算法
我不确定这是否是这个问题的最佳地点,但我认为这个问题与最优调度算法和排队理论有一些关系,所以希望它会没事。
我正在着手建造一辆遥控车来自动导航课程。这个想法是,它只会直线前进,直到其中一个接近传感器检测到墙壁或其他障碍物,这将导致中断和转向调整。
我在嵌入式系统课程中学习了一些关于 RTOS 调度算法的知识,并在网络性能课程中学习了抢占式排队,所以我想知道在对微控制器进行编程时,我是否会从将这些概念中的任何一个应用于此任务中受益,或者如果我我想太多了吗?主要目标是让汽车尽可能快地行驶而不会发生碰撞,但我也想防止它作为次要目标而变得紧张。
那么,从高级的意义上来说,是否有一种特定的方法、方案或类型的调度策略来使用可以为这样的系统带来最佳性能的中断?是否有任何特定的关键部分我应该禁用中断?作为硬件限制的参考,我计划使用类似于 arduino 的微控制器,可能带有三个 IR 传感器。非常感谢任何意见或建议。
c - 什么时候 preempt_count() & PREEMPT_ACTIVE == 0?
我正在查看 Linux 中的调度程序代码:
据我了解,如果prev
任务不可中断,则此代码将停用提供的任务(并从运行队列中删除)
有人可以向我解释什么是什么,什么preempt_count
时候thread_info
会满足这个条件?
multithreading - POSIX pipe write 原子性的含义
根据POSIX 标准,对管道的写入保证是原子的(如果数据大小小于 PIPE_BUF)。
据我了解,这意味着任何试图写入管道的线程都不会在另一个线程的写入过程中访问管道。我不清楚这是如何实现的,以及这种原子性保证是否还有其他含义。
这是否仅仅意味着写入线程在写入函数内的某处获得了锁?
写入管道的线程是否保证在写入操作期间永远不会脱离上下文进行调度?
c - 在进程上下文中调用 kmap_atomic()
我有一个内核模块。它有一个 IOCTL 分配页面,然后使用 kmap_atomic 一次一页映射到内核。
当我通过测试应用程序运行这个 ioctl 时,我得到以下调度 BUG:
有谁知道是什么原因造成的?在内核中,此消息打印在 kernel/sched/core.c 中,因为以下检查为真
此检查在 include/linux/preempt.h 中定义
如果这对任何人有任何意义,请分享您的观点。
c - C - select() 似乎阻塞的时间超过了超时
我正在编写一个需要
使用 select() 等待串行
读取串行数据(RS232 115200 波特),
时间戳(clock_gettime()),
在 SPI 上读取 ADC,
解释它,
通过另一个 tty 设备发送新数据
循环和重复
ADC 现在无关紧要。
在循环结束时,我再次使用 select() 以 0 超时来轮询并查看数据是否已经可用,如果它意味着我已经溢出,即我希望循环在更多数据和 select( ) 在循环开始时阻塞并在它到达时立即获取它。
数据应该每 5 毫秒到达一次,我的第一个 select() 超时计算为(5.5 毫秒 - 循环时间) - 应该是大约 4 毫秒。
我没有超时,但有很多超限。
检查时间戳会发现 select() 阻塞的时间超过了超时时间(但仍然返回>0)。看起来 select() 在超时前获取数据后返回较晚。
这可能在 1000 次重复中发生 20 次。可能是什么原因?我如何解决它?
编辑:这是代码的精简版本(我做了比这更多的错误检查!)
我在输出的串行流上看到的时间戳是相当规则的(通常下一个循环会赶上偏差)。输出片段:
在这里,最高 6.1922s 一切正常。下一个样本是 6.2063 - 上一个样本之后的 14.1 毫秒,但它没有超时,6.1922-6.2063 的前一个循环也没有通过轮询 select() 捕获溢出。我的结论是,最后一个循环是采样时间,并且选择在没有超时的情况下返回了 -10ms 太长的时间。
,,,0.0010 表示循环之后的循环时间(ftime) - 我真的应该检查出错时的循环时间。我明天试试。
kernel - 为什么 spin_lock 应该禁用抢占?如果不禁用抢占会发生什么?
对于这种情况:进程 B 将等待进程 A 释放旋转,所以 preemt OK ???
Process A:
-->spin lock --> do strict call --> before unlock time int
Time int ISR:
--> Process A time slice finished --> need schedule
-->ISR ret --> schedule to Process B
Process B:
-->spin lock for same resource --> failed --> spin wait
timeout - Anylogic getRemainingTime 和函数
我在 Anylogic 中构建了一个相当简单的模型,需要使用延迟函数“getRemainingTime”和“队列”块中的一些函数:基于优先级的排队、抢占和超时。我一直无法在网上找到有关这些的教程或示例。任何人都可以指出一个资源或 Anylogic 中的内置教程,它涵盖了像我这样的初学者程序员这样的事情吗?谢谢,莫希特
linux - Linux 内核 4.11 的 RT_PREEMPT 补丁何时发布
linux kernel 4.11的RT_PREEMPT补丁什么时候发布,最新的稳定Linux Kernel?
我知道我可以在主线 Linux 内核中启用 CONFIG_PREEMPT,但是这个主线 PREEMPT 和 RT_PREEMPT 补丁有什么区别?后者做得更好吗?
runnable - 在 AUTOSAR 或 OSEK 上执行期间可以抢占 runnable 吗?
在 Autosar 中,runnables 被映射到任务。由于优先级,任务可以被抢占。
抢占的重点在哪里?可运行对象之间是否发生抢占?
是可运行的原子执行还是可以在执行期间被抢占?