Nginx源码分析 - Event事件篇 - Nginx的Event事件模块概览(17)

nginx源码分析(4)——事件模型 对于一个服务器来说,事件模型是至关重要的,nginx本身的高性能也要归功于其优秀的事件模型。一般地,nginx的事件模型是基于epoll的,而使用epoll需要调用epoll_create、epoll_ctl和epoll_wait三个函数。由于nginx本身的松耦合模块机制,这些函数的调用被隐藏在很难发现的地方,本篇文章就来介绍nginx的事件模型的初始化过程,从而大家可以清晰的知道epoll各个 阅读详情
AI摘要

本文深入剖析Nginx的事件模块,涵盖核心文件ngx_event.c中的关键函数和数据结构,如ngx_listening_s、ngx_connection_s及ngx_event_s等。适合对网络IO模型有一定了解的读者。

目录

一、event模块的概览

二、重要数据结构

1. ngx_listening_s 侦听结构

2. ngx_connection_s socket连接对象结构

3. ngx_event_s 事件数据结构


前一章,我们讲解了《Nginx源码分析 - 主流程篇 - 多进程的惊群和进程负载均衡处理 》  中实际上已经涉及到了一部分事件模块的概念。细心的可以发现,Nginx的事件都是由nginx_event.c文件中的ngx_process_events_and_timers进程事件分发器这个函数开始的。

这一章开始,我们会详细透彻的分析Nginx的event模块。如果你还对网络IO模型不太熟悉的,建议先把这块熟悉,也可以参考我的文章《 转载和积累系列 - 网络IO模型 》

如果你对Linux下的epoll模型也不是很熟悉的,请先学习下epoll的原理,也可以参考我的文章《Linux c 开发 - libevent 》

一切准备就绪,我们就可以开始了。

一、event模块的概览


  • ngx_event.c :这个文件主要放置Nginx事件event模块的核心代码。包含:进程事件分发器(ngx_process_events_and_timers)、事件模块的模块和配置、模块初始化/配置初始化等事件模块初始化的核心函数。
  • ngx_event_timer.c:定时器事件管理。主要放置定时器的代码。
  • ngx_event_posted.c:主要用于 拿到accept锁的进程 处理accept和read事件的回调函数。上一章惊群处理中,有重点提到ngx_event_process_posted这个方法。
  • ngx_event_pipe.c:主要用于处理管道。
  • ngx_event_openssl.c:主要用于处理SSL通道。HTTPS协议。
  • ngx_event_connect.c:主要用于处理TCP的连接通道。
  • ngx_event_accept.c:核心是ngx_event_accept和ngx_event_recvmsg,主要是处理accept事件的回调函数handler。而后续的read事件被ngx_event_accept中回调ngx_listen_t结构中的ls->handler回调函数回调,并且将rev->handler修改成ngx_http_wait_request_handler方法。
  • modules/xxxx.c:主要封装了各种平台的事件模型。我们这边主要看ngx_epoll_module.c模块。

二、重要数据结构


下面几个数据结构会在event模块中非常常见,必须得非常熟悉。

  • ngx_listening_s:主要是监听套接字结构,存放socket的信息
  • ngx_connection_s:存储连接有关的信息和读写事件。
  • ngx_event_s:主要存放事件的数据结构。

1. ngx_listening_s 侦听结构


主要用于存放连接的socket的侦听结构。

/**
 * socket侦听结构
 */
struct ngx_listening_s {
    ngx_socket_t        fd;	/* 文件描述符,即socket */

    struct sockaddr    *sockaddr;	/* socket地址 */
    socklen_t           socklen;    /* size of sockaddr */
    size_t              addr_text_max_len;
    ngx_str_t           addr_text;

    int                 type;

    int                 backlog;/* 日志 */
    int                 rcvbuf;	/* 数据接收buffer */
    int                 sndbuf;	/* 数据发送的buffer */
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
    int                 keepidle;
    int                 keepintvl;
    int                 keepcnt;
#endif

