轻量级Linux服务器
webserver
ziggy7
这个作者很懒,什么都没留下…
展开
-
线程池web服务器(8) 日志系统(条件变量,单例模式,阻塞队列)
整体概述本项目中,使用单例模式创建日志系统,对服务器运行状态、错误信息和访问数据进行记录,该系统可以实现按天分类,超行分类功能,可以根据实际情况分别使用同步和异步写入两种方式。其中异步写入方式,将生产者-消费者模型封装为阻塞队列,创建一个写线程,工作线程将要写的内容push进队列,写线程从队列中取出内容,写入日志文件。日志系统大致可以分成两部分,其一是单例模式与阻塞队列的定义,其二是日志类的定义与使用。基础知识●日志,由服务器自动创建,并记录运行状态,错误信息,访问数据的文件。●同步日志,日志写原创 2020-06-22 15:13:57 · 1635 阅读 · 0 评论 -
线程池web服务器(7) webbench压测
一个服务器项目,你在本地浏览器键入localhost:9000发现可以运行无异常还不够,你需要对他进行压测,压测过了,才说明你的服务器比较稳定了。社长的项目是如何压测的呢?用到了一个压测软件叫做Webbench,可以直接在社长的Gtihub里面下载,解压,然后在解压目录打开终端运行命令(-c表示客户端数, -t表示时间):./webbench -c 10001 -t 5 http://127.0.0.1:9006/ 直接解压的webbench-1.5文件夹下的webbench文件可能会因为权限问题原创 2020-06-17 11:28:22 · 377 阅读 · 0 评论 -
线程池web服务器(4) http_conn请求类
HTTP报文格式 HTTP报文分为请求报文和响应报文两种,每种报文必须按照特有格式生成,才能被浏览器端识别。 其中,浏览器端向服务器发送的为请求报文,服务器处理后返回给浏览器端的为响应报文。请求报文 HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。其中,请求分为两种,GET和POST,具体的:●GET GET /562f25980001b1b106000338.jpg HTTP/1.1 Host:img.mukewang.原创 2020-06-16 17:45:03 · 1959 阅读 · 2 评论 -
线程池web服务器(3) 半同步/半反应堆线程池实现
基础知识线程池●空间换时间,浪费服务器的硬件资源,换取运行效率.●池是一组资源的集合,这组资源在服务器启动之初就被完全创建好并初始化,这称为静态资源.●当服务器进入正式运行阶段,开始处理客户请求的时候,如果它需要相关的资源,可以直接从池中获取,无需动态分配.●当服务器处理完一个客户连接后,可以把相关的资源放回池中,无需执行系统调用释放资源.静态成员变量 概念:将类成员变量声明为static,则为静态成员变量,与一般的成员变量不同,无论建立多少对象,都只有一个静态成员变量的拷贝,静态成员变量属于原创 2020-06-09 18:04:31 · 464 阅读 · 0 评论 -
线程池web服务器(2) 线程同步机制封装类
#ifndef LOCKER_H#define LOCKER_H#include <exception>#include <pthread.h>#include <semaphore.h>using namespace std;class sem{public: /*创建并初始化信号量*/ sem(){ if(sem_init(&m_sem, 0, 0)!= 0) //信号量初始化为0 t原创 2020-06-09 17:29:54 · 352 阅读 · 0 评论 -
线程池web服务器 EPOLL相关函数、事件、错误
EPOLL过程1、添加监听事件void addfd( int epollfd, int fd, bool one_shot ){ epoll_event event; //1 event.data.fd = fd; //2 event.events = EPOLLIN | EPOLLET | EPOLLRDHUP; //3 epoll_ctl( epollfd, EPOLL_CTL_ADD, fd, &event );//4 setnonblocking原创 2020-06-09 16:32:38 · 393 阅读 · 0 评论 -
线程池web服务器(5) 定时器
基础知识●非活跃:是指客户端(这里是浏览器)与服务器端建立连接后,长时间不交换数据,一直占用服务器端的文件描述符,导致连接资源的浪费。●定时事件:是指固定一段时间之后触发某段代码,由该段代码处理一个事件,如从内核事件表删除事件,并关闭文件描述符,释放连接资源。●定时器:是指利用结构体或其他形式,将多种定时事件进行封装起来。具体的,这里只涉及一种定时事件,即定期检测非活跃连接,这里将该定时事件与连接资源封装为一个结构体定时器。●定时器容器:是指使用某种容器类数据结构,将上述多个定时器组合起来,便于对定原创 2020-06-09 16:32:24 · 834 阅读 · 0 评论 -
线程池web服务器 信号统一事件源
原因 Linux下的信号采用的异步处理机制,信号处理函数和当前进程是两条不同的执行路线。具体的,当进程收到信号时,操作系统会中断进程当前的正常流程,转而进入信号处理函数执行操作,完成后再返回中断的地方继续执行。 为避免信号竞态现象发生,信号处理期间系统不会再次触发它。所以,为确保该信号不被屏蔽太久,信号处理函数需要尽可能快地执行完毕。 一般的信号处理函数需要处理该信号对应的逻辑,当该逻辑比较复杂时,信号处理函数执行时间过长,会导致信号屏蔽太久。 这里的解决方案是,信号处理函数仅仅发送信号通知程序主循原创 2020-06-08 12:56:01 · 332 阅读 · 0 评论 -
线程池web服务器 信号
sigaction结构体1 struct sigaction {2 void (*sa_handler)(int);3 void (*sa_sigaction)(int, siginfo_t *, void *);4 sigset_t sa_mask;5 int sa_flags;6 void (*sa_restorer)(void);7 }●sa_handler是一个函数指针,指向信号处理函数●sa_sigaction同样是信号处理函数,有三个参数,可以原创 2020-06-08 11:38:34 · 250 阅读 · 0 评论 -
线程池web服务器(1) 总体思路
主线程:1、调用线程池构造函数创建8个线程2、调用http_conn构造函数创建名为users的http_conn[ MAX_FD ],为每个可能的客户分配一个http_conn对象即users[connfd]3、建立listenfd并将listenfd加入epollfd4、进入循环,等待事件,通过返回的number来遍历事件●if 事件id==listenfd,接受连接返回connfd,为connfd调用init()初始化http_conn对象,init()初始化http_conn内的变量,并将原创 2020-06-09 16:32:08 · 910 阅读 · 0 评论
分享