简单说,惊群是因为多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),当事件发生时,就会唤醒所有等待的(休眠的)进程(线程)。但是事件只能被一个进程或线程处理,而其他进程(线程)获取失败,只能重新进入休眠状态,这种现象和性能浪费就叫做惊群
linux下 C++ 使用 epoll 多路复用 实现高性能的tcpserver
linux系统中,实现socket多路复用的技术有select 、poll 、epoll 等多种方式。这些不同方式个有优缺点和适用场景,这不是本文讨论的重点,又兴趣的可以自己搜索学习一下。但是在高并发场景下, epoll 性能是最高的, Nginx 都听说过吧,大名鼎鼎的Nginx 底层用的就是 epoll。
go 使用 pprof 排查内存泄露
go 是自带gc的语言,会自动管理内存,不用像C/C++那样,需要程序员手动释放内存,不用手动管理内存,就能少掉很多头发
linux下通过rpath解决cmake动态编译后找不到动态链接库问题
前段时间写了一篇《使用cmake构建C/C++项目和动态库》的文章,但是直接通过cmake编译链接后,会有一个问题,那就是需要的.so文件不能更改目录,一旦.so文件目录变了,整个程序就没法运行了,这肯定是不行的。
使用cmake构建C/C++项目和动态库
编译C/C++文件时,很多时候都是直接使用像 gcc main.c
或者 g++ main.cpp
这样的命令编译的。但是代码文件多了后,这样编译就很困难了。这时候 就出现了MakeFile
这个工具。
MakeFile 解决了多个文件编译难的问题,有了MakeFile,只需要在MakeFile的目录中 运行一下make
命令, 编译就会自动完成。但是编写MakeFile又很啰嗦,于是聪明的程序员们有开发了一个工具,自动生成MakeFile 文件,cmake
的作用就是自动生成MakeFile。毕竟写cmake要比写MakeFile要简单很多
golang使用unsafe包实现指针运算操作private
golang中是有指针概念的,但是go中的指针功能被限制了,不像C/C++中那样,可以对指针进行运算
比如在C/C++中 *p++
这样是正确的。但是在go中,这样写是错误的。至于go为什么会屏蔽指针的运算,比较多的一种说法是go团队认为指针的运算会带来一些安全问题,再有就是简化语法,所以go直接就不支持指针运算了。
golang造轮子 封装一个简单的http client
近来无事,本着爱折腾的原则,在go原生 http client 的基础上,自己封装了一个go的http client。由于才疏学浅,再加是第一次造轮子,在各位大佬面前献丑了,写的烂的地方,请轻喷。还请各位不吝赐教。
linux shell 脚本 常用的if判断条件
工作中经常需要写shell脚本来处理一些重复的东西,使用脚本自动编译,使用脚本多机器传输文件。
因为不是天天写shell,只是用到的时候写一个,再加上脚本中的if的判断条件有点多,容易忘记,所以做个备忘录,以备不时之需
通过汇编看golang函数的多返回值
golang这门语言,有个比较好的特性,就是支持函数的多返回值。想C,C++,Java等这些语言,是不支持函数多返回的。但是C,C++可以使用传递指针,实现函数多返回。但是,你有没有想过,golang是怎样实现函数多返回值的呢?
我们知道,C,C++是通过寄存器实现函数返回值的,也就是先把返回值写入到一个寄存器中,然后再从寄存器中,读到函数的返回值。golang也是这样实现的吗?
ansible 在参数中传入密码
ansible是一个基于python开发自动化的运维工具,这个工具强大的地方是,被操作的机器上不需要安装任何软件,只需要在发起操作的机器上安装就可以使用了。
而且ansible支持很多模块,还可以基于ansible二次开发,添加自己的功能