- 博客(84)
- 资源 (1)
- 收藏
- 关注
原创 分页和mmap
当进程在访问这段地址时,通过查找页表,发现虚拟内存对应的页没有在物理内存中缓存,则产生"缺页",由内核的缺页异常处理程序处理,将文件对应内容,以页为单位(4096)加载到物理内存,注意是只加载缺页,但也会受操作系统一些调度策略影响,加载的比所需的多。因为物理内存是有限的,mmap在写入数据超过物理内存时,操作系统会进行页置换,根据淘汰算法,将需要淘汰的页置换成所需的新页,所以mmap对应的内存是可以被淘汰的(若内存页是"脏"的,则操作系统会先将数据回写磁盘再淘汰)。这个问题可以通过mmap映射很好的解决。
2023-02-12 21:31:01
559
1
原创 Docker 架构和安装
Docker 包括三个基本概念:镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
2023-01-14 18:51:01
528
原创 dpdk mbuf
单 segment 的 mbuf,网卡能够存储的报文大小受限于 dataroom 的大小,而 multi-segmented mbuf 却不存在这一限制,可以用来做报文聚合。这四部分中第一部分用于存储 mbuf 内部的数据结构,第二部分与第四部分的使用由用户控制,第三部分用于存储报文内容。
2022-12-11 22:50:51
386
原创 rte_prefetch(报文处理中的指令预取)
cache的基本操作单位是cache line,如果一个cache line中包含两个不同的数据,那么如果一个线程对其中一个数据进行写操作,那么这个cache line就需要更新,意味着另一个线程需要重新加载另一个数据。所以两个不同的数据不要放在同一个cache line中,这就需要数据定义的时候声明cache对齐,例如cache line的大小是128位(16字节),定义一个8字节的long,剩下8字节使用无用的数据来填充。但是我们在处理本节点时,可以通过CPU指令将下一个节点推送到Cache里。
2022-12-11 19:45:16
1380
原创 [dpdk] Basic Forwarding Sample Application
【代码】[dpdk] Basic Forwarding Sample Application。
2022-10-30 00:22:22
387
原创 Environment Abstraction Layer
The Environment Abstraction Layer (EAL) is responsible for gaining access to low-level resources such as hardware and memory space. It provides a generic interface that hides the environment specifics from the applications and libraries.The core initializa
2022-09-24 23:04:23
290
原创 getopt_long_only函数使用
如果没有设置为NULL,那么它就指向一个变量,这个变量会被赋值为寻找到的长选项在longopts中的索引值,这可以用于错误诊断。,如果该字符串里任一字母后有冒号,那么这个选项就要求有参数。
2022-09-15 19:59:37
415
原创 ntohl()、htonl()、ntohs()、htons()函数
1、大端存储:在计算机中,数据是按照字节存储的,多于一个字节的数据,把高字节部分存储在低地址,把低字节部分存储在高地址,这种方式称为大端存储。例:0x12345678这个数据,我们一般认为左边是高字节部分,右边是低字节部分,那么在采用大端存储的计算机内部的存储则为下面这样低地址: 0x12(高字节)高地址: 0x78(低字节)即一个整型数据的首地址=高位部分(首地址=低地址)2、小端存储:多于一个字节的数据,把高字节部分存储在高地址,把低字节部分存放在低地址。
2022-09-03 13:45:53
419
原创 全局和局部static变量
虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的 值。这两者的区别虽在于非静态全局 变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域, 即只在 定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。把全局变量改变为静态变量 后是改变了它的作用域, 限制了它的使用范围。,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。
2022-09-01 22:01:51
127
原创 __thread作用
不能修饰函数的局部变量或者class的普通成员变量,且__thread变量值只能初始化为编译器常量(值在编译器就可以确定const int i=5,运行期常量是运行初始化后不再改变const int i=rand()).__thread是GCC内置的线程局部存储设施,存取效率可以和全局变量相比。可以用来修饰那些带有全局性且值可能变,但是又不值得用全局变量保护的变量。,因为无法自动调用构造函数和析构函数,
2022-09-01 21:48:41
191
原创 signal() 函数详解
参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。参数2:我们处理的方式(是系统默认还是忽略还是捕获)。
2022-09-01 21:14:58
318
原创 三次握手和队列
内核会为 listen 状态的 socket 维护两个队列:不完全连接请求队列(SYN_RECV)和等待 accept() 建立的队列,就是已完成连接队列(ESTABLISHED);accept函数由TCP服务器调用,用于从已完成连接队列队头返回下一个已完成连接;。...
2022-08-27 22:41:19
612
原创 第十五章 插口层
插口层的主要功能是将进程发送的与协议有关的请求映射到产生插口时指定的与协议有关的实现。下图说明了进程中的插口接口与内核中的协议实现之间的层次关系。
2022-08-27 21:29:40
136
原创 TIPC Getting Started6
The TIPC kernel module is available by default in the major Linux distros. Just do ‘modprobe tipc’and you are ready to run in single node mode.If you want to run in cluster mode you must also give each node a unique identity andattach the interface you w
2022-06-26 19:55:51
214
原创 TIPC Cluster5
TIPC cluster 由通过链路互连的节点组成。节点可以是物理处理器、虚拟机或网络名称空间,例如,以Docker容器的形式。链路构成可靠的分组传输服务,有时称为“L2.5”数据链路层。1、它保证所有数据包的传递和顺序性。2、它充当节点间连接的中继,并跟踪这些连接。3、当与对等节点的所有联系丢失时,将通知与该对等节点有连接的所有套接字,以便它们可以断开连接。4、每个端点在绑定表的本地副本中跟踪对等节点的地址绑定。5、当与对等节点的联系丢失时,将清除来自该对等节点的所有绑定,并向所有匹配的订阅服务器
2022-06-26 19:46:14
98
原创 TIPC Service and Topology Tracking4
1、用户可以订阅全局地址绑定表的内容和更改。2、每次更改时,它们都会收到一个与订阅中指示的范围相匹配的事件。3、绑定/未绑定实例或范围与订阅的范围重叠时存在匹配。4、接收到的事件包含绑定/未绑定套接字的服务地址和套接字地址。1、集群拓扑跟踪是服务跟踪的一种特殊情况,也是基于绑定表内容的2、对等节点可用性(从自己的节点上看)由内置服务类型0表示。3、通过使用内置服务类型2订阅单个链路的可用性,也可以进行群集连接跟踪。4、使用这些机制,并通过连接到其他集群节点的拓扑服务器,用户可以构建和跟踪整个集
2022-06-26 19:33:12
184
原创 TIPC messaging3
MessagingUnicast, anycast or multicast,取决于使用的地址类型、-套接字地址、服务地址或服务范围。如果有多个套接字与给定的服务地址匹配,则以循环方式选择目标。1、可靠的节点间传输。2、接收socket 缓冲过载保护3、没有端到端的流控制,因此消息仍然可能被接收套接字拒绝。4、根据发送套接字的配置,被拒绝的消息可能会被丢弃或返回给发送方。5、如果返回,消息将被截断并带有错误代码。通过使用服务地址或套接字地址建立连接1、使用数据传输信息的单向设置(也称为“0-R
2022-06-26 19:26:24
249
原创 TIPC 寻址2
服务地址总是由作用域指示符(scope indicator)限定的Service Address Binding对于如何绑定服务地址几乎没有任何限制1、不同的服务地址可以绑定到同一套接字2、相同的服务地址可以绑定到不同的套接字3、服务地址范围可以绑定到套接字4、消息总线模式下每个套接字仅提供一个服务地址5、此地址类型也用于发送数据报和通信组组播客户机不需要知道服务器的位置1、从服务地址到套接字地址的转换是在源节点上动态执行的。2、每个节点上都有一个全局绑定表的副本,用于执行此转换。3、
2022-06-26 19:15:08
92
原创 TIPC介绍1
TIPC作为一个内核模块实现,存在于所有主要的Linux发行版中。它可以配置为通过UDP或直接通过以太网传输消息。消息传递是顺序保证、无丢失和流控制的。延迟时间比任何其他已知协议都要短,而最大吞吐量与TCP相当。您是否曾经希望即使在cluster 节点之间传输数据时也能使用Unix Domain 套接字?您自己决定要绑定和使用的地址的位置?您不必执行DNS查找和担心IP地址?您不必启动计时器来监视对等套接字的连续存在?但是如果没有这种套接字类型的缺点,比如延迟inode的风险?欢迎使用透明进程间通信服务,
2022-06-26 18:58:49
2490
原创 有限状态机
有限状态机,是一种抽象的理论模型,它能够把有限个变量描述的状态变化过程,以可构造可验证的方式呈现出来。比如,封闭的有向图。有限状态机可以通过if-else,switch-case和函数指针来实现,从软件工程的角度看,主要是为了封装逻辑。带有状态转移的有限状态机示例代码。 1STATE_MACHINE(){ 2 State cur_State = type_A; 3 while(cur_State != type_C){ 4 Package _pack = getNewP
2022-05-08 21:54:28
574
原创 HTTP报文格式
HTTP报文分为请求报文和响应报文两种,每种报文必须按照特有格式生成,才能被浏览器端识别。其中,浏览器端向服务器发送的为请求报文,服务器处理后返回给浏览器端的为响应报文。1、请求报文HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本。GET说明请求类型为GET,/562f25980001b1b106000338.jpg(URL)为要访问的资源,该行的最后一部分说明使用的是HT
2022-05-08 21:33:02
1594
原创 Linux 线程池类
线程池类定义 1template<typename T> 2class threadpool{ 3 public: 4 //thread_number是线程池中线程的数量 5 //max_requests是请求队列中最多允许的、等待处理的请求的数量 6 //connPool是数据库连接池指针 7 threadpool(connection_pool *connPool, int thread_number = 8, ..
2022-04-30 18:15:26
182
原创 Linux 事件处理模式
作为一个高性能服务器程序通常需要考虑处理三类事件: I/O 事件,定时事件及信号。两种高效的事件处理模型:Reactor 和 Proactor。1、reactor模式主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话立即通知工作线程(逻辑单元 ),读写数据、接受新连接及处理客户请求均在工作线程中完成。通常由同步I/O实现。Reactor是同步IO,同步IO需要线程自己等待内核准备好数据,在内核准备数据的过程中,当前线程是阻塞的,这样就会导致如果某个线程因为读取IO的时间过长(比如
2022-04-30 00:07:27
790
原创 Linux IO模型
阻塞IO:调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的去检查这个函数有没有返回,必须等这个函数返回才能进行下一步动作非阻塞IO:非阻塞等待,每隔一段时间就去检测IO事件是否就绪。没有就绪就可以做其他事。非阻塞I/O执行系统调用总是立即返回,不管时间是否已经发生,若时间没有发生,则返回-1,此时可以根据errno区分这两种情况,对于accept,recv和send,事件未发生时,errno通常被设置成eagain信号驱动IO:linux用套接口进行信号驱动IO,安装一个..
2022-04-29 22:20:35
66
原创 Linux 互斥量
1、互斥量定义互斥锁,也成互斥量,可以保护关键代码段,以确保独占式访问.当进入关键代码段,获得互斥锁将其加锁;离开关键代码段,唤醒等待该互斥锁的线程。2、互斥量操作2.1、pthread_mutex_init函数用于初始化互斥锁2.2、pthread_mutex_destory函数用于销毁互斥锁2.3、pthread_mutex_lock函数以原子操作方式给互斥锁加锁2.4、pthread_mutex_unlock函数以原子操作方式给互斥锁解锁3..
2022-04-27 22:40:54
171
原创 条款4 确定对象被使用前已先被初始化
1、永远在使用对象之前先将它初始化。对于无任何成员的内置类型,你必须手工完成,内置类型以外的任何其他东西,初始化责任落在构造函数身上。规则很简单:确保每一个构造函数都将对象的每一个成员初始化。2、不要混淆了赋值(assignment)和初始化(initialization)对象的成员变量的初始化动作发生在进入构造函数本体之前上面首先调用default构造函数为theName,theAddress和thePhones设初值,然后在函数主体再对它们赋予新值,浪费3、构造函数的一个较佳写法..
2022-04-27 22:17:30
253
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人