我想知道哪些线程处理设备中断.当用户模式线程运行时出现中断时会发生什么?当系统处理中断时,其他用户线程是否也有机会运行?
请建议我一些描述如何通过Windows处理中断的参考资料.
我有两个线程想要在同一个对象上进行同步.如果某个条件已满,则A需要能够中断线程B.这是两个线程做/应该做的一些伪代码.
public void run()
{
while(true)
{
//Do stuff
synchronized(shared)
{
//Do more stuff
if(condition)
{
B.interrupt();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
public void run()
{
while(true)
{
try
{
//Do stuff
synchronized(shared)
{
//Do more stuff
}
}
catch(InterruptedException e)
{
continue;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我无法解决的情况:
A抓取共享资源并执行一些操作.B到达synchronized块,等待A释放其共享资源.A,在做东西时,意识到线程B不应该有共享资源,并尝试中断线程B.但是线程B已经超过了InterruptedException可以抛出的点数.我的问题是,有什么方法可以在线程等待synchronized某事时中断线程吗?
我有一些代码需要在特定中断结束时运行.
我不想在中断本身的上下文中执行它,但我也不希望它在线程模式下执行.
我想以低于高级别中断的优先级运行它,该高级别中断促使其运行,但也优先级高于线程级别(以及其他一些中断).
我想我需要使用其他一个中断处理程序.
最好使用哪些以及调用它们的最佳方法是什么?
目前我正在计划仅使用中断处理程序来处理一些我没有使用的外设,并通过直接通过NVIC设置位来调用它们,但我希望有更好的,更官方的方式.
谢谢,
我使用专有的非SQL DB进行了一个项目,其中查询可能被中断,并且在代码库中有很多地方使用了该功能并且非常有意义(例如,停止长时间运行的查询被取消用户,或者当一个更新的查询发生并使之前的查询过时,等等)并且我意识到我以前从未真正看到那种"中断的查询",并认为它可以提出一个好的问题(几个问题,但是他们都完全相同的事情):
SQL查询可以被中断吗?
这是SQL标准的一部分吗?
如果它不是SQL标准的一部分,哪些SQL DB允许查询被中断(任何最受欢迎的例子)?
中断数据库查询(SQL或不是SQL)是否常见,你知道你不再关心结果?(在我工作的代码库中,它肯定有助于减轻服务器的负载)
我正在研究一个Linux内核模块,该模块为来自定制板的中断注册回调,并将接收到的数据放在char设备接口后面的队列中,由应用程序处理.即使没有来自电路板的中断,该模块也需要不断监视和测量来自电路板的中断和数据,因此它有另一个根据时间触发的回调.
当前实现使用RTC中断作为常量定时器源.我禁用内核RTC驱动程序(CONFIG_RTC_DRV_CMOS)并请求IRQ 8并将计时器回调挂钩为RTC中断处理程序.每秒从RTC芯片产生中断.
问题是我们必须失去一些Linux以这种方式管理时间的能力,因为只能rtc-cmos同时加载一个或一个板模块(显然我们选择了板模块).
目标架构是i386 PC.
我不是内核开发人员,因此对内核模块开发没有全面了解,但我正在努力寻找自己的方式,这些是解决方案最接近的问题:
request_irq(8, rtc_handler, IRQF_SHARED, rtc_handler)?)或chainload IRQ处理程序之间共享IRQ 8 .我想可能有一种简单而标准的方法可以做到这一点,我很高兴如果有人会评论这些解决方案或建议其他解决方案.
linux interrupt linux-device-driver linux-kernel embedded-linux
维基百科说:
在计算中,抢占是暂时中断计算机系统正在执行的任务的行为,不需要它的合作,并打算在以后恢复任务。
其他消息来源说:
[...] 抢占意味着从一个进程中强行夺走处理器并将其分配给另一个进程。[操作系统 (Self Edition 1.1), Sibsankar Haldar ]
当程序在执行过程中出现中断并且调度程序选择一些其他程序执行时,就会发生程序的抢占。[操作系统:基于概念的方法,2E,DM Dhamdhere ]
所以,我的理解是,如果进程被中断(通过硬件中断,即 I/O 中断或定时器中断),并且在处理中断后调用的调度程序选择另一个进程运行(根据CPU调度算法)。如果调度器选择了被中断的进程,我们就没有进程抢占(中断不一定会导致抢占)。
但我发现许多其他来源以下列方式定义抢占:
抢占是从程序中强制释放 CPU。[操作系统:基于概念的方法,2E,DM Dhamdhere ]
您可以看到同一本书报告了两种不同的抢占定义。在后者中没有提到必须将 CPU 分配给另一个进程。根据这个定义,抢占只是“中断”的另一个名称。当硬件中断出现时,进程被中断(它从“运行”状态切换到“就绪”状态)或被抢占。
所以我的问题是:这两个定义中哪一个是正确的?我很困惑。
我知道它"分配一个中断线",但是
> what is happening after request_irq()?
> How a particular handler is getting called on receiving interrupt?
Run Code Online (Sandbox Code Playgroud)
任何人都可以用代码snipet解释它吗?
kernel interrupt linux-device-driver linux-kernel interrupt-handling
我有一个带有信号处理程序的程序:
signal(SIGINT, signalhandler);
Run Code Online (Sandbox Code Playgroud)
然后程序分叉和子代需要一个不同的信号处理程序,所以:
pid = fork();
/* What happens here? */
if(pid==0)
{
signal(SIGINT, signalhandler_for_child);
}
Run Code Online (Sandbox Code Playgroud)
那么如果在fork之后但在分配新的签名处理程序之前调用SIGINT会发生什么?
这可能发生,或者在孩子获得新的信号处理程序之前不可能被打断.
如果有可能.我如何将信号排队给孩子,以便有时间获得新的处理程序?
我知道概率(如果存在的话)必须几乎为0,但我想确保应用程序在这方面是健壮的.
我在类和以下方法中有一个中断处理程序:
def interruptHandler(self, signal, frame):
""" Catches SIGINT and SIGTERM to allow proper shutdown of all threads etc."""
self.stopWorker()
print("interrupt") # the print message is just for me to see if it works
Run Code Online (Sandbox Code Playgroud)
当我按 control + c 时,我从中断处理程序中收到打印消息,因此该方法很好。但是当我为它编写 pytest 时,我不知道如何断言 SIGINT。当我想强制中断时
worker.interruptHandler(signal.sigint)
我收到一个错误,提示我缺少参数框架。
我对裸机编程非常陌生,以前从未接触过中断,但我一直在 RISC-V FE310-G002 SOC 供电的开发板上学习。
我一直在阅读有关 RISC-V WFI(等待中断)指令的内容,并且从手册中来看,听起来您不能依靠它来实际休眠核心。相反,它仅建议系统可以停止执行,并且应该将指令视为 NOP。然而,这对我来说似乎毫无用处。考虑以下 ASM 程序片段:
wfi_loop:
WFI
J wfi_loop
Run Code Online (Sandbox Code Playgroud)
由于不能依赖 WFI,因此必须执行此操作。然而,从中断处理程序中执行 MRET 后,您仍然会陷入循环中。因此,您必须使其以全局变量为条件,该全局变量的值在中断处理程序中更新。这看起来非常混乱。
此外,如果您的实现实际上遵循 WFI 指令,并且在执行 WFI 指令之前触发了中断,则整个内核将停止运行,直到触发其他中断,因为它将在 WFI 指令之前返回。
当没有工作要做时,该指令的唯一正确用法似乎是在内核调度程序内部。但即便如此,我认为您也不会想从中断处理程序返回到此类代码,而是从头开始重新启动调度程序算法。但这也会是一个问题,因为你必须以某种方式回滚堆栈,等等......
我一直在脑子里思考这个问题,但似乎无法找到安全的用途。也许,如果您以原子方式使用 CSRRS 启用中断,然后立即调用 WFI,如下所示:
CSRRSI zero, mie, 0x80
wfi_loop:
WFI
J wfi_loop
NOP
NOP
Run Code Online (Sandbox Code Playgroud)
然后确保在从中断处理程序调用 MRET 之前将 mepc 寄存器增加 8 个字节。在返回之前,还必须在中断处理程序内部的 mie 寄存器中再次禁用中断。只有当 WFI、J 和 NOP 都编码为 4 字节指令时,无论是否使用压缩指令,该解决方案才是安全的。它还取决于在 CSRRSI 指令启用后,程序计数器在可能触发中断之前到达 WFI 指令。然后,这将允许在代码中的安全位置触发中断,并以中断等待它的循环的方式返回。
我想我只是想了解我可以从硬件中获得什么行为,以及如何正确调用中断并返回并使用 WFI 指令?
interrupt ×10
linux-kernel ×2
assembly ×1
c ×1
cortex-m3 ×1
cpu ×1
embedded ×1
java ×1
kernel ×1
kill ×1
linux ×1
mysql ×1
mysqladmin ×1
preemption ×1
pytest ×1
python ×1
riscv ×1
riscv32 ×1
scheduling ×1
signals ×1
sql ×1
synchronized ×1
windows ×1