1、ls命令
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、建安ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的建安網(wǎng)站制作公司
cd /root
ls #顯示當(dāng)前目錄下所有的非隱藏文件
ls -a #顯示當(dāng)前目錄下所有文件,包含隱藏文件
ls -l #顯示當(dāng)前目錄下所有的非隱藏文件的詳情
ls -al #顯示當(dāng)前目錄下所有文件,包含隱藏文件 的詳情
ls -lh #以列表形式顯示當(dāng)前目錄下所有的非隱藏文件的大小(K M T)
ls -alh #以列表形式顯示所有文件,包含隱藏文件的文件大小(K M T)
常用的組合:
ls
ll #等價(jià)于 ls -l
ls /etc #顯示/etc目錄下的文件
2:pwd命令
用來(lái)顯示當(dāng)前所在的路徑
絕對(duì)路徑: 從/目錄開(kāi)始的路徑
/root
/etc/sysconf
/opt/server/data-integration/libswt/win64
相對(duì)路徑: 相對(duì)當(dāng)前的路徑
3、mkdir命令
cd /root
mkdir mytest #在當(dāng)前目錄創(chuàng)建文件夾
mkdir -p 111/222/333 #一次創(chuàng)建多級(jí)文件夾
mkdir /root/mydemo #使用絕對(duì)路徑來(lái)創(chuàng)建
mkdir mydemo2 #使用相對(duì)對(duì)路徑來(lái)創(chuàng)建
4、rm命令
這個(gè)命令既可以刪除文件,也可以刪除目錄
刪文件:
cd /root
rm a.txt #刪除時(shí),會(huì)給出提醒確認(rèn),輸入y刪除,n不刪除
rm -f b.txt #強(qiáng)制刪除 等價(jià)于 rm -f /root/b.txt
rm ../dir2/b.txt
touch a.java b.java c.java
rm a.java b.java c.java #一次可以刪除多個(gè)文件
rm *.java -fr #可以刪除當(dāng)前目錄下的所有.java文件
cd dir
rm * -fr #刪除當(dāng)前目錄的所有內(nèi)容
刪目錄:
rm -r 111 #刪除目錄,依次提醒刪除
rm -rf mytest #強(qiáng)制刪除 等價(jià)于 rm mytest -fr
常用組合:
rm -fr 文件或目錄
5、cd命令
cd 命令可以進(jìn)入一個(gè)目錄,類似于對(duì)windows上的文件夾進(jìn)行雙擊
cd #直接cd 可以從任何一個(gè)目錄回到/root目錄
cd /root #進(jìn)入root目錄
cd /opt/server/data-integration/system/
cd .. #回到上一級(jí)目錄
cd ../.. #回到上上一級(jí)目錄
cd - #可以在最近的兩次目錄之間切換
cd /root
mdkir dir1 dir2
cd dir1
cd ../dir2 #使用相對(duì)路徑 /中國(guó)/廣東省/深圳市/寶安區(qū)/留仙二路/78號(hào)
6、歷史命令和table補(bǔ)全
使用上下方向鍵可以找出歷史命令
table鍵:
cd /opt/ #兩次table可以列出/opt目錄下所有的文件和子目錄
cd /opt/s #一次table可以自動(dòng)補(bǔ)全目錄內(nèi)容,前提是/opt目錄下只有一個(gè)s開(kāi)頭的目錄
7、touch命令
cd /root
touch a.java #在當(dāng)前目錄創(chuàng)建a.txt文件
touch b.java c.java #創(chuàng)建多個(gè)文件
touch /root/d.java #通過(guò)絕對(duì)路徑創(chuàng)建
8、mv命令
移動(dòng):
1、mv 文件 目錄 #將文件移動(dòng)到目錄中區(qū)
cd /root/dir1
touch a.txt
mv a.txt /root/dir2 #等價(jià)于 mv a.txt ../dir2
2、 mv 目錄1 目錄2 #將目錄1移動(dòng)到目錄2下面(前提是目錄2必須存在)
cd /root
mv dir2 dir1 #將dir2移動(dòng)到dir1下面
重命名:
1、mv 文件1 文件2 #給文件重命名(文件2不能存在)
cd /root
mv a.txt aaa.txt #將a.txt 重命名為aaa.txt
2、mv 目錄1 目錄2 #給目錄重命名(目錄2不能存在)
cd /root
mv dir1 dirx #將dir1重命名為dirx
9、cat命令
顯示文件內(nèi)容
cd /root
cat user.txt
10、cp命令
復(fù)制文件
cd /root
cp user.txt user2.txt
cp user.txt /opt/ #將當(dāng)前目錄的user.txt 復(fù)制到/opt目錄,文件名保持不變
cp user.txt /opt.user2.txt #將當(dāng)前目錄的user.txt 復(fù)制到/opt目錄,文件名改為user2.txt
cp /opt/server/data-integration/pan.sh ./ #將指定目錄里的文件復(fù)制到當(dāng)前目錄(.后邊的/可以去掉)
cp /opt/server/data-integration/pan.sh ./dirx #將指定目錄里的文件復(fù)制到當(dāng)前目錄下的dirx目錄(.后邊的/比可以去掉)
cp /opt/server/data-integration/pan.sh /root/dirx #作用同上
11、解壓和壓縮
Linux的壓縮包后綴一般是: .tar.gz
解壓:
.tar.gz
將snappy-1.1.1.tar.gz上傳到/root/dir1目錄
tar -zxvf snappy-1.1.1.tar.gz #默認(rèn)解壓到當(dāng)前目錄
tar -xvf snappy-1.1.1.tar.gz #默認(rèn)解壓到當(dāng)前目錄
tar -xvf snappy-1.1.1.tar.gz -C /opt #將壓縮包解壓到/opt目錄
.zip格式
unzip mysql-connector-java-8.0.13.zip #默認(rèn)解壓到當(dāng)前目錄
unzip -d /opt mysql-connector-java-8.0.13.zip #解壓到指定目錄
壓縮:
.tar.gz
tar -czvf snappy-1.1.1.tar.gz snappy-1.1.1 #將snappy-1.1.1文件夾進(jìn)行打包壓縮
tar -czvf /root/dir/snappy-1.1.1.tar.gz /opt/server/snappy-1.1.1
.zip格式
zip -r mysql-connector-java-8.0.13.zip mysql-connector-java-8.0.13/
12、find命令
用來(lái)實(shí)現(xiàn)文件的查找
find / -name 'a.txt' #從/目錄開(kāi)始查找a.txt文件
find / -name 'ins*' #從/目錄開(kāi)始查找以ins開(kāi)頭的文件
find / -type f -size +100M #查找/目錄下文件大小大于100M的文件
13、grep命令
grep lang anaconda-ks.cfg #從anaconda-ks.cfg文件中查找包含lang的內(nèi)容
14、ps命令
ps #查看依賴終端的進(jìn)程
ps -ef #查看Linux系統(tǒng)中所有的進(jìn)程
15、kill命令
kill -9 進(jìn)程的pid #每次啟動(dòng)進(jìn)程時(shí),pid會(huì)發(fā)生變化,但是進(jìn)程運(yùn)行期間pid不會(huì)變化
16、管道 |
管道就是把前邊命令的結(jié)果作為后邊命令的輸入
ps -ef | grep mysql #查找和mysql相關(guān)的進(jìn)程
ll /etc | grep java #在/etc目錄中查找java相關(guān)的文件
17、用戶的操作
用戶創(chuàng)建和密碼設(shè)置
useradd itheima #創(chuàng)建新用戶itheima
passwd itheima #設(shè)置用戶itheima密碼
用戶刪除
userdel -r itheima #刪除用戶itheima
18、文件的權(quán)限
所屬用戶: root 文件的創(chuàng)建者
所屬用戶組: root 和文件創(chuàng)建者在一個(gè)組的用戶
其他用戶: itcast 既不是文件創(chuàng)建者,也和文件創(chuàng)建者不在同一組
r: 可讀
w:可寫
x: 可執(zhí)行
chmod命令:
方式1:
chmod u+rw a.txt #在所屬用戶之前的權(quán)限基礎(chǔ)上添加可讀和可寫權(quán)限
chmod u=rw a.txt #將所屬用戶的權(quán)限直接修改為可讀,可寫
chmod +x #給所屬用戶,所屬用戶組和其他用戶全部加上可執(zhí)行權(quán)限
方式2:
chmod 777 a.txt #給所有用戶加上所有權(quán)限
19、clear命令
用來(lái)清屏
快捷鍵: ctrl + l
20、history命令
用來(lái)查看所有的歷史命令
21:vi編輯器的使用
vi a.txt #打開(kāi)a.txt文件
vim a.txt #vim是vi的增強(qiáng)
22、網(wǎng)絡(luò)管理命令
hostname :查看主機(jī)名
修改主機(jī)名: /etc/hostname
ifconfig :查看ip地址
修改ip地址: /etc/sysconfig/network-scripts/ifcfg-ens33
服務(wù)問(wèn)題:
service network restart
常見(jiàn)執(zhí)行Linux命令的格式是這樣的:
注意,命令名稱、命令參數(shù)、命令對(duì)象之間請(qǐng)用空格鍵分隔。
命令對(duì)象一般是指要處理的文件、目錄、用戶等資源,而命令參數(shù)可以用長(zhǎng)格式(完整的選項(xiàng)名稱),也可以用短格式(單個(gè)字母的縮寫),兩者分別用--與-作為前綴。
命令參數(shù)的長(zhǎng)格式與短格式示例
1.echo命令
2.date命令
3.reboot命令
4.poweroff命令
5.wget命令
6.ps命令
7.top命令
8.pidof命令
9.kill命令
10.killall命令
如果我們?cè)谙到y(tǒng)終端中執(zhí)行一個(gè)命令后想立即停止它,可以同時(shí)按下Ctrl + C組合鍵(生產(chǎn)環(huán)境中比較常用的一個(gè)快捷鍵),這樣將立即終止該命令的進(jìn)程。
或者,如果有些命令在執(zhí)行時(shí)不斷地在屏幕上輸出信息,影響到后續(xù)命令的輸入,則可以在執(zhí)行命令時(shí)在末尾添加上一個(gè)符號(hào),這樣命令將進(jìn)入系統(tǒng)后臺(tái)來(lái)執(zhí)行。
1.ifconfig命令
2.uname命令
3.uptime命令
4.free命令
5.who命令
6.last命令
7.history命令
8.sosreport命令
三、工作目錄切換命令
1.pwd命令
2.cd命令
3.ls命令
四、文本文件編輯命令
1.cat命令
2.more命令
3.head命令
4.tail命令
5.tr命令
6.wc命令
7.stat命令
8.cut命令
9.diff命令
五、文件目錄管理命令
1.touch命令
2.mkdir命令
3.cp命令
4.mv命令
5.rm命令
6.dd命令
7.file命令
六、打包壓縮與搜索命令
1.tar命令
2.grep命令
3.find命令
我們知道,進(jìn)程運(yùn)行需要各種各樣的系統(tǒng)資源,如內(nèi)存、文件、打印機(jī)和最
寶貴的 CPU 等,所以說(shuō),調(diào)度的實(shí)質(zhì)就是資源的分配。系統(tǒng)通過(guò)不同的調(diào)度算法(Scheduling Algorithm)來(lái)實(shí)現(xiàn)這種資源的分配。通常來(lái)說(shuō),選擇什么樣的調(diào)度算法取決于資源分配的策略(Scheduling Policy)。
有關(guān)調(diào)度相關(guān)的結(jié)構(gòu)保存在 task_struct 中,如下:
active_mm 是為內(nèi)核線程而引入的,因?yàn)閮?nèi)核線程沒(méi)有自己的地址空間,為了讓內(nèi)核線程與普通進(jìn)程具有統(tǒng)一的上下文切換方式,當(dāng)內(nèi)核線程進(jìn)行上下文切換時(shí),讓切換進(jìn)來(lái)的線程的 active_mm 指向剛被調(diào)度出去的進(jìn)程的 active_mm(如果進(jìn)程的mm 域不為空,則其 active_mm 域與 mm 域相同)。
在 linux 2.6 中 sched_class 表示該進(jìn)程所屬的調(diào)度器類有3種:
進(jìn)程的調(diào)度策略有5種,用戶可以調(diào)用調(diào)度器里不同的調(diào)度策略:
在每個(gè) CPU 中都有一個(gè)自身的運(yùn)行隊(duì)列 rq,每個(gè)活動(dòng)進(jìn)程只出現(xiàn)在一個(gè)運(yùn)行隊(duì)列中,在多個(gè) CPU 上同時(shí)運(yùn)行一個(gè)進(jìn)程是不可能的。
運(yùn)行隊(duì)列是使用如下結(jié)構(gòu)實(shí)現(xiàn)的:
tast 作為調(diào)度實(shí)體加入到 CPU 中的調(diào)度隊(duì)列中。
系統(tǒng)中所有的運(yùn)行隊(duì)列都在 runqueues 數(shù)組中,該數(shù)組的每個(gè)元素分別對(duì)應(yīng)于系統(tǒng)中的一個(gè) CPU。在單處理器系統(tǒng)中,由于只需要一個(gè)就緒隊(duì)列,因此數(shù)組只有一個(gè)元素。
內(nèi)核也定義了一下便利的宏,其含義很明顯。
Linux、c/c++服務(wù)器開(kāi)發(fā)篇-------我們來(lái)聊聊進(jìn)程的那些事
Linux內(nèi)核 進(jìn)程間通信組件的實(shí)現(xiàn)
學(xué)習(xí)地址:C/C++Linux服務(wù)器開(kāi)發(fā)/后臺(tái)架構(gòu)師【零聲教育】-學(xué)習(xí)視頻教程-騰訊課堂
需要C/C++ Linux服務(wù)器架構(gòu)師學(xué)習(xí)資料加qun812855908獲?。ㄙY料包括 C/C++,Linux,golang技術(shù),Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協(xié)程,DPDK,ffmpeg 等),免費(fèi)分享
在分析調(diào)度流程之前,我們先來(lái)看在什么情況下要執(zhí)行調(diào)度程序,我們把這種情況叫做調(diào)度時(shí)機(jī)。
Linux 調(diào)度時(shí)機(jī)主要有。
時(shí)機(jī)1,進(jìn)程要調(diào)用 sleep() 或 exit() 等函數(shù)進(jìn)行狀態(tài)轉(zhuǎn)換,這些函數(shù)會(huì)主動(dòng)調(diào)用調(diào)度程序進(jìn)行進(jìn)程調(diào)度。
時(shí)機(jī)2,由于進(jìn)程的時(shí)間片是由時(shí)鐘中斷來(lái)更新的,因此,這種情況和時(shí)機(jī)4 是一樣的。
時(shí)機(jī)3,當(dāng)設(shè)備驅(qū)動(dòng)程序執(zhí)行長(zhǎng)而重復(fù)的任務(wù)時(shí),直接調(diào)用調(diào)度程序。在每次反復(fù)循環(huán)中,驅(qū)動(dòng)程序都檢查 need_resched 的值,如果必要,則調(diào)用調(diào)度程序 schedule() 主動(dòng)放棄 CPU。
時(shí)機(jī)4 , 如前所述, 不管是從中斷、異常還是系統(tǒng)調(diào)用返回, 最終都調(diào)用 ret_from_sys_call(),由這個(gè)函數(shù)進(jìn)行調(diào)度標(biāo)志的檢測(cè),如果必要,則調(diào)用調(diào)用調(diào)度程序。那么,為什么從系統(tǒng)調(diào)用返回時(shí)要調(diào)用調(diào)度程序呢?這當(dāng)然是從效率考慮。從系統(tǒng)調(diào)用返回意味著要離開(kāi)內(nèi)核態(tài)而返回到用戶態(tài),而狀態(tài)的轉(zhuǎn)換要花費(fèi)一定的時(shí)間,因此,在返回到用戶態(tài)前,系統(tǒng)把在內(nèi)核態(tài)該處理的事全部做完。
Linux 的調(diào)度程序是一個(gè)叫 Schedule() 的函數(shù),這個(gè)函數(shù)來(lái)決定是否要進(jìn)行進(jìn)程的切換,如果要切換的話,切換到哪個(gè)進(jìn)程等。
從代碼分析來(lái)看,Schedule 主要完成了2個(gè)功能:
進(jìn)程上下文切換包括進(jìn)程的地址空間的切換和執(zhí)行環(huán)境的切換。
對(duì)于 switch_mm 處理,關(guān)鍵的一步就是它將新進(jìn)程頁(yè)面目錄的起始物理地址裝入到寄存器 CR3 中。CR3 寄存器總是指向當(dāng)前進(jìn)程的頁(yè)面目錄。
switch_to 把寄存器中的值比如esp等存放到進(jìn)程thread結(jié)構(gòu)中,保存現(xiàn)場(chǎng)一邊后續(xù)恢復(fù),同時(shí)調(diào)用 __switch_to 完成了堆棧的切換。
在進(jìn)程的 task_struct 結(jié)構(gòu)中有個(gè)重要的成分 thread,它本身是一個(gè)數(shù)據(jù)結(jié)構(gòu) thread_struct, 里面記錄著進(jìn)程在切換時(shí)的(系統(tǒng)空間)堆棧指針,取指令地址(也就是“返回地址”)等關(guān)鍵性的信息。
關(guān)于__switch_to 的工作就是處理 TSS (任務(wù)狀態(tài)段)。
TSS 全稱task state segment,是指在操作系統(tǒng)進(jìn)程管理的過(guò)程中,任務(wù)(進(jìn)程)切換時(shí)的任務(wù)現(xiàn)場(chǎng)信息。
linux 為每一個(gè) CPU 提供一個(gè) TSS 段,并且在 TR 寄存器中保存該段。
linux 中之所以為每一個(gè) CPU 提供一個(gè) TSS 段,而不是為每個(gè)進(jìn)程提供一個(gè)TSS 段,主要原因是 TR 寄存器永遠(yuǎn)指向它,在任務(wù)切換的適合不必切換 TR 寄存器,從而減小開(kāi)銷。
在從用戶態(tài)切換到內(nèi)核態(tài)時(shí),可以通過(guò)獲取 TSS 段中的 esp0 來(lái)獲取當(dāng)前進(jìn)程的內(nèi)核棧 棧頂指針,從而可以保存用戶態(tài)的 cs,esp,eip 等上下文。
TSS 在任務(wù)切換過(guò)程中起著重要作用,通過(guò)它實(shí)現(xiàn)任務(wù)的掛起和恢復(fù)。所謂任務(wù)切換是指,掛起當(dāng)前正在執(zhí)行的任務(wù),恢復(fù)或啟動(dòng)另一任務(wù)的執(zhí)行。
在任務(wù)切換過(guò)程中,首先,處理器中各寄存器的當(dāng)前值被自動(dòng)保存到 TR(任務(wù)寄存器)所指定的任務(wù)的 TSS 中;然后,下一任務(wù)的 TSS 被裝入 TR;最后,從 TR 所指定的 TSS 中取出各寄存器的值送到處理器的各寄存器中。由此可見(jiàn),通過(guò)在 TSS 中保存任務(wù)現(xiàn)場(chǎng)各寄存器狀態(tài)的完整映象,實(shí)現(xiàn)任務(wù)的切換。
因此,__switch_to 核心內(nèi)容就是將 TSS 中的內(nèi)核空間(0級(jí))堆棧指針換成 next-esp0。這是因?yàn)?CPU 在穿越中斷門或者陷阱門時(shí)要根據(jù)新的運(yùn)行級(jí)別從TSS中取得進(jìn)程在系統(tǒng)空間的堆棧指針。
thread_struct.esp0 指向進(jìn)程的系統(tǒng)空間堆棧的頂端。當(dāng)一個(gè)進(jìn)程被調(diào)度運(yùn)行時(shí),內(nèi)核會(huì)將這個(gè)變量寫入 TSS 的 esp0 字段,表示這個(gè)進(jìn)程進(jìn)入0級(jí)運(yùn)行時(shí)其堆棧的位置。換句話說(shuō),進(jìn)程的 thread_struct 結(jié)構(gòu)中的 esp0 保存著其系統(tǒng)空間堆棧指針。當(dāng)進(jìn)程穿過(guò)中斷門、陷阱門或者調(diào)用門進(jìn)入系統(tǒng)空間時(shí),處理器會(huì)從這里恢復(fù)期系統(tǒng)空間棧。
由于棧中變量的訪問(wèn)依賴的是段、頁(yè)、和 esp、ebp 等這些寄存器,所以當(dāng)段、頁(yè)、寄存器切換完以后,棧中的變量就可以被訪問(wèn)了。
因此 switch_to 完成了進(jìn)程堆棧的切換,由于被切進(jìn)的進(jìn)程各個(gè)寄存器的信息已完成切換,因此 next 進(jìn)程得以執(zhí)行指令運(yùn)行。
由于 A 進(jìn)程在調(diào)用 switch_to 完成了與 B 進(jìn)程堆棧的切換,也即是寄存器中的值都是 B 的,所以 A 進(jìn)程在 switch_to 執(zhí)行完后,A停止運(yùn)行,B開(kāi)始運(yùn)行,當(dāng)過(guò)一段時(shí)間又把 A 進(jìn)程切進(jìn)去后,A 開(kāi)始從switch_to 后面的代碼開(kāi)始執(zhí)行。
schedule 的調(diào)用流程如下:
可以使用su命令來(lái)切換用戶,su是switch user切換用戶的縮寫??梢允菑钠胀ㄓ脩羟袚Q到root用戶,也可以是從root用戶切換到普通用戶。從普通用戶切換到root用戶需要輸入密碼,從root用戶切換到普通用戶不需要輸入密碼。
命令格式:su [參數(shù)] [-] [用戶名]
用戶名的默認(rèn)值為root。
用法示例:
su zhidao #切換到zhidao用戶
su #切換到root用戶