概述
linux进程间通讯方式
在linux系统中进程之间的通讯方式有 套接字、共享内存、消息队列、管道、信号
Nginx进程间通讯方式
Nginx选择其中的套接字、共享内存、信号作为 同步master进程和多个worker进程间数据的方式
Nginx互斥锁
在多个进程访问共享资源时 还需要提供一种机制使各个进程有序、安全的访问资源 避免并发访问带来的未知结果 Nginx主要使用了3种同步方式 原子操作、信号量、文件锁
不要随意使用信号量来实现互斥锁
每个worker进程都会同时处理千万请求 处理任何一个请求都不应该阻塞当前进程处理后续的其他请求 不要随意使用信号量作为互斥锁 这会使得worker进程在得不到锁时进入睡眠状态 从而导致这个worker进程上的请求被饿死
共享内存
通过mmap或者shmget系统调用在内存中创建一块连续的线性地址空间 对应的通过munmap或者shmdt系统调用释放这块内存
共享内存的好处
当多个进程使用同一块共享内存时 在任何一个进程修改了共享内存中的内容后 其他进程通过访问这段共享内存都能得到修改后的内容
linux通过mmap向应用程序提供共享内存
mmap可以将磁盘文件映射到内存中 直接操作内存时Linux内核将负责同步内存和磁盘文件中的数据
mmap函数的5个入参含义
linux mmap函数 如果flags设置为不使用文件映射方式 则fd和offset参数则没有意义 此时的mmap函数的功能和ngx_shm_alloc的功能几乎完全相同
nginx定义共享内存的结构体
Nginx在Master进程fork出worker子进程后 所有的进程开始使用这块内存中的数据
统计某个时刻下nginx已经处理过的连接状况
作为Web服务器 Nginx具有统计整个服务器Http连接框架的功能 (不是某一个worker进程的状况, 而是所有worker进程连接状况)
共享内存中有一个原子变量 ngx_sta_reading表示正在接收TCP流的连接数
在接受请求的方法中将表示正在接收TCP流连接数的统计变量加1 在处理请求的方法中将该统计变量减1