一、学到的命令和工具
查看堆栈信息
使用-g 编译打开调试信息,gdb ./main ./core 查看 core dump,bt,具体堆栈信息查看。
frame 是切换栈帧,info locals 查看局部变量,p 是查看某一个具体的。
查 cpu 使用率
top 查看全部进程的情况,top-H-p 进程号查看进程的线程 cpu 使用情况,perf 工具定位到函数
二、算法
主要是和链表相关的题目,包括链表的翻转的三个(直接翻转,从 left 到 right 和 k 个一组)
链表一般都是需要加一个 dummy 在头部记录开始位置,这是一个技巧,另外就是 k 个一组的解法可以使用 left right 这个扩展去写。
第二种是链表合并,两个链表合并就是直接循环就可以,是归并的思想,多个链表合并,可以两两合并,采取分治的思想,也可以逐个的两个两个结合,也可以用最常用的,优先队列。
拓展一下,因为我使用的是 cpp
priority_queue〈ListNode*,vector 〈ListNode*〉,decltype (cmp )〉pq(cmq );.这里的 cmp 我是写的 lamBda 表达式
auto cmp= \[\](ListNode*a,ListNode*b){return a-〉val〉b-〉val;};
通过这件事可以看出来,因为 pq 要求第三个参数是仿函数,所以 cmp 本质上是通过方函数类实现的。
这个在之前面试的时候被问过,是否知道 lambda 是怎么实现的,当时猜测就是通过仿函数实现的。
第三个是双指针类题,这种也是链表题常见的解法,常见于判断是否有环,删除倒数第 N 个节点。
三、中间件相关知识
因为之前面试有被问过是否了解 kafka,当时是听过但是具体是干嘛的不清楚,被问过两三次是否知道消息队列,后来知道消息队列可以处理高并发问题,可以作为进程间通信的方式。
kafka,是一种分布式流平台,主要作用包括异步处理、解耦、削峰,对于消费者来不及处理的可以暂存在队列,对于同步操作生产者处理,异步操作可以交给消费者来解耦,kafka 使用 topic 和 partition 去存储,然后消费者去消费。
写到这里就回顾一下进程间通信方式吧(主要是六个),套接字,共享内存,管道,消息队列,信号量和信号,其中共享内存是很高效的但是要自己去做同步,管道包括匿名管道和非匿名管道,匿名管道只能在有血缘关系的进程间通信,父子进程通信。