阻塞/非阻塞、同步/异步
数据就绪 - 根据系统IO操作的就绪状态
阻塞 - 调用IO方法的线程进入阻塞状态(挂起)
非阻塞 - 不会改变线程的状态,通过返回值判断
数据读写 - 根据应用程序和内核的交互方式
同步 - 数据的读写需要应用层去读写
异步 - 操作系统提供相应服务
阻塞/非阻塞都是同步IO,只用使用了特殊API才是异步IO;
五种IO模型
阻塞
调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的去检查这个函数有没有返回,必须等这个函数返回才能进行下一步动作。
非阻塞
非阻塞等待,每隔一段时间就去检测10事件是否就绪(代码轮询)。没有就绪就可以做其他事。非阻塞IO执行系统调用总是立即返回,不管事件是否已经发生,若事件没有发生,则返回-1,此时可以根据errno区分这两种情况,对于accept,recv和send,事件未发生时,errno通常被设置成EAGAIN。
IO复用
Linux用 select/pol/epol函数实现IO复用模型,这些函数也会使进程阻塞,但是和阻塞IO所不同的是这些函数以同时阻塞多个IO操作。而且可以同时对多个读操作、写操作的IO函数进行检测。直到有数据可读或可写时,才真正调用IO操作函数。
信号驱动
Linux 用套接口进行信号驱动IO,安装一个信号处理函数,进程继续运行并不阻塞,当IO事件就绪,进程收到SIGIO信号,然后处理IO事件
第一阶段是异步,第二阶段是同步,通过消息通知机制提高了效率;
异步IO
Linux中,可以调用 aio_read 函数告诉内核描述字缓冲区指针和缓冲区的大小、文件偏移及通知的方式,然后立即返回,当内核将数据拷贝到缓冲区后,再通知应用程序。
Web服务器简介及HTTP协议
一个Web Server就是一个服务器软件,或者运行这个服务器软件的硬件。主要功能是通过HTTP协议与客户端(浏览器)进行通信,接收、存储、处理来自客户端的HTTP请求;
通常用户使用 Web 浏览器与相应服务器进行通信。在浏览器中键入"域名”或P地址:端口号”,浏览器则先将你的域名解析成相应的 P 地址或者直接根据你的IP地址向对应的 Web 服务器发送一个 HTTP 请求。这一过程首先要通过TCP 协议的三次握手建立与目标 Web 服务器的连接,然后 HTTP 协议生成针对目标 Web 服务的 HTTP 请求报文,通过 TCP、IP 等协议发送到目标 Web 服务器上。
HTTP协议(应用层的协议)
超文本传输协议 (Hypertext Transfer Protocol,HTTP) 是一个简单的请求-响应协议,它通常运行在TCP 之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以 ASCI I形式给出;而消息内容则具有一个类似 MIME 的格式。HTTP是万维网的数据通信的基础。(默认端口80)
请求响应步骤
1. 客户端连接Web服务器
2. 发送HTTP请求
3. 服务器接受请求并返回HTTP响应
4. 释放TCP连接
5. 客户端浏览器解析HTML内容
HTTP请求格式
请求方法:GET\HEAD\POST\PUT\DELETE\TRACE\OPTIONS\CONNECT;
HTTP响应格式
服务器编程基本框架和两种高效的事件处理模式
服务器编程基本框架
IO处理单元 - 处理客户连接、读写网络数据
逻辑单元 - 业务进程或线程
网络存储单元 - 数据库、五年间或缓存
请求队列 - 各单元之间的通信方式
两种高效的事件处理模式
服务器程序通常需要处理三类事件:IO事件、信号、定时事件;
两种高效的处理模式
同步IO模式 - Reactor模式
异步IO模式 - Practor模式
Reactor模式
Proactor模式
模拟Proactor模式(项目采用的方法)
线程同步机制类封装及线程池实现
线程池 - 防止无休止的创建/销毁线程
线程池中的线程数最直接的限制因素是CPU的处理器数量;CPU密集型任务最好等于核,IO密集型任务一般多余CPU核心数;不至于在线程处理IO过程中造成CPU空闲,导致浪费;
为什么使用线程池
1. 空间换时间,通过硬件资源换取运行效率;
2. 这组资源在服务器启动之初就完全创建初始化 - 静态资源;
3. 可以直接从池中拿,无需资源动态分配;
4. 处理完一个客户连接后,将相关资源放池中,无需系统调用释放资源;