Linux网络I/O
I/O是什么
所谓I/O,无非就是输入输出,磁盘I/O我们关注的较多,实质上,数据传输过程也可以说是一个I/O的过程。
I/O工作流程
I/O网络模型
同步/异步(关注的是消息通知机制)
同步:
调用者发指令给被调用者,被调用者需要获取一些资源后再返回给调用者,那么此时调用者需要等待被调用者返回消息,也就意味着调用者啥也干不了。
异步:
调用者发指令给被调用者,当被调用者获取一些资源后返回给调用者,此时被调用者会主动将当前运行状态通知给调用者。
阻塞/非阻塞(关注是的调用者在等待被调用者返回结果之前所处的状态)
阻塞:
指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起。
非阻塞:
指IO操作被调用后立即返回给用户进程一个状态值,无需等待IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起。
IO模式有这么一些组合使用的情况:
同步阻塞:类似于将衣服扔到洗衣机,然后守在洗衣机旁边,洗衣机洗完了不通知,只能等待它什么时候洗完什么时候处理。
同步非阻塞:将衣服扔到洗衣机,然后可以去干别的事情,是否洗完了,不知道,需要我们时不时去看一下。
异步阻塞:把衣服扔给洗衣机,还是会在旁边等着,洗衣机洗完了会通知。
异步非阻塞:把衣服扔给洗衣机,可以干其他事情,等待洗衣机洗完了会通知,然后去取衣服。
常见的五种I/O模型
同步阻塞IO
每次只能响应一个请求,其他请求会被挂起。
相当于去饭店吃饭,点了菜之后如果还想去逛街,就只能等待菜做完后吃完才能去逛街。
同步非阻塞IO
好处:用户进程可以处理其他任务,坏处:任务完成的响应延迟增大了,因为每过一段时间需要去轮询一次read操作。
相当于去饭店吃饭,然后在做菜的过程中去逛街,逛街途中需要时不时的回饭店问一下服务员菜有没有做好。
IO多路复用
一个进程可以接受多个用户进程的请求。
相当于去饭店吃饭,点了菜后我们去逛街,但是餐厅安装了一个电子屏幕来显示点餐的状态,逛街途中需要时不时的回饭店查看电子屏幕的信息就可以知道我们的菜有没有做好。
信号驱动IO
相当于我们点完菜之后去逛街,系统做完菜后会通知我们菜做好了,我们只需要等菜做好了的通知再回饭店吃饭即可。
异步非阻塞IO
整个过程不会被阻塞。
只有发起请求和完成任务后通知我们的过程。
IO模型对比
IO模型的实现
select :
操作方式:遍历
底层实现:属组
IO效率:每次调用都进行线性便利,使劲啊复杂度为O(n)
最大连接数:1024(X86)或2048(X64)
fd拷贝:每次调用select,都需要把fd集合,从用户态拷贝到内核态。
poll:
操作方式:遍历
底层实现:链表
IO效率:每次调用都进行线性便利,使劲啊复杂度为O(n)
最大连接数:无上限
fd拷贝:每次调用poll,都需要把fd集合从用户态拷贝到内核态。
epoll:
操作方式:遍历
底层实现:哈希表
IO效率:时间通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪fd放到rdllist里面,时间复杂度O(1)
最大连接数:无上限
fd拷贝:调用epoll_ct时拷贝进内核并保存,之后每次epoll_wait不拷贝。
Nginx
基本介绍
nginx其实就是一个web服务器。它的特点是开源、高性能、高可靠。
- 高性能:进w个连接请求时,他的响应要比其他的web要快。
- 高扩展性:nginx功能模块化。官方提供了很多的优秀模块。
- 高可靠性:可靠性达到99999,大概可以达到一年最多宕机5分钟。
- 热部署:可以在不停止服务的情况下进行升级。
- 互联网公司都选择Nginx,具备代理、缓存、负载均衡、静态资源的处理、动静分离、LNMP、LNMT、LNMG架构。
Nginx应用场景
- web服务
- 负载均衡
- 代理缓存
- 安全服务 Https Lua
- 动静分离 Nginx+Tomcat
- 静态资源服务
Nginx基本组件
- nginx二进制文件 (相当于汽车本身)
- nginx.conf配置文件 (相当于汽车的驾驶人员,控制nginx软件的行为)
- nginx access.log日志 (相当于GPS,存放nginx相关的所有的请求与响应)
- nginx error 日志 (存放错误日志)
Nginx的安装
- nginx.org–>download
- 找到Pre-Built Packages下的包
- 选项相应的linux系统
- 按照网站内容去配置yum源后使用yum安装即可
Nginx相关的文件
/etc/logrotate.d/nginx # 用于日志切割
/etc/nginx/nginx.conf # 主配置文件
/usr/sbin/nginx # 编译出来的二进制文件
/var/log/nginx # 存放访问日志和错误日志
Nginx配置文件
#### 全局配置 ####
user nginx; # 运行nginx进程的用户
worker_processes 1; # 启动多少个worker进程
error_log /var/log/nginx/error.log warn; # 错误日志存放路径
pid /var/run/nginx.pid; # 进程pid文件
#### 事件驱动模型 ####
events {
worker_connections 1024;
}
#### http模块 ####
http {
include /etc/nginx/mime.types;
default_type application/octet-stream; # 当nginx无法识别这个文件时,则默认一访问就下载了。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; # 访问日志的路径
sendfile on;
#tcp_nopush on;
keepalive_timeout 65; #长连接(默认长连接保持65s)
#gzip on; # 压缩
include /etc/nginx/conf.d/*.conf; # 包含/etc/nginx/conf.d/目录下所有的.conf结尾的文件
}
cat /etc/nginx/conf.d/default.conf
server { # 每一个server{}表示一个网站,简称虚拟主机,server表示要配置网站。
listen 80; # 这个网站要监听80端口
server_name localhost; # 这个网站的域名是什么
location / { # 控制网站访问的路径
root /usr/share/nginx/html; # 定义网站源代码存放的路径
index index.html index.html; # 默认返回哪个文件作为默认返回页
}
nginx中的http、server、location之间的关系。
http:主要用来解决用户的请求和相应
server:主要用来响应具体的某一个网站
location:用于匹配网站的uri路径
http://10.0.0.7/index.html
url 上面是一个完整的url 其中index.html表示uri
http{}下面可以有多个server{}。每个server{}又可以有多个location{}。
使用nginx运行一个游戏网站
- 准备游戏源码
- 准备一个目录存放游戏
mkdir /code
rz 游戏
unzip 游戏
- 配置nginx
3.1 配置监听的端口
3.2 配置网站的域名
3.3 配置用户访问网站的规则 location
3.4 配置默认返回的页面
server{
listen 80;
server_name game.zhangwenjie.com;
location / {
root /code;
index index.html;
}
}
systemctl restart nginx
- 配置windows的dns
nginx访问网站的原理
- 浏览器请求game.zhangwenjie.com
- 浏览器game.zhangwenjie.com --> http://game.zhangwenjie.com
- 浏览器对域名进行解析
- 浏览器通过随机端口向服务端的80端口建立TCP连接
- 浏览器发起HTTP的请求
- 请求被80端口对应的Nginx应用所接收,会交给http层,发现请求的域名是game.zhangwenjie.com
- 匹配server{}的server_name,查看是否有该域名
- 满足域名匹配后检查用户请求的路径
- 返回结果给用户
- nginx向内核发送请求获取磁盘中的某个文件,磁盘将数据copy到内核的缓冲区,然后再拷贝到nginx应用进程的缓存去
- nginx应用进程封装数据报文,回传给客户端浏览器
图示如下:
Nginx运行多个游戏网站的方法
- 使用多个端口访问。
- 使用多个IP访问。
- 使用多个域名访问。(使用最多)