git命令使用

新工作中由于是在linux环境上写代码,因此原来使用小乌龟提交代码的方式不再适用,因此利用空余时间学习git命令行的使用。
命令行向github推送代码,先在github上创建了仓库:

echo "#hello,world" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:52coder/hello-world.git
git push -u origin main

查看系统上下文切换数

[root benchmark]#vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r   b    swpd    free     buff     cache     si   so    bi    bo   in   cs  us sy id wa st
 1  0    780 1635748   2192 1589420    0    0     0    12    6   21  0  0 100  0  0
 0  0    780 1635496   2192 1589420    0    0     0     0  126  151  0  0 100  0  0
 0  0    780 1635236   2192 1589420    0    0     0     0   95  139  0  0 100  0  0
 0  0    780 1635520   2192 1589420    0    0     0     0  112  147  0  0 100  0  0
 0  0    780 1635528   2192 1589420    0    0     0     1   89  136  0  0 100  0  0

cs(context switch)是每秒上下文切换的次数
in(interrupt)则是每秒中断的次数
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数
b(Blocked)则是处于不可中断睡眠状态的进程数

[root benchmark]#pidstat -w 5
Linux 5.13.1-1.el7.elrepo.x86_64 (MiWiFi-RA50-srv)  2021年08月15日     _x86_64_    (4 CPU)

17时19分00秒   UID       PID   cswch/s nvcswch/s  Command
17时19分05秒     0        12      7.37      0.00  rcu_sched
17时19分05秒     0        13      0.20      0.00  migration/0
17时19分05秒     0        17      0.20      0.00  migration/1
17时19分05秒     0        18      0.40      0.00  ksoftirqd/1
17时19分05秒     0        22      0.20      0.00  migration/2
17时19分05秒     0        27      0.20      0.00  migration/3
17时19分05秒     0        38      1.99      0.00  kcompactd0
17时19分05秒     0        40      0.20      0.00  khugepaged
17时19分05秒     0       831      0.20      0.00  irqbalance
17时19分05秒    81       874      0.40      0.00  dbus-daemon
17时19分05秒     0       944      0.20      0.00  NetworkManager
17时19分05秒     0      1053      0.20      0.00  wpa_supplicant
17时19分05秒     0      1403      0.20      0.00  crond
17时19分05秒     0     19026      0.20      0.00  packagekitd
17时19分05秒     0     19693      0.80      0.00  kworker/0:1-events
17时19分05秒     0     20223      0.40      0.00  sshd
17时19分05秒     0     20508      1.20      0.60  watch
17时19分05秒     0     22985      0.40      0.00  kworker/3:0-mm_percpu_wq
17时19分05秒     0     23020      6.77      0.00  kworker/2:0-events
17时19分05秒     0     23671      2.39      0.00  kworker/1:2-events_power_efficient
17时19分05秒     0     25146     20.72      0.00  kworker/u16:0-phy0
17时19分05秒     0     25666      0.20      0.00  pidstat

cswch:表示每秒自愿上下文切换(voluntary context switches)的次数
nvcswch:表示每秒非自愿上下文切换(non voluntary context switches)的次数
所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。

智能指针与裸指针

#include<iostream>
#include<memory>
typedef struct Sample {
    Sample() {
        internalValue = 0;
        std::cout<<"Constructor"<<std::endl;
    }
    ~Sample() {
        std::cout<<"Destructor"<<std::endl;
    }
private:
    int internalValue;
}Sample;
int main()
{
    {
        Sample * rawPtr = new Sample();
        std::shared_ptr<Sample> ptr_1(rawPtr);
        {
            std::shared_ptr<Sample> ptr_2(rawPtr);
        }
    }
    return 0;
}

review同事写的代码发现了一个问题,上面的代码将裸指针赋值给ptr_1,然后又赋值给ptr_2,ptr_2离开作用域时会释放rawPtr,ptr_1离开作用域时也会释放rawPtr,导致double free程序奔溃,clion运行结果:

Constructor
Destructor
Destructor
leetcode(38041,0x107180e00) malloc: *** error for object 0x7f87edc05960: pointer being freed was not allocated
leetcode(38041,0x107180e00) malloc: *** set a breakpoint in malloc_error_break to debug
Process finished with exit code 6

kafka入门

kafka入门教程

C++ map踩坑

#include <iostream>
#include <unordered_map>
#include <string>
int main() {
    std::unordered_map<int,int> map;
    int x = map[10],y = map[20],c=map[30];
    for(auto it:map)
        std::cout <<it.first <<"::"<<it.second<<std::endl;
    return 0;
}

上面的代码会导致bug,原因是如果map为空,仅仅访问元素也会创建map,如果此时多个线程读写会导致问题,工程中遇到此类问题导致的dump.