项目介绍
看过陈硕大神的muduo网络库,想借助这个网络库做个项目练练手,加深对网络编程知识的理解。
这是一个采用B/S结构模式的服务器程序,使用线程池+非阻塞IO+IO多路复用的reactor并发模型,通过访问数据库实现在web端注册登录功能,可以请求服务器上的图片,服务器是用的阿里云免费申请的,在网上找了一个压力测试工具,测试可以实现上万的并发连接。
使用到的协议
TCP/IP协议族:
- 数据链路层:ARP协议和RARP协议,实现IP地址和机器物理地址之间的转换。
- 网络层:
IP协议,为上层协议提供无状态、无连接、不可靠的服务
ICMP协议,检测网络连接(使用IP协议提供的服务) - 传输层:
TCP协议,为应用层提供可靠的、面向连接的、基于流的服务;
UDP协议,为应用层提供不可靠的、无连接的、基于数据报的服务;
SCTP协议,使用网络传输电话信号。 - 应用层:
telnet协议,远程登录服务
ssh协议,提供主机与服务器间的加密传输
ftp协议,用于大文件的网络传输
OSPF协议,用于路由器之间的通信
DNS协议:用于查询目标主机的IP地址。
线程池相关
手写线程池
线程的同步机制
1.互斥锁 pthread_mutex_lock
与pthread_mutex_unlock
2.信号量 sem_init
与sem_wait
与sem_post
与sem_destory
3.条件变量 pthread_cond_init
与pthread_cond_wait
与pthread_cond_signal
与pthread_cond_destory
线程池中的工作线程是一直等待吗?
线程池中的工作线程在没有任务时一直处于挂起等待状态,在任务队列有任务后会唤醒一个任务进程进行任务处理。
工作线程处理完一个任务后的状态是什么?
工作线程处理完任务后从任务队列读取任务,若没有任务则处于挂起等待状态。
并发模型
reactor、procator
**reactor模式:**用于同步IO,需要应用程序自己读取或写入数据
**proactor模式:**用于异步IO,需操作系统处理数据读写,
select、poll、epoll区别:
select:
缺点:通过数组存储文件描述符,支持fd数量有限;
每次调用需要将fd从用户态拷贝到内核态,开销大;
内核遍历fd开销大
优点:可移植性好,超时值可以达到微秒。
poll:
缺点: 每次调用需要将fd从用户态拷贝到内核态,开销大;
内核遍历fd开销大
优点:不需要计算最大文件描述符的大小,用链表存储fd;
epoll:
缺点:当所有socket基本都是活跃的,epoll不比poll有效率<