Python多線程與多進(jìn)程

簡(jiǎn)書(shū)

內(nèi)容簡(jiǎn)述:

線程與進(jìn)程的相關(guān)概念

  • 1、程序,進(jìn)程,線程,多進(jìn)程,多線程
  • 2、線程的生命周期
  • 3、并行與并發(fā),同步與異步
  • 4、線程同步安全
  • 5、與鎖有關(guān)的特殊情況:死鎖,饑餓與活鎖
  • 6、守護(hù)線程
  • 7、線程并發(fā)的經(jīng)典問(wèn)題:生產(chǎn)中與消費(fèi)者問(wèn)題
  • 8、Python中的GIL鎖
  • 9、Python中對(duì)多線程與多進(jìn)程的支持

線程與進(jìn)程的相關(guān)概念

關(guān)于線程和進(jìn)程的話題,大部分的書(shū)只是微微提下,讀者學(xué)完云里霧里,不知所以。本章會(huì)對(duì)Python中的多線程和多進(jìn)程進(jìn)行詳解。大部分都是概念性的東西,不要去死記硬背,學(xué)完了解有個(gè)大概印象就好。


1、程序,進(jìn)程,線程,多進(jìn)程,多線程

關(guān)于程序,進(jìn)程和線程的一些名詞概念如圖所示:
[圖片上傳失敗...(image-85ba8e-1555409468002)]
有句非常經(jīng)典的話:“進(jìn)程是資源分配的最小單位,線程則是CPU調(diào)度的最小單位”。

先說(shuō)說(shuō)「多進(jìn)程」:從普通用戶的視角:

如果你的電腦是Windows的話,Ctrl+Alt+Del打開(kāi)任務(wù)管理器,可以看到電腦運(yùn)行著很多的進(jìn)程,比如QQ,微信,網(wǎng)易云音樂(lè)等。這就是多進(jìn)程,每個(gè)進(jìn)程各司其職完成對(duì)應(yīng)的功能,互不干擾,你聊天的時(shí)候音樂(lè)照常播放。

再說(shuō)說(shuō)開(kāi)發(fā)仔的視角:

多進(jìn)程的概念更傾向于:多個(gè)進(jìn)程協(xié)同地區(qū)完成同一項(xiàng)工作。

問(wèn)題:為什么要在應(yīng)用里使用多進(jìn)程

筆者觀點(diǎn):擺脫系統(tǒng)的一些限制和為自己的應(yīng)用獲取更多的資源,舉個(gè)例子:
在Android系統(tǒng)中會(huì)為每個(gè)應(yīng)用(進(jìn)程)限制最大內(nèi)容,單個(gè)進(jìn)程超過(guò)這個(gè)閾值會(huì)引起OOM,而使用多進(jìn)程技術(shù)可以規(guī)避這個(gè)內(nèi)存溢出的問(wèn)題。再舉個(gè)例子:Python在實(shí)現(xiàn)Python解析器(CPython)時(shí)引入了GIL鎖,使得任何時(shí)候僅有
一個(gè)線程在執(zhí)行,多線程的效率可能還比不上單線程,使用多進(jìn)程技術(shù)可以
規(guī)避這個(gè)限制。

再說(shuō)說(shuō)「多線程」,首先為什么會(huì)引入線程的概念呢?舉個(gè)例子:

你有一個(gè)文本程序,三個(gè)功能組成部分:接收用戶的輸入,顯示到屏幕上,保存到硬盤里,如果由三個(gè)進(jìn)程組成:輸入接收進(jìn)程A,顯示內(nèi)容進(jìn)程B,寫入硬盤進(jìn)程C,而他們之間共同需要擁有的東西——文本內(nèi)容,而進(jìn)程A,B,C運(yùn)行在不同的內(nèi)存空間,這就涉及到進(jìn)程通信問(wèn)題了,而頻繁
的進(jìn)程切換勢(shì)必導(dǎo)致性能上的損失。有沒(méi)有一種機(jī)制使得做這三個(gè)任務(wù)時(shí)共享資源呢?這個(gè)時(shí)候線程(輕量級(jí)的進(jìn)程)就派上用場(chǎng)了,多個(gè)線程共享進(jìn)程數(shù)據(jù)。相信讀者看到這里,對(duì)于多進(jìn)程和多線程
的概念應(yīng)該有個(gè)初步的了解了,接下來(lái)簡(jiǎn)單比較下兩者的優(yōu)劣和使用場(chǎng)景:

