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入门
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.
SLA介绍
SLA-(Service Level Agreement)服务等级协议
1) 首先计算全年的总小时数:
365 * 24 = 8760 (时)
2) 3个9的标准
(365 * 24)* (1 - 99.9%) = 8760 (时) * 0.001= 8.76 (时)
3) 4个9的标准
(365 * 24)* (1 - 99.99%) = 8760 (时)* 0.0001 = 0.876 * 60 = 52.56 (分)
4) 5个9的标准
(365 * 24)* (1 - 99.999%) = 8760 (时) * 0.00001 = 0.0876 (时) * 60 = 5.256 (分)