标签: interrupt

我应该如何关闭信号处理程序中的套接字?

我正在写一个非常简单的服务器,它会一直循环,直到按下Ctrl-C.我想让ctrl-c的信号处理程序关闭打开的套接字并关闭服务器,但我不知道信号处理程序的范围是什么,我不喜欢声明套接字的想法(s)我需要接近全球化.

有人可以提供建议吗?有没有一些标准的方法来做到这一点?

sockets signals interrupt

8
推荐指数
2
解决办法
7886
查看次数

内核与系统中的Windows进程

我在内核和用户模式中有一些与Windows进程相关的问题.

如果我有一个hello world应用程序,以及一个公开新系统调用的hello world驱动程序foo(),我很好奇我在内核模式下能做什么,不能做什么.

对于初学者来说,当我编写新的hello world应用程序时,我会获得一个新进程,这意味着我拥有自己的用户模式VM空间(让它保持简单,32位窗口).所以我有2GB的空间,我"拥有",我可以偷看,直到我心中的内容.但是,我受到我的程序的约束.我不能(不要让共享内存进入这个)触摸任何人的记忆.

如果,我写这个hello world驱动程序,并从我的用户应用程序调用它,我(驱动程序代码)现在处于内核模式.

第一个澄清/问题:我仍处于与用户模式应用程序相同的过程中,对吗?仍然有相同的PID?

内存问题:内存作为虚拟机呈现给我的进程,即使我有1GB的内存,我仍然可以访问4GB内存(2GB用户/ 2GB内核 - 不关注服务器上的交换机细节,或者具体,只需一个这里的一般假设).作为一个用户进程,我无法窥视任何内核模式的内存地址,但我可以做任何我想要的用户空间,对吗?

如果我调用我的hello world驱动程序,从驱动程序代码中,我是否仍然拥有相同的用户模式内存视图?但是现在我还可以在内核模式下访问任何内存?

这个内核模式是内存SHARED(与用户模式不同,这是我自己的进程拷贝)?也就是说,编写驱动程序更像是为单个进程编写线程应用程序(操作系统除外?)

下一个问题.作为驱动程序,我可以更改正在运行的进程吗?说,我知道另一个应用程序(比如用户模式的web服务器),并为该进程加载VM,更改它的指令指针,堆栈,甚至将不同的代码加载到进程中,然后切换回我自己的应用程序?(我不想在这里做任何邪恶的事情,我只是好奇它在内核模式下的真正含义)?

此外,一旦进入内核模式,我可以阻止操作系统抢占我吗?我认为(在Windows中)您可以设置您的IRQL级别来执行此操作,但即使在阅读Solomons书籍(Inside Windows ...)之后,我也不完全理解这一点.我将问另一个与IRQL/DPC直接相关的问题但是,现在,我想知道内核驱动程序是否有能力将IRQL设置为High并接管系统.

更多内容,但这些问题的答案将有所帮助.

windows operating-system kernel interrupt dispatcher

8
推荐指数
2
解决办法
3740
查看次数

如何在Java中杀死死锁线程?

我想杀死陷入死锁状态的线程.首先,我们可以使用类中的方法检测处于死锁状态的线程ID.findDeadlockedThreads()ThreadMXBeanjava.lang.management

于是,我想通过杀死线程ID线程,因此我有两个相关的问题:
(1)如何获得通过线程ID线程的控制?
(2)如何杀死被阻塞的线程?我认为调用interrupt()方法会给线程一个异常并将杀死线程.

java multithreading deadlock interrupt

8
推荐指数
2
解决办法
9182
查看次数

如何中断java.util.Scanner nextLine调用

我正在使用一个多线程环境,一个Thread通过反复调用不断地监听用户输入scanner.nextLine().要结束应用程序,此runloop会被另一个线程停止,但监听线程将不会停止,直到最后一个用户输入(由于阻塞性质nextLine()).

关闭流似乎不是一个选项,因为我正在读取System.in,它返回一个InputStream不可关闭的.

有没有办法打断扫描仪的阻塞,以便它会返回?

谢谢

java command-line interrupt java.util.scanner

8
推荐指数
1
解决办法
8896
查看次数

R控制台可以支持后台任务或中断(事件处理)吗?

