![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux
文章平均质量分 77
菊头蝙蝠
这个作者很懒,什么都没留下…
展开
-
mmap实现共享内存
mmap实现共享内存一、mmap参数二、内存不共享情况三、内存共享可以简单地理解共享内存:进程A中的一块内存空间和进程B中操作的一块内存空间是同一块内存空间更详细的原理可以参考,下面主要是如何使用mmap去实现共享内存。一、mmap参数通过man手册可以知道addr:共享内存的地址,如果为NULL,则会自动分配一块内存length:共享内存的长度prot:内存保护的一些flags(比如说:匿名,读,写权限等)flags:是否对其他进程可见,更新是否会传递到底层文件fd:文件描述符(用于原创 2022-04-14 20:52:00 · 2014 阅读 · 0 评论 -
动手实现内存泄漏检测组件
c/c++没有垃圾回收机制,可能会出现内存泄漏出现原因:内存分配与内存释放,没有做到匹配1.如何预防内存泄漏?2.内存泄漏如何解决?1.如何知道内存泄漏2.如何定位代码哪一行引起的内存泄漏如何知道内存泄漏:每次malloc/calloc/realloc 就 +1每次free 就 -1如果正常退出,不为0,说明存在内存泄漏如何定位哪一行引起内存泄漏?1.c自带的宏,__FILE__、_ FUNCTION _和、__LINE__,可以定位到具体文件,函数,哪一行2.builtin_re原创 2022-04-14 17:35:01 · 1947 阅读 · 1 评论 -
使用mtrace进行内存泄漏检测
使用mtrace进行内存泄漏检测一、使用mtrace二、完整代码一、使用mtrace要加入头文件#include <mcheck.h>通过mtrace()和muntrace()放在要测试的代码的前后mtrace();void *p1 = malloc(10);void *p2 = malloc(20); //calloc, reallocfree(p1);void *p3 = malloc(20);void *p4 = malloc(20);free(p2);f原创 2022-04-14 16:46:24 · 967 阅读 · 0 评论 -
动手实现死锁检测组件(通过hook与有向图实现)
动手实现死锁检测组件(hook与有向图实现)一、如何理解死锁二、模拟实现一个死锁1、如何去模拟实现一个死锁?2、创建4个线程模拟实现死锁三、死锁检测1、实现hook2、构建有向图4、数据组织方式5、代码逻辑四、完整代码一、如何理解死锁比如线程A需要 线程B的资源才能解锁,线程B需要线程C的资源才能解锁,线程C需要线程A的资源才能解锁。现在A、B、C都不能获得想要的资源,于是都没法解锁,陷入了死锁。如何进行死锁检测?可以把死锁检测的问题转化为有向图的环路检测。为了能够实现死锁检测,首先要模拟一个原创 2022-04-12 22:21:23 · 1075 阅读 · 0 评论 -
网络字节序和主机序(大端和小端)详细解释--通过封装IP协议头去理解网络字节序
网络字节序和主机序(大端和小端)详细解释--通过封装IP协议头去理解网络字节序一、什么是大端和小端?二、主机序:小端模式1、验证主机的字节序2、查看比特序3、主机序总结三、网络序1、以IP协议头为例2、字节中的比特序一、什么是大端和小端?小端:低位数据放在低地址大端:高位数据放在低地址比如 0x12 34 56 78,其中78是低位,12是高位。该数的右侧是低地址,左侧是高地址。也就是说低位对应低地址(小端字节序)如果0x12 34 56 78是小端字节序,那么0x78 56 34 12就是大端字原创 2022-04-11 01:46:31 · 3609 阅读 · 0 评论 -
定时器方案:红黑树、最小堆和时间轮的原理
网络事件和时间事件对于服务端来说,驱动服务端逻辑的事件主要有两个,⼀个是⽹络事件,另⼀个是时间事件;在不同框架中,这两种事件有不同的实现⽅式;第⼀种,⽹络事件和时间事件在⼀个线程当中配合使⽤;例如nginx、redis;第⼆种,⽹络事件和时间事件在不同线程当中处理;例如skynet;第一种// 第⼀种while (!quit) { int now = get_now_time();// 单位:ms int timeout = get_nearest_timer() - now;原创 2022-04-10 00:30:47 · 1135 阅读 · 0 评论 -
nginx中的定时器源码分析与测试
nginx中的定时器源码分析与测试一、nignx中的定时器二、nignx中定时器测试三、附件在nginx中,定时器是由红黑树来实现的。有以下几个定时器的接口init_timer 初始化定时器(初始化红黑树)add_timer 添加定时器(红黑树左侧时间小,右侧时间大。当时间出现重复的时候,插入右侧)del_timer 删除定时器find_nearest_expire_timer 查找时间最近的定时器(红黑树中最左侧的节点)expire_timer 到期的定时器(执行定时事件,并删除红黑树中对原创 2022-04-08 21:29:39 · 2335 阅读 · 0 评论 -
linux中进程与cpu核的绑定
linux中进程与cpu核的绑定一、cpu亲缘性二、fork用法三、设置进程与cpu的亲缘性一、cpu亲缘性进程绑定CPU亲缘性,使得进程只能在指定的cpu上进行调度或者运行。绑定cpu亲缘性的好处:每个CPU本身自己会有cache,如果调度到其他cpu上,CPU cache命中率就低了,设置CPU亲缘性,程序就会一直在指定的cpu运行,从而避免因切换带来的CPU的L1/L2 cache失效。从而进一步提高应用程序的性能。二、fork用法此图来源 linuxC中fork()函数详解三、设置进原创 2022-04-08 15:09:16 · 2072 阅读 · 0 评论 -
线程私有存储空间的全局变量pthread_key_t
线程私有存储空间的全局变量pthread_key_t一、api的使用二、案例一、api的使用1.pthread_key_t key;定义一个该类型的变量,作为key,用来对应线程的私有存储空间的value2.pthread_key_create(&key, NULL);创建(初始化)变量key,使它能够区别不同线程中,这个key所对应的value3.pthread_setspecific(key, &i);在线程中,通过全局变量key,将值传入线程的私有空间中4.int *p原创 2022-04-07 21:32:25 · 1186 阅读 · 0 评论 -
池式组件-异步请求池的原理与实现
请求池一、同步dns请求一、有哪些第三方请求1.http2.ntp/dns3.mysql4.redis发出请求的时候,需要等待第三方回应,这个过程是比较费时的,因此可以通过异步请求的方式,发送完请求后,不等待结果的返回,可以先做其他的事,结果用另外的线程去接受1.inita.epoll_createb.pthread_create2.commita.socket创建b.connect serverc.encode —>redis/mysql/dns 编码成请求格式d.s原创 2022-04-07 15:02:49 · 442 阅读 · 0 评论 -
池式组件-内存池的原理及其实现
为什么要使用内存池?在客户端进行连接(如果有分配内存的需求)的时候,内存会频繁分配和使用(内存池就是为了避免频繁分配和释放)。如果有大量客户端连接,并且每次只占用一点内存,会出现很多的内存碎片内存池1.这个轮子要用,但不要自己造,原理一定要懂jemalloc (c实现)tcmalloc(c++实现)如果要使用内存池,不需要修改原来的代码,只需要进行宏定义和使用hook,就可以通过malloc来自动调用tcmalloc如何去实现一个内存池?通过一个链表节点,一个是指向的内存块地址,另一个是原创 2022-04-06 20:34:30 · 619 阅读 · 0 评论 -
实现用户态epoll的原理
实现用户态epoll的原理一、如何定义数据结构二、协议栈如何与epoll模块通信三、epoll如何加锁四、ET与LT如何实现为什么要在用户态协议栈去实现一个epoll?内核里面实现的epoll是对sockfd,文件系统 vfs进行的一个管理。而对于用户空间的fd, (int类型的fd),内核里的epoll是用不了的,不好管理,于是可以自己去实现一个epoll。包括腾讯的f-stack,也实现了一个epoll。实现一个用户态的epoll需要解决的问题1.如何定义数据结构2.协议栈如何与epoll模原创 2022-04-01 19:42:37 · 773 阅读 · 0 评论 -
用户态协议栈设计netmap实现
用户态协议栈设计实现数据链路层:封装以太网协议头网络层:封装IP协议头传输层:封装udp头封装成udp数据帧通过mmap可以将网卡里的数据映射到内存中去这里是零拷贝,指的是cpu指令没有参与,但并不是没有拷贝,这是一种DMA的方式实现协议栈有几种方式,但是dpdk前置知识太多,所以用netmap去实现数据链路层:封装以太网协议头#define ETH_ADDR_LENGTH 6//以太网头struct ethhdr { unsigned char h_dst[ETH_ADDR_L原创 2022-03-31 19:48:12 · 3065 阅读 · 0 评论 -
ubuntu16-安装netmap
ubuntu16-安装netmap一、安装netmap二、网卡名称修改三、使用四、遇到的坑1. 没有在LINUX目录下./configure, 直接在根目录./configure了2. 在./configure时候,出现下载失败的情况3. make出错4.No such file or directory五、参考链接一、安装netmaphttps://github.com/luigirizzo/netmapgit clone https://github.com/luigirizzo/netma原创 2022-03-31 16:35:42 · 1509 阅读 · 0 评论 -
Linux C/C++ websocket协议与服务器实现
Linux C/C++ websocket协议与服务器实现一、websocket二、握手 handshake三、传输transmission四、完整代码一、websocketwebService、webSocket、socket、http之间的区别Http、Socket、WebSocket之间联系与区别Socket 与 WebSocket二、握手 handshake进行TCP三次握手建立连接后对于 WebSocket 来说,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从原创 2022-03-21 17:04:46 · 7071 阅读 · 4 评论 -
Linux C/C++ reactor模式下实现简易的web服务器
Linux C/C++ reactor模式下实现简易的web服务器一、HTTP协议1.客户端请求消息2.服务器响应消息3.http请求与响应实例4.实现内容二、reactor模式下如何实现web服务器三、完整代码四、补充1、规范写法2、查看http请求内容3、粘包4、可以将包多次发送给客户端5、利用分隔符\r\n\r\n分隔报头和正文6、资源文件7、sendfile8、浏览器出现一直转圈的情况9、事件event中新加入3个参数一、HTTP协议1.客户端请求消息2.服务器响应消息HTTP 响应也由四原创 2022-03-20 23:51:24 · 2022 阅读 · 0 评论 -
epoll中的ET和LT模式区别
epoll中的ET和LT模式一、水平触发(LT)和边沿触发(ET)二、例子1.例子:水平触发(LT)2.例子:边沿触发(ET)一、水平触发(LT)和边沿触发(ET)在电路中的有水平触发和边沿触发的概念,在epoll读取事件下,水平触发可以理解为,蓝色那一部分,只要存在可读的情况,就会一直读取。而边沿触发,可以理解为红色箭头所指向,发生跳变的部分,就会触发一次。在epoll中events=EPOLLIN 为读取事件,LT模式events=EPOLLIN|EPOLLET 为读取事件,ET模式e原创 2022-03-19 16:05:31 · 4720 阅读 · 1 评论 -
Linux C/C++ reactor原理与实现
reactor可以理解为io管理集合,和多线程、多进程没有关系。但后续可以额外在reactor中引入多线性。除了listenfd用accept处理,其他clientfd用recv和send处理原创 2022-03-18 18:37:24 · 1712 阅读 · 0 评论 -
TCP服务器 IO多路复用的实现:select、poll、epoll
TCP服务器 IO多路复用的实现:select、poll、epoll一、多线程并发和IO多路复用(select、poll、epoll)二、代码部分三、补充1.tcp三次握手的时刻2.epoll_create()3.EPOLLOUT触发条件一、多线程并发和IO多路复用(select、poll、epoll)一请求一线程是通过多线程实现的,而selet,poll,epoll是通过io多路复用一请求一线程简单,但线程个数有限,C10K (1W个线程)select 复杂度O(1)1.select原创 2022-03-17 19:24:05 · 1662 阅读 · 0 评论 -
Linux C/C++ 开发(学习笔记十三):百万并发的服务器实现
Linux C/C++ 开发(学习笔记十三 )一、二、2、解决三、一、在那个文件下添加两行reboot后即可可以通过ulimit -a指令来查看文件系统最大的进程fd个数确实由1024变为了百万级别二、连接到一半的时候又会遇到这个问题在客户端这边,远程ip,远程端口,协议都是确定的,本机ip也是确定的,那么实际上就是本机的端口耗尽了。解决方法就是 在服务器开多个端口,目前就开了一个端口:88882、解决端口只有65535个,如何可以实现几百万并发呢。由于sockfd是原创 2022-03-16 11:13:41 · 2736 阅读 · 0 评论 -
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)一、了解epoll二、完整代码三、补充:一、了解epoll可以通过epoll实现io多路复用深入了解epollepoll使用详解二、完整代码epoll水平触发(LT)和边沿触发(ET)概念较为重要开发过程中,一定要注意sockfd要在epoll这个集合里面使用epoll肯定会有一个 事件的主循环。#include<sys/socket.h>#include<arpa/in原创 2022-03-15 18:47:17 · 1460 阅读 · 0 评论 -
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)一、TCP服务器(一请求一线程) 的原理二、完整代码三、测试四、补充一、TCP服务器(一请求一线程) 的原理通过sockfd绑定(bind)和监听(listen),每过来一个客户端就接受(accept),并创建一个clientfd,每个clientfd,占据一个线程。每个线程执行 接受(recv)并printf的任务。具体的监听过程二、完整代码#include<sys/socket.h>原创 2022-03-14 21:30:47 · 2258 阅读 · 0 评论 -
Linux C/C++ 开发(学习笔记十 ):实现http请求器(TCP客户端)
Linux C/C++ 开发(学习笔记十 ):http客户端请求一、需要实现的内容和方式二、完整代码三、补充1.hostname和resource的区别2.fd_set的作用一、需要实现的内容和方式比如进入百度,可以看见右侧web界面的必要信息,这就需要通过http客户端去请求获取。在网页上打开,比如在chrome浏览器中,按F12即可进入开发者模式,可以看见发送的请求实现方式二、完整代码#include<stdio.h>#include<string.h>原创 2022-03-14 18:48:28 · 2727 阅读 · 0 评论 -
Linux C/C++ 开发(学习笔记九 ):DNS协议与请求的实现
Linux C/C++ 开发(学习笔记九 ):一、二、一、在cmd中输入nslookup www.baidu.com就可以查询到百度的ip地址二、srandom()可以设定种子,比如srandom(0) 、srandom(1)等等。如果srandom设定了一个固定的种子,那么random得出的随机数就是固定的;如果程序运行时通过srandom(time(NULL))设定种子为随机的,那么random()每次生成的随机数就是非固定的了。在udp中,connect仅仅是为了开路的,保证sen原创 2022-03-13 23:46:23 · 2697 阅读 · 2 评论 -
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储一、读入图片二、图片数据写入磁盘三、表中增加图片数据一列四、将图片数据存入Mysql服务器五、将图像数据从Mysql服务器中取出六、完整代码1.准备好一张图片文件,将图片read,存放到buffer2.将图片数据(buffer)写入mysql3.从mysql中读取图片数据(buffer)4.将图片数据(buffer)写入磁盘一、读入图片//读取图片//filename:path+file name//buffer:stor原创 2022-03-09 16:16:57 · 2273 阅读 · 1 评论 -
Linux C/C++ 开发(学习笔记七):Mysql数据库C/C++编程实现 插入/读取/删除
Linux C/C++ 开发(学习笔记七):Mysql数据库C/C++编程实现 插入/读取/删除一、数据库建模与建库建表二、安装libmysqlclient-dev三、代码中实现SQL插入数据四、代码中实现SQL查询操作五、代码中实现SQL数据删除(以及存储过程调用)六、补充1.`mysql.h`在vscode中导入并正确编译一、数据库建模与建库建表用户admin登入mysql创建一个数据库create database KING_DB;#创建数据库show databases;use KING原创 2022-03-08 22:58:01 · 2043 阅读 · 1 评论 -
Linux C/C++ 开发(学习笔记六):MySQL安装与远程连接
Linux C/C++ 开发(学习笔记六):MySQL安装与远程连接一、MySql安装二、Windows安装MysqL workbench三、使用Mysql workbench连接数据库服务器四、分配用户权限一、MySql安装sudo apt-get install mysql-server-5.7然后输入两次密码后,安装成功以root身份登入mysqlmysql -u root -p输入密码即可二、Windows安装MysqL workbenchMySQL8.0安装(win10)原创 2022-03-08 20:02:35 · 868 阅读 · 0 评论 -
Linux C/C++ 开发(学习笔记五):线程池
Linux C/C++ 开发(学习笔记五):线程池一、线程池的由来和组成二、一、线程池的由来和组成如果涉及到十万个we线程,根本没办法开这么多如果一个poxis线程占8M内存,那么16G内存也只能有2048个线程,根本没法满足十万线程的需求。线程池1.避免线程太多,使得内存耗尽2.避免创建与销毁线程的代价3.任务与执行分离所以需要 任务与执行 分离。一个例子,对于营业厅来说,办理业务的人是任务队列,柜员 是执行队列因此需要一个组件(也就是线程池),使得任务队列和执行队列,正常有序原创 2022-03-07 22:46:06 · 817 阅读 · 0 评论 -
Linux C/C++ 开发(学习笔记四):多线程并发锁:互斥锁、自旋锁、原子操作、CAS
Linux C/C++ 开发(学习笔记四):多线程并发一、多线程计数二、发现问题三、互斥锁四、自旋锁五、互斥锁和自旋锁的对比六、原子操作七、其他:CAS一、多线程计数背景:火车抢票,总共10个窗口,每个窗口都同时进行10w张抢票可以采用多线程的方式,火车票计数是公共的任务#include<pthread.h>//posix线程 #include<stdio.h>#include<unistd.h>#define THREAD_COUNT 10 //定原创 2022-03-07 20:05:04 · 955 阅读 · 0 评论 -
Linux C/C++ 开发(学习笔记三):Linux C编程案例
统计文件单词数量(文件操作)目的是为了统计txt文档中,单词数量方案是 状态机定义两状态,1:在字符中(IN) 2.在字符外(OUT)因此只需要, OUT->IN的过程,即单词数量+1。默认初始化状态为OUT(算法还需要严密,比如遇到can’t,这边并 )#include<stdio.h>#include<iostream>using namespace std;#define OUT 0#define IN 1#define INIT OUTi原创 2022-03-07 15:04:53 · 644 阅读 · 0 评论 -
Linux C/C++ 开发(学习笔记二):Shell脚本编程案例
Linux C/C++ 开发(学习笔记二):Shell脚本编程案例一、编写shell脚本二、打印文件夹下所有文件三、将数字从1到100求和四、检测服务器内主机是否宕机一、编写shell脚本创建并编写脚本vim first.sh#!/bin/bash是指此脚本使用/bin/bash来解释执行。echo表示输出下面是定义 变量的方式(等号两边不能有空格),并输出变量#!/bin/bashecho "Hello World"zerovoice="www.0voice.com"echo $原创 2022-03-06 18:58:38 · 999 阅读 · 0 评论 -
Linux C/C++ 开发(学习笔记一):环境安装
Linux开发环境安装1.安装VMware2.安装Linux Desktop/Server3.安装配置Samba4.安装编辑器 VSCode/SourceInsight5.ssh操作终端xshell/putty6.gcc/g++用samba,可以直接在windows将代码上保存到linux磁盘上。不建议使用FTP(部署的时候再使用)VMware和ubuntu server安装安装好后,开启虚拟机,就是这个样子安装XShell6在ubuntu虚拟机中输入ifconfig,查看本机ip原创 2022-03-06 16:27:38 · 1057 阅读 · 0 评论 -
WSL2安装及图形界面使用
linux修改源修改源文件vim /etc/apt/sources.list在末尾加入deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main multiverse restricted universedeb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main multiverse restricted universedeb http://mirr原创 2022-02-11 13:19:40 · 7022 阅读 · 0 评论 -
linux vim-编辑器常用指令
linux vim编辑器常用指令模式的切换命令模式输入模式底线命令模式基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是:参考链接模式的切换刚进入vim为命令模式按i进入到输入模式再按Esc可以返回到命令模式在命令模式输入:可以进入底线命令模式以下是一些常用的命令命令模式i 进入到输入模式x 删除当前光标所在字符: 切换到底线命令模式dd删除一原创 2021-04-14 23:26:17 · 99 阅读 · 0 评论