- 博客(26)
- 收藏
- 关注
原创 epoll源码剖析
epoll源码剖析本篇博客部分参考 董昊的poll和epoll内核源码剖析,作者博客链接http://donghao.org/uii/剖析的是内核版本为2.6.9上一篇博客通过分析poll的源码,我们发现poll的运行效率有两个瓶颈:1. 当用户传入的fd很多时,由于poll系统调用每次都要把所有struct pollfd拷进内核,所以参数传递和页分配此时就成了poll系统调用的性能瓶颈。2. 当用户传入的fd很多时(比如1000个),对do_pollfd就会调用很多次。所以epoll对这两个问题进行
2020-08-07 01:47:55
305
1
原创 poll源码剖析
Poll源码剖析本篇博客部分参考 董昊的poll和epoll内核源码剖析,作者博客链接http://donghao.org/uii/剖析的是内核版本为2.6.9的poll重要类型定义// 每一个poll系统调用只有一个poll_wqueues,是总的结构,但是对外接口是poll_table pt的地址// 进入此模块后,使用container_of求出poll_wqueues的地址。绝对,面向对象的用法,减少了耦合性struct poll_wqueues { poll_table pt; s
2020-08-04 22:43:21
352
原创 nginx内存池代码移植
文章目录源码移植头文件类型定义辅助函数以及全局变量内存池类源文件创建内存池销毁内存池内存重置函数内存开辟内存释放(大块内存)添加清理回调操作函数小块内存分配分配新的小块内存池大块内存分配测试代码通过对nginx内存池源码的学习,学习到了nginx内存池的精妙处理以及对于代码的运用。由于nginx是通过C语言实现的,本篇文章将使用C++对内存池进行一个简单的封装。源码移植头文件因为本篇博客着...
2020-04-19 18:41:49
583
原创 nginx内存池源码刨析
Nignx内存池nginx内存池是一个设计很巧妙,效率也特别高的内存池,较SGI STL的内存池也有许多的不同,本篇文章将会简单刨析nginx内存池的源码,通过分析nginx内存池的源码,我们也可以明显的看到该内存池与SGI STL内存池的一些区别。源码刨析1. 重要的类型定义1.1 宏定义首先我们需要先认识一些宏定义,下面是一些主要的宏定义:// 可以从内存池中申请的最大的内存大小(...
2020-04-18 22:10:38
546
原创 SGI STL二级空间配置器内存池源码刨析
SGI STL空间配置器介绍SGI STL包含了一级空间配置器和二级空间配置器,其中一级空间配置器allocator采用malloc和free来管理内存,和C++标准库中提供的allocator是一样的,但其二级空间配置器allocator采用了基于freelist自由链表原理的内存池机制实现内存管理。SGI STL的二级空间配置器的内存池主要是给 C++的容器底层进行内存管理的使用。在内存...
2020-04-17 13:20:35
275
原创 Linux项目——仿写bash程序
功能打印提示符信息:[当前用户名@主机名 当前工作目录名] 标识符($ #)获取用户的命令:命令名称 选项 参数对命令做分类:1)内置命令:exit cd2)外置命令:单独的程序,由bash创建的子进程运行/bin下的可执行文件创建子进程:子进程替换用户输入的命令对应的可执行文件源码#include <stdio.h>#include <stdlib.h...
2020-03-07 18:07:14
247
原创 C++——实现一个简单的unordered_map
无序关联容器无序关联容器的底层是一个链式哈希表,包括下列四种:无序关联容器特点unordered_set无序集合,只存储key且不允许重复unordered_multiset无序多重集合,只存储key且允许重复unordered_map无序映射表,存储key-value且不允许重复unordered_multimap无序多重映射表,存储key-va...
2020-03-07 16:08:31
710
原创 I/O复用——epoll
epoll系列函数#include <sys/epoll.h>// 创建内核事件表,记录用户关注的所有文件描述符以及其关注的事件类型,成功返回内核事件表的标识符,失败返回-1int epoll_create(int size); // size现在并不起作用,只是给内核一个提示// 管理内核事件表:添加、删除、修改int epoll_ctl(int epfd, int op...
2020-03-05 00:18:46
130
原创 I/O复用——epoll两种模式的测试代码
LT的服务端测试代码#define _GUN_SOURCE#include <stdio.h>#include <string.h>#include <unistd.h>#include <assert.h>#include <stdlib.h>#include <sys/socket.h>#include ...
2020-03-04 23:42:47
195
原创 I/O复用——poll
poll#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);系统调用成功返回就绪文件描述符的总数,超时返回0,失败返回-1参数含义fdsstruct polled结构类型的数组,它指定所有用户感兴趣的文件描述符上发生的可读、可写和异常等事件nfds指定被...
2020-03-02 20:26:12
146
原创 I/O复用——select(三)
使用select方法实现一个简单的TCP客户端select方法实现的TCP服务器端#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include <unistd.h>#include <sys/types.h>...
2020-03-02 18:43:27
176
原创 I/O复用——select(二)
使用select方法实现一个简单的TCP服务器端在服务器端采用单链表来存储监听套接字和连接套接字,以便再次调用select时方便对readfds进行初始化,在此份代码中将只关注可读事件,且timeout为NULL,即永久堵塞#include <stdio.h>#include <stdlib.h>#include <string.h>#include ...
2020-03-02 18:38:01
134
原创 I/O复用——select(一)
I/O复用TCP编程流程的一些缺陷缺点1:收发效率较低,当客户端发送一次数据后就断开,若再次发送只能重新连接需求:当一个客户端和服务器建立连接,完成整个交互过程(和服务器存在多次的收发数据)之后,再断开连接解决:给recv()/send()处加个死循环,直至数据交互完成退出缺点2:当有多个客户端需要和服务器传输数据时,若正在和服务器通信的客户端不结束,其他的客户端只能在listen()的...
2020-03-01 23:56:58
157
原创 Linux网络编程——实现一个简单的web服务器
本程序实现了一个简单的连接方式为短链接的web服务器,其中html文件存储在/var/www/html下,也可自行设置其他路径#include <stdio.h>#include <string.h>#include <assert.h>#include <unistd.h>#include <stdlib.h>#inclu...
2020-03-01 21:12:36
467
原创 Linux网络编程——HTTP协议详解
HTTP协议的通信过程浏览器与web服务器在应用层通信使用的是http协议,而http协议在传输层使用的是tcp协议,浏览器需要和web服务器三次握手建立连接后,才可以发送http请求报文,服务器收到请求报文后,向浏览器回复http应答报文HTTP请求报头请求方法连接方式短连接(close):请求一次,应答一次,连接断开长连接(keep-alive):多个请求可以共用一个连接...
2020-02-24 15:32:28
404
原创 Linux网络编程——IP协议详解
IP协议的特点无连接:通信双方不需要建立连接,也不需要断开连接,上层协议交付的数据都必须明确指定IP地址不可靠:IP协议不保证数据能够到达接收方,只是承诺会尽最大努力去传递无状态:接受方接收的数据可能是重复的,也有可能是乱序的关于乱序的理解数据传输过程中IP协议只保证IP数据报里面的数据不乱序,而不能保证IP数据报有序IP协议的报头大小:20字节<=报头<=60字节...
2020-02-24 15:11:56
253
原创 Linux网络编程——TCP协议详解(二)
可靠性传输TCP协议的头部结构头部大小:20字节<=头部结构<=60字节名称含义16位源端口号发送程序的端口号16位目的端口号接收程序的端口号32位序号TCP报文段的编号,第一个编号由系统随机生成,后续的编号为前一个编号加上本报文段所携带的数据的第一个字节在整个字节流中的偏移量32位确认号回馈数据时使用,为收到的报文段的序号值加上携...
2020-02-24 14:44:04
234
原创 Linux网络编程——TCP协议详解(一)
TCP的特点:面向连接的、可靠的、字节流服务面向连接的在传输数据之前必须建立连接(三次握手)在传输数据之后必须断开连接(四次挥手)三次握手进行三次握手的意义保证连接能够成功建立通过SYN(同步报文段)告诉对方将要发送的数据的报文段从何开始,从而使得通讯双方能够同步的知道将要发送的报文段的序号四次挥手MSL:报文段在网络中的最大生存时间TIME_WAIT状态存在...
2020-02-24 14:43:28
182
原创 Linux网络编程——UDP协议详解
UDP的特点:无连接的、不可靠的、数据报服务不可靠的UDP的报头结构只能保证数据不失真,不能保证数据的不丢失、乱序等特点:头部小所能携带的数据多、效率较TCP会高一些(算法不复杂)可应用于直播等用UDP实现可靠的传输:将TCP所有的机制在使用UDP协议的应用层实现数据报服务senator的次数和recvfrom的次数是相等的一次sendto对应一个UDP数据报一次...
2020-02-23 22:38:29
150
原创 Linux网络编程——TCP&UDP编程流程(四)
UDP编程实例本例实现的功能和TCP的实例相同,链接:https://blog.csdn.net/weixin_43725202/article/details/104467660服务器端代码#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>...
2020-02-23 21:45:35
90
原创 Linux网络编程——TCP&UDP编程流程(三)
UDP编程流程UDP的服务器端创建 socket套接字 int socket();使用bind方法命令 socket套接字,将服务器端的地址信息与 socket套接字进行绑定接收数据: int recvfrom();发送数据: int sendto();服务器关闭: int closed();UDP的客户端创建 socket套接字 int socket();发送数据...
2020-02-23 21:40:26
169
原创 Linux网络编程——TCP&UDP编程流程(二)
TCP编程实例本例包括两部分代码,分别为客户端和服务器端,主要实现了客服端向服务器端发送数据,服务器端接收并打印的简单功能,以此来展示TCP编程的一个流程服务器端代码#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include &l...
2020-02-23 21:23:57
130
原创 Linux网络编程——TCP&UDP编程流程(一)
TCP和UDP协议的特点TCP协议:面向连接的、可靠的、字节流服务UDP协议:无连接的、不可靠的、数据报服务编程方式:C/S(客户端/服务器)TCP编程流程TCP编程分为客户端和服务器端两个部分TCP服务器端的编程流程1. 创建用于监听的 socket套接字: int socket();2. 命名创建的 socket套接字: int bind();其中包含服务器的地址信息: ...
2020-02-23 21:12:11
354
原创 Linux网络编程——字节序列&socket地址结构
主机字节序列和网络字节序列主机字节序列:大端字节序列、小端字节序列网络字节序列:大端字节序列大端字节序列:数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中小端字节序列:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中以16进制数0x4F3E2D1C为例字节序之间的转化函数#include <netinet/in. h>uint32...
2020-02-23 20:17:02
107
原创 Linux网络编程——网络分层模型
网络分层模型常见的模型有OSI七层模型、TCP/IP四层模型,分层模型是在每一台主机上都有的应用层:为用户的应用程序提供服务传输层:在两个主机之间提供端到端的通信,只关注通信的起始端和目的端,而不关注通信中数据报的传输过程网络层:在不同的网络中,不同的主机之间提供数据报的传输过程控制,实现数据报的选路和转发数据链路层:在两个相邻节点(主机与路由器或者路由器与路由器)之间传输“帧”数据...
2020-02-23 19:52:18
197
原创 Linux网络编程——基础概念
网络的概念网络关于计算机网络的最简单的定义是:一些互相连接的、自治的计算机的集合线路(网络中会用到)双绞线(网线)—> 最大传输距离100米同轴电缆光纤 —> 速度快,但是不能折断设备路由器 —> 网络层,利用IP地址,实现网络与网络之间的数据链接交换机 —> 数据链路层,利用MAC地址,实现网络端口的扩展集线器 —> 数据链路层...
2020-02-23 19:31:33
171
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人