在R控制台中工作时,我想设置监视特定连接的后台任务,当事件发生时,执行另一个功能(警报).或者,我可以进行设置,以便外部函数只是向R发送警报,但这似乎是同样的问题:有必要设置一个监听器.

我可以在R的专用过程中执行此操作,但我不知道在控制台中是否可行.另外,如果它正在计算一个函数,我对中断R不感兴趣,但是如果控制台只是在等待输入,则警告或中断.

以下是三个用例:

  1. 最简单的例子是观看文件.假设我有一个名为"latestData.csv"的文件,我想监视它的变化; 当它改变时,myAlert()执行.(可以将它扩展为执行不同的操作,但只是弹出一个文件已更改的注释是有用的.)

  2. 一种不同类型的监视器将监视给定的机器是否在RAM上运行不足并且可能执行save.image()并终止.同样,这可能是一个简单的问题,即观察由外部监视器生成的文件,该文件可以保存输出top或其他命令.

  3. 一个不同的例子就像另一个最近的SO问题,关于:让R停止正在运行的EC2机器.如果来自另一台机器或进程的警报告诉程序保存并终止,那么能够监听该警报将是很好的.

目前,我怀疑有两种方法可以解决这个问题:通过Rserve和可能的via fork.如果有人有关于如何使用包或通过其他方法执行此操作的示例,那将是很好的.我认为解决这三个用例中的任何一个都可以解决所有这些问题,模拟一些外部代码.


注1:我意识到,根据另一个SO问题的答案,R是单线程的,这就是我怀疑fork和Rserve可能工作的原因.但是,如果一个人与R终端接口,我不确定可行性.虽然R的REPL附加到控制台的输入,但我试图绕过它或模仿它,这是答案的地方forkRserve可能.

注2:对于那些熟悉事件处理/事件处理方法的人来说,这也可以解决所有问题.我在R中找不到任何相关内容.


更新1:我发现编写R扩展的手册有一个引用事件处理的部分,其中提到了使用R_PolledEvents.这很有希望.

r interrupt event-handling background-process

8
推荐指数
2
解决办法
2433
查看次数

如何在不填写屏幕的情况下清除屏幕

是否存在中断服务程序来帮助我清除终端屏幕?它会在Windows上运行吗?

x86 assembly dos interrupt

8
推荐指数
2
解决办法
3万
查看次数

interrupt()不起作用

我试图在以下代码中终止线程:

public synchronized void run() {
    try {
        while (!Thread.currentThread().isInterrupted()) {
            this.scan();
            this.distribute();
            this.wait();
        }
    } catch (InterruptedException e) {}
}

public void cancel() {
    this.interrupt();
}
Run Code Online (Sandbox Code Playgroud)

但线程不会终止.我使用了调试器并发现在命令之后this.interrupt(),线程没有被中断(我对表达式进行了监视this.isInterrupted()并保持不变false).任何人都知道为什么这个线程不会被打断?

编辑:

问题已经找到.原来这个帖子有两个实例.我附上导致这个问题的有问题的代码:

/* (class Detector extends Thread) */
Detector detector = new Detector(board);
...
Thread tdetector  = new Thread(detector); /* WRONG!!! */
...
tdetector.start();
...
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading interrupt

8
推荐指数
1
解决办法
2538
查看次数

使用QNX RTOS实时接收UDP数据包

我有一个源,它以819.2 Hz(~1.2ms)的速率向我的QNX Neutrino机器发送UDP数据包.我想以尽可能小的延迟和抖动接收和处理这些消息.

我的第一个代码基本上是:

SetupUDPSocket(); 
while (true) {
    recv(socket, buffer, BufferSize, MSG_WAITALL); // blocks until whole packet is received
    processPacket(buffer);
}
Run Code Online (Sandbox Code Playgroud)

问题是recv()只检查系统的每个计时器滴答是否有可用的新数据包.计时器滴答通常为1毫秒.所以,如果我使用它,我会得到一个巨大的抖动,因为我每1ms或每2ms处理一个数据包.我可以重置计时器滴答的大小,但这会影响整个系统(以及其他进程的其他计时器等).我仍然会有一个抖动,因为我肯定永远不会完全匹配819.2赫兹.