簡(jiǎn)書(shū)

2、線程的生命周期

線程的生命周期如圖所示

[圖片上傳失敗...(image-bc721e-1555409468002)]

各個(gè)狀態(tài)說(shuō)明

  • New(新建),新創(chuàng)建的線程進(jìn)過(guò)初始化,進(jìn)入Runnable(就緒)狀態(tài)。
  • Runnable(就緒),等待線程調(diào)度,調(diào)度后進(jìn)入Running(運(yùn)行)狀態(tài)。
  • Running(運(yùn)行),線程正常運(yùn)行,期間可能會(huì)因?yàn)槟承┣闆r進(jìn)入Blocked
    (同步鎖;調(diào)用了sleep()和join()方法進(jìn)入Sleeping狀態(tài);執(zhí)行wait()方法進(jìn)入
    Waiting狀態(tài),等待其他線程notify通知喚醒)。
  • Blocked(堵塞),線程暫停運(yùn)行,解除堵塞后進(jìn)入Runnable(就緒)狀態(tài)重新等待調(diào)度。
  • Dead(死亡):線程完成了它的任務(wù)正常結(jié)束或因異常導(dǎo)致終止。

3、并行與并發(fā),同步與異步

并行與并發(fā)的區(qū)別

并行是同時(shí)處理多個(gè)任務(wù),而并發(fā)則是處理多個(gè)任務(wù),而不一定要同時(shí),并行可以說(shuō)是并發(fā)的子集

同步與異步的區(qū)別

  • 同步:線程執(zhí)行某個(gè)請(qǐng)求,如果該請(qǐng)求需要一段時(shí)間才能返回信息,那么這個(gè)線程
    會(huì)一直等待,直到收到返回信息才能繼續(xù)執(zhí)行下去。
  • 異步:線程執(zhí)行完某個(gè)請(qǐng)求,不需要一直等直接繼續(xù)執(zhí)行后續(xù)操作,當(dāng)有消息
    返回時(shí)系統(tǒng)會(huì)通知線程進(jìn)程處理,這樣可以提高執(zhí)行的效率;異步在網(wǎng)絡(luò)請(qǐng)求
    的應(yīng)用非常常見(jiàn)。

4、線程同步安全

什么是線程同步安全問(wèn)題

當(dāng)有兩個(gè)或以上線程在同一時(shí)刻訪問(wèn)同一資源,可能會(huì)帶來(lái)一些問(wèn)題。
比如:數(shù)據(jù)庫(kù)表不允許插入重復(fù)數(shù)據(jù),而線程1,2都得到了數(shù)據(jù)X,然后線程1,2同時(shí)查詢了數(shù)據(jù)庫(kù),發(fā)現(xiàn)沒(méi)有數(shù)據(jù)X,接著兩線程都往數(shù)據(jù)庫(kù)中插入了X,然后就出現(xiàn)異常了,這就是線程的同步安全問(wèn)題,而這里的數(shù)據(jù)庫(kù)資源我們又稱為:臨界資源(共享資源)

如何解決同步安全問(wèn)題(同步鎖)?

當(dāng)多個(gè)線程訪問(wèn)臨界資源的時(shí)候,有可能會(huì)出現(xiàn)線程安全問(wèn)題;而基本所有并發(fā)模式在解決線程安全問(wèn)題時(shí)都采用"系列化訪問(wèn)臨界資源"的方式,就是同一時(shí)刻,只能有一個(gè)線程訪問(wèn)臨界資源,也稱"同步互斥訪問(wèn)"。通常的操作就是加鎖(同步鎖),當(dāng)有線程訪問(wèn)臨界資源時(shí)需要獲得這個(gè)鎖,其他線程無(wú)法訪問(wèn),只能等待(堵塞),等這個(gè)線程使用完釋放鎖,供其他線程繼續(xù)訪問(wèn)。


