首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux源码epoll

linux源码epoll 前言 linux的高性能网络编程中,绕不开的就是epoll。...本文就是笔者探究epoll源码过程中,对kernel将就绪描述符添加到epoll并唤醒对应进程的一次源码分析(基于linux-2.6.32内核版本)。...由于linux的系统调用是通过(SYSCALL_DEFINE1,SYSCALL_DEFINE2......SYSCALL_DEFINE6)定义的,那么sys_epoll_create1对应的源码即是SYSCALL_DEFINE...(注:由于是tcp socket,所以这边sock->ops=inet_stream_ops,这个初始化的过程我的另一篇博客>中,博客地址如下: https...总结 epoll作为linux下非常优秀的事件触发机制得到了广泛的运用。其源码还是比较复杂的,本文只是阐述了epoll读写事件的触发机制,探究linux kernel源码的过程非常快乐^_^。

5.2K41

linux源码epoll

前言 linux的高性能网络编程中,绕不开的就是epoll。和select、poll等系统调用相比,epoll需要监视大量文件描述符并且其中只有少数活跃的时候,表现出无可比拟的优势。...本文就是笔者探究epoll源码过程中,对kernel将就绪描述符添加到epoll并唤醒对应进程的一次源码分析(基于linux-2.6.32内核版本)。...由于linux的系统调用是通过(SYSCALL_DEFINE1,SYSCALL_DEFINE2......SYSCALL_DEFINE6)定义的,那么sys_epoll_create1对应的源码即是SYSCALL_DEFINE...>中,博客地址如下: https://my.oschina.net/alchemystar/blog/1791017) 既然知道了tfile->f_op...总结 epoll作为linux下非常优秀的事件触发机制得到了广泛的运用。其源码还是比较复杂的,本文只是阐述了epoll读写事件的触发机制,探究linux kernel源码的过程非常快乐_。

2.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    linux源码socket的close

    linux源码socket的close 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。...上篇博客讲了socket的阻塞和非阻塞,这篇就开始谈一谈socket的close(以tcp为例且基于linux-2.6.24内核版本) TCP关闭状态转移图: 众所周知,TCP的close过程是四次挥手...接着FIN_WAIT2状态等待对端的FIN,完成后面两次挥手: ?...总结 linux内核源代码博大精深,阅读其代码很费周折。之前读>的时候由于有先辈引导和梳理,所以看书中所使用的BSD源码并不觉得十分费劲。...直到现在自己带着问题独立linux源码的时候,尽管有之前的基础,仍旧被其中的各种细节所迷惑。希望笔者这篇文章能帮助到阅读linux网络协议栈代码的人。

    5.4K80

    openjdk8下Unsafe源码

    目录 1.前言 2.Unsafe中的native方法 3.Unsafe中的上层方法 =======正文分割线====== 一、前言 JDK8中追踪可见sun.misc.Unsafe这个类是无法看见源码的...,打开openjdk8源码 目录:openjdk-8-src-b132-03_mar_2014\openjdk\jdk\src\share\classes\sun\misc 此类包含了低级(native...native void park(boolean isAbsolute, long time);              //终止挂起的线程,恢复正常.java.util.concurrent包中挂起操作都是LockSupport...类实现的,也正是使用这两个方法     public native void unpark(Object thread);              //获取系统不同时间系统的负载情况       public...;   if ((result = (*addr == old)))     *addr = new_val;   return result; } ====参考======== 1.openjdk8源码

    39920

    linux源码socket(tcp)的timeout

    linux源码socket(tcp)的timeout 前言 网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌。...kernel代码版本细微变化 值得注意的是,linux本身官方发布的2.6.32源码对于tcp_syn_retries2的解释和RFC并不一致(至少笔者阅读的代码如此,这个细微的变化困扰了笔者好久,笔者下载了和机器对应的内核版本后才发现代码改了...以下为代码对比: ========================>linux 内核版本2.6.32-431<======================== #define TCP_TIMEOUT_INIT...timeout = ((2 << boundary) - 1) * rto_base; ...... } ========================>linux 内核版本2.6.32.630时,将socket设置为非阻塞,然后用select系统调用去模拟超时,而没有走linux本身的超时逻辑,如下图所示: ?

    4.7K20

    linux源码socket(tcp)的timeout

    kernel代码版本细微变化 值得注意的是,linux本身官方发布的2.6.32源码对于tcp_syn_retries2的解释和RFC并不一致(至少笔者阅读的代码如此,这个细微的变化困扰了笔者好久,笔者下载了和机器对应的内核版本后才发现代码改了...以下为代码对比: ========================>linux 内核版本2.6.32-431<======================== #define TCP_TIMEOUT_INIT...timeout = ((2 << boundary) - 1) * rto_base; ...... } ========================>linux 内核版本2.6.32.630时,将socket设置为非阻塞,然后用select系统调用去模拟超时,而没有走linux本身的超时逻辑,如下图所示: 由于没有java并没有设置so_sndtimeo的选项,所以...我们先看下系统调用的源码: read系统调用 socket的read系统调用最终调用的是tcp_recvmsg, 其源码如下: int tcp_recvmsg(struct kiocb *iocb, struct

    2K20

    Linux源码Socket(TCP)的accept

    今天笔者就从Linux源码的角度看下Server端的Socket进行Accept的时候到底做了哪些事情(基于Linux 3.10内核)。...理解accept的关键点是,它会创建一个新的Socket,这个新的Socket来与对端运行connect()的对等Socket进行连接,如下图所示: 接下来,我们就进入Linux内核源码栈吧 accept...关于epoll的原理可以看下笔者之前的博客《从linux源码epoll》: https://www.cnblogs.com/alchemystar/p/13161781.html 在这里描述一下原因,...,可以见笔者另一篇博客的详细分析 《从Linux源码Socket(TCP)的listen及连接队列》: https://www.cnblogs.com/alchemystar/p/13845081.html...总结 Linux内核源码博大精深,每次扎进去探索时候都会废寝忘食,其间可以看到各种优雅的设计,在此分享出来,希望对读者有所帮助。

    1.8K00

    Linux源码Socket(TCP)Client端的Connect

    今天笔者就来从Linux源码的角度看下Client端的Socket进行Connect的时候到底做了哪些事情。由于篇幅原因,关于Server端的Accept源码讲解留给下一篇博客。...int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen) 这个系统调用有三个参数,那么依据规则,它肯定在内核中的源码长下面这个样子...内核中修改的地方为: cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 通过hash决定端口号起始搜索范围 Linux上进行connect...自然也考虑到了这种情况,所以提供了一个tcp_tw_reuse参数使得搜索端口号时可以某些情况下重用TIME_WAIT。...端口号迭代搜索 Linux内核[low,high]范围按照上述逻辑进行port的搜索,如果没有搜索到port,即port耗尽,就会返回-EADDRNOTAVAIL,也即Cannot assign requested

    71920

    Linux 内核】编译 Linux 内核 ① ( 下载指定版本Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 )

    文章目录 一、下载 Linux 内核 1、下载最新版本 Linux 内核 2、下载指定版本 Linux 内核 二、Linux 内核版本号含义 一、下载 Linux 内核 ---- 1、下载最新版本 Linux...6 小版本号 ( 修改次数 ) : 14 Linux 内核 官网 https://www.kernel.org/ 页面中 , 点击 https://www.kernel.org/pub/ 链接....x 版本 , 进入 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ 页面 , 该界面中可以直接下载 linux-5.6.14.tar.gz...文件 , 这就是 5.6.14 版本 Linux 内核源码 ; 二、Linux 内核版本号含义 ---- 以 5.6.14 版本为例 : 主版本号 : 5 次版本号 : 6 小版本号 (...修改次数 ) : 14 版本稳定性 : 稳定版本 : 次版本号 为 偶数 , 说明该版本Linux 内核是可以使用的稳定版本 , 不稳定版本 : 如果次版本号为奇数 , 说明版本

    31.3K30

    Linux源码Socket(TCP)Client端的Connect

    今天笔者就来从Linux源码的角度看下Client端的Socket进行Connect的时候到底做了哪些事情。...int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen) 这个系统调用有三个参数,那么依据规则,它肯定在内核中的源码长下面这个样子...内核中修改的地方为: cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 通过hash决定端口号起始搜索范围 Linux上进行connect...端口号迭代搜索 Linux内核[low,high]范围按照上述逻辑进行port的搜索,如果没有搜索到port,即port耗尽,就会返回-EADDRNOTAVAIL,也即Cannot assign requested...Client(TCP)端进行Connect的过程真是跋山涉水,从一开始文件描述符的限制到端口号的搜索再到路由表的搜索再到最后的三次握手,任何一个环节有问题就会导致创建连接失败,笔者详细的描述了这些机制的源码实现

    1.5K41

    Linux源码Socket(TCP)的listen及连接队列

    今天笔者就来从Linux源码的角度看下Server端的Socket进行listen的时候到底做了哪些事情(基于Linux 3.10内核),当然由于listen的backlog参数和半连接hash表以及全连接队列都相关...这就会引起一些微妙的现象,这个本文中会进行讲解。 接下来,我们就进入Linux内核源码栈吧 listen |->INLINE_SYSCALL(listen......)...Nginx 1.9.1版本开启了之后,其压测性能达到3倍! 半连接队列hash表和全连接队列 笔者一开始翻阅的资料里面,都提到。...但笔者仔细阅读了一下源码,其实并非如此。事实上,sync_queue其实是个hash表(syn_table)。另一个队列是icsk_accept_queue。...而笔者也正是写这篇博客而详细阅读源码的时候偶然间灵光一闪,找到了最近一个诡异问题的根因。这个诡异问题的分析过程将会在近期写出来分享给大家。

    1.8K20

    linux源码socket的阻塞和非阻塞 顶

    linux源码socket的阻塞和非阻塞 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。 大部分高性能网络框架采用的是非阻塞模式。...笔者这次就从linux源码的角度来阐述socket阻塞(block)和非阻塞(non_block)的区别。 本文源码均来自采用Linux-2.6.24内核版本。...事实上: fcntl的作用就是将O_NONBLOCK标志位存储sock_fd对应的filp结构的f_lags里,如下图所示。 ?...(进程结构体)->files_struct->fd_array中找到对应的socket的file描述符,再修改file->flags 调用socket.recv的时候 我们跟踪源码调用: socket.recv...希望笔者这篇文章能帮助到阅读linux网络协议栈代码的人。

    3.6K20

    手动Linux源码编译安装httpd

    好比作者自己的机器是X86_64架构的,而你的机器是i386,那很不幸运,不适合你,只能下载源码手动安装了。...大概有多少种编译器呢,我们可以使用yum groupinfo Development tools 进行包组的查看了。...有的读者也许还不懂这个命令的含义,我写完这个博文后,会单独开设一个博文讲解yum命令和yum 仓库的,其实也很简单,不要畏惧。...2.下载httpd源码包 在网上找到源码的地址,如图所示: 复制链接地址后,进去xshell中命令行中输入: wget 链接地址,下载下来的源码包就存在你当前的路径下。...下载好源码之后解压出来,在当前目录上使用:ls 查看源码包是用哪种格式的压缩文件压缩的。

    1.6K10
    领券