1 buffer.cpp
/* 分散读, 保证数据全部读完 */
//正常情况下往buffer里面读,buffer读满了,就会往临时数组buff[65535]里面读
举例:
已写入0~3,4个数据,剩余1020个位置,本次写入长度为1021个;
超出长度为本次写入长度1021 - 可写长度1020 = 1 ;
那么就在buff中写入超出的一个数据
2 有限状态机
逻辑单元内部的一种高效编程方法:有限状态机 (finite state machine)。
有的应用层协议头部包含数据包类型字段,每种类型可以映射为逻辑单元的一种执行状态,服务器可以根据它来编写相应的处理逻辑。如下是一种状态独立的有限状态机:
STATE_MACHINE( Package _pack ){
PackageType -type = _pack.cetType( ;switch( _type )
{
case type_A:
process_package_A( _pack );break;
case type_B:
process_package_B( _pack );break;
}
}
这是一个简单的有限状态机,只不过该状态机的每个状态都是相互独立的,即状态之间没有相互转移。状态之间的转移是需要状态机内部驱动,如下代码:
STATE_MACHINE()
{
state cur_state = type_A;while( cur_state != type_c )
{
Package _pack = getNewPackage(;switch( cur_state )
{
case type_A:
process_package_state_A( _pack );
cur_state = type_B;//状态A执行完毕,当前状态更新为B
break;
case type_B:
process_package_state_B( _pack );cur_state = type_c;
break;
}
}
}
该状态机包含三种状态: type_A. type_B和type_C,其中 type_A是状态机的开始状态,type_C是状态机的结束状态。状态机的当前状态记录在cur_State变量中。在一趟循环过程中,状态机先通过getNewPackage方法获得一个新的数据包,然后根据cur_State变量的值判断如何处理该数据包。数据包处理完之后,状态机通过给cur_State变量传递目标状态值来实现状态转移。那么当状态机进入下一趟循环时它将执行新的状态对应的逻辑。
3 EPOLLONESHOT事件
即使可以使用ET模式,一个socket上的某个事件还是可能被触发多次。这在并发程序中就会引起一个问题。比如一个线程在读取完某个socket 上的数据后开始处理这些数据,而在数据的处理过程中该socket上又有新数据可读(EPOLLIN再次被触发),此时另外一个线程被唤醒来读取这些新的数据。于是就出现了两个线程同时操作一个socket的局面。一个socket连接在任一时刻都只被一个线程处理,可以使用epoll的EPOLLONESHOT事件实现。
对于注册了EPOLLONESHOT事件的文件描述符,操作系统最多触发其上注册的一个可读、可写或者异常事件,且只触发一次,除非我们使用epol_ctl函数重置该文件描述符上注册的EPOLLONESHOT事件。这样,自H个斑程在处理某个socket时,其他线程是不可能有机会操作该socket的。但反过来思考,注册了EPOLLONESHOT事件的socket一旦被某个线程处理完毕,该线程就应该立即重置这个socket 上的EPOLLONESHOT事件,以确保这个socket下一次可读时,其EPOLLIN事件能被触发,进而让其他工作线程有机会继续处理这个socket。
4 运行
进入Webserver-master目录make编译
make
开启服务器
./bin/server
5.服务器压力测试
Webbench是Linux上一款知名的、优秀的web性能压力测试工具。它是由Lionbridge公司开发。
- 测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。
- 展示服务器的两项内容:每秒钟响应请求数和每秒钟传输数据量。
基本原理: Webbench首先 fork出多个子进程,每个子进程都循环做web访问测试。子进程把访问的结果通过pipe告诉父进程,父进程做最终的统计结果。
测试示例
webbench -c 1000 -t 30 http://192.168.110.129:10000/index.htm1
参数:
-c 表示客户端数(子进程数)
-t 表示时间
进入Webserver-master目录下的webbench-1.5压力测目录下;
make编译测试文件
./webbench -c 5000 -t 5 http://192.168.37.128:1316/
因为测试文件就在当前目录下,最后斜杠就行了;
5000个客户端测试5秒,结果如下
11.GET请求和POST请求的区别