我是NIO的新手,我正在试图弄清Jetty如何利用NIO.
我对使用阻塞IO服务请求的传统servlet容器的理解如下:
doGet调用servlet方法(etc)InputStream和OutputStreamInputStream并写入OutputStreamInputStream和OutputStream基本上与基础的相应流Socket使用NIO连接器时有何不同?我的猜测大致如下:
InputStreamOutputStream)doGet处理上述包装器流的servlet方法(etc)SocketChannel从Jetty文档中,我发现了以下内容:
SelectChannelConnector - 此连接器使用具有非阻塞线程模型的高效NIO缓冲区.Jetty使用Direct NIO缓冲区,并仅将线程分配给具有请求的连接.同步模拟对servlet API的阻塞,并且在请求处理结束时任何未刷新的内容都是异步写入的.
我不确定我明白是什么Synchronization simulates blocking for the servlet API意思?
在Java中,JVM(例如HotSpot)能够进行JIT编译,并且该技术用于通过将字节码编译为本机代码来加速执行.我的问题是,这在技术上是如何发生的?我的理解是,现代处理器将内存区域标记为只读部分,以及可执行部分以防止恶意代码执行.因此,JVM无法将新的"可执行代码"写入它可以访问的内存空间(即自修改代码).所以,我猜测JVM生成本机代码,将其写入文件然后使用操作系统服务将该本机代码动态加载到内存中,
我确实看到了这个答案:如何将JIT编译的代码注入内存并执行?,但我很困惑为什么操作系统会允许用户程序READ + EXECUTE内存区域.其他操作系统,即Linux等提供类似的东西,以便JIT工作吗?
有人可以帮助澄清我的理解吗?
我知道有这个int isatty(int filedes)函数,但是这个在标准C库中。我想通过在 Linux 和 OSX 中进行系统调用来确定 STDIN 是否是 TTY(我正在汇编中编写 FORTH,并且不想链接到 C 库)。
我知道该实现发出MessageNotUnderstood异常信号,但最终如何打开调试器?