From ff05bc11c27fbe29791d98e543023c9a04b76287 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sat, 25 Jul 2020 20:52:42 +0800 Subject: [PATCH] Update --- README.md | 91 +++++ ...15\344\275\234\345\221\275\344\273\244.md" | 353 ++++++++++++++++++ 2 files changed, 444 insertions(+) create mode 100644 "docs/linux\345\270\270\347\224\250\346\223\215\344\275\234\345\221\275\344\273\244.md" diff --git a/README.md b/README.md index 7052a8c..e81c8ab 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,23 @@ # 编程语言C++ * [大厂程序员教你如何学习C++(内附学习资料)](https://mp.weixin.qq.com/s/Gwtu4mc43YVFlX46yu_WDg) +* C++: volatile static const extern等关键字 +* 常用库函数实现 + * malloc,strcpy,strcmp的实现,常用库函数实现,哪些库函数属于高危函数 +* STL原理及实现 +* 虚函数的作用和实现原理,什么是虚函数,有什么作用? + * 纯虚函数,为什么需要纯虚函数? + * 为什么需要虚析构函数,什么时候不需要?父类的析构函数为什么要定义为虚函数? + * 内联函数、构造函数、静态成员函数可以是虚函数吗? + * 构造函数中可以调用虚函数吗? + * 为什么需要虚继承?虚继承实现原理解析, + +* C++ 内存分配机制 +* 指针 + * 迭代器与普通指针有什么区别 + * C++的智能指针及其原理 +* override和overload的区别 +* 写string类的构造,析构,拷贝函数 # 数据结构与算法 * [leetcode面试高频题目题解](https://github.com/youngyangyang04/leetcode-master) @@ -27,6 +44,80 @@ * [这五道数组相关的面试题,你一定要会!](https://mp.weixin.qq.com/s/vdKHt2vFSZEouZASjdWieg) * [关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/g8N6WmoQmsCUw3_BaWxHZA) + +# 设计模式 + +* [C++设计模式](https://github.com/youngyangyang04/DesignPattern) +* C++单例模式 +* 用C++设计一个不能被继承的类 +* 如何定义一个只能在堆上定义对象的类?栈上呢 +* 重类构造和析构的顺序 + +# 操作系统 + +* linux的内存管理机制,内存寻址方式,什么叫虚拟内存,内存调页算法,任务调度算法 +* 锁:互斥锁,乐观锁,悲观锁 + * 死锁必要条件及避免算法 +* 动态链接和静态链接的区别 +* 常见的信号、系统如何将一个信号通知到进程 +* linux系统的各类同步机制、linux系统的各类异步机制 +* 如何实现守护进程 +* 标准库函数和系统调用的区别 +* 32位系统一个进程最多有多少堆内存 +* 五种I/O 模式:阻塞I/O,非阻塞 I/O,I/O 多路复用,信号驱动 I/O,异步 I/O + * select 模型和 poll 模型,epoll模型 + * socket服务端的实现,select和epoll的区别(必问) + * epoll哪些触发模式,有啥区别? +* 用户态和内核态的区别 +* linux文件系统:inode,inode存储了哪些东西,目录名,文件名存在哪里 + +# 计算机网络 + +* TCP和UDP区别 +* TCP和UDP头部字节定义 +* TCP和UDP三次握手和四次挥手状态及消息类型 +* time_wait,close_wait状态产生原因,keepalive +* 什么是滑动窗口,超时重传 +* 列举你所知道的tcp选项 +* connect会阻塞检测及防止,socket什么情况下可读? +* socket什么情况下可读? +* connect会阻塞,怎么解决?(必考必问) +* keepalive是什么?如何使用? +* 长连接和短连接 +* UDP中使用connect的好处 +* DNS和HTTP协议,HTTP请求方式 + +# 数据库 + +* 谈谈数据库中索引的理解,索引和主键区别 +* 现在普通关系数据库用得数据结构是什么类型的数据结构 +* 索引的优点和缺点 +* 系型数据库和非关系数据库的特点 +* 乐观锁与悲观锁的区别 +* 数据库范式:第一第二第三范式 +* 数据库日志类型作用 +* B TREE 和B+TREE的区别 +* union和join + +# 海量数据处理 + +* bitmap +* Map-Reduce原理 +* BloomFilter原理 +* Trie树原理 +* LSM树原理 + +# linux下操作命令以及工具 + +* 编译工具GCC +* 调试工具GDB +* 性能优化工具Perf +* 内存泄露检查工具Valgrind +* makefile编写 +* linux 常用命令 +* netstat,ps,top,df,fdisk,lsof,ifconfig,uname,kill,tcpdump,ipcs,grep + + # 程序员求职 * [简历模板](https://github.com/youngyangyang04/Markdown-Resume-Template) diff --git "a/docs/linux\345\270\270\347\224\250\346\223\215\344\275\234\345\221\275\344\273\244.md" "b/docs/linux\345\270\270\347\224\250\346\223\215\344\275\234\345\221\275\344\273\244.md" new file mode 100644 index 0000000..57459b5 --- /dev/null +++ "b/docs/linux\345\270\270\347\224\250\346\223\215\344\275\234\345\221\275\344\273\244.md" @@ -0,0 +1,353 @@ +# OP + +## CPU + +``` + 有几个cpu cpu num cat /proc/cpuinfo | grep "physical id" | sort | uniq + 一个cpu里有几个core cpu core num cat /proc/cpuinfo | grep "cores" | uniq + 逻辑cpu num cat /proc/cpuinfo | grep "processor" | wc -l or top 然后按 1 + cpu info cat /proc/cpuinfo +``` + +## IO + +``` + iostat -x -d 1 + iostat -x 1 3 就显示三条 + iostat -x 1 100 查看io读写状态,sda 为home盘,sdb为disk1,sdc为disk2 + iotop 看谁在占用IO,tid 为线程id + sudo iotop -P --only 看具体进程实际正在做io的 +``` + +## Memory + +``` + top + free -g/ free -m +``` +## free +![](./media/free-g.png) + +* 第1行Mem数据: + +total 内存总数: 189 +used 已经使用的内存数: 188 +free 空闲的内存数: 0 +shared 当前已经废弃不用,总是0 +buffers Buffer Cache内存数: 3 +cached Page Cache内存数: 149 + +* 第2行-/+ buffers/cache: + +-buffers/cache 的内存数:34 (等于第1行的 used - buffers - cached) ++buffers/cache 的内存数: 154 (等于第1行的 free + buffers + cached) +可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。 +第三行数据是交换分区SWAP的,也就是我们通常所说的虚拟内存。 + +## top +* top 中的VIRT,RES,SHR + +VIRT : +1. 进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间等; +2. 假如进程新申请10MB的内存,但实际只使用了1MB,那么它会增长10MB,而不是实际的1MB使用量. + +RES : +1. 进程当前使用的内存大小,包括使用中的malloc、new分配的堆空间和分配的栈空间,但不包括swap out量; +2. 包含其他进程的共享; +3. 关于库占用内存的情况,它只统计加载的库文件所占内存大小。 +4. RES = CODE + DATA + +SHR: +1. 除了自身进程的共享内存,也包括其他进程的共享内存; +2. 虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小; +3. 计算某个进程所占的物理内存大小公式:RES – SHR; + +## OS + +``` +lsb_release -a 系统版本,操作系统 和 版本 +uname -a +uname -r 内核版本 +``` + +## Disk + +``` +du -sh filename 看文件大小 +df -H 查看各个磁盘空间 +lsblk -d -o name,rota ROTA 1 for hard disks, 0 for ssd +du -h --max-depth=1 列出当前目录所有文件夹的大小 +``` + +## Network + +``` + ethtool xgbe0 查看网卡信息,看网卡是百兆还是千兆,xgbe0是网卡的名字,可以通过ifconfig获取到 + curl ip:port 判断当前ip和端口号是否在监听 + curl -vv 可以看到发出和接受的报头信息等 + curl -v https 访问https + lsof -i:port 列出在监听的端口号 list open files + lsof(list open file) -p pid 列出指定进程打开的文件 (真的有用) + netstat -tunlp | grep port 列出监听的端口号 netstat -tunlp | grep pid 可以看当前进程监听哪些端口 + netstat -nap | grep port 看那些端口被监听 + ping -c 1 www.baidu.com + telnet www.test.com 8090 看这个域名加端口是否可以访问 + host -i IP 根据ip 找域名 + netstat | grep 端口号 看哪个IP在访问这个端口号 +``` + +## Linux + +``` + tar -zxvf 解压 + tar -zcvf output.tar output/ 压缩 + tar -cvf output.tar output/ 打包 不压缩 + tar -tvf test.tar.gz 预览压缩文件夹内容 + ldd 查看一个 应用需要哪些依赖的动态库 + curl url -o obj 下载该url的文件,类似wget + curl -vk https 验证https + vim --version | grep clipboard 看vim是否支持系统剪切板 + ls -lht 看目录下文件大小以K/M/G 单位 + ll -tr 看修改顺序 + /usr/libexec/java_home -V java 路径 + nohup cmd & 在后台运行cmd命令 + ssh -i id_rsa root@ip 使用私钥登录目标机器 + authorized_keys + file 查看文件信息 + strings 查看bin文件下的字符串 + 0 stdin,1 stdout,2 stderr + 2>&1 将标准错误输出到标准输出中tai + nohup myprogram > myprogram.out 2> myprogram.err & 将标准输出到特定的文件,err分开,后台起线程运行 + ctrl+A/ctrl+E 定位到行首行未 + ctrl+U/ctrl+K 删除到行首/行未 + ctrl+R 查找历史命令 + ctags --list-languages 看ctags支持哪些语言 + find ./ -name "*.xml" 递归查找一定要加双引号 + cal -3 / cal -y 查看前一个月后一个月日历/显示全年的 + su - name 切换到该用户,同时加载一些列环境配置,例如bash_profile + sudo su 切root账户 + rsync -av src/ 172.18.188.106:/Users/sunxiuyang/tmp/ 172.18.188.106为目标机器ip,copy src下的文件到目标机器tmp下 + rsync -av src 172.18.188.106:/Users/sunxiuyang/tmp/ 把src这个目录copy过去 + for i in `cat gzns01_all`; do ssh -o StrictHostKeyChecking=no $i "cd /root && sh name_env_setup.sh"; done root 已经是相互信任的 + ln -s jdk-8u161 jdk 软链 + ll | grep taf 查看文件 + sort -k3 -n filename 按照(k3)第三个列 的数字(-n) 从小到大排序 + for i in `cat ip.list`;do host $i;done > tmp 按行读取ip.list文件, 并执行 host操作 + for i in `cat gzns01_all`; do scp -o no StrictHostKeyChecking `pwd`/home_env_setup.sh $i:/root/; done + for i in `cat gzns01_all`; do ssh -o StrictHostKeyChecking=no $i "cd /root && sh home_env_setup.sh"; done + dig www.baidu.com dig命令可以执行查询域名相关的任务 + crontab + rm node.log.* node.log.wf.* -f & 起一个进程删掉 + pstack pid 打印出pid进程下所有的线程栈信息 + jstack -l pid 打印java进程的堆栈信息 + for i in `echo -e "name1\n name2\n name3"`; do echo $i" "$RANDOM; done > ./tmp; cat ./tmp | sort -nk2 随机排序名字 + cat /proc/version + cat /etc/issue + ll /proc/340/fg | grep socket | wc -l 查看fd数量 + uptime 看机器启动时间 + /etc/security/limits.conf 把core文件打开 + ulimit -c 看core文件是否打开 + ulimit -c unlimited 不设置core文件大小 + /var/log/messages 看系统日志 + ls -l /proc/15430/fd/ | wc -l 查看这个进程打开的文件描述符的个数 + cat /proc/sys/fs/file-max 查看系统可打开的最大描述符 + lsof -p 24405 看这个进程打开的fd + netstat -antp | grep 24405 看该进程的链接的情况 + /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 + sysctl -a | grep keepalive 看系统内核是不是那tcp得探活关了 + top -Hp 32554 查看32554进程的线程情况 + lsblk -d -o name,rota 查看磁盘是否是ssd 或者 HDD, 如果ROTA:0 就是ssd + curl http://test.com:8302/metrics -o tmp 把这个url的内容输出到文本里 + export TMOUT=0 不超时 + + asan/pmap 看内存泄漏 + sed 正则,各种替换 + fdisk -l 切换root 账号 看机器链接的磁盘数量 + ls /dev 看机器设备,看有多少块盘 + useradd name 机器添加 name 用户 + passwd name 给name 用户添加密码 + cat /dev/null > fe.log 清空文件 + awk -v RS='' -v ORS='\n\n' '/搜索的词/' 文件名字 搜出关键词所在的段落 +``` + +### user_manager + +``` + useradd testuser 创建用户testuser + passwd testuser 给testuser设置密码 + userdel testuser 删除该用户 +``` + +## git + +``` + git reset HEAD 如果add了的话,全都取消 + git checkout filename 恢复最新版本 + git commit --amend 改变提交的commit message 或者 对同一个提交进行代码上的修改 + git log -p -2 最近两次的修改详细记录 + + git reset test.cpp 如果add了test.cpp,要取消add + git log 查看提交文件的 logid + git log -p filename 查看该文件的提交历史, 可以通过关键字 + git reset --hard ${logid} 回滚该logid的提交(已经commit,没有push)f you don't care about keeping the changes you made + git reset --soft ${logid} use --soft if you want to keep your changes + git diff --stat --cached origin/master 看commit但没有push的文件 + git log --graph 图形化显示 + git branch -d the_local_branch 删除对应分支 + + + git brach tmp 创建一个branch分支,把当天提交记录都保存起来 + git co 当前branch + git lg tmp 查看tmp这个分支的日志 + git cherry-pick commitid 把tmp上某个分支的commit合并到本分支后面 + git cm --amend 把change id 改了,要不把changeid也考到这个分支上,改分支提交合入的时候就会出现问题 + git merge feature-show-create-table-partition 当前分支是feature-show-create-table-partition-info,merge一下feature-show-create-table-partition ,响应的提交也会 merge过来 + git merge feature-show-create-table-partition-info --no-ff + + git co develop + git branch + git diff develop master + git pull --rebase + git branch feature-split-blacklist + git add fe/src + git rebase --abort + git cm + git branch feature origin/feature 把在本地新建一个feature分支并把远端的分支feature同步下来 + + // 分支拉的久远了,和develop上差距比较大,先把把本地备份到 tmp分支 + git rebase develop rebase 本地develop的分支,(我当前的分支是tmp)· + + git format-patch -1 生成对应的patch文件 + git am 0001-Add-delete-range-http-and-rpc-interface.patch + + git branch -d dev 删除本地分支 + git branch -a 显示所有分支 + git push origin --delete dev 删除远端分支 + + git show ce8c290d23ebaf5e1348ff74df5c61a0d8185856 看这个commitid属于哪个分支 + git branch -a --contains 5c64d8be4950b0adc9352de848b1edb915c4ccd4 看远端和本地是否有这个分支 + + + git clone http://github.com/large-repository --depth 1 + cd large-repository + git fetch --unshallow + git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。 + git reset --hard origin/hotfix-leader-balance + git stash + git stash save "save message" 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别 + git stash pop 恢复 + git reset --hard origin/master 恢复到和远端一致 + git show commit_id 可以看到每个文件具体的改动内容 + +``` + +## Mysql + +``` +select count(*) from table_name table记录数量 +select * from meta_tablet_1 limit 1; 取一条看一下 +SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'db_name'; 看该库有多少张表 +SHOW CREATE TABLE tablename 看创建table的语句 +``` +## Gdb + +``` + gdb lib/name_be ~/core.24563 + bt(backtrace) 当前堆栈信息 + f(frame) n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。 +``` + + +## dot + +``` +dot -Tpng test.dot > output.png +dot -Tsvg test.dot > output.svg +``` + +## webserver +* nohup python -m SimpleHTTPServer 8000 & 使用python可以快速搭建一个web服务 + +# Software shortcuts + +## Tmux + +``` + ctrl + b + , 重命名当前窗口,这样便于识别 + . 修改当前窗口编号,相当于窗口重新排序 + " 将当前面板平分为上下两块 + % 将当前面板平分为左右两块 + x 关闭当前面板 + 数字键 切换至指定窗口 + & 关闭当前窗口 + c 创建新窗口 + w 通过窗口列表切换窗口 + 方向键 移动光标以选择面板 + [ "[",此时进入所谓的copy-mode + set -g terminal-overrides For tmux version 2.1 and up scroll up , modify on .tmux.conf + set-option -g mouse on scroll up +``` + +## Taglist + +``` + u 更新taglist窗口中的tag + x taglist窗口放大和缩小,方便查看较长的tag +``` + +## Chrome + +``` + ⌘ + t Open a new tab, and jump to it + ⌘ + 9 Jump to the last tab + ⌘ + Option + Right arrow Jump to the next open tab/ Left arrow for previous open tab + ⌘ + w Closes the current tab or pop-up + Control + Command + F Full screen +``` + +# Java compile + +``` + javac -cp ".:./third-party/*:./lib/*" Sample.java complie with jar + java -cp ".:./third-party/*:./lib/*" Sample run +``` + +# Maven + +``` + ~/.m2/settings.xml This is a reference for the user-specific configuration for Maven. + mvn install download plugin maven need + mvn package compile + ~/.m2/ When maven build is executed, Maven automatically downloads all the dependency jars into the local repository. + mvn package -Dmaven.test.skip=true skip simple test + mvn package -Dmaven.javadoc.skip=true skip doc generator +``` + +# Ack + +``` + +ack -w wordname // Force PATTERN to match only whole words + +``` +# crontab + +``` + crontab –e // open crontab jobs 0 18 * * * sh /home/name/test/test-feature/replica_hot.sh 这里例子就是每天18点执行这个shell + crontab –l // list existing cron jobs + +``` + +# size + +## mysql +5.0版本以上 varchar(20),指的是20字符 +bigint 8个字节 + + +# 排除问题的思路 + +* 查看机器 内存和CPU +* 在看日志 +