02 2020 档案
摘要:1 #include <vnet/plugin/plugin.h> 2 #include <ck_sample/ck_sample.h> 3 4 ck_sample_main_t ck_sample_main; 5 6 7 int ck_sample_enable_disable(u32 sw_if
阅读全文
摘要:节点类型作用: VLIB_NODE_TYPE_INTERNAL 内部节点,最典型的节点接收缓冲向量,执行操作。vpp大部分节点是这个角色,主要对数据流做内部处理,比如ip4-input-no-checksum/ip4-icmp-input等内部功能节点 VLIB_NODE_TYPE_INPUT 输入
阅读全文
摘要:一、linux的内存布局 1、32位模式下内存的经典布局 图1 32位模式下内存经典布局 注:这种内存布局模式是linux内核2.6.7以前的默认内存布局形式 说明: (1)在32的机器上,loader将可执行文件的各个段次依次载入到从0x80048000(128M)位置开始的空间中。程序能够
阅读全文
摘要:FD.io项目介绍 FD.io(Fast data - Input/Output)是Linux基金会旗下的又一开源项目,其成立于2016年2月11日。该项目在通用硬件平台上提供了具有灵活性、可扩展、组件化等特点的高性能IO服务框架,用以迎接下一个网络和存储浪潮。该框架支持高吞吐量、低延迟、高资源利用
阅读全文
摘要:设备驱动层 当一些网络包到来触发了中断,内核处理完这些网络包之后,我们可以先进入主动轮询 poll 网卡的方式,主动去接收到来的网络包。如果一直有,就一直处理,等处理告一段落,就返回干其他的事情。当再有下一批网络包到来的时候,再中断,再轮询 poll。这样就会大大减少中断的数量,提升网络处理的效率,
阅读全文
摘要:解析 socket 函数 SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) { int retval; struct socket *sock; int flags; ...... if (SOCK_NONBLOCK !=
阅读全文
摘要:schedule 函数的调用过程 asmlinkage __visible void __sched schedule(void) { struct task_struct *tsk = current; sched_submit_work(tsk); do { preempt_disable();
阅读全文
摘要:抢占式调度 两种情况: 执行太久, 需切换到另一进程; 高优先级进程被唤醒 切换到另一进程实现: 时钟中断处理函数会调用 scheduler_tick()查看是否是需要抢占的时间点 void scheduler_tick(void) { int cpu = smp_processor_id(); s
阅读全文
摘要:调度策略与调度类 进程分为实时进程和普通进程,分别对应实时调度策略和普通调度策略 在 task_struct 中,有一个成员变量,我们叫调度策略 unsigned int policy; 它有以下几个定义: #define SCHED_NORMAL 0 #define SCHED_FIFO 1 #d
阅读全文
摘要:信号概述 在 Linux 操作系统中,为了响应各种各样的事件,也是定义了非常多的信号 # kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10)
阅读全文
摘要:Linux/Unix进程创建相关基本知识 linux中的0号、1号进程 1. 进程0 Linux引导中创建的第一个进程,完成加载系统后,演变为进程调度、交换及存储管理进程(也就是说0号进程自从创建完1号进程后就不会再次去创建其他进程了,之后由1号进程负责新子进程的创建) Linux中1号进程是由0号
阅读全文
摘要:如何理解“跳表”? 对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,是 O(n)。 那怎么来提高查找效率呢?如果像图中那样,对链表建立一级“索引”,查找起来是不是就会更快一些呢? 每两个结点提取一个结点
阅读全文
摘要:本文以32位机器为准,串讲一些内存管理的知识点 1. 虚拟地址、物理地址、逻辑地址、线性地址 虚拟地址又叫线性地址。linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻辑地址专指下文说的线性偏移前的地址)是一个概念。物理地址自不必提。内核的虚拟地址和物理地址,大部分只差
阅读全文
摘要:理解指针或引用的含义 含义: 将某个变量(对象)赋值给指针(引用),实际上就是就是将这个变量(对象)的地址赋值给指针(引用)。 示例: p—>next = q; 表示p节点的后继指针存储了q节点的内存地址。 p—>next = p—>next—>next; 表示p节点的后继指针存储了p节点的下下个节
阅读全文
摘要:https://leezhenghui.github.io/linux/2019/03/05/exploring-usdt-on-linux.html Table of Contents Table of Contents Motivation Tracing System Overview Ter
阅读全文
摘要:问题 1. C10K 就是单机同时处理 1 万个请求(并发连接 1 万)的问题 2. C1000K 也就是单机支持处理 100 万个请求(并发连接 100 万)的问题 C10K I/O 模型 两种 I/O 事件通知的方式: 水平触发和边缘触发 (1) 水平触发:只要文件描述符可以非阻塞地执行 I/O
阅读全文
摘要:问题: 1. 内核态内存映射函数 vmalloc、kmap_atomic 是如何工作的; 2. 内核态页表是放在哪里的,如何工作的? 3. swapper_pg_dir 是怎么回事; 4. 出现了内核态缺页异常应该怎么办? 内核页表 注意:和用户态页表不同,在系统初始化的时候,我们就要创建内核页表了
阅读全文
摘要:mmap 的原理 每一个进程都有一个列表 vm_area_struct 1 struct mm_struct { 2 struct vm_area_struct *mmap; /* list of VMAs */ 3 ...... 4 } 5 6 7 struct vm_area_struct {
阅读全文
摘要:前言: 重点讲解slub分配器原因: 内核里小内存分配一共有三种,SLAB/SLUB/SLOB,slub分配器是slab分配器的进化版,而slob是一种精简的小内存分配算法,主要用于嵌入式系统。慢慢的slab分配器或许会被slub取代,所以对slub的了解是十分有必要的。 slab分配器的弊端: s
阅读全文
摘要:物理内存的组织方式 物理内存的布局平坦内存模型: 由于物理地址是连续的,页也是连续的,每个页大小也是一样的。因而对于任何一个地址,只要直接除一下每页的大小,很容易直接算出在哪一页。每个页有一个结构 struct page 表示,这个结构也是放在一个数组里面,这样根据页号,很容易通过下标找到相应的 s
阅读全文
摘要:1 #include <vector> 2 3 class CTask 4 { 5 protected: 6 string m_strTaskName; //任务的名称 7 void* m_ptrData; //要执行的任务的具体数据 8 public: 9 CTask(){} 10 CTask(s
阅读全文
摘要:用户态和内核态的划分 内存管理信息: task_struct 的 mm_struct 中 整个虚拟内存空间: 1)是用户态地址空间 2)是内核态地址空间 那这两部分的分界线在哪里呢?这就要 task_size 来定义 1 #ifdef CONFIG_X86_32 2 /* 3 * User spac
阅读全文
摘要:分段机制的原理 分段机制下的虚拟地址由两部分组成,段选择子和段内偏移 量 分段机制下的虚拟地址由两部分组成,段选择子和段内偏移量 段描述符 段寄存器的值是通过段描述符填充的。 GDT(全局描述符表) LDT(局部描述符表) 当我们执行类似MOV DS, AX指令时,CPU会查表,根据AX的值来决定查
阅读全文
摘要:计算机进行计算 包括2方面: 1) 进程和线程对cpu的使用 2) 内存管理 独享内存空间的原理 每个进程都有自己独立的内存空间,如果直接使用物理空间,多个程序同时执行会有占用冲突。所以程序使用虚拟地址,系统负责把虚拟地址和物理地址映射起来 1、会议室和物理内存的关系 和会议室一样,内存都被分成一块
阅读全文
摘要:Linux 多线程编程之 线程池 的原理和一个简单的C实现,提高对多线程编 程的认知,同步处理等操作,以及如何在实际项目中高效的利用多线程开 发。 1. 线程池介绍 为什么需要线程池??? 目前的大多数网络服务器,包括Web服务器、Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必
阅读全文
摘要:内存屏障缘由 1. 单处理器下的乱序问题 2. 多处理器下的内存同步问题 举例: 在如图的这种系统模型中,假设存在如下的内存访问操作: 由于处理器出于效率而引入的乱序执行(out-of-order execution)和缓存的关系, 对于内存来说, 最后x和y的值可以有如下组合: 因此,对于在操作系
阅读全文
摘要:一. 中断上半部,下半部理解 设备的中断会打断内核中进程的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽可能地短小精悍。但是,这个良好的愿望往往与现实并不吻合。在大多数真实的系统中,当中断到来时,要完成的工作往往并不会是短小的,它可能要进行较大量的耗时处理。 如上图描述了Linux内核
阅读全文
摘要:1. 主函数分析 1 /* 命令行解析 2 * 参数输入 ./l2fwd -c 0x3 -n 4 -- -p 3 -q 1 3 * -c 为十六进制的分配的逻辑内核数量 4 * -n 为十进制的内存通道数量,EAL参数和程序参数用--分开 5 * -q 为分配给每个核心的收发队列数量(端口数量) 6
阅读全文
摘要:Perf 简介 Perf 是用来进行软件性能分析的工具。 通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中
阅读全文
摘要:CPU 性能指标 CPU 使用率 CPU 使用率描述了非空闲时间占总 CPU 时间的百分比,根据 CPU 上运行任务的不同,又被分为用户 CPU、系统 CPU、等待 I/O CPU、软中断和硬中断等。 用户 CPU 使用率:包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(ni
阅读全文
摘要:1、什么是中断中断表示我们请求操作硬件操作准备就绪了,例如从磁盘读取数据,我们知道CPU执行速度比磁盘执行速度快几个数量级,因此如果CPU每次check磁盘是否准备就绪了,那么系统的并发能力和性能会大大下降,但是采用中断方式,异步事件驱动方式来提升系统效率,首先会在驱动程序中嵌入中断程序,一旦磁盘准
阅读全文
摘要:前言 LINUX完全注释中的一段话 当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称 为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的 所有状态,即保存当前进程的上下文,以便在再次执行该进程时,能够必得到切换时的状态执行下去。在LINUX中,当前进程上
阅读全文
摘要:极客时间-倪鹏飞 课程《Liunx性能优化实战》学习专栏 ............................................................................................... 一、什么是平均负载 正确定义:单位时间内,系统中处
阅读全文
摘要:1. 问题背景: tcp是以流动的方式传输数据,没有边界的一段数据。像打开自来水管一样,连成一片,没有边界。传输的最小单位为一个报 文段(segment)。tcp Header中有个Options标识位,常见的标识为mss(Maximum Segment Size)指的是:连接层每次传输的数据有个最
阅读全文
摘要:图1. kni结构图 从结构图中可以看到KNI需要内核模块的支持,即rte_kni.ko 当rte_kni模块加载时,创建/dev/kni设备节点(rte_kni模块创建kni杂项设备,文件系统节点/dev/kni需要手动或者通过udev机制创建),藉此节点,DPDK KNI应用可控制和与内核rte
阅读全文
摘要:[转载] 1. 介绍 互联网协议套件是一个网络通信模型以及整个网络传输协议家族, 由于该协议簇包含两个核心协议: TCP(传输控制协议) 和 IP(网际协议), 因此常被通称为 TCP/IP 协议族 . TCP/IP 协议对于数据应该如何封装, 定址, 传输, 路由以及在目的地如何接收等基本过程都加
阅读全文
摘要:1. libevent简介 Libevent 有几个显著的亮点: => 事件驱动(event-driven),高性能; => 轻量级,专注于网络,不如ACE那么臃肿庞大; => 源代码相当精炼、易读; => 跨平台,支持Windows、Linux、*BSD和Mac Os; => 支持多种I/O多路复
阅读全文
摘要:发布订阅模式: PUB发送,send。SUB接收,recv。和PUSH-PULL模式不同,PUB将消息同时发给和他建立的链接,类似于广播。另外发布订阅模式也可以使用订阅过滤来实现只接收特定的消息。订阅过滤是在服务器上进行过滤的,如果一个订阅者设定了过滤,那么发布者将只发布满足他订阅条件的消息。这个就
阅读全文
摘要:197 void *zmq_init (int io_threads_) 198 { 199 if (io_threads_ >= 0) { 200 void *ctx = zmq_ctx_new (); 201 zmq_ctx_set (ctx, ZMQ_IO_THREADS, io_thread
阅读全文
摘要:1 ZeroMQ概述 ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。ZeroMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。 2 系统架
阅读全文
摘要:惊群效应: 举一个很简单的例子,当你往一群鸽子中间扔一块食物,虽然最终只有一个鸽子抢到食物,但所有鸽子都会被惊动来争夺,没有抢到食物的鸽子只好回去继续睡觉, 等待下一块食物到来。这样,每扔一块食物,都会惊动所有的鸽子,即为惊群。对于操作系统来说,多个进程/线程在等待同一资源是,也会产生类似的效果,其
阅读全文
摘要:一、可重入函数1)什么是可重入性?可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继
阅读全文
摘要:1.基本数据结构 分别是 eventpoll、epitem 和 eppoll_entry。 1.1 eventpoll 我们先看一下 eventpoll 这个数据结构,这个数据结构是我们在调用 epoll_create 之后内核侧创建的一个句柄,表示了一个 epoll 实例。后续如果我们再调用 ep
阅读全文
摘要:找了很多资料发现这一篇文章写的最好,转载以下:https://blog.csdn.net/cqu20093154/article/details/44020043 ....................................................................
阅读全文
摘要:参考文献:《深入理解linux网络技术内幕》 《精通linux内核网络》 代码内核版本:3.1.68 ............................................................................................... 1.
阅读全文