5、與鎖有關(guān)的特殊情況:死鎖,饑餓與活鎖

有了同步鎖并不意味著就一了百了了,當(dāng)多個(gè)進(jìn)程/線程的操作涉及到了多個(gè)鎖,
就可能出現(xiàn)下述三種情況:

  • 死鎖(DeadLock)

兩個(gè)或以上進(jìn)程(線程)在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,如果無(wú)外力作用,他們將繼續(xù)這樣僵持下去。舉個(gè)形象化的例子:

開(kāi)一個(gè)門需要兩條鑰匙,而兩個(gè)人手上各持有一條,然后都不愿意把自己的鑰匙給對(duì)方,就一直那樣僵持著,這種狀態(tài)就叫死鎖。

死鎖發(fā)生的條件

  • 互斥條件(臨界資源);
  • 請(qǐng)求和保持條件(請(qǐng)求資源但不釋放自己暫用的資源);
  • 不剝奪條件(線程獲得的資源只有線程使用完后自己釋放,不能被其他線程剝奪);
  • 環(huán)路等待條件:在死鎖發(fā)生時(shí),必然存在一個(gè)“進(jìn)程-資源環(huán)形鏈”,t1等t2,t2等t1;

如何避免死鎖

破壞四個(gè)條件中的一個(gè)或多個(gè)條件,常見(jiàn)的預(yù)防方法有如下兩種:

① 有序資源分配法:資源按某種規(guī)則統(tǒng)一編號(hào),申請(qǐng)時(shí)必須按照升序申請(qǐng): 屬于同一類的資源要一次申請(qǐng)完,申請(qǐng)不同類資源按照一定的順序申請(qǐng)。

② 銀行家算法:就是檢查申請(qǐng)者對(duì)資源的最大需求量,如果當(dāng)前各類資源都可以滿足的 申請(qǐng)者的請(qǐng)求,就滿足申請(qǐng)者的請(qǐng)求,這樣申請(qǐng)者就可很快完成其計(jì)算,然后釋放它占用 的資源,從而保證了系統(tǒng)中的所有進(jìn)程都能完成,所以可避免死鎖的發(fā)生。 理論上能夠非常有效的避免死鎖,但從某種意義上說(shuō),缺乏使用價(jià)值,因?yàn)楹苌儆羞M(jìn)程能夠知道所需資源的最大值,而且進(jìn)程數(shù)目也不是固定的,往往是不斷變化的, 況且原本可用的資源也可能突然間變得不可用(比如打印機(jī)損壞)。

  • 2.饑餓(starvation)與餓死(starve to death)

資源分配策略有可能是不公平的,即不能保證等待時(shí)間上界的存在,即使沒(méi)有發(fā)生死鎖, 某些進(jìn)程可能因長(zhǎng)時(shí)間的等待對(duì)進(jìn)程推進(jìn)與相應(yīng)帶來(lái)明顯影響,此時(shí)的進(jìn)程就是 發(fā)生了進(jìn)程饑餓(starvation),當(dāng)饑餓達(dá)到一定程度即使此時(shí)進(jìn)程即使完成了任務(wù)也沒(méi)有實(shí)際意義時(shí),此時(shí)稱該進(jìn)程被餓死(starve to death),舉個(gè)典型的例子:文件打印采用短文件優(yōu)先策略,如果短文件太多,長(zhǎng)文件會(huì)一直推遲,那還打印個(gè)毛。

  • 3.活鎖(LiveLock)

特殊的饑餓,一系列進(jìn)程輪詢等待某個(gè)不可能為真的條件為真,此時(shí)進(jìn)程不會(huì)進(jìn)入blocked狀態(tài),但會(huì)占用CPU資源,活鎖還有幾率能自己解開(kāi),而死鎖則無(wú)法自己解開(kāi)。(例子:都覺(jué)得對(duì)方優(yōu)先級(jí)比自己高,相互謙讓,導(dǎo)致無(wú)法使用某資源),簡(jiǎn)單避免活鎖的方法:先來(lái)先服務(wù)策略


