linux
文章平均质量分 87
staticnetwind
这个作者很懒,什么都没留下…
展开
-
Linux下computed-goto实验对比
Python-computed-goto优化测试原创 2022-02-01 10:21:47 · 570 阅读 · 1 评论 -
Linux下mktime接口耗时测试
1、背景项目中使用发现mktime开销较大,使用性能测试工具测试一下;2、接口说明主要用于所指向的结构转换为自 1970 年1月1日以来持续时间的秒数,发生错误时返回-1。SYNOPSIS top #include <time.h> time_t mktime(struct tm *timeptr);DESCRIPTION The functionality described on this reference page i原创 2021-09-26 20:56:45 · 4589 阅读 · 0 评论 -
Linux下用户态mktime实现参考
1、背景项目中使用发现mktime开销较大,使用性能测试工具测试一下;2、接口说明主要用于所指向的结构转换为自 1970 年1月1日以来持续时间的秒数,发生错误时返回-1。SYNOPSIS top #include <time.h> time_t mktime(struct tm *timeptr);DESCRIPTION The functionality described on this reference page i原创 2021-09-11 11:07:17 · 5018 阅读 · 0 评论 -
Linux下使用pthread实现进程锁的注意事项
1. 背景最近通过共享内存mmap实现多进程的数据共享,使用PTHREAD_PROCESS_SHARED时写错了,导致进程锁不起作用。2. 接口接口说明如下,用法与多线程的互斥锁类似,但需要额外设置一下PTHREAD_PROCESS_SHAREDSYNOPSIS #include <pthread.h> int pthread_mutexattr_getpshared( const pthread_m原创 2021-05-22 17:46:46 · 1333 阅读 · 1 评论 -
Linux下c语言快速实现web服务器
1. 前言 最近整理了整理,把之前好玩的东西翻一下,这期就到了http了。 如何快速写一个http服务器?方法当然五花八门了,python、go几行就能实现出来了,那么c\c++如何实现呢?2. 相关接口libevent内置了http相关的处理方法(之前早期版本会有一些不稳定,现在event2比较靠谱了),同时支持原创 2020-10-07 18:04:42 · 1309 阅读 · 0 评论 -
Linux下使用hiredis库与libevent实现异步接口的I/O复用
1 前言 之前的一篇文章《Linux下使用hiredis库实现优先级队列》,用的同步的接口实践; 后来遇到一个场景,同时需要处理Redis订阅的消息,又需要处理其他网络socket操作、定时器操作,当然多线程是一个思路,本文尝试从Reactive模式上解决这个问题,即用redis的异步接口,与libevent进行对接。 其实最终目的就是就是Redis接入到这篇文章编原创 2020-08-02 13:59:57 · 1798 阅读 · 0 评论 -
Linux下使用libevent实践文件零拷贝操作
1. 前言这两天又翻了翻libevent代码,发现文件操作中内部带有sendfile、mmap相关代码。又找了网上相关使用说明,资料都比较少,所以实践出真知,搞一搞。2. 介绍2.1 初探零拷贝mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系[2]。#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int原创 2020-07-18 15:27:33 · 828 阅读 · 0 评论 -
Linux下进程级令牌桶的一种实现方法
1、前言最近看了原创 2020-07-11 23:00:23 · 651 阅读 · 0 评论 -
Linux下快速解析nf_conntrack
1. 背景回顾了项目需求是系统的统计tcp连接数;于是想到了 nf_conntrack 这个Linux内核提供的记录和跟踪连接状态的功能;然后写了个程序解析 /proc/net/nf_conntrack这个映射文件,后来悲剧就发生了,当conntrack表记录变增加到1w以上之后,解析速度急速下降,到了10w规模后,解析耗时几十秒都不能完成,,,终于后来翻到了netfilter的老巢,发现了解决方法:libnml、libnetfilter_conntrack2. 使用核心原理是通过netlink原创 2020-07-08 22:00:31 · 2020 阅读 · 0 评论 -
Linux下使用benchmark进行性能测试
1、背景继《Linux下使用gtest对接口进行单元测试》一文之后,Google还有一个实用工具:benchmark;他是基于c++11的性能测试工具,写法方面跟gtest十分类似2、实践实践这块正好使用bm这个工具,正好结合测试了一下leveldb的读写性能,课题背景是调研leveldb单条写入的测试,后续还继续对比redis、sqlite相关性能;2.1 实现首先构造一个类bm_level,与gtest类似,实现setup、teardown方法。#include <list>#原创 2020-07-07 21:48:34 · 5867 阅读 · 0 评论 -
c语言数组洗牌的实现
1.前言 测试数据中,需要用到随机数据,同时要求数据不能重复。所以最终想到了洗牌的方式来生成测试数据,也就是大名鼎鼎的shuffle算法。2.相关知识2.1 算法描述考虑了不需要额外地申请空间,所以需要再数组内部进行调整。for i=1 to n do swap( a[i], a[random(i,n)] );2.2 数学证明...原创 2019-10-20 15:54:16 · 801 阅读 · 0 评论 -
Linux下使用zlib实现文件压缩解压
Linux下使用zlib实现文件压缩解压1.背景2.思路3.实现3.1 函数入口3.2 压缩文件3.3 解压文件4.运行5.结论1.背景上篇文章《Linux下使用zlib实现数据压缩解压》对文本数据进行压缩处理,本文再进行zlib的案例进行学习,这次整理出了文件压缩例子。2.思路查看 zlib-1.2.11/examples/zpipe.c代码,发现他的处理是从stdin获取原始数据,再从...原创 2019-04-10 23:57:59 · 6294 阅读 · 0 评论 -
Linux下使用fuse编写自己的文件系统
一、前言近几天调研了一下fuse编写文件系统的方法,先尝试拿fuse写一套类似tmpfs的简易文件系统,文件信息都保留在内存中。文件系统需要一个数据结构来管理文件节点 inode,正好《c语言实现map-使用内核红黑树》一文将rbtree结构拿出来了可以用上。目标:支持文件读写操作:echo、cat;支持目录操作ls、mkdir、cd。二、知识准备FUSE(Filesystem i...原创 2018-09-28 12:51:38 · 14766 阅读 · 1 评论 -
c语言map的实现-使用内核红黑树
一、前言内核数据结构中,上次讲了一次内核链表的使用《c语言双向循环链表实现-使用内核链表》,这次再接着讲一下内核中常用的<key,value>结构,红黑树(rbtree)。二、相关知识2.1 红黑树特点红黑树为自平衡二叉查找树,具备了以下几种特征[1]:节点是红色或黑色。 根是黑色。 所有叶子都是黑色(叶子是NIL节点)。 每个红色节点必须有两个黑色的子节点...原创 2018-09-27 17:36:41 · 21476 阅读 · 0 评论 -
Linux下快速删除大量小文件的方法探索
一、前言Linux服务器磁盘中存在大量小文件,需要进行删除(文件小于1K,数量50w~100w),发现rm删除速度奇慢无比,甚至出现“argument list too long”的错误。网上资料一搜索基本都是建议rsync方法,所以本文对几种常见的方法进行试验对比。二、相关知识2.1 文件系统的元数据(metadata)1)superblock:记录文件系统的整体信息,包含ino...原创 2018-09-24 08:36:29 · 7031 阅读 · 0 评论 -
Linux下使用ZMQ实践“发布-订阅”模型
一、背景 继续ZMQ系列,本期我们看一下“单生产者-多消费者”的编程场景,使用ZMQ_PUB/ZMQ_SUB实践“发布-订阅”模型二、相关知识2.1 ZMQ_PUBZMQ_PUB A socket of type ZMQ_PUB is used by a publisher to distribute data. Messages sent are distributed in a ...原创 2018-06-24 13:37:50 · 3255 阅读 · 0 评论 -
Linux下使用protobuf-c实现自定义协议
1、背景需求 通信协议设计,考虑了后续跨语言的支持(如Java、Python、C),需求一种序列化、反序列化的库2、相关知识 Google Protocol BUffer 提供了一种适用于RPC系统、持续数据存储系统的混合语言数据标准,可用于通信协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前有C++、C、Java、Python三种语言的API。2.1 pro...原创 2018-05-12 20:37:36 · 10252 阅读 · 2 评论 -
Linux下对libevent的evbuffer模块裁剪移植
目录列表1. 背景2. 源码分析2.1 结构体分析2.2 主要接口3.裁剪3.1 兼容性定义3.2 裁剪实现3.1 chain相关操作3.2 evbuffer的操作3.3 运行测试4. 结论1. 背景libevent作为一款高效的网络开发库,内部模块也有许多优秀的实现。evbuffer为libevent的核心缓冲器功能,提供了与I/O的操作的高效结合:数据拷贝、移动、读写。上篇文章《Lin...原创 2019-06-02 17:24:53 · 420 阅读 · 0 评论 -
Linux下使用ZMQ实践“请求-响应”异步服务器模型
一、背景 上一篇文章《Linux下使用ZMQ实践“请求-响应”服务器模型》中使用的是REP-REQ套件,该套件的特点是必须一个请求对应一个响应,如果在应用中不想使用同步处理的方式呢?ZMQ有没有提供异步处理的方法?答案是使用DEALER-ROUTER套件。 另外如何在多线程中安全传递消息的方法可以参见《Linux下使用ZMQ实践“生产者-消费者”模型》ZMQ_PULL、ZMQ_PUSH...原创 2018-03-20 00:23:09 · 1778 阅读 · 0 评论 -
Linux使用ragel进行文本快速解析(上)
Linux使用ragel进行文本快速解析1、前言2、相关知识2.1、简介2.1.1 Ragel 优势2.1.2 Ragel 特性2.2 状态机(mechine)概念2.3 动作(action)的概念2.4 流程设计3、案例实践3.1 源码分析3.2 编译4、结论参考文章:1、前言 在项目中我们经常涉及一些文本解析处理的场景,大部分场景是进行简单解析且数据量不大,但本文要讨论的是某些特定场景下...原创 2019-04-13 20:36:10 · 4457 阅读 · 0 评论 -
Linux使用ragel进行文本快速解析(下)
1、前言 《Linux使用ragel进行文本快速解析(上)》文中对Ragel进行了初步介绍,并给出了一个atoi的例子,本文接着再给出一个文本行解析的例子2、思路 awk的主要是对固定列数的文本进行内容解析,若使用 awk命令的话,是进行逐行解析。同样的,使用 Ragel 写的思路也是,编写正则以行为单位,进行读取解析。但是相比命令的方式,Ragel 相当于可编程处理,则能灵活地对不固定...原创 2019-04-13 23:07:26 · 1099 阅读 · 0 评论 -
c语言暴力递归实现数独求解
数独求解1. 简介1.1 规则介绍1.2 解法介绍2 程序思路2.1 数据的存储表示2.2 数独检查2.2 数独计算2.3 调用3. 调用运行4. 总结1. 简介1.1 规则介绍Wiki-数独百科-数独九宫格的定义:水平方向的每一横行有九格,每一横行称为行(Row)垂直方向的每一纵列有九格,每一纵列称为列(Column)三行与三列相交之处有九格,每一单元称为小九宫(Box、B...原创 2019-05-21 01:14:37 · 1978 阅读 · 0 评论 -
c语言快速数独生成器
1.准备继上篇文章《c语言暴力递归实现数独求解》 思路,本章编写一个数独生成器,按照数独的规则生成题目,但不保证题目可解。2.思路按照数独的规则:水平方向的每一横行有九格,每一横行称为行(Row)垂直方向的每一纵列有九格,每一纵列称为列(Column)三行与三列相交之处有九格,每一单元称为小九宫(Box、Block)格子上填入1-9数字,使1-9每个数字在每一行、每一列和每一宫中都...原创 2019-05-23 00:07:01 · 4360 阅读 · 0 评论 -
Linux下使用gtest对接口进行单元测试
目录1. 背景2. gtest 断言2.1 布尔值判断2.2 二进制比较2.3 字符串比较2.4 浮点数比较3. 实践3.1 框架使用3.2 用例编写3.3 编译运行4.结论1. 背景工程中涉及基础接口的设计,为了保证接口的质量,所以需要进行单元测试:单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。单元测试需要构建测试代码(开源软件中一般都提供了tests目录)...原创 2019-06-02 15:15:40 · 1557 阅读 · 0 评论 -
Linux下使用ZMQ实践之监控事件
1. 前言继续《Linux下使用ZMQ实践“生产者-消费者”模型》 文章之后进一步思考:ZeroMQ通过隐藏了基础的socket操作,达到调用简明易懂的层次;那么,如果某些场景下,又需要考虑到连接状态的维护,应该如何操作?ZeroMQ给出的解决方案就是zmq_socket_monitor2. 相关知识支持监控的事件:事件描述ZMQ_EVENT_CONNECTED...原创 2019-06-26 00:09:23 · 2116 阅读 · 0 评论 -
Linux下使用ZMQ实践之与libevent结合
1. 前言 最近考虑到一个问题,项目中有同时处理socket、zeromq的逻辑需求,想通过libevent(I/O服用)一块将zmq-socket的事件也放一个线程中处理。 网上了解了一些实现,大部分都是通过将zmq的sockfd拿到,加入libevent_dispatch中一并处理,...原创 2019-06-27 00:59:25 · 1551 阅读 · 0 评论 -
Linux下使用eventfd实现进程间信号量操作
1 前言起源来自于单线程epoll_wait内部处理queue的思考,后来发现了linux支持一种自定义事件的fd,查找资料之余又发现了eventfd还有多进程信号灯的用处。。。本文翻译了eventfd的用法,并在文末附带demo进行实践。新的改变ommand + Y加粗:Ctrl/Command + B斜体:Ctrl/Command + I标题:Ctrl/Command + Shif...原创 2019-09-19 00:43:01 · 1657 阅读 · 0 评论 -
Linux下使用原始套接字实现ping命令
客户端程通过透明代理访问远程服务器,代理需要以SNAT去修改源地址源端口,一般写法是Add SNAT、Connect、Del SNAT;那么问题来了,加SNAT规则时需要 -s $ip --sport $port (避免多个客户端互相混淆),若正好代理机器上存在多个地址时,调用Connect之前Socket并不知道需要绑定哪个出口地址,那怎么获取到$ip、$port呢?思路是需要在Connect动作之前,目的服务器地址是已知的,通过发送ICMP echo 来确定本机的出口地址;原创 2016-11-09 23:16:41 · 2614 阅读 · 0 评论 -
Linux下使用ZMQ实践“生产者-消费者”模型
一、背景 上一篇文章《Linux下使用ZMQ实践“请求-响应”模型》引入了ZMQ的实践案例,本章继续实践编程模型中常用的“生产者-消费者”模型。二、相关知识 ZMQ_PUSH、ZMQ_PULL模型是单发单收的模型,你只能在ZMQ_PUSH套接字上进行send操作,而不能进行recv,反之一样: ZMQ_PUSH A socket of type ZMQ...原创 2018-03-17 23:02:51 · 1261 阅读 · 0 评论 -
Linux下使用ZMQ实践“请求-应答”服务模型
一、背景 在C/S编程模式中,经常需要进行进程间消息传递,常用的模式是“请求-应答”方式,客户端通过发起请求,服务端进行处理再进行回复,如果使用socket去实现,难免还要实现消息的分包、连接状态的维护的功能。 ZMQ(ZeroMQ、0MQ)则是一种高性能的异步消息库,接口风格类似于套接字实现,但又将sockfd的相关细节隐藏起来。支持线程间、进程间通信、一对多、多对一节点处理,外部的...原创 2018-03-17 21:33:06 · 1545 阅读 · 0 评论 -
Linux下使用hiredis库实现优先级队列
一、背景需求 需求主要为: 1、优先级分为高、中、低(优先级队列); 2、支持多生产者、多消费者模型(解决竞争); 3、期间进程退出,队列内容不会丢失(持久化); 选型方面考虑了第三方工具,先调研了一下Redis,发现其中LIST数据结构非常适用上诉需求;二、相关知识2.1 List结构 Redis List是Redis最重要的数据结构之一,内部实现是一个双向链...原创 2018-03-03 15:27:50 · 1039 阅读 · 0 评论 -
c语言最小堆的实现-优先队列
libevent 中有定时事件的管理,用户可以把超时的定时事件插入到 管理器中,当时间到了之后触发用户的回调函数处理;查看了源码发现,定时器的数据结构其实是由最小堆来实现的。优先队列为完全二叉树,所以在插入调整的时间复杂度为 O(N),弹出的复杂度为O(1);原创 2017-02-25 15:07:48 · 3373 阅读 · 0 评论 -
c语言双向循环链表实现-使用内核链表
一、前言Linux内核链表作为内核最基础最常用的数据结构,那么在咱们用户态的编程下是否可以借鉴?二、相关知识1、双向循环链表如图所示,每个节点分别有前驱(prev)、后继(next)两个指针域,双链表支持两个方向的遍历,循环则指尾节点又可以重新指向到头节点;2、内核链表的实现(以3.10.25为例)2.1 头节点定义(linux-3.10.25/include/linux/list.h)struc...原创 2017-02-25 09:51:47 · 1124 阅读 · 0 评论 -
c语言命令行-勇者斗恶龙
c语言实现的命令行交互小游戏-勇者斗恶龙原创 2017-01-27 12:35:22 · 1787 阅读 · 0 评论 -
Linux下TCP非阻塞连接的方法
TCP连接函数用于连接服务器端口,若服务器地址不存在时,并不能在短时间内返回连接结果;非阻塞connect接口主要用于控制连接的时间,防止异常连接带来的过长的CPU占用;原创 2017-01-27 13:42:50 · 3111 阅读 · 0 评论 -
c语言线程池的简单实现
在某种CPU密集型的应用场景中,处理计算任务耗时较多(如图像处理),考虑多核CPU的优势,若能把计算分担到多个线程中处理则能有效利用CPU;但是,若过开启过多的线程,线程创建销毁、线程间切换所带来的开销也不容小觑;所以,本文设计线程池对任务进行处理,即所有待处理的任务集中在队列里头,N个线程轮流去取队列进行计算;原创 2017-02-06 22:19:34 · 1564 阅读 · 0 评论 -
c语言多线程-模拟微信抢红包
想法源于微信、QQ、蓝信抢红包的热情,内部是怎么实现分配处理的呢?本文通过一生产者多消费者的多线程编程去模拟微信抢红包的过程;从执行结果上看,10个线程同时抢红包,每次发5个红包抢到的结果均是比较贴近手气红包的规律;原创 2017-01-29 17:31:38 · 2163 阅读 · 0 评论 -
c语言数据结构实现-哈希表/哈希桶(hashtable/hashbucket)
本文简单介绍了哈希表的原理,以及对内核的哈希源码进行了分析,代码里的回调思想是值得推荐的。在实际的使用中,hash表的可以用于大规模数据下的增加、删除操作;但是若存在一些遍历的需求,hash表在这块的效率不高(需要遍历所有的桶),这些情况则可以考虑别的数据结构如红黑树、B+树等;原创 2016-12-11 18:56:44 · 13619 阅读 · 0 评论 -
c语言数据结构实现-链式队列
一、背景需求在上一篇文章中介绍了数组实现的队列,本章节再补充一个链式的队列,实现动态插入空间的操作。二、相关知识链式队列由环形链表实现,通过链表头和链表尾的操作,完成了队列入列出列的功能。如图所示,空队列时至少需要一个空节点,表示为队列头和队列尾,相当于哨兵的作用;入列:新增节点插入到队列尾,并更新 tail 指针;出列:更新 head 位置,释放原来 head节点,返回现有位原创 2016-12-18 00:23:26 · 1114 阅读 · 0 评论 -
c语言数据结构实现-数组队列/环形队列
队列的数据结构其实非常简单,实现方式主要为动态的链式结构或者为静态的数组结构,本文介绍一种静态的数组结构使用数组队列类似于牺牲空间换时间的方法,实现简单。但要求用户数据必须定长,并且会出现队列满的情况;但是在索引方面,由于使用了下标法进行定位,可以快速地查找到下一个元素(head=(head + 1)&mask),这个时候也必须保证队列大小为2^N;同时在一个生产者一个消费者的场景下,使用该队列可以无需上锁,节省锁的开销;原创 2016-12-15 22:50:23 · 6307 阅读 · 0 评论