做悬浮导航的网站,高密网站开发,孝感网站建设公司,佛山做外贸网站推广服务器#xff1a;
单循环服务器#xff1a;服务器在同一时刻只能响应一个客户端的请求
并发服务器模型#xff1a;服务器在同一时刻可以响应多个客户端的请求
UDP:无连接 TCP:有连接 1.多进程 资源空间消耗大 效率低 2.多线程 相…服务器
单循环服务器服务器在同一时刻只能响应一个客户端的请求
并发服务器模型服务器在同一时刻可以响应多个客户端的请求
UDP:无连接 TCP:有连接 1.多进程 资源空间消耗大 效率低 2.多线程 相对进程资源消耗小 效率较高 3.IO多路复用 为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术 使进程不阻塞于某个特定的 I/O 系统调用。 优势 系统开销小系统不需要建立新的进程或者线程也不必维护这些线程和进程。 多进程并发服务器 多线程并发服务器
Linux系统IO模型:
1.阻塞IO
scnaf getchar fgets gets read recv recvfrom 1.可以实现多任务同步多个事件相互影响 2.可以节省CPU资源开销,提高执行效率
2.非阻塞IO 1. 获取文件描述符属性 fcntl---------flag 0 2. 为文件描述符添加非阻塞属性 3. 设置文件描述符属性 fcntl 增加非阻塞属性 flag fcntl(0F_GETFL) flag flag | O_NONBLOCK; fcntl(0,F_SETFL,flag); 1.可以访问多个IO事件 2.配合轮询操作浪费CPU资源 3.信号驱动IO 1.实现异步IO操作节省CPU开销 2.只能针对比较少的IO事件 1为IO设备增加信号驱动属性 O_ASYNC 2关联SIGIO信号到对应进程 fcntl(fd, F_SETOWN, getpid()); 3) 注册SIGIO处理函数 signal
4.多路复用IO
select 缺点: 1.select监听文件描述符最大个数为1024 数组 2.select监听的文件描述符集合在用户层,需要应用层和内核层互相传递数据 3.select需要循环遍历一次才能找到产生的事件 4.select只能工作在水平触发模式(低速模式)无法工作在边沿触发模式(高速模式) int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 功能: 监听文件描述符集合 参数: nfds:监测的文件描述符上限值最大文件描述符的值1 readfds:读文件描述符集合 writefds:写文件描述符集合 exceptfds:异常条件的描述符集合 timeout:设置超时时间 NULL:一直等待 返回值: 成功返回产生事件文件描述符个数 失败返回-1 定时时间到达仍没有事件产生返回0 void FD_CLR(int fd, fd_set *set); 将fd从文件描述符集合中清除 int FD_ISSET(int fd, fd_set *set); 判断文件描述符fd是否仍在文件描述符集合中 void FD_SET(int fd, fd_set *set); 将fd加入文件描述符集合中 void FD_ZERO(fd_set *set); 文件描述符集合清0
fcntl
int fcntl(int fd, int cmd, ... /* arg */ ); 功能: 设置文件描述符属性 参数: fd:文件描述符 cmd:F_GETFL 获得文件描述符属性 F_SETFL 设置文件描述符属性 返回值: F_GETFL: 成功返回获得的属性 失败返回-1 F_SETFL 成功返回0 失败返回-1 O_NONBLOCK 非阻塞 O_ASYNC 异步方式 修改IO属性 1获取原有属性 2增加新的属性 3设置新的属性
注意文件属性是直接设置完成的设置完成后就算去掉代码行依旧会保留上一次更改设置。 select内核监听当对应的监听内容触发后执行大大减小了cpu的开支以扩大服务器的容量。 使用select创建一个无进程和线程的io多路复用服务器对多用户进行连接。