io -- 18




1 2
概述在 nginx 初始化流程的介绍中,我们已经看到 nginx module 是怎么初始化和加载的,nginx module 提供了抽象的接口,由各个实际的模块实现者去实现相应的接口,当然,事件模块也是如此 EPOLL 模块 module 定义// struct ngx_event_module_t // 事件模块结构体 {{{ typedef struct { // 模块名称 ngx_str_t *name; // 解析配置前,用于创建存储配置项参数结构体的回调函数 void *(*create_conf)(ngx_cycle_t *cycle); // 解析配置完成后,用于综合处理某些配置项 char *(*init_conf)(ngx_cycle_t *cycle, void *conf); // 对于事件驱动机制,每个事件需要实现的 10 个抽象方法 ngx_event_actions_t actions; } ngx_event_module_t; // }}}  在事件模块结构体的最后定义了 
#技术帖    #龙潭书斋    #io    #epoll   

200x200


概述linux 中最常用的 IO 模型是同步 IO,在这个模型中,请求发出后应用程序会阻塞直到满足条件(阻塞 IO),或在不满足条件的情况下立即返回

#读书笔记    #技术帖    #linux    #apue   

200x200


nginx 相对于 apache 的优点轻量级ngxin 相对于 apache 来说,占用资源更少,这是高度模块化设计的优势nginx&nb

#技术帖    #linux    #unix    #apache   
问题描述开始阅读 nginx 源码的时候就一直伴随着一个问题,那就是多进程的 nginx 模型是怎么保证多个进程同时写入一个文件不发生数据交错呢?猜想中,主要有以下几种解决方案:最传统的,正在写文件的进程加锁,其他进程等待,但是这样的情况是绝对不允许的,效率太过低下写 log 前测试锁状态,如果已经锁定,则写入进程自己的缓冲区中,等待下次调用时同步缓冲区,这样做的好处是无需阻塞,提高了效率,但是就无法做到 log 的实时了,这样做工程中也是绝对无法接受的,一旦发生问题,将无法保证 log 是否已经被写入,因此很难定位一个进程专门负责写 log,其他进程通过域套接字或者管道将 log 内容发送给他,他持续阻塞在 epoll_wait 上,直到收到信息,立即写入,但是众所周知,nginx 是调用同一个函数启动所有进程的,并没有专门调用函数启动所谓的 log 进程,除了 master 和 worker,nginx 也确实没有 log 进程存在那么就是进程启动后,全部去竞争某个锁,竞争到该锁的 worker 执行 log&n
#技术帖    #linux    #unix    #socket   

200x200


简介STREAMS 就是流流在用户进程和设备驱动程序之间提供了一条全双工通道,从而无需和实际的硬件设备直接会话,也因此,流可以用来构造伪设备驱动程序任意数量的处理模块可以被压入流,流类似于栈

#读书笔记    #linux    #unix    #龙潭书斋   
概述存储映射 IO 使一个磁盘文件与存储空间中的一个缓冲区想映射,于是当从缓冲区中取数据时,就相当于读文件中的相应字节,同样,将数据写入缓冲区则相应字节被自动写入文件,这样就可以在不使用 read 和 write 的情况下执行 IO 操作了 存储映射mmap 函数用来声明一个映射,即告知内核将一个给定的文件映射到一个存储区域中void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off); 定义于 sys/mman.h 中调用成功返回映射区域的首地址,否则返回 MAP_FAILED 参数说明addraddr 参数用于指定映射存储区的起始地址,如果设为 0,则由系统选择该映射区的起始地址 len映射字节数 off要映射字节在文件中的起始偏移量通常应当是系统虚存页表长度的倍数虚存页表长度可以通过 _SC_PAGESIZE 或 _SC_PAGE_SIZE 参数调用 sysconf 函数获取 filedes被映射文件的文件描述符 p
#读书笔记    #技术帖    #龙潭书斋    #apue   

200x200


非阻塞IO概述我们可以将系统调用分成低速系统调用和其他系统调用两类低速系统调用有可能会使进程永远阻塞,低速系统调用包括下列情况:如果某些文件类型的数据不存在,则读操作的调用者可能永远阻塞如果数据不能立

#读书笔记    #操作系统    #linux    #unix   

200x200


概述linu 提供如下 IO 接口:read 和 write -- 最简单的读写函数readn 和 write

#读书笔记    #技术帖    #linux    #unix   
概述epoll 是 linux 内核为处理大批量文件描述符而对 poll 进行的改进版本,是 linux 下多路复用 IO 接口 select/poll 的增强版本,显著提高了程序在大量并发连接中只有少量活跃的情况下的CPU利用率在获取事件时,它无需遍历整个被侦听描述符集,只要遍历被内核 IO 事件异步唤醒而加入 ready 队列的描述符集合就行了epoll 除了提供 select/poll 所提供的 IO 事件的电平触发,还提供了边沿触发,,这样做可以使得用户空间程序有可能缓存 IO 状态,减少 epoll_wait 或 epoll_pwait 的调用,提高程序效率 实现原理当某个进程调用 epoll_create 函数创建 epoll 专用的文件描述符时,Linux 内核会创建一个 eventpoll 结构体变量:struct eventpoll { ... struct rb_root rbr; // 红黑树根节点,存储 epo
#读书笔记    #技术帖    #linux    #unix   
1 2



京ICP备15018585号