作者回复: 语速有些快吗? 如果是这样, 接下来的课程我会尽量放慢语速
作者回复: 是的
作者回复: 对的,这就是epoll+异步编程
作者回复: 纠正下,在用户态完成请求切换。
所有切换都消耗CPU资源,请求切换在用户态完成最大的价值在于:如果基于LWP线程切换实现请求切换,会有以下问题:
1、每个线程的栈消耗空间过大
2、切换线程成本要更大,而总成本随着线程数量增长呈指数级上升
3、阻塞IO调用产生的时间成本
4、内核态与用户态数据的拷贝成本
作者回复: 操作系统为提升可靠性,将应用程序操作内存称为用户态,OS本身为内核态。边缘触发相对水平触发而言,是epoll的两种触发方式。
作者回复: 先回答第1个:边缘触发性能更好,但对代码要求更高,需要处理更多的异常情况。nginx用的是边缘触发,因为这样减少了不必要的socket唤醒。
第2个:epoll wait是系统调用,所有的系统调用都需要做用户态与内核态间的切换,因为内核态的地址空间与用户态不同,这是为了内核的可靠性与安全性考虑设计的。
作者回复: 第几分几秒能标识下吗?不好意思,习惯性说“我们”,没明确主语
作者回复: 静态优先级。Sorry,确实说得太快了:-)
作者回复: 这里指与每个线程同一时间只处理一个请求,基于线程调度实现请求切换而言。
比如,epoll一次返回100个ready状态的socket,那么可以在用户态一次完成100个请求的切换,不产生主动线程切换。
作者回复: 1、每次处理几百个,但总并发连接数可能是几万个。
2、Nginx与OS一样,都是用一个线程处理几万个连接,而如Tomcat等应用程序是1个线程1个连接的处理业务逻辑,这是最大的不同。
作者回复: 这2个问题都需要阅读内核知识才能明白,推荐你学习《Linux内核设计与实践》一书。
作者回复: 本节课中,没有谈到Nginx的多线程特性。
作者回复: 1、在Linux中,线程与进程在调度上没有差别,所以process和线程可视为等价。
2、nginx不是多线程程序(thread pool除外,它仅处理AIO读取,参见第132课),在一个worker进程内,它只有1个线程。所谓用户态切换,就是指epoll+无阻塞的事件驱动的方式来切换请求。它相对于1个线程同一时间只处理1个请求的方式。