
程序设计
文章平均质量分 70
cjfeii
Hello World.
展开
-
tensorstore简单介绍
TensorStore是谷歌开源的C++库,主要用于读、写大规模的多维数组。原创 2023-10-13 10:42:10 · 459 阅读 · 0 评论 -
重新认识C语言中的结构体
我们对C语言中的struct的印象是什么?它是C语言中内置的复合数据类型;相当于C++中的class;丰富的初始化操作;Struct的拷贝为浅拷贝;支持嵌套、指针等操作;支持位字段,节省空间。如果你知道的只有这些,那么说明你对struct了解的还不够深刻,后续我们简单聊聊结构体的一些知识。本文的代码以及描述都是基于linux环境。1. C++中的structC++中的struct本质上和class没有区别,struct也支持构造函数、成员函数、虚函数、继承等,仅仅只有默认的访问权原创 2021-10-27 20:51:43 · 335 阅读 · 0 评论 -
sysbench代码剖析和实践
sysbench是一款比较流行的测试工具,主要用于测试fileio、cpu、memory、threads、mutex等的性能测试,但是最主要的还是做数据库的性能测试,经常用来测试MySQL、Drizzle、AttachSQL、Oracle、PostgreSQL等相关的数据库,也可以扩展支持其他的数据库以及测试用例,本文主要介绍sysbench的代码逻辑、代码调试、lua脚本以及相关扩展功能。本文的介绍主要基于sysbench 1.0的代码:repo:https://github.com/akopyto原创 2021-10-13 20:55:51 · 1644 阅读 · 0 评论 -
gcc之__attribute__字节对齐参数设置
在性能要求比较高的场景下,经常会用到字节对齐,我们可以通过gcc的__attribute__来设置struct的字节对齐,比较常用的就是aligned和packet,本文主要介绍这两种设置字节对齐的用法。1. aligned - 设置变量对齐aligned的功能就是设置变量按照指定的字节进行内存对齐,对齐的字节数必须是2的指数,再看一个使用的例子:// file: test.c// gcc test.c -o test#include <stdint.h>#include <s原创 2021-09-26 18:12:31 · 3020 阅读 · 0 评论 -
Mellanox网卡参数调优
为了提高IPv4和IPv6的流量性能,可以使用Linux sysctl命令修改操作系统设置的默认系统网络参数。但是,需要注意,更改网络参数可能会在不同的系统上产生不同的结果。结果显著依赖于CPU和芯片组的效率。ref:https://community.mellanox.com/s/article/linux-sysctl-tuninghttps://community.mellanox.com/s/article/performance-tuning-for-mellanox-adaptersh原创 2021-04-07 14:33:16 · 3047 阅读 · 0 评论 -
socket的O_NONBLOCK以及TCP_NODELAY
设置socket的O_NONBLOCK以及TCP_NODELAY1. no-blocking将socket设置为no-blocking意味着socket收发数据都是非阻塞的,相比于阻塞方式,需要特殊处理这个错误码:EWOULDBLOCK or EAGAIN(这两个错误码是一样的,都是35),进行重试或者重新调度。将socket设置非阻塞有多种方法,下面会一一汇总。1.1 fcntl设置O_NONBLOCKPOSIX的fcntl用的比较广泛,兼容性也比较好,优先推荐使用fcntl来设置,缺点是需要两原创 2021-04-07 14:19:15 · 6689 阅读 · 0 评论 -
在c++中实现一个good spinlock
在c++中实现一个good spinlock网上有很多关于spinlock不好的实现。他们都犯了相同的错误:在RMW(read-modify-write)操作上自旋。我后面会说明为什么这些实现不好,也会介绍如何在C++中实现一个好的spinlock,并且这个实现很容易迁移到其他编程语言中。在本文的最后提供了完整的spinlock实现。一个bad spinlock实现最基本的自旋锁使用一个boolean值(或1个bit)来表示锁是否被持有。要获取锁,使用原子交换操作将boolean值设置为true。翻译 2021-03-30 17:45:15 · 2253 阅读 · 1 评论 -
brpc线程模型和网络模型
brpc线程模型和网络模型1. 简单介绍本文主要介绍brpc的线程模型,以及网络请求处理的整个流程。1.1 brpc线程模型简介bthread是brpc使用的M:N线程库,目的是在提高程序的并发度的同时,降低编码难度,并在核数日益增多的CPU上提供更好的scalability和cache locality。”M:N“是指M个bthread会映射至N个pthread,一般M远大于N。由于linux当下的pthread实现(NPTL)是1:1的,M个bthread也相当于映射至N个LWP。bthre原创 2021-03-12 18:16:27 · 6677 阅读 · 0 评论 -
研发过程管理与质量控制
质量控制是研发过程管理非常重要的一环,需要考虑到从需求的产生到最终功能上线,以及后续的运维工作,甚至是故障的处理。方方面面都需要考虑到。具体包含如下环节。需求:需求分析、需求评审、需求排期设计:总体设计、接口设计、详细设计、邮件讨论、方案评审、signoff机制实现:功能开发、单元测试、开发冒烟、性能自测、CodeReview、提测邮件测试:用例评审、功能测试、性能测试、异常测试、稳...原创 2019-10-22 09:46:59 · 2866 阅读 · 0 评论 -
C++14 lambda 简介
C++ 的最新版本,C++14 于2014年8月通过了。C++14 带来了一些期待已久的变化,比如auto类型可以作为函数返回值类型,通用的lambda表达式——也是本篇文章的主题。C++ 中的 lambda,在 C++11 标准中就有介绍。主要是为了书写更简洁,还有就是匿名函数用以代替函数对象,避免单独创建一个 class 和一个函数定义。这里有一个 C++11 lambda 用法的典型例子翻译 2014-08-29 11:36:56 · 4253 阅读 · 1 评论 -
lua table 库介绍
table库是由一些辅助函数构成的,这些函数将table作为数组来操作,本文主要介绍table的常用函数。原创 2016-03-02 11:42:49 · 1066 阅读 · 0 评论 -
openresty--基于redis实现一个动态路由
本文的一个例子主要介绍如何利用redis实现对请求头中User-Agent修改已达到路由到两个不同的http后台的目的。这个例子使用了这些openresty组件: Redis2 Nginx Module, Lua Nginx Module, Lua Redis Parser Library, 和 Set Misc Nginx Module。翻译 2016-04-15 10:21:58 · 7567 阅读 · 0 评论 -
openresty--centos7下开发环境安装
openresty--centos7下开发环境安装原创 2016-04-18 11:31:50 · 6990 阅读 · 0 评论 -
centos7 systemtap 介绍
systemtap原创 2016-05-27 17:26:19 · 2272 阅读 · 0 评论 -
HBase1.0+ java-api 介绍
在网上查了hbase的java client api的介绍,发现很多都是之前的版本,虽然现在还可以运行,但是里面有很多不建议使用(@deprecated)的class及相关方法。其中很关键的就是增加了`Connection`类,使其给人感觉更像一个专业的客户端api,还有就是用`Admin`替换了`HBaseAdmin`,还有一些细节上的修改。原创 2016-07-07 10:32:59 · 3006 阅读 · 0 评论 -
openresty-lua代码的语法检查
lua 代码的语法检查可以如下命令:$ luajit -bl foo.lua > /dev/nullref: https://github.com/openresty/lua-nginx-module/issues/436原创 2016-07-21 15:08:38 · 3185 阅读 · 0 评论 -
影响cache的几个http头部
Http的Cache机制总共有4个组成部分:Cache-Control、Last-Modified(If-Modified-Since)、Etag(If-None-Match) 、Expires原创 2017-07-07 20:11:53 · 718 阅读 · 0 评论 -
Nginx range过滤器整形溢出漏洞 (CVE–2017–7529)预警分析
Nginx range过滤器整形溢出漏洞 (CVE–2017–7529)预警分析:当使用nginx标准模块时,这允许攻击者如果从缓存返回响应,则获取缓存文件头,黑客可以通过缓存文件头获取包含IP地址的后端服务器或其他敏感信息,从而导致信息泄露。原创 2017-07-28 19:04:25 · 5798 阅读 · 0 评论 -
利用Nginx的resolver实现动态upstream
之前写了篇文章用openresty实现了一个动态路由,虽然说是动态的,但是实际上还是需要将upstream在配置文件中写好,还是相当于静态的。最近工作中有这方面的需求,upstream是完全动态,由客户端来指定,开始的时候有一些错误,最后通过resolver指定dns服务来完成,具体流程如下。1. 开始采坑nginx的配置如下:worker_processes 1;events { wor原创 2017-09-15 00:01:13 · 39373 阅读 · 2 评论 -
openresty-IP字符串转数字
IP字符串转换成数字原创 2016-06-28 11:44:56 · 2083 阅读 · 0 评论 -
netty系列2-Linux网络IO模型
1. 阻塞和非阻塞阻塞和非阻塞描述的是IO函数,指访问某个函数时是否会阻塞线程(block,线程进入阻塞状态)2. 同步和异步同步和异步描述的是执行IO操作的主体是谁同步是由用户进程自己去执行最终的IO操作异步是用户进程自己不关心实际IO操作的过程,只需要由内核在IO完成后通知它既可,由内核进程来执行最终的IO操作3. IO分类3.1 阻塞IO模型阻塞IO指的是用户调用读写方法是阻塞的原创 2017-11-09 19:30:25 · 394 阅读 · 0 评论 -
netty系列3-Java BIO编程
网络模型基本的模型是client/server模型,client进程和server进行通信,server端做绑定IP,并绑定端口;client端向服务端监听的地址发起连接请求,通过三次握手建立连接。如果建立成功,双方就可以通过socket进行通信。原创 2017-11-10 10:17:33 · 369 阅读 · 0 评论 -
netty系列1-JAVA IO演进之路
在JAVA1.4之前的版本,JAVA对I/O的支持并不完善,基于JAVA所有的Socket通信都是同步阻塞模式,这一模式虽然简化了开发难度,但是在性能和可靠性方面存在着巨大的瓶颈。在很长一段时间里,大型的应用服务器都是采用C/C++开发的。采用Java BIO开发的服务端软件只能通过不断扩容来满足高并发和低延迟,极大的增加了企业的成本。原创 2017-11-08 11:40:12 · 616 阅读 · 0 评论 -
消息队列使用场景汇总
在工作中经常会用到消息队列(MQ),消息队列适用的场景有哪些呢?消息处理的方式有哪些?1. 功能场景解耦削峰填谷最终一致性广播消费无限重试2. 消息处理exact onceat least onceat most once3. 其他TODO...原创 2018-06-23 14:26:08 · 457 阅读 · 0 评论 -
在Linux中利用mmap模拟Windows的VirtualAlloc
主要利用mmap中的匿名映射来实现。VirtualAlloc的Linux实现如下:// 预留内存(相当于Windows-VirtualAlloc的MEM_RESERVE)。// 用mmap映射一块private、anonymous、non-accessible的内存。// 下面表示从0x10000000开始,预留1GB的内存void* result1 = mma原创 2013-06-18 17:22:26 · 5339 阅读 · 2 评论 -
Pinot架构介绍
Pinot 是一个实时分布式的 OLAP 数据存储和分析系统。LinkedIn 使用它实现低延迟可伸缩的实时分析。Pinot 从离线数据源(包括 Hadoop 和各类文件)和在线数据源(如 Kafka)中攫取数据进行分析。Pinot 被设计是可以进行水平扩展的。原创 2015-07-03 15:11:33 · 4789 阅读 · 0 评论 -
github 的一些问题汇总
github 的一些问题汇总原创 2015-07-09 14:37:31 · 789 阅读 · 0 评论 -
数据库系统——一种存储定长数据的索引结构--Index File
一种基于索引的存储定长数据的结构1前提条件:record定长record是按顺序存储的2架构图:DataPage:主要存放定长record,假设一个page能存放k个record;IndexPage:主要存放DataPage的pageID,pageID也是一个定长结构,假设一个IndexPage能存放m个pageID;HeadPage:主要存放第一个IndexPage和原创 2013-05-18 19:38:53 · 1740 阅读 · 0 评论 -
一些软件设计的原则
转自:陈皓的博客:酷壳 – CoolShell.cn1.DRY——Don’t Repeat Yourself 很好理解,对重复的代码进行抽象封装。2.KISS——Keep It Simple, Stupid 把一个事情搞复杂是一件简单的事,但要把一个复杂的事变简单,这是一件复杂的事。3.Program to an interface, not an implementa转载 2014-03-07 15:42:21 · 1759 阅读 · 0 评论 -
CopyOnWrite容器
设计思路:在修改容器的时候,先将原来的内容copy到一个新容器里,然后在新容器里进行修改,修改成功之后,将容器指针指向新容器指针。这是一种读写分离的方法,读和写不同的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。示例代码:#include #include templateclass CopyOnWri原创 2014-03-14 09:29:17 · 2218 阅读 · 0 评论 -
lua 和 C 语言进行交互 —— 如何传递table
方法1:采用 lua_pushstring/lua_pushnumber 传递key、value,然后通过 lua_settable 设置 table 中的kv对,like this: lua_pushnumber(L, 1); lua_pushstring(L, "value1"); lua_settable(L, -3);原创 2014-05-12 09:55:02 · 17651 阅读 · 0 评论 -
c/c++ 中的volatile分析
volatile 具有下面的特点:1.易变的;2.不可优化的;3.顺序性; 1) volatile变量之间能保证顺序性(编译时); 2) volatile变量之间可能会出现乱序;但是,执行时是否顺序执行,这要依赖于CPU内存模型;原创 2014-07-25 11:06:42 · 676 阅读 · 0 评论 -
GetComputerName和SetComputerName在Linux下的实现
Windows环境下的定义://获取本地主机的主机名BOOL WINAPI GetComputerName( _Out_ LPTSTR lpBuffer, _Inout_ LPDWORD lpnSize);Linux下的对应的实现:#include #include //gethostname#include //HOST_NAME_MAX #i原创 2013-06-03 19:38:37 · 2171 阅读 · 0 评论 -
有意思的C语言面试题
1. 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果A选手说:B第一,我第三。B选手说:我第二,E第四。C选手说:我第一,D第二。D选手说:C最后,我第三。E选手说:我第四,A第一。比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。解:#include int main(){ for(int a=1; a<=5; a++)原创 2013-08-25 17:03:34 · 2448 阅读 · 3 评论 -
C中与时间有关的函数
ref:http://bbs.youkuaiyun.com/topics/300190357、mark一下。总是在这里问问题,帮大家搜集些资料:C语言时间函数应用摘要:本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数转载 2014-03-22 23:48:34 · 818 阅读 · 0 评论 -
将ffmpeg改造成一个可以链接的library
一、事件起因:最近有个项目,需要搞音频格式转换,需要满足一下功能:1. amr wav2. amr mp33. 已接口加动态库的形式提供上面1和2的功能在网上搜索了很久,没有找到合适的library。在找的过程中发现ffmpeg能实现1和2的功能,但是它不满足3的功能,所以有了将ffmpeg改造成library。二、改造的步骤:1. 提取必要的参原创 2014-04-24 12:21:22 · 1775 阅读 · 0 评论 -
lua 中随机种子的设定
该文主要介绍 lua 中设置随机种子的方法,这些方法也可用到其他的编程语言中。原创 2015-01-15 09:20:41 · 10891 阅读 · 2 评论 -
Linux中使用ptrace获取pthread线程的寄存器信息
1.与本文相关的有这几个重要的函数:pthread_create:创建线程pthread_self:获取当前运行的线程的线程ID (The pthread_self() function returns the ID of the calling thread.)getpid:获取当前进程IDgettid:获取当前运行的线程的线程ID(gettid() returns the ca原创 2013-07-12 20:28:42 · 7275 阅读 · 6 评论 -
libhdfs 的C API
1.概述libhdfs是基于JNI的hdfs的C应用接口。它提供了通过C接口访问HDFS的功能。libhdfs库是Hadoop发行版中一部分,已经编译好了,所在位置一般是${HADOOP_HOME}/lib/native/libhdfs.so 。不同的版本库文件所在位置稍微不同。2.APIlibhdfs中的没有API描述一般在hdfs.h中,该头文件的位置一般在${HADOOP_H原创 2014-02-14 16:25:37 · 6805 阅读 · 0 评论 -
Python yield使用浅析
Python yield使用浅析转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/index.html?ca=drs-初学 Python 的开发者经常会发现很多 Python 函数中用到了 yield 关键字,然而,带有 yield 的函数执行流程却和普通函数不一样,yield 到底用来做什转载 2014-01-10 15:24:04 · 1023 阅读 · 0 评论