    /* handler of accepted connection */
    ngx_connection_handler_pt   handler; /* 接收连接后的回调函数,回调方法:ngx_http_init_connection */

    void               *servers;  /* array of ngx_http_in_addr_t, for example */

    ngx_log_t           log;
    ngx_log_t          *logp;

    size_t              pool_size;
    /* should be here because of the AcceptEx() preread */
    size_t              post_accept_buffer_size;
    /* should be here because of the deferred accept */
    ngx_msec_t          post_accept_timeout;

    ngx_listening_t    *previous; /* 前一个ngx_listening_t */
    ngx_connection_t   *connection; /* 连接对象 */

    ngx_uint_t          worker;

    unsigned            open:1; /* 为1表示监听句柄有效,为0表示正常关闭 */
    unsigned            remain:1;/* 为1表示不关闭原先打开的监听端口,为0表示关闭曾经打开的监听端口 */
    unsigned            ignore:1; /* 为1表示跳过设置当前ngx_listening_t结构体中的套接字,为0时正常初始化套接字 */

    unsigned            bound:1;       /* already bound */
    unsigned            inherited:1;   /* inherited from previous process */
    unsigned            nonblocking_accept:1;
    unsigned            listen:1; /* 为1表示当前结构体对应的套接字已经监听 */
    unsigned            nonblocking:1;
    unsigned            shared:1;    /* shared between threads or processes */
    unsigned            addr_ntop:1;
    unsigned            wildcard:1;

#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
    unsigned            ipv6only:1;
#endif
#if (NGX_HAVE_REUSEPORT)
    unsigned            reuseport:1;
    unsigned            add_reuseport:1;
#endif
    unsigned            keepalive:2;

#if (NGX_HAVE_DEFERRED_ACCEPT)
    unsigned            deferred_accept:1;
    unsigned            delete_deferred:1;
    unsigned            add_deferred:1;
#ifdef SO_ACCEPTFILTER
    char               *accept_filter;
#endif
#endif
#if (NGX_HAVE_SETFIB)
    int                 setfib;
#endif

#if (NGX_HAVE_TCP_FASTOPEN)
    int                 fastopen;
#endif

};
ngx_http_init_connection */

    void               *servers;  /* array of ngx_http_in_addr_t, for example */

    ngx_log_t           log;
    ngx_log_t          *logp;

    size_t              pool_size;
    /* should be here because of the AcceptEx() preread */
    size_t              post_accept_buffer_size;
    /* should be here because of the deferred accept */
    ngx_msec_t          post_accept_timeout;

    ngx_listening_t    *previous; /* 前一个ngx_listening_t */
    ngx_connection_t   *connection; /* 连接对象 */

    ngx_uint_t          worker;

    unsigned            open:1; /* 为1表示监听句柄有效,为0表示正常关闭 */
    unsigned            remain:1;/* 为1表示不关闭原先打开的监听端口,为0表示关闭曾经打开的监听端口 */
    unsigned            ignore:1; /* 为1表示跳过设置当前ngx_listening_t结构体中的套接字,为0时正常初始化套接字 */

    unsigned            bound:1;       /* already bound */
    unsigned            inherited:1;   /* inherited from previous process */
    unsigned            nonblocking_accept:1;
    unsigned            listen:1; /* 为1表示当前结构体对应的套接字已经监听 */
    unsigned            nonblocking:1;
    unsigned            shared:1;    /* shared between threads or processes */
    unsigned            addr_ntop:1;
    unsigned            wildcard:1;

#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
    unsigned            ipv6only:1;
#endif
#if (NGX_HAVE_REUSEPORT)
    unsigned            reuseport:1;
    unsigned            add_reuseport:1;
#endif
    unsigned            keepalive:2;

#if (NGX_HAVE_DEFERRED_ACCEPT)
    unsigned            deferred_accept:1;
    unsigned            delete_deferred:1;
    unsigned            add_deferred:1;
#ifdef SO_ACCEPTFILTER
    char               *accept_filter;
