一:ngx_epoll_process_events函数调用位置

上节课:epoll_create();epoll_ctl();--我们目前已经做好准备 等待迎接客户端主动发起三次握手连入;

介绍ngx_epoll_process_events();

(i)ngx_master_process_cycle()        //创建子进程等一系列动作

(i)    ngx_setproctitle()            //设置进程标题

(i)    ngx_start_worker_processes()  //创建worker子进程

(i)        for (i = 0; i < threadnums; i++)   //master进程在走这个循环,来创建若干个子进程

(i)            ngx_spawn_process(i,"worker process");

(i)                pid = fork(); //分叉,从原来的一个master进程(一个叉),分成两个叉(原有的master进程,以及一个新fork()出来的worker进程

(i)                //只有子进程这个分叉才会执行ngx_worker_process_cycle()

(i)                ngx_worker_process_cycle(inum,pprocname);  //子进程分叉

(i)                    ngx_worker_process_init();

(i)                        sigemptyset(&set);

(i)                        sigprocmask(SIG_SETMASK, &set, NULL); //允许接收所有信号

(i)                        g_socket.ngx_epoll_init();  //初始化epoll相关内容,同时 往监听socket上增加监听事件,从而开始让监听端口履行其职责

(i)                            m_epollhandle = epoll_create(m_worker_connections);

(i)                            ngx_epoll_add_event((*pos)->fd....);

(i)                                epoll_ctl(m_epollhandle,eventtype,fd,&ev);

(i)                    ngx_setproctitle(pprocname);          //重新为子进程设置标题为worker process

(i)                    for ( ;; )

(i)                    {

(i)                        //子进程开始在这里不断的死循环

(i)                        ngx_process_events_and_timers(); //处理网络事件和定时器事件

(i)                            g_socket.ngx_epoll_process_events(-1); //-1表示卡着等待吧

(i)                    }

(i)    sigemptyset(&set);

(i)    for ( ;; ) {}.                //父进程[master进程]会一直在这里循环

从ngx_epoll_process_events()的函数调用位置,我们能够感觉到:

a)这个函数,仍旧是在子进程中被调用;

b)这个函数,放在了子进程的for ( ;; ) ,这意味着这个函数会被不断的调用;

二:ngx_epoll_process_events函数内容

用户三次握手成功连入进来,这个“连入进来”这个事件对于我们服务器来讲,就是 一个监听套接字上的可读事件;

(2.1)事件驱动:官方nginx本身的架构也被称为“事件驱动架构”;拆开:“事件”,“驱动”;

“驱动”:汽车靠发动机驱动,人体的发动机就是心脏;

“驱动”:动力的来源;驱动的问题,就是探讨程序怎么来干活的问题;

“事件驱动”,无非就是通过获取事件,通过获取到的事件并根据这个事件来调用适当的函数从而让整个程序干活,无非就是这点事;

三:ngx_event_accept函数内容

a)accept4/accept

b)ngx_get_connection/setnonblocking

c)ngx_epoll_add_event

(3.1)epoll的两种工作模式:LT和ET【面试可能问】

LT:level trigged, 水平触发,这种工作模式 低速模式(效率差) -------------epoll缺省用次模式

ET:edge trigged,  边缘触发/边沿触发,这种工作模式 高速模式(效率好)

现状:所有的监听套接字用的都是 水平触发;   所有的接入进来的用户套接字都是  边缘触发

水平触发的意思:来 一个事件,如果你不处理它,那么这个事件就会一直被触发;

边缘触发的意思:只对非阻塞socket有用;来一个事件,内核只会通知你一次【不管你是否处理,内核都不再次通知你】;

边缘触发模式,提高系统运行效率,编码的难度加大;因为只通知一次,所以接到通知后,你必须要保证把该处理的事情处理利索;

程序高手能够洞察到很多普通程序员所洞察不到的问题,并且能够写出更好的,更稳定的,更少出错误的代码;

四:总结和测试

(1)服务器能够感知到客户端发送过来abc字符了;

(2)来数据会调用ngx_wait_request_handler()

五:事件驱动总结:nginx所谓的事件驱动框架【面试可能问到】

我们的项目和官方nginx一样,都是事件驱动框架;

总结事件驱动框架/事件驱动架构

所谓事件驱动框架,就是由一些事件发生源【三次握手内核通知,事件发生源就是客户端】,通过事件收集器来手机和分发事件【调用函数处理】

【事件收集器:epoll_wait()函数】【ngx_event_accept(),ngx_wait_request_handler()都属于事件处理器,用来消费事件】

六:一道腾讯后台开发的面试题

问题:使用Linux epoll模型,水平触发模式;当socket可写时,会不停的触发socket可写的事件,如何处理?

答案:

第一种最普遍的方式:

需要向socket写数据的时候才把socket加入epoll【红黑树】,等待可写事件。接受到可写事件后,调用write或者send发送数据。当所有数据都写完后,把socket移出epoll。

