1.怎样应对服务器的大流量、高并发
- 客户端:
- 尽量减少请求数量:依靠客户端自身的缓存或处理能力
- 尽量减少对服务端资源的不必要耗费:重复使用某些资源,如连接池
- 服务端:
- 增加资源供给:更大的网络带宽,使用更高配置的服务器
- 请求分流:使用集群,分布式的系统架构
- 应用优化:使用更高效的编程语言,优化处理业务逻辑的算法
2.线程池与多线程的设计思路
- 设计一个任务队列,作为临界资源
- 初始化n个线程,开始运行,对任务队列加锁取拿取任务执行
- 当任务队列为空时,所有子线程(工作线程)阻塞(pthread_cond_wait)
- 主线程感知到内核事件表上有事件发生时,将任务添加到任务队列中,唤醒睡眠的工作线程(pthread_cond_signal pthread_cond_broadcast)
3、客户端断开连接,服务端epoll监听到的事件是什么
在使用 epoll 时,客户端正常断开连接(调用 close()),在服务器端会触发一个 epoll 事件。在早期的内核中,这个 epoll 事件一般是 EPOLLIN,即 0x1,代表连接可读。
连接池检测到某个连接发生 EPOLLIN 事件且没有错误后,会认为有请求到来,将连接交给上层进行处理。这样一来,