JVM 内核空间 epoll函数

最近在看NIO异步阻塞的原理分析文章,其中说到了关于epoll函数的作用,所以我深入思考了native函数是如何运作的。

native函数是c++或c写的。那么为什么需要用native函数进行轮询监控而不是用java语言?相比较java,native函数是对性能友好吗?还是效率更高更快?

native语言比java快。

因为native是用c、c++编写的编译型语言,经过源代码-》编译-》机器码文件 只需要一次编译所有代码,就可以转换成计算机识别的语言。

java是解释型语言,经过源代码-》编译成字节码-》虚拟机解释-》机器码 需要虚拟机每一次执行一条命令再编译一次,转换成机器码。所以执行一个字节码文件需要执行n次,而c语言只需要执行一次。

为了保证在安全的环境中管理硬件,进程分为内核模式和用户模式,因此划分了内核空间和用户空间。

JVM运行在用户空间。JVM是由c或c++语言编写的,所以native函数执行的速度是java的10倍。

 

epoll函数包括两个:epoll_ctl和epoll_wait。这两个函数主要维护一块数据结构即epoll_event。这块数据结构包含3个部分,分别为就绪列表(存放就绪的socket信息,是双向链表),检查列表(需要检查的socket_fd,是红黑树)、等待队列(存放调用epoll_wait的进程)。

epoll_ctl:维护检查列表,增删改查需要检查的socket文件描述符信息

epoll_wait:主要的参数是epoll_event_id,和一个存放socket数组的指针。当epoll_event对象中没有socket就绪,阻塞线程,直到有socket就绪,才返回函数。在返回前,把就绪的socket写入入参的socket数组里。

 

 

 

 

 

 

 

 

 

 

 

 

参考:

1.什么是编译、链接、编译程序 - 知乎 (zhihu.com)

2.操作系统:操作系统内核是什么?_Julian Q的博客-CSDN博客

3.写操作系统只能用汇编和 C 语言吗?-腾讯云开发者社区-腾讯云 (tencent.com)

4.Java VS C/C++ 运行速度的对比_c比java快多少_runrun117的博客-CSDN博客

5.编译执行和解析执行的区别以及执行的速度比较?_解释器执行软件速度比编译器编译后的软件执行速度快_一个人的世界、的博客-CSDN博客

6.面试系列 深入理解NIO select&epoll - 知乎 (zhihu.com)

posted @ 2023-08-16 14:08  IT知识生产小店铺  阅读(7)  评论(0编辑  收藏  举报