#endif
#endif
#if (NGX_HAVE_SETFIB)
    int                 setfib;
#endif

#if (NGX_HAVE_TCP_FASTOPEN)
    int                 fastopen;
#endif

};

2. ngx_connection_s socket连接对象结构


存储连接有关的信息和读写事件。

struct ngx_connection_s {

	/* 关联其它的 ngx_connection_s */
    void               *data;

    /* 读取数据事件 */
    ngx_event_t        *read;

    /* 写入事件*/
    ngx_event_t        *write;

    /* socket句柄 */
    ngx_socket_t        fd;

    /* 接收数据的函数指针 */
    ngx_recv_pt         recv;

    /* 发送数据的函数指针 */
    ngx_send_pt         send;

    /* 批量接收数据的函数指针 */
    ngx_recv_chain_pt   recv_chain;

    /* 批量发送数据的函数指针 */
    ngx_send_chain_pt   send_chain;

    /* 该连接的网络监听数据结构 */
    ngx_listening_t    *listening;

    off_t               sent;

    /* 日志 */
    ngx_log_t          *log;

    /* 内存池 */
    ngx_pool_t         *pool;

    int                 type;

    /* socket的地址结构 */
    struct sockaddr    *sockaddr;
    socklen_t           socklen;
    ngx_str_t           addr_text;

    ngx_str_t           proxy_protocol_addr;
    in_port_t           proxy_protocol_port;

#if (NGX_SSL)
    ngx_ssl_connection_t  *ssl;
#endif

    /* 本地监听socket的地址结构 */
    struct sockaddr    *local_sockaddr;
    socklen_t           local_socklen;

    /* 用于接收和缓存客户端发来的字符流 */
    ngx_buf_t          *buffer;

    /* 该字段表示将该连接以双向链表形式添加到cycle结构体中的   cycle->free_connections*/
    ngx_queue_t         queue;

    /* 建立一条与后端服务器的连接,number+1   */
    ngx_atomic_uint_t   number;

    /* 处理请求的次数  */
    ngx_uint_t          requests;

    unsigned            buffered:8;

    /* 日志级别   */
    unsigned            log_error:3;     /* ngx_connection_log_error_e */
    /* 不期待字符流结束  */
    unsigned            timedout:1;
    /* 连接处理过程中出现错误 */
    unsigned            error:1;
    /* 标识此链接已经销毁,内存池,套接字等都不可用  */
    unsigned            destroyed:1;

    /* 连接处于空闲状态  */
    unsigned            idle:1;
    /* 连接可以重用  */
    unsigned            reusable:1;
    /* 连接关闭 */
    unsigned            close:1;
    unsigned            shared:1;

    /* 正在将文件中的数据法网另一端 */
    unsigned            sendfile:1;
    unsigned            sndlowat:1;
    /* 使用tcp的nodely特性  */
    unsigned            tcp_nodelay:2;   /* ngx_connection_tcp_nodelay_e */
    /* 使用tcp的nopush特性   */
    unsigned            tcp_nopush:2;    /* ngx_connection_tcp_nopush_e */

    unsigned            need_last_buf:1;

#if (NGX_HAVE_IOCP)
    unsigned            accept_context_updated:1;
#endif

#if (NGX_HAVE_AIO_SENDFILE)
    unsigned            busy_count:2;
#endif

#if (NGX_THREADS)
    ngx_thread_task_t  *sendfile_task;
#endif
};

3. ngx_event_s 事件数据结构


struct ngx_event_s {

	/* 事件相关对象, 通常data指向ngx_connection_t连接对象. (开启异步IO后可能指向ngx_event_aio_t结构体) */
    void            *data;

    unsigned         write:1;

    /* 标识是否可以建立连接 */
    unsigned         accept:1;

    /* used to detect the stale events in kqueue and epoll */
    unsigned         instance:1;

    /*
     * the event was passed or would be passed to a kernel;
     * in aio mode - operation was posted.
     */
    /* 表示是否是活动状态 */
    unsigned         active:1;

