处理器,操作系统,编译器,调试器,语言和工具,网络
目錄
處理器
常用處理器架構、指令集
國產處理器
字長和處理器類型的關系
不同處理器的大小端
查看處理器類型
核與線程之間的關系
如何綁定處理器
基本的匯編原子操作
加減
比較后交換
交換
操作系統
操作系統接口標準,名稱,廠商
有哪些國產操作系統
哪些是實時、哪些是非實時操作系統
設置時間、時區
設置用戶、密碼和文件讀、寫、運行權限
查找文件、字符串及管道操作
遠程連接
ssh
vnc,winscp
命令行,查看內存、磁盤、進程、線程資源使用情況
查看操作系統、Glibc、GCC版本
如何殺死進程
如何查看系統日志
編寫批處理和Shell腳本
Tty切換
輸出stdout\stderror的意義,會重定向
編譯器
編譯器選項,頭文件包含方式、庫連接方式、優化選項
常用編譯選項
頭文件包含和庫鏈接
優化選項
類型未定義、缺少引用解決辦法
優化級別設置
編碼方式配置
并行編譯選項
VS
Windows 、Linux、下查看符號表,dumpbin、readelf、objdump用法
用denpends和ldd查看依賴關系
如何設置導出調試信息
調試器
設置調試斷點
使用快捷鍵操作
查看內存信息
遠程調試
附加部分代碼調試
調試時更改內存值
設置調試斷點條件
使用GDB調試基本程序
查看和調試軟件鎖死原因
語言和工具
SVN基本操作,checkin \check out\ update\add
與SVN特定版本比較,revert到某一個版本
內存對齊
不同語言的接口實現
C++插入C代碼
不同語言版本的主要差異
C++11 && C++98
c98 && c99
網絡
網絡地址、MAC地址查看、配置
Route路由查看
TCP基本原理
TCP頭
三次握手
四次揮手
UDP基本原理
UDP頭
設置不同防火墻
常用軟件默認端口
Wireshark查看過濾網絡包
netstat查看應用綁定的端口
iperf3測試不同協議下的網絡可用帶寬
調整操作系統和網卡的工作模式、緩沖區大小
不同協議包頭大小
后續補充
處理器
常用處理器架構、指令集
CISC:x86、x86_64-litte
RISC:Arm、MIPS(龍芯)、PowerPC-big
國產處理器
mips陣營:龍芯
arm陣營: 飛騰,海思麒麟
IBM powerpc陣營:
宏芯x86:兆芯,申威
字長和處理器類型的關系
計算機字長(機器字長)取決于數據總線的寬度,通常就是CPU一次能處理的數據的位數(CPU位數)。
不同處理器的大小端
Big Endian:低字節存儲在高地址
eg:PowerPC、IBM、Sun
Little Endian:低字節存放在低地址
eg:x86、DEC.
查看處理器類型
uname -m核與線程之間的關系
總的邏輯 cpu 數 = 物理 cpu 數 * 每顆物理 cpu 的核心數 * 每個核心的超線程數
如何綁定處理器
cat /proc/cpuinfo|grep "physical id"|sort -u|wc -l
查看物理CPU個數
cat /proc/cpuinfo|grep "cpu cores"|uniq
查看每個物理CPU中core的個數(即核數)
cat /proc/cpuinfo|grep "processor"|wc -l
查看邏輯CPU的個數
cat /proc/cpuinfo|grep "name"|cut -f2 -d:|uniq
查看CPU的名稱型號
ps -eo pid,args,psr
查看進程運行的邏輯CPU
taskset -c [CPU NUMBER] -p PID
指定cpu
基本的匯編原子操作
加減
mov? ? ?ecx, Addend; mov? ? ?eax, 0FFFFFFFFh;//-1 (mov? ? ? eax, 1;)//+1 lock xadd [ecx], eax; //加-1 dec? ? ?eax;
比較后交換
mov? ? ?ecx, Destination;
mov? ? ?edx, Exchange;
mov? ? ?eax, Comperand;
lock cmpxchg [ecx], edx;
交換
? ? ? mov? ? ? ecx, Target;mov? ? ? edx, Value; label:lock cmpxchg [ecx], edx;//加jnz? ? ? short label;操作系統
操作系統接口標準,名稱,廠商
操作系統 提供了3類型的接口供用戶使用:
| 名稱 | 廠商 |
| posix | IEEE |
有哪些國產操作系統
| 中標麒麟(NeoKylin) | 銀河麒麟操作系統 | inux(Deepin) | 普華操作系統 | 中科方德操作系統 |
| 中興新支點操作系統 | 一銘操作系統 | 優麒麟(UbuntuKylin) | 湖南麒麟 Kylinsec | startOS(起點操作系統) |
| 共創Linux桌面操作系統 | 威科樂恩Linux(WIOS) | 恩普操作系統 | UOS 統一操作系統 | 紅旗Linux |
哪些是實時、哪些是非實時操作系統
????????實時操作系統的實時性是第一要求,需要調度一切可利用的資源完成實時任務。根據響應時間在微秒、毫秒和秒級的不同,可分為強實時、準實時和弱實時三種。強實時系統必須是對即時的事件作出反應,絕對不能錯過事件處理時限。?
實時操作系統:VxWorks、mC/OS-II、RT-Linux、QNX?
非實時操作系統:Linux/Windows
設置時間、時區
查看時間:date
設置時間(年月日):date -s 3/29/2021 (其中-s 指的是set)
設置時間(時分秒):date -s 15:52:36
設置時間(年月日時分秒) :date -s "2022-3-29 18:44:02"
查看時區: date -R
關閉網絡時間協議同步時間:sudo timedatectl set-ntp false
修改時區:timedatectl set-timezone “Asia/Shanghai”
修改時區:timedatectl set-time '16:10:40 2015-11-20'
設置用戶、密碼和文件讀、寫、運行權限
# useradd 用戶名稱 // 添加用戶 # passwd 用戶名稱 // 修改用戶密碼 # chmod [who] [+ | - | =] [mode] 文件名查找文件、字符串及管道操作
將當前目錄及其子目錄下所有文件后綴為 .c 的文件列出來:
find . -name "*.c"
將當前目錄及其子目錄中的所有文件列出:
find . -type f
將當前目錄及其子目錄下所有最近 20 天內更新過的文件列出:
find . -ctime? 20
遠程連接
ssh
ssh user@remote -p port?
// 保證對端機器打開sshd服務,使用 systemctl status sshd.service?查看
vnc,winscp
桌面工具,粘貼兩個鏈接
VNC的安裝與使用(Windows環境下使用VNC進行遠程桌面控制) - 簡書
WinSCP安裝教程 - 簡書
不過使用vnc client要注意,一定不能讓目標主機磁盤占用過大,不然會導致 vnc server服務無法啟動從而連接失敗
命令行,查看內存、磁盤、進程、線程資源使用情況
磁盤:df -h
內存:sar -r
進程:ps -elf
線程:ps -T -p 20756、top -H -p 20756
或者 top 一鍵搞定
查看操作系統、Glibc、GCC版本
uname -r // 操作系統 ldd --version // glibc gcc --version // gcc// 跨平臺交叉編譯時需要如何殺死進程
kill -9 PID如何查看系統日志
Windows:
程序-查看事件日志
Linux:
/var/log/message 系統啟動后的信息和錯誤日志,是Red Hat Linux中最常用的日志之一
/var/log/secure 與安全相關的日志信息
/var/log/cron 與定時任務相關的日志信息
/var/log/spooler 與UUCP和news設備相關的日志信息
/var/log/boot.log 守護進程啟動和停止相關的日志消息
/var/log/wtmp 該日志文件永久記錄每個用戶登錄、注銷及系統的啟動、停機的事件
編寫批處理和Shell腳本
程序必須以下面的行開始(必須方在文件的第一行):?
? #!/bin/sh?
符號#!用來告訴系統它后面的參數是用來執行該文件的程序。在這個例子中我們使用/bin/sh來執行程序。?(能寫一些shell普通命令,命令用分號隔開)
#!bin/sh echo "===============================================" echo "================啟動 ***===================" echo "===============================================" start-all.sh;Tty切換
chvt N輸出stdout\stderror的意義,會重定向
????????cout的輸出可以重定向到一個文件中,而cerr必須輸出在顯示器上。cerr不經過緩沖區,直接向顯示器輸出信息,而clog中的信息存放在緩沖區,緩沖區滿或者遇到endl 時才輸出。緩沖區的的,就是減少訪問文件的次數。
編譯器
編譯器選項,頭文件包含方式、庫連接方式、優化選項
常用編譯選項
- -E 預處理,生成.i的文件[預處理器cpp]
- -S?將預處理后的文件不轉換成匯編語言,生成文件.s[編譯器egcs]
- -s 有匯編變為目標代碼(機器代碼)生成.o的文件[匯編器as]
- -l 連接目標代碼,生成可執行程序[鏈接器ld]
頭文件包含和庫鏈接
-nostdinc 使編譯器不再系統默認的頭文件目錄里面找頭文件, 一般和 -I 聯合使用,明確限定頭文件的位置。
-llibrary? ?制定編譯的時候使用的庫
優化選項
-O0 、-O1 、-O2 、-O3
編譯器的優化選項的 4 個級別,-O0 表示沒有優化, -O1 為默認值,-O3 優化級別最高。
類型未定義、缺少引用解決辦法
- 檢查頭文件包含
- 庫文件符號表
- 頭文件包含覆蓋
優化級別設置
gcc中指定優化級別的參數有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast。
gcc -Q --help=optimizers -O3?
查尋O3參數具體做了哪些優化
編碼方式配置
- 源碼字符集:源碼存儲在計算機磁盤上所采用的編碼方式。
- 執行字符集:運行的程序中的字符在內存中存儲所使用的編碼方式。
- 內部字符集:編譯器內部使用的字符集。
以gcc為例:
-finput-charset 設置輸入字符集,用于從輸入的字符集轉換,默認為utf8。
-fexec-charset=charset 設置執行字符集。決定了字符串常量在內存中的編碼。默認為utf8。
????????輸入字符集決定了源碼到內部字符集的轉換方式。源碼存儲方式如果為gbk,且編譯器指定的輸入字符集為gbk。在將c語言編譯為匯編時,會將源碼字符集轉換為內部utf-8。
????????執行字符集決定了由內部字符集到執行字符集的轉換方式。如果設置為gbk,在將匯編語言翻譯成機器語言時,會將字符串常量從內部字符集utf-8向gbk轉換。
????????如果二者都為utf-8,由于gcc內部字符集也為utf-8,不會發生轉換。內存中的字符串常量的編碼直接取決于源碼的編碼。
并行編譯選項
VS
Windows 、Linux、下查看符號表,dumpbin、readelf、objdump用法
dumpbin
dumpbin.exe /SYMBOLS <file(.lib)>readelf
readelf -s <file>objdump
objdmp -t <file(.so)>nm
nm -D <file>? ? // 查村符號并支持反譯為函數名用denpends和ldd查看依賴關系
ldd <filename> // linuxdenpends 軟件打開可執行文件或者動態庫查看依賴 // windows如何設置導出調試信息
# gdb <file> // 進入到gdb命令行中 # set logging file <filename> // 設置輸出文件 # set logging on // 開始拷貝 # thread apply all bt // 查看所有線程堆棧并輸出到文件中 # set logging off // 停止拷貝調試器
設置調試斷點
GDB
break | b | 添加斷點 tbreak | tb | 添加臨時斷點 delete | d | 刪除斷點 enable | enable | 啟用某個斷點 disable | disable | 禁用某個斷點使用快捷鍵操作
GDB
run | r | 運行一個待調試的程序 continue | c | 讓暫停的程序繼續運行 next | n | 運行到下一行 step | s | 單步執行,遇到函數會進入 until | u | 運行到指定行停下來 finish | fi | 結束當前調用函數,回到上一層調用函數處 return | return | 結束當前調用函數并返回指定值,到上一層函數調用處 jump | j | 將當前程序執行流跳轉到指定行或地址 print | p | 打印變量或寄存器值 backtrace | bt | 查看當前線程的調用堆棧 frame | f | 切換到當前調用線程的指定堆棧 thread | thread | 切換到指定線程 break | b | 添加斷點 tbreak | tb | 添加臨時斷點 delete | d | 刪除斷點 enable | enable | 啟用某個斷點 disable | disable | 禁用某個斷點 watch | watch | 監視某一個變量或內存地址的值是否發生變化 list | l | 顯示源碼 info | i | 查看斷點 / 線程等信息 ptype | ptype | 查看變量類型 disassemble | dis | 查看匯編代碼 set args | set args | 設置程序啟動命令行參數 show args | show args | 查看設置的命令行參數查看內存信息
GDB
print | p | 打印變量或寄存器值 backtrace | bt | 查看當前線程的調用堆棧 watch | watch | 監視某一個變量或內存地址的值是否發生變化遠程調試
gdbserver、VsCode、qtcreator、VS2010、VisualGDB
附加部分代碼調試
qtcreator
直接將想要調試的文件拖進qt中,但必須保證代碼版本一致(帶界面)
調試時更改內存值
GDB
(gdb) whatis tmp type = double (gdb) p tmp $4 = 13 (gdb) set var tmp=47不能直接使用set tmp=47,因為set的子命令可能跟變量名沖突導致運行錯誤
set {int}0x83040 = 4設置調試斷點條件
GDB
(gdb) b N if i == 8使用GDB調試基本程序
GDB調試主要有三種方式
- 直接調試目標程序:gdb ./hello_server
- 附加進程id:gdb attach pid
- 調試core文件:gdb filename corename
查看和調試軟件鎖死原因
方法1:
方法2:
方法3:
語言和工具
SVN基本操作,checkin \check out\ update\add
拉取代碼:
????????svn checkout svn://192.168.0.1/runoob01 --username=user01
提交代碼:
? ? ? ? cat readme //?在庫本版中需要增加一個readme的說明文件。
????????svn status //?查看工作副本中的狀態,此時 readme的狀態為?,說明它還未加到版本
????????????????????????????控制中。
????????svn add readme //?將文件readme加到版本控制,等待提交到版本庫。
????????svn status //?查看工作副本中的狀態,此時 readme的狀態為A,它意味著這個文件已經
????????????????????????????被成功地添加到了版本控制中。
????????svn commit -m "SVN readme" //?為了把 readme 存儲到版本庫中,使用 commit -m
????????????????????????????????????????????????????????????加上注釋信息來提交。
????????????????????????????????????????????????????????????如果你忽略了 -m 選項, SVN會打開一個可以輸入
????????????????????????????????????????????????????????????多行的文本編輯器來讓你輸入提交信息。
更新代碼:
????????svn update
與SVN特定版本比較,revert到某一個版本
# svn revert readme // 文件 readme 回歸到未修改狀態 # svn revert -R trunk // 目錄 trunk 回歸到未修改狀態 # svn merge -r 22:21 readme // 恢復一個已經提交的版本:現版本22,舊版本21。內存對齊
默認對齊數可以通過預編譯命令#pragma pack(n),n = 1,2,4,8,16來改變。
詳聊內存對齊(Memory alignment)-技術圈
#pragma pack(4)
#pragma pack(1)
#pragma pack(2)
需要特別注意的有幾點
不同語言的接口實現
C++插入C代碼
extern "C" {void funcA(int x); }不同語言版本的主要差異
C++11 && C++98
c98 && c99
網絡
網絡地址、MAC地址查看、配置
查看IP/MAC
$ ifconfig設置IP和掩碼
# ifconfig eth0 192.168.5.40 netmask 255.255.255.0設置網關
# route add default gw 192.168.5.1Route路由查看
centos7
$ route / $netstat -rnUbuntu20.04
$ route / $netstat -rn| Destination | 目標網絡/主機 |
| Gateway | 網關地址,*表示目標和本機在同一網絡,不需要路由 |
| Genmask | 網絡掩碼 |
| Flags | 路由項標志,常見標志有如下 U 該路由項是活動的 |
| Metric | 路由距離,即到達指定網絡所需的中轉數 Ref 路由項被引用的次數(Linux未使用) |
| Use | 該路由項被使用的次數 |
| Iface | 該路由項對應的輸出網卡接口 |
TCP基本原理
TCP頭
- URG:緊急比特(urgent)。當URG=1時,表明緊急指針字段有效,代表該封包為緊急封包。它告訴系統此報文段中有緊急數據,應盡快傳送(相當于高優先級的數據), 且上圖中的 Urgent Pointer 字段也會被啟用。
- ACK:確認比特(Acknowledge)。只有當ACK=1時確認號字段才有效,代表這個封包為確認封包。當ACK=0時,確認號無效。
- PSH:(Push function)。若為1時,代表要求對方立即傳送緩沖區內的其他對應封包,而無需等緩沖滿了才送。
- RST:復位比特(Reset) 。當RST=1時,表明TCP連接中出現嚴重差錯(如由于主機崩潰或其他原因),必須釋放連接,然后再重新建立運輸連接。
- SYN:同步比特(Synchronous)。SYN置為1,就表示這是一個連接請求或連接接受報文,通常帶有 SYN 標志的封包表示『主動』要連接到對方的意思。
- FIN:終止比特(Final)。用來釋放一個連接。當FIN=1時,表明此報文段的發送端的數據已發送完畢,并要求釋放運輸連接。
三次握手
四次揮手
UDP基本原理
UDP頭
設置不同防火墻
centos7
啟動防火墻:# systemctl start firewalld
查看防火墻狀態:# systemctl status firewalld
停止防火墻:# systemctl disable firewalld
禁用防火墻:# systemctl stop firewalld
Ubuntu20.04
開啟/關閉防火墻:$ sudo ufw enable|disable
允許 53 端口
$ sudo ufw allow 53
禁用 53 端口
$ sudo ufw delete allow 53
允許 80 端口
$ sudo ufw allow 80/tcp
禁用 80 端口
$ sudo ufw delete allow 80/tcp
允許 smtp 端口
$ sudo ufw allow smtp
刪除 smtp 端口的許可
$ sudo ufw delete allow smtp
允許某特定 IP
$ sudo ufw allow from 192.168.254.254
刪除上面的規則
$ sudo ufw delete allow from 192.168.254.254
常用軟件默認端口
HTTP:80/8080/3128/8081/9080
HTTP:443
FTP(文件傳輸):21
Telnet(遠程登錄):23
ssh(VNC 安全登錄):22
DNS:53
Wireshark查看過濾網絡包
過濾源ip、目的ip:
- 查找目的地址為192.168.101.8的包
- ip.dst==192.168.101.8
- 查找源地址為
- ip.src==1.1.1.1
端口過濾:
- tcp.port==80,
- 源端口和目的端口為80
- tcp.dstport==80
- 只過濾目的端口為80的
- tcp.srcport==80
- 只過濾源端口為80的
協議過濾:
- 在Filter框中直接輸入協議名即可,如過濾HTTP的協議
http模式過濾:
- 如過濾get包,http.request.method=="GET",過濾post包,http.request.method=="POST"
連接符and
- 過濾兩種條件時,使用and連接,如過濾ip為192.168.101.8并且為http協議的,ip.src==192.168.101.8 and http。
netstat查看應用綁定的端口
windows
netstat -anoLinux
TCP:netstat -ntlp<br> UDP:netstat -nulpiperf3測試不同協議下的網絡可用帶寬
服務端
iperf3 -s -i 1 -p 5201客戶端
TCP iperf3 -c 192.168.1.120 -i 1 -t 60 -p 5201UDP iperf3 -u -c 192.168.1.120 -b 1000m -t 60 -p 5201調整操作系統和網卡的工作模式、緩沖區大小
工作模式
查看:mii-tool -v ens33 調整:mii-tool -F 10baseT-HD ens33 恢復自適應:mii-tool -r ens33 // HD:半雙工 FD:全雙工緩沖區大小
查看:ethtool -g ens33 調整:ethtool -G ens33 rx 4096 tx 4096不同協議包頭大小
以太頭 14 尾 4
IP頭 20
TCP頭 20
UDP頭 8
后續補充
- 操作系統
- 調整線程、進程優先級
- 用戶線程和處理器線程之間的關系
- 鎖的原理,連接讀寫鎖和自旋鎖的原理
- 系統資源和文件句柄數、系統鎖等的關系
- 查看不同操作系統定時器誤差,由此引起線程切換時間范圍
- 編譯器
- 編譯的基本工程,能夠手動通過命令行操作程序
- 編譯運行和解釋運行的區別
- 哪些主流語言是解釋運行,哪些是編譯運行
- Java語言虛擬機基本原理
- 如何判斷編譯器版本
- 附加部分代碼調試
這篇文章呢主要是搜索和整理,歡迎大家留言補充和糾正。后面關于網絡和 rtps 我會單獨開一兩篇去詳講我碰到的一些問題和查看處理辦法。共勉。
總結
以上是生活随笔為你收集整理的处理器,操作系统,编译器,调试器,语言和工具,网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UML——Use Case Diagra
- 下一篇: Istio系列学习(二)----Isti