这种方式的缺点是,即使发送很少的数据,也要把socket加入epoll,写完后在移出epoll,有一定操作代价。

一种改进的方式:

开始不把socket加入epoll,需要向socket写数据的时候,直接调用write或者send发送数据。如果返回EAGAIN,把socket加入epoll,在epoll

的驱动下写数据,全部数据发送完毕后,再移出epoll。

这种方式的优点是:数据不多的时候可以避免epoll的事件处理,提高效率。

epoll精粹二 - Linux C++网络编程(二十三)相关推荐

  1. 二.linux应用网络编程之文件属性

    ·有道云笔记地址,详细戳这:http://note.youdao.com/noteshare?id=c3acd730a7443727b1db74d2d44e9ac9&sub=BAD34E04D ...

  2. 服务器程序框架 - Linux C++网络编程(十三)

    一:信号高级认识范例 ps -eo pid,ppid,sid,tty,pgrp,comm,stat,cmd | grep -E 'bash|PID|nginx' 用kill 发送 USR1信号给进程 ...

  3. 【Linux】网络编程三:TCP通信和UDP通信介绍及代码编写

    参考连接:https://www.nowcoder.com/study/live/504/2/16. [Linux]网络编程一:网络结构模式.MAC/IP/端口.网络模型.协议及网络通信过程简单介绍 ...

  4. linux网络编程二:基础socket, bind, listen, accept, connect

    linux网络编程二:基础socket, bind, listen, accept, connect 1. 创建socket #include <sys/types.h>     #inc ...

  5. Linux shell脚本编程(二)

    Linux shell脚本编程(二) -------------------------------------------------------------------- 注:如果你对python ...

  6. Linux多线程网络编程要义丨epoll与reactor原理

    linux多线程网络编程要义 1. epoll原理剖析 2. 单reactor原理以及应用 3. 多reactor原理以及应用 [Linux服务器系列]Linux多线程网络编程要义丨epoll与rea ...

  7. Windows Socket 网络编程(二)

    来源: http://www.vckbase.com/document/viewdoc/?id=484 Windows Socket 网络编程(二) -- 套接字编程原理 作者: 冰点工作室 小鹰 [ ...

  8. Java网络编程(二) 连续发送数据

    有了建立连接的基础后,接下来尝试连续地发送和接收数据. 对于发送端比较好理解,有数据时就可以发送出去.对于接收端,就需要一直监听是否有数据发送过来.一个基本的方法就是使用 while(true) 循环 ...

  9. Linux下网络编程

    Linux下网络编程初步 Linux以其源代码公开闻名于世,并以其稳定性和可靠性雄霸操作系统领域,在网络应用技术方面使用得更加广泛.很久以来它就是Windows的重要对手之一.随着网络时代的来临,Li ...

  10. Linux原始网络编程,Linux操作系统网络编程 原始套接字 (1)

    Linux操作系统网络编程--原始套接字 (1) http://soft.zdnet.com.cn/software_zone/2007/1020/568223.shtml 我们在前面已经学习过了网络 ...

最新文章

  1. ABAP-FI常用BAPI
  2. 典型PC系统各操作指令执行时间
  3. kettle 的表输出 table output
  4. GIT关联本地仓库与远端仓库
  5. 51单片机IIC总线编程
  6. 浅谈linux中的grub
  7. 数据库事物 jdbc事物 spring事物 隔离级别:脏幻不可重复读
  8. cocos2d-x 使用BMFont生成中文字体并应用
  9. 计算机主机前后,Win10电脑主机前面的耳机插口没声音怎么办?前置面板插孔没声音...
  10. 设置背景颜色html,css怎么设置背景颜色?
  11. IDEA翻译插件出现报错: 更新 TKK 失败,请检查网络连接解决
  12. 火星南极有水,会有生命吗?
  13. Lotus Notes 7.0找不到服务器路径
  14. 一文读懂 HTTPS 与 TLS证书链校验
  15. oracle数据库表数据误删除恢复
  16. golang版google pay 支付验证
  17. idea-代码格式化快捷键设置
  18. WIN11连接WIN7共享的打印机报0x00000709错误
  19. JavaScript之匀速与减速动画函数的封装原理与编码讲解
  20. 强制用户使用定向推送功能是什么意思?整改措施请收好

热门文章

  1. This service allows sftp connections only
  2. Steam 最新VR 游戏畅销榜——这几款游戏绝对值得一玩~不来看看你可就错过啦!
  3. Android 仿微信全局字体大小调整
  4. 笑傲江湖 琴箫合奏之曲
  5. c++求一个数的因子
  6. IgA | 对抗病原菌,帮助共生菌定植的“重要开关”
  7. svchost 总是占用网速 一招见效(实测)
  8. CoreOS在儿童节发布了自己的分布式存储Torus
  9. W10系统matlab无法保存对该路径的更改 pathdef_最新WIN10 20H2系统找回经典系统属性界面的几种方法...
  10. 笔记本电脑开机指示灯亮但显示屏没有反应(已解决)