    unsigned         disabled:1;

    /* the ready event; in aio mode 0 means that no operation can be posted */
    unsigned         ready:1;

    unsigned         oneshot:1;

    /* aio operation is complete */
    unsigned         complete:1;

    unsigned         eof:1;
    unsigned         error:1;

    unsigned         timedout:1;
    unsigned         timer_set:1;

    unsigned         delayed:1;

    unsigned         deferred_accept:1;

    /* the pending eof reported by kqueue, epoll or in aio chain operation */
    unsigned         pending_eof:1;

    unsigned         posted:1;

    unsigned         closed:1;

    /* to test on worker exit */
    unsigned         channel:1;
    unsigned         resolver:1;

    unsigned         cancelable:1;

#if (NGX_WIN32)
    /* setsockopt(SO_UPDATE_ACCEPT_CONTEXT) was successful */
    unsigned         accept_context_updated:1;
#endif

#if (NGX_HAVE_KQUEUE)
    unsigned         kq_vnode:1;

    /* the pending errno reported by kqueue */
    int              kq_errno;
#endif

    /*
     * kqueue only:
     *   accept:     number of sockets that wait to be accepted
     *   read:       bytes to read when event is ready
     *               or lowat when event is set with NGX_LOWAT_EVENT flag
     *   write:      available space in buffer when event is ready
     *               or lowat when event is set with NGX_LOWAT_EVENT flag
     *
     * epoll with EPOLLRDHUP:
     *   accept:     1 if accept many, 0 otherwise
     *   read:       1 if there can be data to read, 0 otherwise
     *
     * iocp: TODO
     *
     * otherwise:
     *   accept:     1 if accept many, 0 otherwise
     */

#if (NGX_HAVE_KQUEUE) || (NGX_HAVE_IOCP)
    int              available;
#else
    unsigned         available:1;
#endif

    ngx_event_handler_pt  handler;


#if (NGX_HAVE_IOCP)
    ngx_event_ovlp_t ovlp;
#endif

    ngx_uint_t       index;

    ngx_log_t       *log;

    ngx_rbtree_node_t   timer;

    /* the posted queue */
    ngx_queue_t      queue;

#if 0

    /* the threads support */

    /*
     * the event thread context, we store it here
     * if $(CC) does not understand __thread declaration
     * and pthread_getspecific() is too costly
     */

    void            *thr_ctx;

#if (NGX_EVENT_T_PADDING)

    /* event should not cross cache line in SMP */

    uint32_t         padding[NGX_EVENT_T_PADDING];
#endif
#endif
};

 

 

 

 

nginx事件处理框架及源码解析 nginx的中的事件可以分为两类:系统事件和定时器事件。系统事件指的是由操作系统通知给nginx的事件,例如各种IO多路复用api(select,epoll_wait等)返回的事件,定时器事件是指由nginx的定时器模型产生的超时事件。由于事件处理机制与生俱来的复杂性,为了方便管理,降低开发难度,nginx的事件处理框架将事件的管理抽象成一系列的接口,这些接口屏蔽了事件处理的底层细节,外部只需要关... 阅读详情

相关推荐

CTF密码学奇技淫巧:当Base64遇到ROT13与Atbash

本文深入解析CTF竞赛中Base64、ROT13与Atbash的复合编码技术,提供Python实现与CyberChef可视化处理方案,帮助选手掌握密码学题目的解题技巧。通过NewStarCTF2025实战案例,对比脚本化与可视化工具的优劣,提升Web安全竞赛中的编码处理能力。

weixin_29001683的博客 508

nginx事件模块

nginx事件模块

多看多听多总结 672

利用PLECS实现Boost变换器的闭环控制仿真与优化

本文详细介绍了如何利用PLECS仿真软件实现Boost变换器的闭环控制与优化。从基础原理到开环系统搭建,再到闭环控制设计与动态优化,提供了完整的仿真实践指南。通过PLECS的仿真功能,工程师可以有效诊断问题、优化参数,并实现高性能的DC-DC变换器设计。

