進(jìn)程和線程
進(jìn)程和線程的區(qū)別
線程具有許多傳統(tǒng)進(jìn)程所具有的特征,故又稱為輕型進(jìn)程(Light—Weight Process)或進(jìn)程元;而把傳統(tǒng)的進(jìn)程稱為重型進(jìn)程(Heavy—Weight Process),它相當(dāng)于只有一個線程的任務(wù)。在引入了線程的操作系統(tǒng)中,通常一個進(jìn)程都有若干個線程,至少包含一個線程。
根本區(qū)別:進(jìn)程是操作系統(tǒng)資源分配的基本單位,而線程是處理器任務(wù)調(diào)度和執(zhí)行的基本單位
資源開銷:每個進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進(jìn)程,同一類線程共享代碼和數(shù)據(jù)空間,每個線程都有自己獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線程之間切換的開銷小。
包含關(guān)系:如果一個進(jìn)程內(nèi)有多個線程,則執(zhí)行過程不是一條線的,而是多條線(線程)共同完成的;線程是進(jìn)程的一部分,所以線程也被稱為輕權(quán)進(jìn)程或者輕量級進(jìn)程。
內(nèi)存分配:同一進(jìn)程的線程共享本進(jìn)程的地址空間和資源,而進(jìn)程之間的地址空間和資源是相互獨(dú)立的
影響關(guān)系:一個進(jìn)程崩潰后,在保護(hù)模式下不會對其他進(jìn)程產(chǎn)生影響,但是一個線程崩潰整個進(jìn)程都死掉。所以多進(jìn)程要比多線程健壯。
執(zhí)行過程:每個獨(dú)立的進(jìn)程有程序運(yùn)行的入口、順序執(zhí)行序列和程序出口。但是線程不能獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制,兩者均可并發(fā)執(zhí)行
進(jìn)程的狀態(tài)轉(zhuǎn)換
三種基本狀態(tài):
運(yùn)行態(tài):占用CPU,并在CPU上運(yùn)行
就緒態(tài):已經(jīng)具備了運(yùn)行條件,但由于沒有空閑的CPU,而暫時不能運(yùn)行
阻塞態(tài):因等待某一事件而暫時不能運(yùn)行
另外兩種狀態(tài):
創(chuàng)建態(tài):進(jìn)程正在被創(chuàng)建,操作系統(tǒng)為進(jìn)程分配資源,初始化PCB
進(jìn)程正在從系統(tǒng)中撤銷,操作系統(tǒng)會回收進(jìn)程擁有的資源,撤銷PCB
進(jìn)程間的通信
對于同步和互斥的理解:
區(qū)別:
互斥:是指三部在不同進(jìn)程之間的若干程序片斷,當(dāng)某個進(jìn)程運(yùn)行其中一個程序片段時,其它進(jìn)程就不能運(yùn)行它們之中的任一程序片段,只能等到該進(jìn)程運(yùn)行完這個程序片段后才可以運(yùn)行。
同步:是指散步在不同進(jìn)程之間的若干程序片斷,它們的運(yùn)行必須嚴(yán)格按照規(guī)定的 某種先后次序來運(yùn)行,這種先后次序依賴于要完成的特定的任務(wù)。
聯(lián)系:
同步是一種更為復(fù)雜的互斥,而互斥是一種特殊的同步。也就是說互斥是兩個線程之間不可以同時運(yùn)行,他們會相互排斥,必須等待一個線程運(yùn)行完畢,另一個才能運(yùn)行,而同步也是不能同時運(yùn)行,但他是必須要安照某種次序來運(yùn)行相應(yīng)的線程(也是一種互斥)。
進(jìn)程間為什么需要通信
在操作系統(tǒng)中,協(xié)作的進(jìn)程可能共享一些彼此都能共同讀寫的一些有限資源。而這些資源是有限的,或者如一些共享內(nèi)存,進(jìn)程隨意讀寫可能會造成數(shù)據(jù)的順序,內(nèi)容等發(fā)生錯亂,進(jìn)程不能對其隨意的使用,讀寫等。從而會發(fā)生競爭。我們把對共享內(nèi)存進(jìn)行訪問的程序片稱為臨界資源或臨界區(qū),對同一共享內(nèi)存,任何時候兩個進(jìn)程不能同時處于臨界區(qū).
進(jìn)程間通信的目的:
數(shù)據(jù)傳輸:一個進(jìn)程需要將它的數(shù)據(jù)發(fā)送給另一個進(jìn)程。
通知事件:一個進(jìn)程需要向另一個或一組進(jìn)程發(fā)送消息,通知它(它們)發(fā)生了某種事件(如進(jìn)程終止時要通知父進(jìn)程)。
資源共享:多個進(jìn)程之間共享同樣的資源。為了做到這一點(diǎn),需要內(nèi)核提供互斥和同步機(jī)制。
進(jìn)程控制:有些進(jìn)程希望完全控制另一個進(jìn)程的執(zhí)行(如 Debug 進(jìn)程),此時控制進(jìn)程希望能夠攔截另一個進(jìn)程的所有陷入和異常,并能夠及時知道它的狀態(tài)改變
進(jìn)程間通信的方式
1.管道通信:
管道只能采取半雙工通信,某一時間段內(nèi)只能實(shí)現(xiàn)單向的傳輸。如果要實(shí)現(xiàn)雙向同時通信,則需要設(shè)置兩個管道
各個進(jìn)程要互斥的訪問管道
數(shù)據(jù)以字節(jié)流的形式寫入管道,當(dāng)管道寫滿時,寫進(jìn)程的write()系統(tǒng)調(diào)用將會被阻塞,等待讀進(jìn)程將數(shù)據(jù)取走。當(dāng)讀進(jìn)程將數(shù)據(jù)全部取走后,管道變空,此時讀進(jìn)程的read()系統(tǒng)調(diào)用將會被阻塞
注意:匿名管道只能用于有親緣關(guān)系間的進(jìn)程,而有名管道允許無親緣關(guān)系的進(jìn)程間通信
2.消息隊(duì)列MessageQueue:
消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識符標(biāo)識。消息隊(duì)列克服了信號傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。
3.信號
信號是進(jìn)程之間唯一的異步通信機(jī)制,信號的主要來源主要有硬件來源(入鍵盤操作ctrl + C) 和軟件來源(如kill命令),信號傳遞的信息比較少,主要用于通知進(jìn)程某個時間已經(jīng)發(fā)生。比如利用kill pid,可以讓系統(tǒng)優(yōu)雅停機(jī)。
4.信號量
信號量是一個計(jì)數(shù)器,可以用來控制多個進(jìn)程對資源的訪問,通常作為一種鎖機(jī)制,防止某個進(jìn)程正在訪問共享資源,其他進(jìn)程也訪問資源
5.共享內(nèi)存
共享內(nèi)存就是映射一段能被進(jìn)程之間共享的內(nèi)存,這段內(nèi)存由一個進(jìn)程創(chuàng)建,但是多個進(jìn)程都可以共享訪問,是最快的一種進(jìn)程間通信的方式(不需要從用戶態(tài)到內(nèi)核態(tài)的切換),它是針對其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號量,配合使用,來實(shí)現(xiàn)進(jìn)程間的同步和通信。
6.Socket
socket套接字,不僅僅可以用于本地進(jìn)程通信,還可以用于不通主機(jī)進(jìn)程之間的通信。
進(jìn)程的調(diào)度和處理機(jī)調(diào)度
進(jìn)程調(diào)度(低級調(diào)度),就是按照某種算法,從就緒隊(duì)列中選擇一個進(jìn)程為其分配處理機(jī)
進(jìn)程調(diào)度的時機(jī)
進(jìn)程主動放棄處理機(jī):進(jìn)程正常終止,發(fā)生異常終止,進(jìn)程主動請求阻塞(如等待I/O)等
進(jìn)程被動放棄處理機(jī):分配的時間片用完,IO中斷,有更高的優(yōu)先級進(jìn)程進(jìn)入就緒隊(duì)列等
調(diào)度算法
設(shè)置多級就緒隊(duì)列,各級的隊(duì)列優(yōu)先級從高到低,時間片從小到大
新進(jìn)程到達(dá)時先進(jìn)入第一級隊(duì)列,按照先來先服務(wù)排隊(duì)等待被分配時間片,若用完時間片進(jìn)程還未結(jié)束,則進(jìn)程進(jìn)入下一級隊(duì)列的隊(duì)尾,如果此時已經(jīng)在最下級隊(duì)列,則從新放回最后一級隊(duì)列的隊(duì)尾
只有當(dāng)?shù)贙級的隊(duì)列為空時,才會為K+1級的隊(duì)列隊(duì)頭的進(jìn)程分配時間片
先來先服務(wù)
最短作業(yè)優(yōu)先
最高響應(yīng)比優(yōu)先 響應(yīng)比:(等待時間+服務(wù)時間)/要求服務(wù)的時間
時間片輪轉(zhuǎn)調(diào)度
優(yōu)先級調(diào)度
多級反饋隊(duì)列
內(nèi)存管理
內(nèi)存管理的功能
內(nèi)存空間的分配與回收:由操作系統(tǒng)完成主存儲器空間的分配和管理,使程序員擺脫存儲分配的麻煩,提高編程效率。
地址轉(zhuǎn)換:在多道程序環(huán)境下, 程序中的邏輯地址與內(nèi)存中的物理地址不可能一致, 因此存儲管理必須提供地址變換功能,把邏輯地址轉(zhuǎn)換成相應(yīng)的物理地址。
內(nèi)存空間的擴(kuò)充:利用虛擬存儲技術(shù)或自動覆蓋技術(shù),從邏輯上擴(kuò)充內(nèi)存 。
存儲保護(hù):保證各道作業(yè)在各自的存儲空間內(nèi)運(yùn)行,互不干擾。
內(nèi)存分配方式
連續(xù)分配管理方式
連續(xù)分配方式,是指為一個用戶程序分配一個連續(xù)的內(nèi)存空間,比如說某用戶需要1GB的內(nèi)存空間,它就在內(nèi)存空間中分配一塊連續(xù)的 1GB的空間給用戶。
單一連續(xù)分配:內(nèi)存在此方式下分為系統(tǒng)區(qū)和用戶區(qū),系統(tǒng)區(qū)僅提供給操作系統(tǒng)使用,通常在低地址部分;用戶區(qū)是為用戶提供的、除系統(tǒng)區(qū)之外的內(nèi)存空間。這種方式無需進(jìn)行內(nèi)存保護(hù)。
固定分區(qū)分配:固定分區(qū)分配是最簡單的一種多道程序存儲管理方式,它將用戶內(nèi)存空間劃分為若干個固定大小的區(qū)域,每個分區(qū)只裝入一道作業(yè)。當(dāng)有空閑分區(qū)時,便可以再從外存的后備作業(yè)隊(duì)列中, 選擇適當(dāng)大小的作業(yè)裝入該分區(qū),如此循環(huán)。
動態(tài)分區(qū)分配:動態(tài)分區(qū)分配又稱為可變分區(qū)分配,是一種動態(tài)劃分內(nèi)存的分區(qū)方法。這種分區(qū)方法不預(yù)先將內(nèi)存劃分,而是在進(jìn)程裝入內(nèi)存時,根據(jù)進(jìn)程的大小動態(tài)地建立分區(qū) ,并使分區(qū)的大小正好適合進(jìn)程的需要。因此系統(tǒng)中分區(qū)的大小和數(shù)目是可變的。
分配策略算法
首次適應(yīng) (First Fit) 算法:空閑分區(qū)以地址遞增的次序鏈接。分配內(nèi)存時順序查找,找到大小能滿足要求的第一個空閑分區(qū)。
最佳適應(yīng) ( Best Fit )算法:空閑分區(qū)按容量遞增形成分區(qū)鏈,找到第一個能滿足要求的空閑分區(qū)。
最壞適應(yīng) ( Worst Fit )算法:又稱最大適應(yīng) ( Largest Fit )算法,空閑分區(qū)以容量遞減的次序鏈接。找到第一個能滿足要求的空閑分區(qū),也就是挑選出最大的分區(qū)。
鄰近適應(yīng) ( Next Fit )算法:又稱循環(huán)首次適應(yīng)算法,由首次適應(yīng)算法演變而成。不同之處是分配內(nèi)存時從上次查找結(jié)束的位置開始繼續(xù)查找。
非連續(xù)分配管理方式
非連續(xù)分配允許一個程序分散地裝入到不相鄰的內(nèi)存分區(qū)中
分頁存儲管理方式
將內(nèi)存空間分為一個個大小相等的分區(qū)(比如:每個分區(qū)4KB),每個分區(qū)就是一個頁框(頁幀,內(nèi)存塊,物理塊),每個頁框都有一個編號,即頁框號(頁幀號,內(nèi)存塊號,物理塊號),頁框號從0開始
將用戶進(jìn)程的地址空間也分為與頁框大小相等的一個個區(qū)域,稱為 "頁"或 “頁面”,每個頁面也有一個編號,即頁號,頁號也是從0開始(注意:進(jìn)程最后一個頁面可能沒有頁框那么大,因此頁框不能太大,否則會產(chǎn)生過大的內(nèi)部碎片)
操作系統(tǒng)以頁框?yàn)閱挝粸楦鱾€進(jìn)程分配內(nèi)存空間。進(jìn)程的每個頁面分別放入一個頁框中,則進(jìn)程的頁面和內(nèi)存的頁框產(chǎn)生了一一對應(yīng)的關(guān)系
分段存儲管理方式
進(jìn)程的地址空間:按照程序自身的邏輯關(guān)系劃分為若干個段,每個段都有一個段名(在低級語言中,程序員使用段名來編程),每段從0開始編址
內(nèi)存分配規(guī)則:以段位單位進(jìn)行分配,每個段在內(nèi)存中占據(jù)連續(xù)空間,但是各個段之間可以不相鄰
優(yōu)點(diǎn):由于是按邏輯功能劃分,用戶編程更加方便,程序的可讀性更高
分頁和分段存儲管理的區(qū)別
頁是信息的物理單位,分頁是為實(shí)現(xiàn)離散分配方式,提高內(nèi)存利用率。分頁僅僅是由于系統(tǒng)管理的需要而并不是用戶的需要。而段則是信息的邏輯單位,是為了更好地滿足用戶的需要。
分段比分頁更容易實(shí)現(xiàn)信息的保護(hù)與共享,分段可以在某個段編寫邏輯,實(shí)現(xiàn)對另外一個段的保護(hù),而分頁不行
頁的大小固定且由系統(tǒng)決定,而段的長度取決于用戶所編寫的程序。
頁面置換算法(追求最少的缺頁率)
最佳置換算法OPT(無法實(shí)現(xiàn),作為一個標(biāo)準(zhǔn)):每次選擇淘汰的頁面將是以后永不使用,或者在最長的時間內(nèi)不被使用,由于無法預(yù)知將會訪問哪些頁面,所以這種算法無法實(shí)現(xiàn),只能作為一個標(biāo)準(zhǔn)
例如:需要訪問7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1,則訪問順序:
先進(jìn)先出置換算法FIFO:每次選擇淘汰的頁面是最早進(jìn)入內(nèi)存的頁面
例如:需要訪問 3 2 1 0 3 2 4 3 2 1 0 4 ,則訪問順序
最近最久未使用置換算法(LRU):每次淘汰的頁面是最近最久未使用的頁面
例如:需要訪問 1 8 1 7 8 2 7 2 1 8 3 8 2 1 3 1 7 1 3 7 則訪問順序
最近未用置換算法NRU(Clock算法):為每個頁面設(shè)置一個訪問位,再將內(nèi)存中的頁面都通過鏈接指針鏈接成一個循環(huán)隊(duì)列。當(dāng)某頁被訪問時,其訪問位置為1.當(dāng)需要淘汰某個頁面時,只需要檢查頁的訪問位。如果是0,就將該頁面換出,如果是1,則將他置為0,暫不換出。繼續(xù)檢查下一個頁面,如果第一輪掃描之后全是1,則掃描完成,這些都置為0.再進(jìn)行第二輪掃描,因此簡單的Clock算法選擇一個頁面淘汰最多兩輪
文件管理
文件的分配方式(物理結(jié)構(gòu))
文件塊和磁盤塊:類似于內(nèi)存的分頁
磁盤塊:磁盤中的存儲單元會被分為一個個"塊/磁盤塊/物理塊",在很多的操作系統(tǒng)中,磁盤塊的大小與內(nèi)存塊,頁面的大小相同
文件塊:在外存管理中,為了方便對文件數(shù)據(jù)的管理,文件的邏輯地址空間被分為一個一個的文件塊,文件的邏輯地址可以表示為(邏輯塊號,塊內(nèi)地址)的形式。用戶通過邏輯地址來操作自己的文件,操作
文件的分配方式
連續(xù)分配:要求每個文件在磁盤上占有一組連續(xù)的塊
優(yōu)點(diǎn):支持順序訪問和直接訪問(類似數(shù)組),連續(xù)分配的文件在順序訪問時速度最快
缺點(diǎn):不方便文件的擴(kuò)展,存儲空間利用率低,會產(chǎn)生磁盤碎片
鏈接分配:采取離散分配的方式,為文件分配離散的磁盤塊。(類似鏈表數(shù)據(jù)結(jié)構(gòu))
隱式鏈接:目錄中記錄的文件的起始塊號和結(jié)束塊號。除了文件最后一個磁盤塊之外,每個磁盤塊中都會保存指向下一個盤塊的指針,這些指針對用戶是透明的,每次訪問某個磁盤塊都需從頭訪問
優(yōu)點(diǎn):方便文件的擴(kuò)展,不會產(chǎn)生碎片問題,外存的利用率高
缺點(diǎn):只支持順序訪問,不支持隨機(jī)訪問,查找時效率低
*顯示鏈接:把用于鏈接文件各物理塊的指針顯示的存放在一張表中,即文件分配表。文件目錄只需要記錄起始塊號。一個磁盤只需要設(shè)置一張分配表,開機(jī)時,將分配表讀入內(nèi)存,并常駐內(nèi)存 *優(yōu)點(diǎn):支持順序訪問,也支持隨機(jī)訪問,方便文件的擴(kuò)展,不會產(chǎn)生碎片問題,地址轉(zhuǎn)換不需要訪問磁盤,因此文件的訪問效率更高 *缺點(diǎn):文件分配表需要占據(jù)一定的存儲空間
索引分配:索引分配允許文件離散的分配在各個磁盤塊中,系統(tǒng)會為每個文件建立一張索引表,索引表中記錄了文件的各個邏輯塊對應(yīng)的物理塊(索引表的功能類似于內(nèi)存管理的頁表–建立邏輯頁面到物理頁面之間的映射關(guān)系)。索引表存放的磁盤塊稱為索引塊,文件數(shù)據(jù)存放的磁盤塊稱為數(shù)據(jù)塊
文件存儲空間管理
存儲空間的劃分和初始化
存儲空間的劃分:將物理磁盤劃分為一個個文件卷(邏輯卷,邏輯盤,如Windows系統(tǒng)下的C,D,E盤等)
有的系統(tǒng)支持超大型文件,可由多個物理磁盤組成一個文件卷
存儲空間的初始化:將各個文件卷劃分為目錄區(qū),文件區(qū)
目錄區(qū):目錄區(qū)主要存放文件的目錄信息(FCB),用于磁盤存儲空間的管理的信息
文件區(qū):文件區(qū)用于存放文件數(shù)據(jù)
存儲空間的管理方法
空閑表法:與內(nèi)存管理中的動態(tài)分區(qū)分配很類似,為一個文件分配連續(xù)的存儲空間。同樣可以采用首次適應(yīng),最佳適應(yīng),最壞適應(yīng)等算法來決定要為文件分配哪個區(qū)間
空閑鏈表法:分為—>
空閑盤塊鏈:以盤塊為單位組成一條空閑鏈
空閑盤區(qū)鏈:以盤區(qū)為單位組成一條空閑鏈
位示圖法:每個二進(jìn)制位代表一個盤塊。例如可以用"0"來代表盤塊空閑 ,"1"代表盤塊已經(jīng)分配
成組鏈接法:UNIX采用的策略,適合大型的文件系統(tǒng)。
IO管理
磁盤調(diào)度算法
一次磁盤讀/寫操作需要的時間:尋找時間+延遲時間+傳輸時間
尋找時間:在讀/寫前,將磁頭移動到指定磁道所畫的時間(啟動磁頭臂和移動磁頭臂)
延遲時間:通過旋轉(zhuǎn)磁盤,使磁頭定位到目標(biāo)扇區(qū)所需要的時間
傳輸時間:從磁盤中讀出或?qū)懭霐?shù)據(jù)所經(jīng)歷的時間
磁盤調(diào)度算法:
先來先服務(wù)算法(FIFO):根據(jù)進(jìn)程請求訪問磁盤的先后順序進(jìn)行調(diào)度
最短尋找時間優(yōu)先算法(SSTF):優(yōu)先處理的磁道是與當(dāng)前磁道最近的磁道,可以保證每次的尋道時間最短,但是不能保證總的尋道時間最短(貪心算法)
掃描算法(SCAN,電梯調(diào)度算法):SSTF算法可能會產(chǎn)生饑餓,磁頭有可能在一個小區(qū)域內(nèi)來回移動,因此掃描算法規(guī)定,只有磁頭移動到最外側(cè)磁道的時候才能往內(nèi)移動,移動到最內(nèi)側(cè)磁道才能往外移動,在這個基礎(chǔ)上使用SSTF算法
循環(huán)掃描算法(C-SCAN):SCAN算法對于各個位置磁道的響應(yīng)頻率不平均,C-SCAN算法在SCAN算法的基礎(chǔ)上規(guī)定:只有磁頭朝著某個特定的方向移動時才能處理磁道的訪問請求,而返回時直接快速移動到起始端而不處理任何請求
死鎖
對死鎖的理解
如果一組進(jìn)程中的每個進(jìn)程都在等待一個事件,而這個事件是有這組中的某一個進(jìn)程觸發(fā),這種情況則會導(dǎo)致死鎖
資源死鎖的條件:發(fā)生死鎖時,以下四個條件必須全部具備
互斥條件:進(jìn)程要求對所分配的資源進(jìn)行排它性控制,即在一段時間內(nèi)某資源僅為一進(jìn)程所占用。
保持和等待條件:當(dāng)進(jìn)程因請求資源而阻塞時,對已獲得的資源保持不放。
不可搶占條件:進(jìn)程已獲得的資源在未使用完之前,不能剝奪,只能在使用完時由自己釋放。
循環(huán)等待條件:在發(fā)生死鎖時,必然存在一個進(jìn)程–資源的環(huán)形鏈。
死鎖的避免->銀行家算法
當(dāng)一個進(jìn)程申請使用資源的時候,銀行家算法通過先 試探 分配給該進(jìn)程資源,然后通過安全性算法判斷分配后的系統(tǒng)是否處于安全狀態(tài),若不安全則試探分配作廢,讓該進(jìn)程繼續(xù)等待。
安全序列的判斷:
死鎖的解除
資源剝奪法:掛起(暫時放到外存上)某些死鎖的進(jìn)程,并搶占他的資源,將這些資源分配給其他的死鎖進(jìn)程。但是應(yīng)防止被掛起的進(jìn)程長時間得不到資源而饑餓
撤銷進(jìn)程法:強(qiáng)制撤銷部分,甚至全部的死鎖進(jìn)程,并剝奪這些進(jìn)程的資源。雖然實(shí)現(xiàn)簡單,但是代價可能較大
進(jìn)程回退法:讓一個或多個死鎖進(jìn)程回退到足以避免死鎖的地步
簡單來說,死鎖的破壞就是對死鎖產(chǎn)生的四個條件進(jìn)行破壞,讓其中任意一個不滿足即可。
審核編輯 :李倩
-
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6545瀏覽量
122732 -
線程
+關(guān)注
關(guān)注
0文章
501瀏覽量
19580 -
進(jìn)程
+關(guān)注
關(guān)注
0文章
197瀏覽量
13928
原文標(biāo)題:這一次,徹底拿下操作系統(tǒng)?。?!
文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論