云晶Cloud:解說(shuō)已有的操作系統(tǒng)(三)
04??操作系統(tǒng)中與編程有關(guān)的基本知識(shí)

進(jìn)程線程的基本概念
并發(fā)和隔離。
程序執(zhí)行的上下文(Context of Execution)
執(zhí)行與調(diào)度的基本單位:thread
資源所有權(quán):process
進(jìn)程是資源的容器,包含(一個(gè)或)多個(gè)線程。內(nèi)核調(diào)度的基本單位是線程(不完全是)、而非進(jìn)程。
同一進(jìn)程下的各個(gè)線程共享資源(address space、open files、signal handlers,etc),但寄存器、棧、PC指針等不共享。
進(jìn)程和線程到底有什么區(qū)別?
以上其實(shí)已經(jīng)說(shuō)了一部分,線程是調(diào)度和執(zhí)行的基本單位,最終代碼都在線程中執(zhí)行。而進(jìn)程是資源的容器,包括一個(gè)或多個(gè)線程。同一個(gè)進(jìn)程下的各個(gè)線程共享資源。
如下圖為區(qū)別:

Linux的線程進(jìn)程概念

Linux的線程是用戶(hù)級(jí)別的,也就是內(nèi)核中不存在線程。
所有的線程管理都在應(yīng)用層去執(zhí)行。
內(nèi)核不關(guān)心,實(shí)際上也覺(jué)察不到線程的存在。
Windows的線程進(jìn)程概念

而從上圖也可以看出,Windows和Linux顯然采用不同的理念。
windows的線程是內(nèi)核級(jí)別的。
Windows是這些概念的一個(gè)例子。
內(nèi)核維護(hù)著線程和進(jìn)程的上下文。
調(diào)度實(shí)際上是基于線程而運(yùn)行的。
05??進(jìn)程間的通信
有了線程,進(jìn)程的隔離,就需要線程進(jìn)程之間的通信機(jī)制來(lái)保證協(xié)作完成任務(wù),共享訪問(wèn)數(shù)據(jù)。
Windows進(jìn)程間的通信
文件映射
共享內(nèi)存
匿名管道(單項(xiàng),一端寫(xiě),一端讀)
命名管道。
動(dòng)態(tài)鏈接庫(kù)
遠(yuǎn)程過(guò)程調(diào)用(可以在一臺(tái)機(jī)器內(nèi),也可以跨機(jī)器)
UDS(Unix Domain Socket)
基于Windows的消息機(jī)制 ……
Linux進(jìn)程間的通信
管道(Pipe),以及有名管道
信號(hào)(Signal)
報(bào)文(Message)隊(duì)列(消息隊(duì)列)
共享內(nèi)存(效率最高)
信號(hào)量(Semaphore)
主要作用是進(jìn)程間,以及同一進(jìn)程的不同線程之間的同步手段(UDS)Socket套接字
以上Window和Linux雖然采用了不同的方式,概念上有所不同的方式進(jìn)行進(jìn)程間的通信,實(shí)際上,他們的基本原理類(lèi)似。
06??線程間的通信
共享數(shù)據(jù)結(jié)構(gòu)。共享內(nèi)存
事件(Event)傳遞
消息隊(duì)列
郵箱(ucosII)
07??線程同步
線程同步,即當(dāng)有一個(gè)線程在對(duì)內(nèi)存或者外設(shè)進(jìn)行操作時(shí),其他線程都不可以對(duì)這個(gè)內(nèi)存地址或者外設(shè)進(jìn)行操作,直到該線程完成操作,其他線程才可以進(jìn)行操作,而其他線程又處于等待狀態(tài),實(shí)現(xiàn)線程同步的方法有很多,如下。
一般使用信號(hào)量(Semaphore)。
高級(jí)語(yǔ)言如java本身語(yǔ)言的設(shè)計(jì)就為此考慮,如synchronized關(guān)鍵字,wait,notify方法。
可以使用Mutex。
臨界區(qū)對(duì)象。
08??信號(hào)量與互斥鎖
Semaphore(信號(hào)量,或者信號(hào)燈)
以一個(gè)停車(chē)場(chǎng)的運(yùn)作為例。簡(jiǎn)單起見(jiàn),假設(shè)停車(chē)場(chǎng)只有三個(gè)車(chē)位,一開(kāi)始三個(gè)車(chē)位都是空的。
如果同時(shí)來(lái)了五輛車(chē),看門(mén)人允許其中三輛直接進(jìn)入,然后放下車(chē)攔,剩下的車(chē)則必須在入口等待,此后來(lái)的車(chē)也都不得不在入口處等待。
這時(shí),有一輛車(chē)離開(kāi)停車(chē)場(chǎng),看門(mén)人得知后,打開(kāi)車(chē)欄,放入外面的一輛進(jìn)去,如果又離開(kāi)兩輛,則又可以放入兩輛,如此往復(fù)。
在微觀世界里,計(jì)算機(jī)世界里,比如訪問(wèn)硬盤(pán)空間,讀取數(shù)據(jù),往往資源有限??梢钥梢允褂迷摍C(jī)制,進(jìn)行有效的對(duì)資源的訪問(wèn)進(jìn)行協(xié)調(diào)控制。
Mutex(互斥鎖)
一次只能有一個(gè)線程進(jìn)入的特殊信號(hào)量。性能會(huì)比信號(hào)量好。對(duì)于某些特殊的應(yīng)用場(chǎng)景,一次只能有一個(gè)線程訪問(wèn),待該線程退出后,其他線程方可繼續(xù)運(yùn)行。例如操作系統(tǒng)的IO外設(shè),打印機(jī),現(xiàn)實(shí)生活當(dāng)中的公共衛(wèi)生間等等。