weixin_42527401的博客 325

nginx ngx_event_t结构体详解

nginx的ngx_event_t结构体:为添加到循环event事件使用的event事件结构体。

focus on security 2569

jmeter小白下载安装步骤

本文仅仅简单介绍了jmeter工具的下载安装,以及基础的操作步骤。

昔年@曦的博客 3492

(25.08)Ubuntu20.04+ROS1复现FAST-LIO2

请确保在。

m0_69023437的博客 3992

NGX学习: ngx_event事件机制

一: 概述 1, 编译时如何选择正确的事件机制? 答:  编译的目标选择最先进的事件机制, 例如如果该机器支持epool就不会使用pool或select等. 实现的方法是写一个编译脚本, 依次尝试, 例如先尝试编译epool, 如果失败再尝试poll等. (待确认) 二: 代码结构   三: 数据结构 1, ngx_event_s 描述一个事件最基

poppick的专栏 1625

【语音识别算法】深度学习语音识别算法与传统语音识别算法的区别、对比及联系

深度学习语音识别算法与传统语音识别算法在理论基础、实现方式、性能表现等方面存在显著区别,同时也有一些联系。下面将从几个方面详细比较这两种方法,并给出应用实例和代码示例。

weixin_51306394的博客 2567

nginx源码阅读(九).事件及连接的定义、连接池