6、守護(hù)線程

又稱「后臺(tái)線程」,是一種為其他線程提供服務(wù)的線程,比如一個(gè)簡(jiǎn)單的例子:你有兩個(gè)線程在協(xié)同的做一件事,如果有一個(gè)線程死掉,事情就無(wú)法繼續(xù)下去,此時(shí)可以引入守護(hù)線程,輪詢地去判斷兩個(gè)線程是否活著(調(diào)isAlive()),如果死掉就start開(kāi)啟線程,在Python中可以在線程初始化的時(shí)候調(diào)用setDaemon(True)把線程設(shè)置為守護(hù)線程,另外如果程序中只剩下守護(hù)線程的話程序會(huì)自動(dòng)退出。


7、線程并發(fā)的經(jīng)典問(wèn)題:生產(chǎn)中與消費(fèi)者問(wèn)題

說(shuō)到線程并發(fā),不得不說(shuō)的一個(gè)經(jīng)典問(wèn)題就是:生產(chǎn)中與消費(fèi)者問(wèn)題

兩個(gè)共享固定緩沖區(qū)大小的線程,生產(chǎn)者線程負(fù)責(zé)生產(chǎn)一定量的數(shù)據(jù) 放入緩沖區(qū), 而消費(fèi)者線程則負(fù)責(zé)消耗緩沖區(qū)中的數(shù)據(jù),關(guān)鍵問(wèn)題是需要保證兩點(diǎn):

  • 緩沖區(qū)滿的時(shí)候,生產(chǎn)者不再往緩沖區(qū)中填充數(shù)據(jù)。
  • 緩存區(qū)空的時(shí)候,消費(fèi)者不在消耗緩沖區(qū)中的數(shù)據(jù)。

8、Python中的GIL鎖

上面講到Python在實(shí)現(xiàn)Python解析器(CPython)時(shí)引入了GIL鎖,使得「任何時(shí)候僅有 一個(gè)線程在執(zhí)行」,Python多線程的效率可能還比不上單線程,那么這個(gè)GIL鎖是什么?

概念:全局解釋器鎖,用于同步線程的一種機(jī)制,使得任何時(shí)候僅有一個(gè)線程在執(zhí)行。GIL 并不是Python的特性,只是在實(shí)現(xiàn)Python解析器(CPython)時(shí)引入的一個(gè)概念。換句話說(shuō),Python完全可以不依賴于GILPython解釋器進(jìn)程內(nèi)的多線程是以協(xié)作多任務(wù)方式執(zhí)行的,當(dāng)一個(gè)線程遇到I/O操作時(shí)會(huì)釋放GIL,而依賴CPU計(jì)算的線程則是執(zhí)行代碼量到一定的閥值才會(huì)釋放GIL

而在Python 3.2開(kāi)始使用新的GIL,使用固定的超時(shí)時(shí)間來(lái)指示當(dāng)前線程放棄全局鎖,就是:「當(dāng)前線程持有這個(gè)鎖,且其他線程請(qǐng)求這個(gè)鎖時(shí),當(dāng)前線程就會(huì)在5毫秒后被強(qiáng)制釋放掉該鎖。」多線程在處理CPU密集型操作因?yàn)楦鞣N循環(huán)處理計(jì)數(shù)等,會(huì)很快達(dá)到閥值,而**多個(gè)線程來(lái)回切換是會(huì)消耗資源的,所以多線程的效率往往可能還比不上單線程!

而在多核CPU上效率會(huì)更低,因?yàn)槎嗪谁h(huán)境下,持有鎖的CPU釋放鎖后,其他CPU上的線程都會(huì)進(jìn)行競(jìng)爭(zhēng),但GIL可能馬上又會(huì)被之前的CPU拿到拿到,導(dǎo)致其他幾個(gè)CPU上被喚醒后的線程會(huì)醒著等待到切換時(shí)間后又進(jìn)入待調(diào)度狀態(tài),從而造成 線程顛簸(thrashing),導(dǎo)致效率更低

