去线程化与智能调度
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
多線程是個(gè)問題。
當(dāng)多個(gè)任務(wù)真正并發(fā)執(zhí)行的時(shí)候,等待時(shí)間最大化。不管在對(duì)內(nèi)存的利用上還是任務(wù)的實(shí)時(shí)性上都是不利的。公平是效率是矛盾的。
加了優(yōu)先級(jí)就不一樣了,但是優(yōu)先級(jí)不能得到實(shí)時(shí)反饋的任務(wù)信息,需要?jiǎng)討B(tài)調(diào)整的話也不好做。
根子在io。io的不確定性太大。
另外一方面,多線程起源于多道程序設(shè)計(jì),多道程序設(shè)計(jì)也起源于分時(shí)。多道程序設(shè)計(jì)如果不考慮分時(shí)的公平性需求的話也是多余的,多個(gè)任務(wù)可以輪著上,效率更高。但是這個(gè)在多個(gè)長(zhǎng)線程的需求下失效。有些任務(wù)是永遠(yuǎn)也完成不了的,它們需要分時(shí)。特別是操作系統(tǒng)任務(wù),長(zhǎng)的不得了。于是分時(shí)碉堡了,沒人動(dòng)得了它。
這就是現(xiàn)在的多任務(wù)。
我決定換個(gè)角度來(lái)考慮,把處理器看成一個(gè)主動(dòng)找活干的人。
歸根結(jié)底,只要所有的活都被干了,那么就無(wú)所謂活有沒有干完這個(gè)問題了。或者,只要處理器已經(jīng)滿負(fù)荷,那么其余的都不是問題。
并且我覺得這個(gè)的系統(tǒng)粒度更小一點(diǎn),所以能提供更細(xì)致的任務(wù)區(qū)分。
線程粒度太粗。
提供更細(xì)致的任務(wù)區(qū)分是建立智能調(diào)度的基礎(chǔ)。因?yàn)榫€程沒有辦法被描述。比如一個(gè)文件訪問明顯是一個(gè)不同的任務(wù),單獨(dú)拿出來(lái)做可能要好的多。而且不會(huì)因?yàn)閕o緩慢阻塞原來(lái)的線程形成內(nèi)存溢出。很多時(shí)候io恰恰是一個(gè)線程的最大堆棧點(diǎn)。并且一個(gè)多階段io的線程將長(zhǎng)期占據(jù)內(nèi)存不放。
這個(gè)改革將使傳統(tǒng)的編程模型全部實(shí)效。J2EE所有的api都將廢棄。J2EE跟線程模型太粘。它是典型的方法調(diào)用型計(jì)算。加上面向?qū)ο?#xff0c;內(nèi)存很吃虧。多線程跑不動(dòng)就在這里:io加對(duì)象,線程給卡死了。
這個(gè)其實(shí)也不是大問題。
我覺得只要處理器能動(dòng)就不是問題。大多數(shù)時(shí)候并沒有這個(gè)問題。
那么為什么還要智能調(diào)度呢?
不要。我只是想把多核給真正跑起來(lái)。也許小粒度的任務(wù)定義能提供更好的并行性能。
關(guān)鍵任務(wù)之間的關(guān)系怎么處理。怎么去掉任務(wù)的時(shí)序?有兩個(gè)問題:一是單任務(wù)的劃分,一是多任務(wù)的并行。這樣是否意味著一個(gè)多級(jí)任務(wù)模型?這樣就復(fù)雜了肯定fail掉。
必須要?jiǎng)澐?#xff0c;否則不可能做到單任務(wù)的并行。對(duì)線程進(jìn)行流水線改造。那你又想,為什么線程不行。線程不符合現(xiàn)實(shí)情況:現(xiàn)實(shí)并發(fā)任務(wù)并不多。當(dāng)沒有并發(fā)的時(shí)候不能充分利用機(jī)器的計(jì)算能力。
子任務(wù)間的依賴將是自適應(yīng)的:條件沒到就做不了。索性去做別的。
這樣就真正去掉了線程:不允許定義線程。沒有線程。操作系統(tǒng)將全權(quán)掌握系統(tǒng)的運(yùn)行而不只是調(diào)度線程。任務(wù)退后,系統(tǒng)站出來(lái),像批處理,一切由操作系統(tǒng)說了算。用戶提交的只是真正的“任務(wù)”,而不是一個(gè)“程序”。
另一方面,分時(shí)其實(shí)是迫不得已:
處理器被占用時(shí)不可能做任何真正的智能調(diào)度。因?yàn)樗鼪]有周期。
但是多核可以。多核隨時(shí)可以動(dòng)態(tài)調(diào)度。這樣也迫使將任務(wù)降級(jí),使之完全聽命于操作系統(tǒng)而不是只能用個(gè)時(shí)鐘中斷時(shí)不時(shí)地看一下優(yōu)先級(jí)動(dòng)了沒有。
關(guān)鍵是任務(wù)降級(jí)。成為魚腩。是任務(wù)是操作系統(tǒng)的魚腩,不是操作系統(tǒng)是線程的魚腩。要奪回操作系統(tǒng)的權(quán)利。
去線程化的關(guān)鍵則在于強(qiáng)調(diào)處理器的第一性地位。讓處理器跳出來(lái),形成一個(gè)worker。而不是線程的服用。把它看成是工作的真正完成者而不是線程。讓線程的概念退下,不需要它了。單處理器下必須線程來(lái)做到分時(shí),現(xiàn)在不需要了。分時(shí)是為了并發(fā),復(fù)用,現(xiàn)在自然可以并發(fā)復(fù)用了。多任務(wù)不等于并發(fā)。所以分時(shí)離開單處理器環(huán)境已經(jīng)沒有用。
另一件關(guān)于線程的事就是它嵌入了運(yùn)行時(shí)的語(yǔ)義。操作系統(tǒng)對(duì)他能做的就只有做與不做,不可能衍生其它的操作。這個(gè)限制了任務(wù)的語(yǔ)義發(fā)展。比如頂多發(fā)展到優(yōu)先級(jí),進(jìn)一步則很困難。去掉這個(gè)運(yùn)行時(shí)語(yǔ)義它就成了魚腩,基本原因就是這個(gè)概念離底層太近。從這個(gè)角度還可以看出,線程于系統(tǒng)安全的發(fā)展也很不利:它給予程序太多權(quán)利。去掉它的運(yùn)行時(shí)特性就給了操作系統(tǒng)空間去做所有的事情:你往你的空間退,你陳述一個(gè)任務(wù),我來(lái)完成它。這是個(gè)理想,我想把系統(tǒng)安全化。安全話最好的方法就是收縮任務(wù)的語(yǔ)義,讓他遠(yuǎn)離系統(tǒng)。這個(gè)就是最小化原則的應(yīng)用:不讓一個(gè)人惹事最好的辦法就是收縮與他的接口。收縮接口就是對(duì)他的信任解除。收縮它的相對(duì)行為空間!
在系統(tǒng)核心嵌入神經(jīng)學(xué)習(xí)網(wǎng)絡(luò),建立評(píng)價(jià)機(jī)制,讓系統(tǒng)自己學(xué)習(xí)而不是用概率來(lái)解決問題。使系統(tǒng)屈從于評(píng)價(jià)系統(tǒng)。加上規(guī)則系統(tǒng),可以建立一定的智能調(diào)度。在任務(wù)中加入評(píng)價(jià)api與數(shù)據(jù)服務(wù),讓用戶自己產(chǎn)生調(diào)度評(píng)價(jià)。這樣達(dá)到以及動(dòng)態(tài)達(dá)到最佳調(diào)度。可以對(duì)系統(tǒng)進(jìn)行充分的訓(xùn)練再投入使用也可以讓他在實(shí)踐中學(xué)習(xí)。它將學(xué)得非常快并且迅速達(dá)到最佳狀態(tài)。從這個(gè)角度考慮,關(guān)鍵要形成正確合理粒度的資源概念。 --這是個(gè)理想。
轉(zhuǎn)載于:https://my.oschina.net/digerl/blog/221398
總結(jié)
- 上一篇: hadoop--MapReduce框架原
- 下一篇: 倒排索引、分词、同义词