1.正向代理:代理的是客户端,一般有明确的访问对象
比如:我现在通过v-p-n去访问YouTube,那么就是正向代理。
2.反向代理:代理的是服务器
最常见的就是web中,nginx去代理一群后端的服务器。
3.负载均衡:在反向代理的基础上,
比如:后代集群每一台机器的处理能力不同,nginx根据配置权重,请求来了去分一个机器处理。
--------------------
共享内存中的锁
----------------------------------
通过master启动worker,master负责listen,worker负责accept
模块化架构:
不同阶段对应不同的钩子函数。
void* ctx表示上下文?
worker中的锁:
主线程通过epoll感知任务。
线程池负责处理任务
完成队列
------------------
锁的分类:
互斥锁。
自旋锁: 适合push和pop这种很轻量级的,这样子可以避免cpu上下文切换。
读写锁。
条件变量:在单进程内,信号量能解决的问题,条件变量都可以解决。
比如可以实现:任务少的时候休眠,任务多的时候唤醒。
但是只能解决多线程之间的互斥问题。
信号量:可以解决多进程的问题。
--------------------
高性能服务器影响因素:
内存池:大量的请求下,波动很小。
锁:互斥锁(会 引起上下文切换)和spinlock(浪费一点cpu,但是不切换)
----------------
一个好的开源项目,以nginx为例子:
1.代码可读性好
2.性能高、稳定性强、内存池、http协议
3.文档齐全,社区维护较好
4.代码迭代很频繁
5.代码结构稳定,写代码的人有一定的预见能力,应对后续的变更,代码结构基本不变。