問(wèn)題因?yàn)镚IL鎖的原因,對(duì)于CPU密集型操作,Python多線程就是雞肋了?

答:是的!盡管多線程開(kāi)銷小,但卻無(wú)法利用多核優(yōu)勢(shì)!可以使用多進(jìn)程來(lái)規(guī)避這個(gè)問(wèn)題,Python提供了multiprocessing這個(gè)跨平臺(tái)的模塊來(lái)幫助我們實(shí)現(xiàn)多進(jìn)程代碼的編寫。每個(gè)進(jìn)程都有自己獨(dú)立的GIL,因此不會(huì)出現(xiàn)進(jìn)程間GIL鎖搶奪的問(wèn)題,但是也增加程序?qū)崿F(xiàn)線程間數(shù)據(jù)通訊和同步時(shí)的成本,這個(gè)需要自行進(jìn)行權(quán)衡。


9、Python中對(duì)多線程與多進(jìn)程的支持

Python與線程,進(jìn)程相關(guān)的官方文檔鏈接:docs.python.org/3/library/c…

簡(jiǎn)單說(shuō)下這些模塊都是干嘛的:

  • threading—— 提供線程相關(guān)的操作。
  • multiprocessing—— 提供進(jìn)程程相關(guān)的操作。
  • concurrent.futures—— 異步并發(fā)模塊,實(shí)現(xiàn)多線程和多進(jìn)程的異步并發(fā)(3.2后引入)。
  • subprocess—— 創(chuàng)建子進(jìn)程,并提供鏈接到他們輸入/輸出/錯(cuò)誤管道的方法,并獲得他們的返回碼,該模塊旨在替換幾個(gè)較舊的模塊和功能:os.system與os.spawn*。
  • sched——任務(wù)調(diào)度(延時(shí)處理機(jī)制)。
  • queue——提供同步的、線程安全的隊(duì)列類。

還有幾個(gè)是兼容模塊,比如Python 2.x上用threading和Python 3.x上用thread:

  • dummy_threading:提供和threading模塊相同的接口,2.x使用threading兼容。
  • _thread:threading模塊的基礎(chǔ)模塊,應(yīng)該盡量使用 threading 模塊替代。
  • dummy_thread:提供和thread模塊相同的接口,3.x使用threading兼容。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,786評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,986評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,204評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,964評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,354評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,554評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,106評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,918評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,093評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,342評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,755評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,009評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,839評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,107評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容

  • 一. 操作系統(tǒng)概念 操作系統(tǒng)位于底層硬件與應(yīng)用軟件之間的一層.工作方式: 向下管理硬件,向上提供接口.操作系統(tǒng)進(jìn)行...
    月亮是我踢彎得閱讀 5,993評(píng)論 3 28
  • 線程 操作系統(tǒng)線程理論 線程概念的引入背景 進(jìn)程 之前我們已經(jīng)了解了操作系統(tǒng)中進(jìn)程的概念,程序并不能單獨(dú)運(yùn)行,只有...
    go以恒閱讀 1,665評(píng)論 0 6
  • 概念理解 對(duì)于操作系統(tǒng)來(lái)說(shuō),一個(gè)任務(wù)就是一個(gè)進(jìn)程。例如打開(kāi)瀏覽器,打開(kāi)word,打開(kāi)記事本等等,都是獨(dú)立的任務(wù),它...
    忘了呼吸的那只貓閱讀 437評(píng)論 0 1
  • Python是運(yùn)行在解釋器中的語(yǔ)言,查找資料知道,python中有一個(gè)全局鎖(GIL),在使用多線程(Thread...
    冬季戀歌1218閱讀 905評(píng)論 0 2
  • 必備的理論基礎(chǔ) 1.操作系統(tǒng)作用: 隱藏丑陋復(fù)雜的硬件接口,提供良好的抽象接口。 管理調(diào)度進(jìn)程,并將多個(gè)進(jìn)程對(duì)硬件...
    drfung閱讀 3,560評(píng)論 0 5