
Linux高性能服务器编程
文章平均质量分 93
吃着火锅x唱着歌
这个作者很懒,什么都没留下…
展开
-
Linux高性能服务器编程 学习笔记 第十七章 系统监测工具
在4.0及之前的版本中,默认的抓包长度是68字节,这对于IP、TCP、UDP等协议时足够的,但对于DNS、NFS等协议,68字节通常不能容纳一个完整的数据包。对于其他类型参数的输出方式,可参考strace的man手册。netstat可以打印本地网卡接口上的全部连接、路由表信息、网卡接口信息等,本书主要使用上述功能中的第一个,即显示TCP连接及其状态信息,毕竟,要想获得路由表信息和网卡接口信息,我们可以使用输出内容更丰富的route(管理和显示系统的网络路由表的命令)和ifconfig命令。原创 2023-10-18 18:29:21 · 340 阅读 · 0 评论 -
Linux高性能服务器编程 学习笔记 第十六章 服务器调制、调试和测试
压力测试程序有很多种实现方式,如IO复用方式、多线程(进程)并发编程方式,以及这些方式的结合使用,但单纯的IO复用方式的施压程度是最高的,因为线程和进程的调度本身也要占用一定CPU时间(作者此处认为单线程、单进程的压力测试程序施压程度最高,但单线程、单进程只能同时使用CPU的一个核心,而多线程或多进程情况下可以使用CPU的多个核心,为什么多核心同时施压比单核心施压程度高呢?1.单独调试子进程。gdb会为每个线程分配一个ID,我们可使用这个ID来操作对应的线程,ID前面有*的线程是当前被调试的线程。原创 2023-10-17 17:28:22 · 746 阅读 · 0 评论 -
Linux高性能服务器编程 学习笔记 第十五章 进程池和线程池
我们接下来实现上图所示的半同步/半反应堆模式的线程池,相比以上进程池的实现,该线程池的通用性要高得多,因为它使用一个工作队列完全解除了主线程和工作线程的耦合关系:主线程往工作队列插入任务,工作线程通过竞争来取得任务并执行它。2.主进程和所有子进程通过一个共享的工作队列来同步,子进程都睡眠在该工作队列上,当有新任务到来时,主进程将任务添加到工作队列中,这将唤醒正在等待任务的子进程,但只有一个子进程能获得新任务的接管权,它可以从工作队列中取出任务并执行之,而其他子进程将继续睡眠在工作队列上。原创 2023-10-16 18:46:15 · 377 阅读 · 0 评论 -
Linux高性能服务器编程 学习笔记 第十四章 多线程编程
以上代码中,主线程试图先占有互斥锁mutex_a,然后操作被该锁保护的变量a,但操作完毕后,主线程没有释放互斥锁mutex_a,而是又申请了互斥锁mutex_b,并在两个互斥锁的保护下,操作变量a和b,最后才一起释放这两个互斥锁,与此同时,子线程则按相反的顺序来申请互斥锁mutex_a和mutex_b,并在两个锁的保护下操作变量a和b。完全由内核调度的模式将创建、调度线程的任务交给了内核,运行在用户空间的线程库无须执行管理任务,这与完全在用户空间实现的线程恰恰相反,因此二者的优缺点也正好互换。原创 2023-10-13 16:12:56 · 683 阅读 · 0 评论 -
Linux高性能服务器编程 学习笔记 第十三章 多进程编程
waitpid函数的stat_loc参数的含义和wait函数的stat_loc参数的相同。semget的调用者可以给其key参数传递一个特殊键值IPC_PRIVATE(其值为0),这样无论该信号量是否已存在,semget函数都将创建一个新信号量,使用该键值创建的信号量并非像它的名字声称的那样是进程私有的,其他进程,尤其是子进程,也有方法来访问这个信号量,所以semget函数的man手册的BUGS部分上说,使用名字IPC_PRIVATE有些误导(历史原因),应称为IPC_NEW。原创 2023-10-12 15:37:26 · 268 阅读 · 0 评论 -
Linux高性能服务器编程 学习笔记 第十一章 定时器
最小堆的删除操作指的是删除其根节点上的元素,且不破坏堆序性质,执行删除操作时,我们需要先在根节点处创建一个空穴,由于堆现在少了一个元素,因此我们把堆的最后一个元素X移动到该堆的某个地方,如果X可以被放入空穴(当前是根节点),则删除操作完成,否则执行下虑操作,即交换空穴和它的两个子节点中较小者,不断进行该过程,直到X可以被放入空穴。从执行效率来看,如果链表中有n个定时器,则添加定时器的时间复杂度是O(n),删除定时器的时间复杂度是O(1),执行定时任务的时间复杂度平均是O(1)。原创 2023-10-07 22:02:26 · 1140 阅读 · 0 评论 -
Linux高性能服务器编程 学习笔记 第十二章 高性能IO框架库Libevent
所有具有相同信号值的信号事件处理器通过ev.ev_signal.ev_signal_next成员串联成一个尾队列,我们称之为信号事件队列,ev.ev_signal.ev_ncalls成员指定信号事件发生时,Reactor需要执行多少次该事件对应的事件处理器中的回调函数,ev.ev_signal.ev_pncalls指针成员要么是NULL,要么指向ev.ev_signal.ev_ncalls。所有已经注册的事件处理器(包括IO事件处理器和信号事件处理器)通过该成员串联成一个尾队列,我们称之为注册事件队列。原创 2023-10-10 00:32:43 · 289 阅读 · 0 评论 -
Linux高性能服务器编程 学习笔记 第十章 信号
Linux定义的信号值都大于0,如果sig参数传为0,则kill函数不发送任何信号,此时可用来检测目标进程或进程组是否存在,因为检查工作总是在信号发送前执行,但这种检测方式不可靠,一方面是由于PID的回绕,导致被检测的PID不是我们期望的进程的PID,另一方面,这种检测方法不是原子操作(检测完进程可能就终止了)。设置进程信号掩码后,被屏蔽的信号不能被进程接收,如果给进程发送一个被屏蔽的信号,则操作系统将该信号设置为进程的一个被挂起的信号,如果我们取消对被挂起信号的屏蔽,则它立即能被进程接收到。原创 2023-10-04 22:38:08 · 538 阅读 · 0 评论 -
Linux高性能服务器编程 学习笔记 第九章 IO复用
IO复用使程序能同时监听多个文件描述符,这可以提高程序的性能,通常网络程序在以下情况需要使用IO复用:1.客户端进程需要同时处理多个socket。2.客户端进程需要同时处理用户输入和网络连接。3.TCP服务器要同时处理监听socket和连接socket。4.服务器要同时处理TCP请求和UDP请求。5.服务器要同时监听多个端口,或处理多种服务,如xinetd服务器。IO复用能同时监听多个文件描述符,但它本身是阻塞的,且当多个文件描述符同时就绪时,如果不采取额外措施,进程只能按顺序依次处理其中的每个原创 2023-10-01 01:04:55 · 411 阅读 · 1 评论 -
Linux高性能服务器编程 学习笔记 第八章 高性能服务器程序框架
TCP/IP协议在设计和实现上没有客户端和服务器的概念,在通信过程中所有机器都是对等的。但由于资源(视频、新闻、软件等)被数据提供者所垄断,所以几乎所有网络应用程序都采用了下图所示的C/S(客户端/服务器)模型,所有客户端都通过访问服务器来获取所需资源:采用C/S模型的TCP服务器和客户端的工作流程:C/S模型中,服务器启动后,首先创建一个或多个监听socket,并调用bind将其绑定到服务器感兴趣的端口上,然后调用listen等待客户连接,之后客户端就可以调用connect向服务器发起连接了。由于原创 2023-09-26 15:05:52 · 348 阅读 · 1 评论 -
Linux高性能服务器编程 学习笔记 第七章 Linux服务器程序规范
rsyslogd的主配置文件是/etc/rsyslog.conf,其中主要可以设置的内容包括:内核日志输入路径(接收来自操作系统内核的日志消息的路径),是否接收UDP日志及其监听端口(默认为514,见/etc/services文件),是否接收TCP日志及其监听端口,日志文件的权限,包含哪些子配置文件(如/etc/rsyslog.d/*.conf)。Linux上运行的程序会受到资源限制的影响,如物理设备限制(CPU、内存等)、系统策略限制(CPU时间等)、具体实现的限制(文件名的最大长度等)。原创 2023-09-23 17:29:09 · 171 阅读 · 0 评论 -
Linux高性能服务器编程 学习笔记 第六章 高级IO函数
反之,如果管道的读端文件描述符fd[0]的引用计数减少至0,即没有任何进程需要从管道读取数据,则针对该管道的写端文件描述符fd[1]的write操作将失败,并引发SIGPIPE信号。fd_in参数是待输入数据的文件描述符,如果fd_in是一个管道文件描述符,那么off_in参数必须被设置为NULL,否则,off_in参数表示从输入数据流的何处开始读取数据,此时,若off_in被设置为NULL,则表示从输入数据流的当前偏移位置读入,若off_in不为NULL,则它指出具体的偏移位置。原创 2023-09-22 15:31:11 · 313 阅读 · 1 评论 -
Linux高性能服务器编程 学习笔记 第五章 Linux网络编程基础API
我们将从以下3方面讨论Linux网络API:1.socket地址API。socket最开始的含义是一个IP地址和端口对(ip,port),它唯一表示了使用TCP通信的一端,本书称其为socket地址。2.socket基础API。socket的主要API都定义在sys/socket.h头文件中,包括创建socket、命名socket、监听socket、接受连接、发起连接、读写数据、获取地址信息、检测带外标记、读取和设置socket选项。3.网络信息API。Linux提供了一套网络信息API,以实现主机名原创 2023-09-21 11:42:04 · 293 阅读 · 0 评论 -
Linux高性能服务器编程 学习笔记 第四章 TCP/IP通信案例:访问Internet上的Web服务器
在旧的HTTP协议中,Web客户端和Web服务器之间的一个TCP连接只能为一个HTTP请求服务,当处理完客户的一个HTTP请求后,Web服务器就主动将TCP连接关闭了,此后,同一客户如果再发送一个HTTP请求,就必须与服务器建立一个新的TCP连接,即同一个客户的多个连续的HTTP请求不能共用一个TCP连接,这称为短连接。由上图,TCP连接从建立到关闭的过程中,客户端仅给服务器发送了一个HTTP请求(报文段4),该请求长为136字节(见代码清单4-2中报文段4的length值)。配置了HTTP访问规则。原创 2023-09-17 19:31:31 · 728 阅读 · 0 评论 -
Linux高性能服务器编程 学习笔记 第三章 TCP协议详解
与IP协议相比,TCP协议更靠近应用层,因此在应用程序中有更强的可操作性。一些重要的socket选项都和TCP协议相关。本章从以下方面讨论TCP协议:1.TCP头部信息。TCP头部信息出现在每个TCP报文段中,用于指定通信的源端端口号、目的端端口号,管理TCP连接,控制两个方向的数据流。2.TCP状态转移过程。TCP连接的任意一端都是一个状态机,在TCP连接从建立到断开的过程中,连接两端的状态机将经历不同的状态变迁。3.TCP数据流。有两种TCP数据流:交互数据流和成块数据流。TCP数据流中有一种特原创 2023-09-15 21:25:46 · 480 阅读 · 0 评论 -
Linux高性能服务器编程 学习笔记 第二章 IP协议详解
无状态(stateless)指所有IP数据报的发送、传输、接收都是相互独立、没有上下文关系的,这种服务的缺点是无法处理乱序和重复的IP数据报,如发送端发送出的第N个IP数据报可能比第N+1个IP数据报后到达接收端,而相同源地址和目的地址的IP数据报也可能经过不同路径到达接收端,也会出现同一个IP数据报多次到达接收端(正常情况下,同一个IP数据报不会多次到达接收端,只有在网络故障的情况下才会出现),这样接收端的IP模块无法检测到乱序和重复,因为这些IP数据报之间没有任何上下文关系。原创 2023-09-11 18:42:20 · 429 阅读 · 0 评论 -
Linux高性能服务器编程 学习笔记 第一章 TCP/IP协议族
WAN(Wide Area Network,广域网)通常使用众多分级的路由器来连接分散的主机或LAN(Local Area Network,局域网),因此,通信的两台主机一般不是直接相连的,而是通过多个中间节点(路由器)连接的。同时,网络层对上层隐藏了网络拓扑连接的细节,使得在传输层和网络应用程序看来,通信的双方是直接连接的。以以太网帧为例,它使用2字节的类型字段来标识上层协议,如果主机接收到的以太网帧的类型字段的值为0x800,则帧的数据部分为IP数据报,于是以太网驱动程序就将帧交付给IP模块;原创 2023-09-09 21:53:09 · 565 阅读 · 1 评论