自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 使用arthas进行接口性能测试

Arthas 用户文档 — Arthas 3.5.4 文档下载安装arthascurl -O https://arthas.aliyun.com/arthas-boot.jar启动sudo /data/zgc/jdk-11/bin/java -jar arthas-boot.jar选择需要attach的进程,输入1此次修改了recommend.algoframe.recaller.BaseNewCFSimi类的getrecall接口使用arthas的monito.

2021-09-10 10:15:29 807

原创 LogBack指定时间间隔生成日志文件

LogBack指定时间间隔生成日志文件支持小时,分钟,秒比如每2小时,每5分钟,每30秒产生一个日志文件package dao.log;import ch.qos.logback.core.joran.spi.NoAutoStart;import ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy;import lombok.Getter;import lombok.Setter;im

2021-09-08 18:20:25 1151

原创 一个C/C++协程库的思考与实现之协程栈的动态按需增长

https://github.com/DoasIsay/ToyCoroutine对于操作系统的任务(进程或线程)而言,任务所需的栈内存,堆内存,并不是任务启动后或发起内存申请(brk/mmap/malloc/new)后操作系统立即为其分配物理内存,而是先为其在进程的虚拟地址空间中找到一块空闲的空间标记其大小起止地址及访问权限,当CPU真正访问到任务未分配物理内存的虚拟页内的地址时MMU会产生一个内存缺页中断,此时在缺页中断处理中操作系统才会真正的为任务分配一页物理内存并更新进程的页表如何检测协程是否

2020-08-25 21:16:35 551

原创 一个C/C++协程库的思考与实现之协程的errno与信号处理

https://github.com/DoasIsay/ToyCoroutine每个线程都有自己的errno,那么协程是否也需要自已的errno?如果这样写代码,那每个协程要有自已的errno在hook的系统调用中当io读写不能满足时,就进行协程切换,在io可读写返回到用户代码后继续使用errno,此时的errno可能已经不是协程切换前的errno了,因为期间其它协程也会call系统调用,所以因在hook系统调用的代码中,在协程切换前先保存errno的值,因为协程恢复后会先判..

2020-08-24 21:49:37 269

原创 一个C/C++协程库的思考与实现之协程的跨线程负载均衡调度

https://github.com/DoasIsay/ToyCoroutine其实一开始我并不想让ToyCoroutine支持多线程,多进程SO_REUSEADDR其实也挺好的,大家各跑各的互不影响,但在写代码时我又时刻考虑到多线程,毕竟,没有多线程间的同步协作那该是多么的无聊啊,,,我在想当在多线程环境中使用协程库时,比如在一台8核的机器上,创建7个线程(调度器线程),每个线程负责一部分协程的调度执行,如何避免一些线程很忙导致协程调度超时,另一些线程却很空闲处于无协程可调度执行的状态?把忙的

2020-08-23 09:33:37 677

原创 一个C/C++协程库的思考与实现之协程的互斥量与条件变量

https://github.com/DoasIsay/ToyCoroutine在为ToyCoroutine的协程实现互斥量与条件变量时,测试过程中竟然死锁了,代码如下我怀疑是producer,consumer使用了同一个条件变量进行协作导致的,测试时刚好创建了2个consumer协程,1个producer协程,当consumer1协程与producer协程都cond.wait在同一个条件变量时,由于调度原因consumer2调用cond.signal如果每次唤醒的都是consumer1,在最后

2020-08-11 21:48:13 460

原创 一个C/C++协程库的思考与实现之栈溢出检测

事情是这样的,在第一次因协程栈溢出导致的进程崩溃后,过了不知道多久由于代码量的增加,协程的栈又溢出了程序又崩溃了,多线程加协程对使用gdb调试而言并不是很友好,可能我还是不会使用gdb吧,从coredump中基本上找不到什么有助于问题定位的信息,有时候连个函数调用栈都没有,你都不知道运行到那个函数那行代码时出现了问题,如果是刚刚修改了代码程序就崩了,还可以大概确定是修改了的这部分代码出了问题,但是如果修改了很多代码,就需要大海捞针一样,用最原始的调试手段,在每个你觉得可疑的地方去print碰运气于是我决

