我正在写一个非常简单的服务器,它会一直循环,直到按下Ctrl-C.我想让ctrl-c的信号处理程序关闭打开的套接字并关闭服务器,但我不知道信号处理程序的范围是什么,我不喜欢声明套接字的想法(s)我需要接近全球化.
有人可以提供建议吗?有没有一些标准的方法来做到这一点?
我在内核和用户模式中有一些与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并接管系统.
更多内容,但这些问题的答案将有所帮助.
我想杀死陷入死锁状态的线程.首先,我们可以使用类中的方法检测处于死锁状态的线程ID.findDeadlockedThreads()ThreadMXBeanjava.lang.management
于是,我想通过杀死线程ID线程,因此我有两个相关的问题:
(1)如何获得通过线程ID线程的控制?
(2)如何杀死被阻塞的线程?我认为调用interrupt()方法会给线程一个异常并将杀死线程.
我正在使用一个多线程环境,一个Thread通过反复调用不断地监听用户输入scanner.nextLine().要结束应用程序,此runloop会被另一个线程停止,但监听线程将不会停止,直到最后一个用户输入(由于阻塞性质nextLine()).
关闭流似乎不是一个选项,因为我正在读取System.in,它返回一个InputStream不可关闭的.
有没有办法打断扫描仪的阻塞,以便它会返回?
谢谢
在R控制台中工作时,我想设置监视特定连接的后台任务,当事件发生时,执行另一个功能(警报).或者,我可以进行设置,以便外部函数只是向R发送警报,但这似乎是同样的问题:有必要设置一个监听器.
我可以在R的专用过程中执行此操作,但我不知道在控制台中是否可行.另外,如果它正在计算一个函数,我对中断R不感兴趣,但是如果控制台只是在等待输入,则警告或中断.
以下是三个用例:
最简单的例子是观看文件.假设我有一个名为"latestData.csv"的文件,我想监视它的变化; 当它改变时,myAlert()执行.(可以将它扩展为执行不同的操作,但只是弹出一个文件已更改的注释是有用的.)
一种不同类型的监视器将监视给定的机器是否在RAM上运行不足并且可能执行save.image()并终止.同样,这可能是一个简单的问题,即观察由外部监视器生成的文件,该文件可以保存输出top或其他命令.
一个不同的例子就像另一个最近的SO问题,关于:让R停止正在运行的EC2机器.如果来自另一台机器或进程的警报告诉程序保存并终止,那么能够监听该警报将是很好的.
目前,我怀疑有两种方法可以解决这个问题:通过Rserve和可能的via fork.如果有人有关于如何使用包或通过其他方法执行此操作的示例,那将是很好的.我认为解决这三个用例中的任何一个都可以解决所有这些问题,模拟一些外部代码.
注1:我意识到,根据另一个SO问题的答案,R是单线程的,这就是我怀疑fork和Rserve可能工作的原因.但是,如果一个人与R终端接口,我不确定可行性.虽然R的REPL附加到控制台的输入,但我试图绕过它或模仿它,这是答案的地方fork或Rserve可能.
注2:对于那些熟悉事件处理/事件处理方法的人来说,这也可以解决所有问题.我在R中找不到任何相关内容.
更新1:我发现编写R扩展的手册有一个引用事件处理的部分,其中提到了使用R_PolledEvents.这很有希望.
是否存在中断服务程序来帮助我清除终端屏幕?它会在Windows上运行吗?
我试图在以下代码中终止线程:
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) 我有一个源,它以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) 这是参考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) 众所周知,有两种方法可以避免高负载网络中的硬件中断的一些开销,当硬件中断太多时,切换到它们需要花费太多时间.对于程序风格的性能和选择方法非常重要.
http://en.wikipedia.org/wiki/New_API 内核可以定期检查传入网络数据包的到达而不会中断,从而消除了中断处理的开销.
https://en.wikipedia.org/wiki/Interrupt_coalescing一种技术,在这种技术中,通常会触发硬件中断的事件会被阻止,直到一定量的工作挂起或超时计时器触发为止.
两种方法都没有显着的中断成本 - 这是默认中断驱动模式的优势.
但第二种方法 - 中断合并更合理,因为它:
减少延迟 - 一旦程序包到达,立即尝试立即处理它,如果最近发生了中断,则立即轮询它.NAPI对面不会立即处理帧,但会等待一段时间进行下一次轮询.
较少的CPU使用率 - 仅在至少有一个数据包到来时才开始轮询.但即使没有收到框架,也不是徒劳无功,就好像是NAPI一样.
IRQ Coalesce之前NAPI有哪些优势?
linux performance network-programming interrupt linux-kernel
interrupt ×10
java ×4
concurrency ×2
assembly ×1
c++ ×1
command-line ×1
deadlock ×1
dispatcher ×1
dos ×1
kernel ×1
linux ×1
linux-kernel ×1
performance ×1
qnx ×1
r ×1
real-time ×1
signals ×1
sockets ×1
udp ×1
windows ×1
x86 ×1