![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
网络编程
文章平均质量分 60
云端漫步的程狗子
这个作者很懒,什么都没留下…
展开
-
分页和mmap
当进程在访问这段地址时,通过查找页表,发现虚拟内存对应的页没有在物理内存中缓存,则产生"缺页",由内核的缺页异常处理程序处理,将文件对应内容,以页为单位(4096)加载到物理内存,注意是只加载缺页,但也会受操作系统一些调度策略影响,加载的比所需的多。因为物理内存是有限的,mmap在写入数据超过物理内存时,操作系统会进行页置换,根据淘汰算法,将需要淘汰的页置换成所需的新页,所以mmap对应的内存是可以被淘汰的(若内存页是"脏"的,则操作系统会先将数据回写磁盘再淘汰)。这个问题可以通过mmap映射很好的解决。原创 2023-02-12 21:31:01 · 542 阅读 · 1 评论 -
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 · 1313 阅读 · 0 评论 -
Poll Mode Driver
Poll Mode Driver原创 2022-10-05 09:49:02 · 326 阅读 · 0 评论 -
Mbuf Library
mbuf原创 2022-10-05 08:08:05 · 324 阅读 · 0 评论 -
Mempool Library
Mempool Library原创 2022-09-29 21:26:22 · 255 阅读 · 0 评论 -
Ring Library
Ring Library原创 2022-09-26 22:22:16 · 233 阅读 · 0 评论 -
RCU Library
RCU Library原创 2022-09-25 22:31:43 · 301 阅读 · 0 评论 -
getopt_long_only函数使用
如果没有设置为NULL,那么它就指向一个变量,这个变量会被赋值为寻找到的长选项在longopts中的索引值,这可以用于错误诊断。,如果该字符串里任一字母后有冒号,那么这个选项就要求有参数。原创 2022-09-15 19:59:37 · 400 阅读 · 0 评论 -
ubuntu dpdk-19.11.10和dperf安装
【代码】ubuntu dpdk-19.11.10和dperf安装。原创 2022-09-04 23:44:14 · 755 阅读 · 1 评论 -
ntohl()、htonl()、ntohs()、htons()函数
1、大端存储:在计算机中,数据是按照字节存储的,多于一个字节的数据,把高字节部分存储在低地址,把低字节部分存储在高地址,这种方式称为大端存储。例:0x12345678这个数据,我们一般认为左边是高字节部分,右边是低字节部分,那么在采用大端存储的计算机内部的存储则为下面这样低地址: 0x12(高字节)高地址: 0x78(低字节)即一个整型数据的首地址=高位部分(首地址=低地址)2、小端存储:多于一个字节的数据,把高字节部分存储在高地址,把低字节部分存放在低地址。原创 2022-09-03 13:45:53 · 392 阅读 · 0 评论 -
__thread作用
不能修饰函数的局部变量或者class的普通成员变量,且__thread变量值只能初始化为编译器常量(值在编译器就可以确定const int i=5,运行期常量是运行初始化后不再改变const int i=rand()).__thread是GCC内置的线程局部存储设施,存取效率可以和全局变量相比。可以用来修饰那些带有全局性且值可能变,但是又不值得用全局变量保护的变量。,因为无法自动调用构造函数和析构函数,原创 2022-09-01 21:48:41 · 183 阅读 · 0 评论 -
signal() 函数详解
参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。参数2:我们处理的方式(是系统默认还是忽略还是捕获)。原创 2022-09-01 21:14:58 · 309 阅读 · 0 评论 -
三次握手和队列
内核会为 listen 状态的 socket 维护两个队列:不完全连接请求队列(SYN_RECV)和等待 accept() 建立的队列,就是已完成连接队列(ESTABLISHED);accept函数由TCP服务器调用,用于从已完成连接队列队头返回下一个已完成连接;。...原创 2022-08-27 22:41:19 · 605 阅读 · 0 评论 -
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 · 175 阅读 · 0 评论 -
Linux 事件处理模式
作为一个高性能服务器程序通常需要考虑处理三类事件: I/O 事件,定时事件及信号。两种高效的事件处理模型:Reactor 和 Proactor。1、reactor模式主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话立即通知工作线程(逻辑单元 ),读写数据、接受新连接及处理客户请求均在工作线程中完成。通常由同步I/O实现。Reactor是同步IO,同步IO需要线程自己等待内核准备好数据,在内核准备数据的过程中,当前线程是阻塞的,这样就会导致如果某个线程因为读取IO的时间过长(比如原创 2022-04-30 00:07:27 · 772 阅读 · 0 评论 -
Linux IO模型
阻塞IO:调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的去检查这个函数有没有返回,必须等这个函数返回才能进行下一步动作非阻塞IO:非阻塞等待,每隔一段时间就去检测IO事件是否就绪。没有就绪就可以做其他事。非阻塞I/O执行系统调用总是立即返回,不管时间是否已经发生,若时间没有发生,则返回-1,此时可以根据errno区分这两种情况,对于accept,recv和send,事件未发生时,errno通常被设置成eagain信号驱动IO:linux用套接口进行信号驱动IO,安装一个..原创 2022-04-29 22:20:35 · 57 阅读 · 0 评论 -
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 · 165 阅读 · 0 评论 -
Linux 信号量
1、信号量定义信号量的取值可以是任何自然数,可用于实现多线程和多进程之间的临界资源访问安全和合理性,最常用的,最简单的信号量是二进制信号量,只有0和1两个值;信号量只能取自然数值并且只支持两种操作:等待§和信号(V).假设有信号量SV,对其的P、V操作如下:P,如果SV的值大于0,则将其减一;若SV的值为0,则挂起执行V,如果有其他进行因为等待SV而挂起,则唤醒;若没有,则将SV值加一资源计数>0;表示操作可行,可以对临界资源进行访问;直接返回,且资源计数-1;资源<=0;表..原创 2022-04-23 22:40:35 · 466 阅读 · 0 评论 -
线程池实现
#ifndef ILOVERS_THREAD_POOL_H#define ILOVERS_THREAD_POOL_H #include <iostream>#include <functional>#include <thread>#include <condition_variable>#include <future>#include <atomic>#include <vector>#include原创 2022-04-18 14:11:47 · 780 阅读 · 0 评论