正如fucking real world,總有貌似搞不完的工作,浩瀚無(wú)際的信息向我們迎面而來(lái)。而我們的腦袋只有一個(gè),無(wú)法多去處理那些紛繁的事務(wù),需要進(jìn)行規(guī)劃和執(zhí)行,可以像上班一樣一天只做一件事,也可以像上學(xué)一樣一天切換多節(jié)課。
計(jì)算機(jī)面臨的問(wèn)題與我們相同,只有一個(gè)處理器核心(多核大多也被抽象成單核來(lái)利于編程),所以前人們就需要用并行和同步這兩個(gè)概念去應(yīng)對(duì)處理現(xiàn)實(shí)的那些繽繁的問(wèn)題
并行對(duì)于我們并不直觀。我們大腦是一個(gè)非常精妙的系統(tǒng),所采取的并行策略是一明一暗兩條線,我們?nèi)粘8兄拿骶€是線性的,于是就和計(jì)算機(jī)中并行的概念沖突了,所以概念并不直觀。時(shí)間這個(gè)概念亦是,所以對(duì)于問(wèn)題我們先要在腦中抽象出這樣一個(gè)這么一些概念,然后去映射到編程當(dāng)中,這個(gè)過(guò)程由于反直覺,會(huì)產(chǎn)生一些常見的問(wèn)題,例如競(jìng)爭(zhēng)條件、死鎖和活鎖。
我們也并不孤獨(dú),處理并發(fā)思路構(gòu)建與前人的智慧之上。根據(jù)系統(tǒng)層級(jí),和實(shí)現(xiàn)方式,有三大類
- 基于進(jìn)程
內(nèi)核自動(dòng)管理多個(gè)邏輯流
每個(gè)進(jìn)程有其私有的地址空間(也就是說(shuō)進(jìn)程切換的時(shí)候需要保存和載入數(shù)據(jù)) - 基于事件
由程序員手動(dòng)控制多個(gè)邏輯流
所有的邏輯流共享同一個(gè)地址空間
這個(gè)技術(shù)稱為 I/O multiplexing - 基于線程
內(nèi)核自動(dòng)管理多個(gè)邏輯流
每個(gè)線程共享地址空間
屬于基于進(jìn)程和基于事件的混合體
用強(qiáng)大的邏輯和抽象把并行能夠執(zhí)行之后還有一個(gè)非常重要的問(wèn)題,那就是數(shù)據(jù)的同步,并行任務(wù)邏輯往往會(huì)交織,所以需要一些方法去保證并行中數(shù)據(jù)的同步,主要有
- 共享變量
- 臨界區(qū) Critical Section
- 信號(hào)量
這個(gè)領(lǐng)域也有著兩個(gè)經(jīng)典的模版問(wèn)題
- 生產(chǎn)者-消費(fèi)者問(wèn)題
- 讀者-寫者問(wèn)題
給這個(gè)紛雜的世界一些假設(shè)和先驗(yàn),世界的運(yùn)行就變得有邏輯可循