Linux高性能服务器编程 高并发服务器
高并发服务器1.多进程并发服务器linux网络编程 | c | 多进程并发服务器实现-CSDN博客 2.多线程并发服务器linux网络编程 | c | 多线程并发服务器实现-CSDN博客 3.多路IO转接服务器1.selectlinux网络编程 | c | select实现IO多路转接服务器-CSDN博客 2.polllinux网络编程 | c | select实现IO多路转接服务器-CSDN博客 3.epolllinux网络编程 | c | epoll实现IO多路转接服务器-CSDN博客 4.libeventLibevent实现TCP客户端服务器-CSDN博客 5.UDPUDP通信-CSDN博客
Linux高性能服务器编程 7. I/O 复用
7. I/O 复用0.前情提要-IO多路转接服务器设计思路1.前情提要I/O 复用使得程序能够同时监听多个文件描述符,从而提高程序的性能。I/O 复用本身是阻塞的。Linux 下实现 I/O 复用的系统调用主要有 select、poll 和 epoll。 IO复用和多路IO复用只是表述上不同,实际上指的是同一个东西。 Reactor 模型基本原理回顾 Reactor 模型是一种事件驱动的设计模式,主要包含事件分离器(Reactor)和事件处理器(Handler)。事件分离器负责监听 I/O 事件,当事件发生时,将事件分发给相应的事件处理器进行处理。、 而本章的select,poll,epoll都是Reactor模型的一种实现方式。 select 是 Reactor 模型的一种实现方式 事件监听机制:select 函数充当事件分离器的角色。它可以同时监听多个文件描述符(包括套接字)的可读、可写和异常事件。程序将需要监听的文件描述符集合传递给 select 函数,select...
Linux高性能服务器编程 8. 信号
8. 信号信号是由用户、系统、进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。Linux信号可由以下条件产生: 对于前台进程,用户可通过输入特殊终端字符来给它发送信号,如输入Ctrl+C通常会给进程发送一个中断信号。 系统异常。如浮点异常或非法内存段访问。 系统状态变化。如alarm定时器到期将引起SIGALRM信号。 运行kill命令或调用kill函数。 服务器程序必须处理(或至少忽略)一些常见信号,以免异常终止。 1.Linux 信号概述0.全部信号1.信号的四要素信号使用前应确定它的四要素 编号 名称 事件 默认处理动作 2.信号的编号kill -l 获取全部信号 SIGHUP本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业,...
Linux高性能服务器编程 9. 定时器
9. 定时器网络程序需要处理定时事件,如定期检测一个客户连接的活动状态。服务器程序通常管理着众多定时事件,有效地组织这些定时事件,使其在预期的时间被触发且不影响服务器的主要逻辑,对于服务器的性能有至关重要的影响。为此,我们要将每个定时事件分别封装成定时器,并使用某种容器类数据结构,如链表、排序链表、时间轮,将所有定时器串联起来,以实现对定时事件的统一管理。本章主要讨论两种高效的管理定时器的容器:时间轮和时间堆。 定时指在一段时间后触发某段代码的机制,我们可以在这段代码中依次处理所有到期的定时器,即定时机制是定时器得以被处理的原动力。Linux提供三种定时方法: socket套接字选项SO_RCVTIMEO和SO_SNDTIMEO; SIGALRM信号; I/O复用系统调用的超时参数。 1.socket 选项 SO_RCVTIMEO 和 SO_SNDTIMEOSO_RCVTIMEO设置 socket 接收数据超时时间。 SO_SNDTIMEO设置 socket 发送数据超时时间。 这两个数据仅对与数据接收和发送相关的 socket 系统调用...
Linux高性能服务器编程 UDP通信
UDP通信1.TCP和UDP通信优缺点 2.UDP的通信流程1.serve和client相对TCP来说, 服务端的accept()和客户端connect()不需要了 recv()和send()只能用于TCP serve端: lfd = socket(AF_INET,SOCK_DGRAM,0) 由SOCK_STREAM 改为了 SOCK_DGRAM bind(lfd,地址结构,地址结构大小) listen() – 可有可无 while(1){ read(cfd,buf,sizeof)–>被替换为–>recvfrom() write()–>被替换为–>sendto() } close() client端: confd = socket(AF_INET,SOCK_DGRAM,0) sendto(服务器的地址结构,地址结构大小) recvfrom()读回新数据 close() 2.recvfrom和sendto1ssize_t recvfrom(int sockfd, void *buf, size_t len, int...
Linux高性能服务器编程 epoll反应堆模型
epoll反应堆模型基于该视频所做笔记,视频里面讲的也挺难的,最好先让chat给你梳理一遍整体的代码再去看视频吧 15-epoll反应堆模型总述_bilibili_哔哩哔哩_bilibili 1.epoll反应堆模型概述核心:epoll ET模式 + 非阻塞IO + 轮询 + void *ptr(回调函数) 一般而言socket也是非阻塞的 就是原来咱们监听到事件比如说读事件的话,就得自己去写read或者recv去读数据, 现在有了ptr,就不用管了,有了读事件程序自己就帮我调了回调函数,我不用自己写了 原来步骤: 1.socket、bind、listen 2.epoll_create 创建监听 红黑树 3.返回 epfd – epo11_ct1()向树上添加一个监听fd 4.while(1) 循环着做下面的事情 5-10 5.epoll_wait 监听 6.对应监听fd有事件产生 7.返回 监听满足数组元素个数 8.判断返回数组元素 9.lfd满足 – Accept 建立连接 10.cfd 满足– read() — 小->大 –...
Linux高性能服务器编程 Linux高性能服务器编程中的TCP带外数据梳理总结
Linux高性能服务器编程中的TCP带外数据梳理总结1.TCP 带外数据总结至此,我们讨论完了 TCP 带外数据相关的所有知识。总结梳理一下: 《Linux 高性能服务器编程》第 3 章 3.8 节 (P50):Linux高性能服务器编程 | 读书笔记 | 2. TCP协议-CSDN博客 《Linux 高性能服务器编程》第 5 章 5.8.1 小节 (P81):Linux高性能服务器编程 | 读书笔记 | 3. Linux网络编程基础API-CSDN博客提到的 recv 和 send 调用,函数传入的参数中的 flags 参数为数据收发提供了额外的控制,其中 MSG_OOB标志的含义即为发送或接收紧急数据。使用 MSG_OOB 选项发送带外数据的代码描述了这一过程。 《Linux 高性能服务器编程》第 9 章 9.1.3 小节 (P148):Linux高性能服务器编程 | 读书笔记 | 7. I/O 复用-CSDN博客,socket上接收到普通数据和带外数据都将使select函数返回,但 socket...
Linux高性能服务器编程 重点注意 read系统调用和传入传出参数
1.read系统调用原型1ssize_t read(int fd, void *buf, size_t count); 参数 int fd:文件描述符,是一个指向要读取文件的指针或引用。通过打开文件或设备获得文件描述符。 void *buf:指向用户提供的缓冲区,该缓冲区用于存储从文件中读取的数据。该缓冲区应足够大,以容纳请求读取的字节数(由count参数指定)。 size_t...
Linux高性能服务器编程 阻塞与非阻塞系列问题
1.阻塞IO和非阻塞IO有啥区别? 概念定义 阻塞 IO(Blocking I/O): 当应用程序发起一个 I/O 操作(如读取文件、接收网络数据等)时,在该操作完成之前,应用程序会被阻塞,即线程暂停执行,等待 I/O 操作的完成。例如,在使用read函数从一个网络套接字读取数据时,如果没有数据可读,线程会一直等待,直到有数据到达并被成功读取。 非阻塞 IO(Non - Blocking I/O): 当应用程序发起一个 I/O 操作时,如果操作不能立即完成(例如读取数据时缓冲区没有数据),函数会立即返回一个错误码(如在 Linux 系统中返回EWOULDBLOCK或EAGAIN),而不是阻塞线程等待操作完成。应用程序可以继续执行其他任务,之后可以通过轮询或者其他异步机制来检查 I/O 操作是否可以继续进行。 工作原理 阻塞...
Linux高性能服务器编程 select实现IO多路转接服务器
select实现IO多路转接服务器基于该视频完成 15-select实现多路IO转接设计思路_哔哩哔哩_bilibili 通过响应式–多路IO转接实现 1.思路&功能**功能:**客户端输入小写字符串,服务器转成大写返回给客户端 思路: allset是用来更新rset的,因为rest是传入传出参数,allset是记录传出的rest的,因为rest传出以后,监听列表就变了,可能不会原来的了 2.代码实现warp.h12345678910111213141516171819202122232425262728293031323334353637383940414243#ifndef __WRAP_H_#define...