2020-07-16 22:38:53 923

原创 一个C/C++协程库的思考与实现之协程的简单调度

提供这样的协程使用接口,实在令人,,,0.0.1代码的accept协程只能写的这样丑陋,因为协程创建后立马调度执行占用了CPU,只有当协程读写网络IO将被阻塞时才会主动让出CPU,这时调度器会获得CPU,当有新连接到来时accept协程才会被调度器调度恢复执行,所以要在新创建一个协程前要先保存accept协程的上下文环境做为一个返回点,以便将来返回对于这么丑陋的代码我耿耿于怀,事实是我写代码的水平也确实不怎么样,确实丑陋但我还是想写出像创建多线程那样的代码,比如这样要写出..

2020-06-25 23:09:07 656

原创 linux任务的几种状态

linux任务的几种状态而我们用ps,top看到的线程状态还需要转一下R:任务正在CPU上运行,或已获取除CPU外所有的资源,正在等待调度运行当linux任务无法获取所需资源时,如通过软中断陷入内核态调用会引起阻塞的系统调用read,accept,epoll_wait,select,futex等,不能继续运行下去时会在内核态改变自己的状态为阻塞态,然后进行任务切换S:当阻塞可以被信号中断如net read,net write,accept,epoll_w...

2020-05-31 21:45:11 1648

原创 关于java线程状态的一点小小的疑惑

事情是这样了,一个月黑风高的晚上,窗外的冷空气是那么的可口解渴,让人沉浸地无法自拔,人们都沉沉的睡去了,它正贪婪地,,,,突然,,,,我这kafka不消费数据,是这个问题引起的?看着不像,正说着发来了线程堆栈看着不像kafkaConsumer的线程栈啊,其实另一张图有就不发了没啥看头如此如此这般这般,,,,,,,,,,,,,,,,,,,,,,最后同事那边说是卡在与数据库通信上了也不是kafka消费的问题但是,我看那个java线程的函数调用栈跟状态有点怪啊,明...

2020-05-30 22:10:45 268 1

原创 C++复杂类型-对象及虚函数表在可执行文件的存放位置与初始化时机

C++复杂类型-对象及虚函数表在可执行文件的存放位置与初始化时机使用objdump -D -C反汇编-D会输出所有段,-C可以看到代码中的变量名rodata 只读数据段可看到只读数据段中有虚函数表(虚函数表的第一个4字节是空的,第二个4字节存放是typeinfo的地址,第三个4字节存放的是Test类的虚函数fun的地址),和用于RTTI的Test类的类型...

2020-05-01 13:31:12 438

原创 如何使一个正在运行的进程慢下来?哦,不,是暂停

