O、面试问:什么是进程,什么是线程?
- 进程是计算机CPU分配资源的最小单位。
- 举例:
比如你有一个计算机,相当于一个工厂,想要干活,就要建一个厂房,也就是分配一定的空间资源。厂房里有一个或多个工人在工作。这里的工厂就是进程,工人就是线程。一个进程至少有一个线程。
一、同步与异步、阻塞与非阻塞
1. 举例背景
我们去饭店吃饭,有大厅和后厨。
2. 同步与异步
- 大厅里的我们下单后,如果等待后厨把饭做好端给我们,然后我们在做其他的事情,这是同步。
- 如果我们下单后,后厨去做饭,我们不等后厨,干别的事情了,那这就是异步。
- 同步和异步针对的是大厅的我们。
3. 阻塞与非阻塞
- 大厅的我们下单后,把单子给服务员,服务员把单子给后厨。如果服务员等待后厨做好饭后,再做别的事情,那就是阻塞。
- 如果服务员把单子给后厨后,去做别的事情了,那就是非阻塞。
- 阻塞与非阻塞是针对服务员的。
4. 分类
- 同步阻塞IO
- 同步非阻塞IO
- 异步阻塞IO
- 异步非阻塞IO
5. 事件策略
事件模型 | 描述 |
---|---|
select | 单个进程能打开的最大连接数为1024,因为需要对所有的文件描述符进行线性遍历,所以文件描述符太多会导致性能下降。 |
poll | 和select基本一样,因为用链表存储文件描述符,没有最大连接数限制 |
epoll | epoll是在每个文件描述符上设置callback来实现,FD就绪后才会调用callback,活跃socket少的话性能高,socket活跃多的话性能低 |
-
有三种策略:
-
策略一:select
- 当我们下单给服务员后,服务员把单子给厨师。
- 然后服务员轮询厨师,比如每隔一秒问一次:饭好了没。一旦有一次饭好了,就把饭给我们。
- 性能不太好
-
策略二:poll
- 与select一样,只不过select是数组形式的,有最大限制数,poll是链表形式的,没有最大限制数
- 性能不太好
-
策略三:epoll回调
- 当我们下单给服务员后,服务员把单子给厨师。
- 然后后厨一旦做好饭了,就告诉服务员,然后服务员就把饭给我们。
-
-
【面试】什么时候用select/poll轮询,什么时候用epoll回调?
- 后端特别快,用select/poll轮询,后端满用epoll回调
4. 谁的性能最低
- 同步阻塞。之前阿帕奇就是这么干的。
二、进程间切换
当在a进程做a事情,做到一半,去b进程做b事情,b进程又做到一半,去a进程做a事情。这样频繁切换,每次切换的时候,需要保存当前进程的事情,当下一次再次继续做的时候,需要恢复保存的记录,这样保存恢复很消耗性能。
三、文件描述符
- 文件描述符(File descriptor)是一个用于表述指向文件的引用的抽象画概念
- 当程序打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符
四、I/O模式
- 对于一次IO访问(以read为例),数据会先被拷贝到操作系统内核的缓冲区,然后才会从操作系统内核的缓冲区拷贝到应用程序的缓冲区,最后交给进程。所以说,当一个read操作发生时,它会经理两个阶段:
- a. 等待数据准备
- b. 将数据从内核拷贝到进程中
五、多路IO复用
- 所谓的多路IO复用,就是:
多个顾客点餐,把订单交给同一个服务员,这个服务员把订单分发 给多个厨师。
顾客 服务员 后厨
o--> -->o
↓ ↑
o-->-----> O ->------->o
↑ ↓
o--> -->o
六、 CPU亲和
- 把CPU内核和nginx的工作进程绑定在一起,让每个worker进程固定在一个CPU上执行,从而减少CPU的切换并提高缓存命中率,提高性能
七、sendfile
-
sendfile 零拷贝传输
- 首先,内存分为内存空间和用户空间(如果是4G内存,那么分别为1G和3G)
- 那么用户要读一个文件:
- 首先,请求发给内核,内核再发给用户空间
- 然后用户空间处理完后,将内容发给内核空间,内核空间再发给用户
- 那么如果是sendfile,
- 假如是读取一个静态文件,静态文件是在硬盘上的,硬盘谁可以读?内核可以读,那么也就不需要用户空间处理。
- 也就是说,用户读一个静态文件(比如.css),直接请求给内核,内核直接把文件返给用户了。不经过用户空间。
-
动静分离
- 静:静态内容
- 比如html、css、js
- nginx直接让内核空间把文件读出来返给用户,不经过用户空间
- 动:动态内容
- 比如需要经过应用程序处理的内容,比如注册、登陆
- nginx让内核接受用户请求,再转交给用户空间,用户空间处理后,返回给内核,内核再返给用户
- 静:静态内容
-
nginx就是实现了动静分离