这篇文章是陶辉nginx的学习笔记。linux
首先,共享内存,是全部进程均可以访问。是进程通讯的一种方法。nginx
其次,就是磁盘文件和内存的映射。程序员
这里的内存是共享内存。web
可是,在NGINX里,是没有用到磁盘文件,而只用到共享内存。服务器
NGINX的共享内存,主要是被主进程和从进程共同使用。数据结构
主进程是master进程,从进程是work进程。多线程
主进程,主要干几件事情:
1.管理全部/全局东西
2.建立从进程
fork方法
3.申请共享内存
Linux有专门的申请共享内存方法,其实就是磁盘文件和内存映射的方法。叫map什么的。socket
从进程,主要做用就是,处理请求。函数
NGINX的进程都是单线程,不是多线程。性能
消费队列和事件队列的区别?
不一样点
一个是数据,一个是操做,都有写读。只不过一个是是写数据,一个是写操做。数据是写到集合里,好比队列。操做也是写到一个数据结构里,操做其实也只是一个对象,只不过概念有一点不同而已。好比,消费队列是叫消费者须要订阅主题/消费队列,生产者向消息队列写数据。而事件是消费者须要先注册一个什么事件,好比TCP socket里的链接事件,写数据事件,,读数据事件。
相同点
都有生产者和消费者,都是一个生产者生产数据/操做,一个消费者消费数据/操做。
1.半链接
Syn
2.链接成功
Ack
3.关闭
Fin
4.窗口抖动?
这他妈什么破名字
5.backlog
队列最大数量,分别在各个不一样的状态
具体来讲,就是客户端其实是和操做系统内核打交道,一直到最终内核建立链接,而且把链接放到链接集合,即accept队列里。
NGINX,包括其余的全部的服务器软件,都只是从操做系统内核的链接队列即accept队列里取一个已经建立好的链接对象而已。
操做系统内核有两个集合,一个是未完成的链接,即刚进来的链接,新的链接,所谓未完成,指的是握手的这个流程没有完成。
一个是已经完成的链接,即完成握手的链接。
握手其实也就是请求,响应。按理来讲,应该只有两步。
可是,实际状况是,更复杂一点。多了一个确认的过程。
原本应该是
1.客户端请求
2.服务器确认收到请求,处理数据
3.服务器返回数据
实际是
1.客户端请求
发送请求
2.服务器确认收到请求
把确认发给客户端。
你收到了请求,要告诉别人即客户端,别人即客户端才知道你服务器收到了请求。
3.客户端确认服务器收到了请求
和2同理,客户端收到了服务器的确认收到客户端请求,可是客户端也须要把这个确认告诉服务器。
4.服务器,即内核,把新链接放到已完成握手的队列里面
实际上,就是多了一个互相确认的过程,这个确认是指,还有点不同。
服务器的确认是,收到了客户端的请求。
客户端的确认是,服务器收到了可客户端的请求。
c原本是须要程序员本身分配内存,本身释放内存,这样有两个问题,麻烦,并且还容易忘。基于此,JVM的垃圾回收就是为了解决这个问题的,就是内存释放的问题,把这个工做自动化,而不须要程序员人为的处理这个跟具体业务没什么关系的操做。至于分配内存,这个确定是须要程序员手动建立的,由于建立对象,是程序员要不要建立和建立什么对象。NGINX里的内存池,也是为了解决自动释放内存的问题,具体是每一个请求和每一个链接都有本身的独立的线程池。这样的目的是,当请求/链接销毁的时候,即生命周期结束的时候,那么内存池也当即释放,这样就不会出现线程池申请以后,就一直占着内存的状况。
信号是其中的一种方式。
全部的回调函数,都是基于阻塞队列,而阻塞队列的调用者是操做系统,就是有数据来了,就给消费者。
按时间顺序
1.Apache
C
2.Tomcat
Java
3.NGINX
C
高性能
如今市场占用率第二名,超过Tomcat
是什么
顾名思义,是旋转屡次获取锁,就是循环屡次获取锁。而不是,在那里等待别人释放。
代码
代码如何实现,来一段代码。
锁的使用时间长短
由于要循环屡次获取锁,因此适合锁占用时间短的状况。不然,锁一直被别的线程占用,那么自旋锁线程一直在长时间空转,浪费CPU。
不是获取不到锁,就必需要等待吗?为何还能继续循环执行获取锁。
自旋锁,适合核心业务处理代码,由于必需要尽快主动获取锁,不能只是光等待。
做用是同步。
代码
做用是进程之间的通讯。主要是短数据,好比01,就是一个数字,一个进程通知一个进程作什么事情。
代码
陶辉 nginx