sleep?renice?ionice?连着上了两周班,搞的闷了一脸痘,右下巴起了个大包,现在还没好,为了谁?为了兄弟姐妹不流泪?那个周六还是我生日啊,我加班到了23点,在路边吃了碗西红柿鸡蛋面就解决了,真是惨。第二天一大早又跑过去,我招谁了,惹谁了,有时候真是十分讨厌工作这么认真,这么敬业的自己,为什么就不能不负责点,,,OK, this is a long story, let`s c...

2020-01-09 23:42:26 487

原创 你知不知Java如何解析C++通过tcp socket传过来的结构体啊

你:知不知道Java如何解析C++通过TcpSocket传过来的结构体啊我:知道啊不久前,接到一个任务,使用Java写一个flume的TcpSource做为服务端,用于接收C++客户端程序发送的未序列化的C++结构体并解析成Java对象,要完成这个需求的开发,首先需要了解一点点,结构体内存对齐,字节填充,CPU大小端及网络字节序,然后就是一点点反汇编,会写点点C++ /Java代码,会简单的使...

2020-01-01 22:40:43 2194 9

原创 一条debug日志引发的性能问题排查

又到周天了啊!每次到周天都会有问题啊啊啊!加班,加班,呃呃呃,本来已经想好了,这个周天,红烧老鳖,搞点豆瓣酱爆出红油,再来点青红二荆条什么的,最后撒上葱花香菜,哇!肯定好看又好吃。但是,XXX啊这个问题你要解决啊,下周大家都等着用数据。。。。。我不知道大家知不知道?反正我身边的程序员一般都是特别敬岗爱业,长的特别好看,说话特别好听,职业道德又特别高尚的人,电话秒接,信息秒回,一年365天,...

2019-12-09 00:22:30 2031

原创 C++基本类型-变量在可执行文件中的存放位置及初始化时机

C++基本类型-变量在可执行文件中的存放位置及初始化时机环境如下如下代码使用objdump -D -C反汇编-D会输出所有段,-C可以输出变量名rodata 只读数据段只读数据段中存放了全局字符串常量char *f="123456"的值局部字符串常量char *k="abcdef"的值全局变量const int d=3...

2019-12-01 21:08:52 615

原创 网络问题的排查解决

一条很有用的命令解决tcp数据发送积压问题netstat -anpt|grep 2181|awk ‘{if($2!=0||$3!=0) print $0}’以kafka为例:开源kafka默认配置的据传输端口是2181,kafka server会监听2181端口,等待客户端连接,netstat -anpt的输出所有的tcp连接信息netstat -anpt|gre...

2019-09-07 23:38:13 3001

原创 我遇到的字符编码的那些坑

我遇到的字符编码的那些坑如图创建utf8.c源文件并以utf-8编码保存编译运行后把文件拷到windows用UE打开并查看其16进制值查看哈字的UTF-8 16进制编码值,可以看到,utf8.dat,中的哈字是以UTF-8编码保存的,占用了3个字节如图创建gb18030.c源文件并以gb18030编码保存同样的套路可以发...

2019-09-03 23:44:23 581

原创 用户空间自旋锁实现的思考

我顿悟,不论这个结论是否正确,我还是要以它为指导思想来写点代码,因为我真的想写点并发场景下的东西来验证我这七年来对编程及操作系统的思考于是我又重启了去年六七月分停止的并发编程大业,打开了虚拟机,重启了乌班图,准备大干一场可是啊!原本以为自己对并发编程已经有点了解了,但实际写代码出现问题时还是会一时摸不着头脑,让人信心大措,我准备在userSpace通过gcc原子操作和共享内存实现一个既可以...

2019-09-03 23:41:24 531

原创 Linux内核源码流水笔记之进程的调度运行

Linux内核源码流水导读之进程的调度运行基于linux.2.0 源码内核通过schedule函数完成进程的任务调度通过switch_to宏完成进程切换do_bottom_half();run_task_queue(&tq_scheduler);完成中断下半部任务,如网卡接收到一个完整的包后将触发中断,cpu响应中断调用网卡驱动程序分配一个sk_buff从网卡缓冲区拷贝此包到s...

2019-09-02 22:48:40 206

原创 基于共享内存的HashMap的思考

基于mmap共享内存实现既可用于多进程又可用于多线程的无需持久化的并发HashMap,我们就叫它SharedHashMap吧!基于mmap共享内存实现既可用于多进程又可用于多线程的无需持久化的并发SharedHashMap使用mmap把文件内容映射到进程的虚拟地址空间,在这块虚拟地址空间中实现一个HashMap每个进程都会使用mmap把Nodes文件做...

2019-08-28 13:11:41 1544 1

原创 Linux内核源码流水笔记之进程的创建

Linux内核源码流水笔记之进程的创建基于linux.2.0 源码内核通进调用do_fork(clone_flags, newsp, &regs);创建一个进程参数clone_flags表明了子进程要与父进程共享的资源,参数struct pt_regs结构体保存了用户态下进程使用的cpu寄存器信息,在内核态父进程会从do_fork返回到用户态,子进程不从do_fork返回,但父...

2019-08-27 22:23:34 260

原创 并发编程的尝试之volatile的困惑

去年在使用C++实现一个线程安全的HashMap时,当我实现了HashMap,准备引入锁时,面对这么多共享的变量,我竟一时不知那些变量该使用volatile去声明,volatile一个在我大学毕业前就自认为搞的烂透的一个概念,当有人问我volatile时,我会从GCC编译器是如何实现volatile的,再到CMP,SMP,架构下CPU是如实现数据的可见性,及缓存一致性协议,内存栏栅。但在二年后的去...

2019-08-24 18:34:04 181

原创 c++中new与delete,new[]与delete[]

你不知道的c++之new与delete和new[]与delete[]有如下代码反汇编如下查看代码发现并没有什么不同因为int类型在c++中不是对象,在构造时不需要调用构造函数,销毁时不用调用析构函数,所以直接分配,回收空间就行了修改代码如下反汇编如下看到区别了?发现编译器在遇到非内置对象使用new和new[]与内置对象...

2019-07-09 21:15:52 167

原创 0拷贝实现C字符串原地分割

     如果你曾经写过几天python代码,你将不会再轻易喜欢上另一种新语言。你感觉它们简直是丑爆了于python而言,从名字上它们就已经败了,虽说什么语言,都无所谓,关键是合不合适,但谁TM还没个最爱?对没错,我太简直是太爱C语言了,,,在python 中要分割一个字符串是这样来操作的  用过python 的str类再用c++的string类,你会发现c++的string类竟然没有split函...

2018-04-02 22:41:51 546

原创 误人子弟篇之C语言函数返回值与参数传递

写篇博客证明还干着程序员这勾当,并乐此不疲,,,写在开头以免看到结尾你骂人,此篇博客纯属瞎扯,看看就可以了,不要当真哦!如果搞过汇编,写过子程序,那么你就不用看了,因为看到最后你会发现,在汇编中你有很多方法去返回值,传递参数,而在高级语言中,编译器只是选择了其中的一种而已,而这篇博客也写的毫无逻辑,简直丧尽天良,草菅人命,道却也有那么点点意思,如果你能看完我就,,,

2017-07-13 17:49:29 7874 2

原创 误人子弟篇之C++为什么对引用变量取地址得到的是被引用变量的地址

C++引用编辑同义词@#Protect@#一般指C++引用引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;(1)&在此不是求地址运算,而是起标识作...

2015-10-22 10:54:01 12085 2

原创 用指针去修改const变量的值

怎样修改c++中被const修饰的变量?你要知道的一点是,编译器在遇到const关键字修饰的变量后并没有在每次使用该变量的代码前插入检测代码,检测是否对其进行写入如果是则禁止对其修改,。其实是在编译期间编译器在遇到const声明的变量后会把此变量记录下来(我猜测的可能就是这样),比如表,每当遇到为一个变量赋值时就查表如果表中有此变量则给出警告(只是我猜测),而编译器也没有禁止我们对一个const变...

2015-09-21 15:46:32 1527

原创 win7交换机共享宽带连接上网

交换机共享宽带连接交换机怎样共享宽带连接?如果你照着网上的方法试了N次仍无法共享,那么就试下192.168.137.1大一的时候就照着网上怎样用交换机共享宽带的方法试了无数次,怎么试都无法成功。今闲来无聊就又试了一下,竟然成功的,其实和网上的所有方法都一样,,,,,,首先我们打开宽带连接的属性直接设置共享 会出现错误,提示说,Internet连接共享无法开启,一个本地连接已经被

2015-09-21 14:46:56 2895

原创 你不知道的位操作之整数取余

你不知道的位操作之整数取余 对任一整数x,nx%2n=x&(2n-1)对于整数的2的倍数的乘除法我们可以通过位的右移算术左移来实现,那么对于整数除以2n的余数怎么用位操作来实现?在看编程珠玑一书中实现的位向量时,发现了x&0x1f怎么都想不通这是干什么的?最后编写代码试了下,竟是对任意一个整数除32取余,最后用二进制研究了下,当然我们不必真的去写32个0和1的二进制

2015-09-15 23:04:54 3074

原创 shellcode

写过shellcode的都写过这样的语句,unsigned char shellcode[]={}; ((void (*)())(&shellcode))();然而输出shellcode,&shellcode, &shellcode[0]它们的值却是一样的,但在这里为什么却只能用&shellcode?如果将它们自身的值各自增一再输出你就会看到不同的结果,这是为什么?现以window

2015-09-15 21:22:22 723

原创 Java中static为什么不能修饰局部变量?

Java中static为什么不能修饰局部变量?问这样问题的人显然是学过c/c++的,因为在c/c++中static是可以修饰局部变量的如果你对这个问题百思不得其解,怎么都想不明白,你还是不要想了,因为没有什么为什么。不能就是不能,人为规定的规则罢了。如果你非要知道个为什么?我不介意在这误人子弟一下,,,,,, 首先让我们来看一下c语言中static的作用1.

2015-09-15 20:03:28 11685

原创 C++之对象内存分配

C++之对象内存分配在c++中类在实例化一个对象时,只为对象分配了存放成员变量的空间,如果类中存在虚函数那么还会分配一个指针大小的空间去存放指向虚表指针现在让我们来看看在c++中编译器是怎样为对象分配空间的其实和为结构体分配空间是一样的,分配一块能容纳所有成员的空间,成员按类中声明出现的先后顺序以次排列放在空间中 查看其反汇编代码 会看到编译器在栈上为其分12个字节的空

2015-09-14 09:34:52 1092

原创 new与malloc()的区别

new与malloc()有什么区别在c语言中在堆上动态分配一块空间我们可以用malloc()等函数,在c++中我们可以用new,那么new与malloc()函数有什么不同?int*p,*qp=(int*)malloc(sizeof(int))q=newint可以看到1.malloc()函数的返回值要经过转换后才能使用而new可直接使用2.malloc()是个...

2015-09-10 08:48:20 850

原创 c语言与c++函数调用区别

c语言与c++函数调用区别有如下代码class father{private:int a;public:father(int b){a=b;}void ADD(int a){}};void add(int a){};int main(int argc, char* argv[]){father a(1);a.ADD(1);add(1);r

2015-09-10 08:23:06 1158

原创 C++函数调用之thiscall

C++函数调用之thiscall所有c++对象共享类中的一份代码拷贝,那c++是怎么实现对每个对象的数据的正确操作?这就要归功与c++的thiscall, C++会为每个类成员函数传递一个this指针即指向被操作对象的地址做为成员函数的隐含参数(被static修饰的除外 ) 下面让我们来看看thiscall在c++中到底是怎么实现的,,,有如下代码 查看反汇编代码

2015-09-09 20:20:00 4014 1

原创 C语言之指向数组的指针

C语言之指向数组的指针int a[3],*p;p=a;正确int b[2][3],**q;q=b;错误初学c语言时总会这样声明一个指向二维数组的指针,按一维数组与一级指针的关系,二维数组与二级指针也应该有这样的关系呀,,,,,,,怎么会错?要解决这个问题首先让我们来研究下一维数组的数组名与一级指针的含义int *p表示p是一个指向int类型的指针int a[3]

2015-09-09 15:28:10 1033

原创 C语言之函数调用

你不知道的C语言之函数调用-栈帧学过汇编的都知道在汇编中子程序调用是怎样实现的那高级语言中的函数调用是怎样实现的?通过栈帧,什么是栈帧?栈帧是函数调用的过程记录栈帧是怎么实现的?有如下代码 反汇编代码如下 我们发现在call指令调用add函数前进行了两次push 操作把add函数所需的参数压入栈中,这就是调用前的准备工作,而add esp,8指令是函数调用后

2015-09-09 15:16:28 1428

原创 你不知道的c语言之为什么数组的大小不能是变量

你不知道的c语言之为什么数组的大小不能是变量不知道是编译器是这样实现数组的还是c语言是这样规定数组的有如下代码 反汇编代码如下 我们从上面的反汇编代码可看到编译器会把int a=3,编译为 mov dword ptr[ebp-4],3虽然变量a 的值是3(这只是你认为的,其实程序不运行它的值是未知的vc6.0下为0),但在编译期间编译器为变量a分配的栈空间dword ptr

2015-09-09 15:09:02 2434

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除