前言 事件的定义 连接的定义 关于连接池 小结前言本小节将分析事件模块中事件的定义以及连接池等相关定义,方便我们后面对事件模块中的模块进行分析。事件的定义每个事件由ngx_event_s表示:struct ngx_event_s { /* 跟事件相关的对象。通常指向ngx_connection_t连接 * 当开启了文件异步I/O之后,它可能会指向ngx_event_aio_t结构体

Move_now的博客 1320

AutoSAR系列讲解(实践篇)9.5-通信的数据映射

讲解了AppL中的数据与通信中的Signal的一个映射操作

雪云飞星的博客 1万+

基于多智能体架构的AI模拟法庭系统:律师案件预演的革命性工具

多智能体系统(Multi-Agent System)是人工智能领域的重要分支,它通过多个自主或半自主的智能体协同工作,模拟复杂的社会交互与决策过程。其核心原理在于分布式问题求解,每个智能体具备感知、推理和行动能力,通过通信与协作实现整体目标。在工程实践中,多智能体架构的价值在于能够模拟真实世界中的信息不对称与策略独立性,从而在复杂决策场景中提供更贴近现实的推演。这一技术正被应用于法律科技领域,通过构建物理隔离的智能体环境,模拟法庭对抗中的信息屏障与策略博弈。例如,在AI模拟法庭系统中,原告、被告、法官等角色

weixin_42561249的博客 393

Nginx源码分析(25篇)

1、Nginx源码分析 - 初探Nginx的架构(01) 2、Nginx源码分析 - 基础数据结构篇 - 内存池 ngx_palloc.c(02) 3、Nginx源码分析 - 基础数据结构篇 - 数组结构 ngx_array.c(03) 4、Nginx源码分析 - 基础数据结构篇 - 缓冲区结构 ngx_buf.c(04) 5、Nginx源码分析 - 基础数据结构篇 - 双向链表结构 ngx_queue.c(05) 6、Nginx源码分析 - 基础数据结构篇 - 单向链表结构 ngx_list.c(06)

xiaohuozi2015的博客 5029

在Ubuntu系统中安装和使用wxPython进行Python图形用户界面(GUI)开发

在本文中,我将向您展示如何在Ubuntu系统上安装和使用wxPython,并提供一些示例代码来帮助您开始使用这个强大的工具。在MyFrame的构造函数中,我们创建了一个wx.Panel和一个按钮,并将按钮的点击事件绑定到一个自定义的方法on_button_click上。最后,我们创建了一个wx.App的实例,创建了一个MyFrame对象并显示它,最后通过调用app.MainLoop()启动应用程序的主事件循环。这只是一个简单的示例,但它演示了如何使用wxPython创建一个基本的GUI应用程序。

qq_37934722的博客 1040

Nginx源码分析 - Event事件篇 - Event模块和配置的初始化(16)

目录 一、Event模块的数据结构 1. event事件模块的配置 2. ngx_events_module 事件模块 3. ngx_event_core_module 事件核心模块 4. ngx_event_conf_t 事件conf结构 二、Event模块结构图 三、Event模块的初始化 1. ngx_event_module_init 模块初始化函数 四、Event模块配置的初始化 1. ngx_events_module 模块配置初始化 2. ngx_conf_parse 解

alpha_love的博客 650

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Nginx源码分析 - Event事件篇 - Event模块的进程初始化(18)

目录 一、源码分析 1. Event核心模块ngx_event_core_module 2. Event模块初始化ngx_worker_process_init 3. 初始化核心函数ngx_event_process_init 二、TCP连接和读取事件逻辑 1. ngx_event_process_init 初始化事件循环 2.ngx_http_init_connection 初始化http连接,读取read事件数据 3. ls->handler的回调函数是如何赋值的 前面一篇我..

alpha_love的博客 470

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

nginx源码分析——event模块

一、简介      nginx是一款非常受欢迎的软件,具备高性能、模块化可定制的良好特性。之前写了一篇nginx的http模块分析的文章,主要对http处理模块进行了分析讲解,同时也涉及了nginx模块化的内容。至于nginx高性能的原因,希望能够在在这篇文章中就自己对于这方面的理解给大家分享一下。      nginx的event处理模型包含两个方面:高效的IO处理函数,事件的异步处

p77ll9l53x的博客 401

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Nginx源码分析 - Event事件篇 - Epoll事件模块(19)

目录 一、Epoll模块的数据结构 1. epoll模块命令集 ngx_epoll_commands 2. epoll模块上下文 ngx_epoll_module_ctx 3. epoll模块配置 ngx_epoll_module 二、Epoll模块的初始化 1. 配置文件初始化ngx_events_block 2. 模块初始化ngx_event_process_init 三、核心函数 1. ngx_epoll_process_events实现了收集、分发事件接口 这一篇主要讲解一下..

alpha_love的博客 700

nginx源码分析——事件模块

1. 事件模块概述 事件处理框架所要解决的问题是如何收集,管理,分发事件。这里所说的事件,主要以网络事件和定时器事件为主,而网络事件中又以TCP网络事件为主。由于网络事件与网卡中断处理程序,内核提供的系统调用密切相关,所以网络事件的驱动取决于不同的操作系统平台,在同一操作系统中也受制于不同的操作系统内核版本。因此不同操作系统有不同的事件驱动机制。 基于模块化的设计思想,nginx对于事件处理分不同的模块来完成。首先是ngx_events_module,它是NGX_CORE_MODULE类型的模块,主要负

focus on security 427

Nginx 源码分析

nginx.caspect:constants:nginx.hfilter:fixture:lang:runtime:tools:

zjw12221的专栏 1136

Nginx源码初探之事件模块-用户请求建立连接

事件处理框架介绍 Nginx基于事件驱动架构的Web服务器,负责这个功能的主要模块就是事件处理模块。事件处理模块主要解决如何收集、管理、分发事件(主要是网络事件和定时器事件)。由于网络事件与网卡中断处理程序,内核提供的系统调用密切相关,所以网络事件的驱动既取决与不同的操作系统,也取决于操作系统不同的操作系统内核版本。Nginx定义了一些列的事件驱动模块:ngx_devpoll_...

mlydaemon的专栏 2613
上一篇: Nginx源码分析 - 主流程篇 - 多进程的惊群和进程负载均衡处理(15)
下一篇: 推荐算法和机器学习系列 - 推荐算法综述
老码农zhuli
老码农zhuli 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄14年 2456粉丝 312原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值