所以,我试图使用网卡的中断线(5).但似乎还有其他因素导致中断上升.我曾经使用以下代码:

ThreadCtl(_NTO_TCTL_IO, 0);
SIGEV_INTR_INIT(&event);
iID = InterruptAttachEvent(IRQ5, &event, _NTO_INTR_FLAGS_TRK_MSK);

while(true) {
    if (InterruptWait(0, NULL) == -1) {
        std::cerr << "errno: " << errno << std::endl;
    }

    length = recv(socket, buffer, bufferSize, 0); // non-blocking this time

    LogTimeAndLength(); 

    InterruptUnmask(IRQ5, iID;
} 
Run Code Online (Sandbox Code Playgroud)

这导致在开始时单次成功读取,然后在0次传递后读取0字节长度.看来,在执行InterruptUnmask()之后,InterruptWait()根本不会等待,所以必须已经有一个新的中断(或者相同的?!).

是否可以使用网卡的中断线进行类似的操作?是否还有其他可能以819.2 Hz的速率接收数据包?

有关网卡的一些信息:'pci -vvv'输出:

Class          = Network (Ethernet)
Vendor ID      = 8086h, Intel Corporation 
Device ID      = …
Run Code Online (Sandbox Code Playgroud)

c++ udp real-time interrupt qnx

8
推荐指数
1
解决办法
2475
查看次数

线程中断状态被清除 - 可能是Java错误

这是参考Path#register方法.如果一个线程正在运行一个包含该方法的块,另一个线程会事先中断它.然后发现该方法清除了中断状态.

在文档中没有提到它清除了线程的中断状态.

要复制

import java.io.*;
import java.nio.file.*;
import static java.nio.file.LinkOption.*;
import static java.nio.file.StandardWatchEventKinds.*;
import java.nio.file.attribute.*;


public class WatchDir {

private final WatchService watcher;


private void register(Path dir) throws IOException {
    //interrupt itself
    Thread.currentThread().interrupt();
    boolean before = Thread.currentThread().isInterrupted();
    WatchKey key = dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
    boolean after = Thread.currentThread().isInterrupted();

    if(before){
        if(!after){
            System.out.println("--------------------BUG-------------------");
            System.out.format("Interrupt Status: true before making call to Path#register for folder folder: %s\n", dir);
            System.out.format("Interrupt Status: false after making call to Path#register for folder folder: %s\n", dir);
            System.out.println("The …
Run Code Online (Sandbox Code Playgroud)

java concurrency multithreading interrupt

8
推荐指数
1
解决办法
894
查看次数

IRQ Coalesce之前NAPI有哪些优势?

众所周知,有两种方法可以避免高负载网络中的硬件中断的一些开销,当硬件中断太多时,切换到它们需要花费太多时间.对于程序风格的性能和选择方法非常重要.

  1. NAPI(新API) - 不使用硬件中断,并且每隔一段时间轮询以太网设备.Linux内核默认使用中断驱动模式,只有当传入数据包流量超过某个阈值时才切换到轮询模式.

http://en.wikipedia.org/wiki/New_API 内核可以定期检查传入网络数据包的到达而不会中断,从而消除了中断处理的开销.

  1. 中断合并 - 使用硬件中断,但如果发生中断,则禁用中断并开始轮询,持续一段时间,然后轮询终止并激活中断.

https://en.wikipedia.org/wiki/Interrupt_coalescing一种技术,在这种技术中,通常会触发硬件中断的事件会被阻止,直到一定量的工作挂起或超时计时器触发为止.

两种方法都没有显着的中断成本 - 这是默认中断驱动模式的优势.

但第二种方法 - 中断合并更合理,因为它:

  • 减少延迟 - 一旦程序包到达,立即尝试立即处理它,如果最近发生了中断,则立即轮询它.NAPI对面不会立即处理帧,但会等待一段时间进行下一次轮询.

  • 较少的CPU使用率 - 仅在至少有一个数据包到来时才开始轮询.但即使没有收到框架,也不是徒劳无功,就好像是NAPI一样.

IRQ Coalesce之前NAPI有哪些优势?

linux performance network-programming interrupt linux-kernel

8
推荐指数
1
解决办法
2966
查看次数