至今爲止在學習操做系統過程當中累計的問題

還在排版中
對文中不少定義不是很確定,但願能有人指正。node

提問
問題1.爲何複製一個大文件比複製不少小的文件快。
問題2.從服務器上覆制文件使用多線程仍是多進程。
問題3.那麼嚴格意義上線程除了TLS之外沒有私有變量?只要得到了指針,即可以對其餘線程的數據進行修改。
問題4.內核空間和用戶空間都是虛擬內存的一部分?
問題5.對於高併發的網絡請求,多進程多線程可能都不能知足?對於c語言來講,又是什麼狀況?
問題5.各類IPC使用場景,雖然搜索了一些資料,但以爲十分片面,理解不深。
問題6.使用socket麻煩的地方,頭,協議,封裝,配置成本?
問題7.零拷貝是什麼
問題8.沖洗和關閉?
問題9.默認I/O流
問題10.signal和sigaction的區別python

其餘的也但願老師能過目一下,確認下個人理解沒有錯誤linux

CPU密集型和IO密集型
因爲python GILd的存在,python多線程並非並行而是併發,也就致使了CPU密集型任務效率的降低
IO密集型由於等待而掛起的時間很長,因此多線程也適用,而且建立線程,上下文切換消耗的資源都比進程小,因此速度更快。
所以,對於python,cpu密集型使用多進程,而IO密集型使用多線程
對於高併發的網絡請求,多進程多線程可能都不能知足?對於c語言來講,又是什麼狀況?nginx

對於一個聊天室應用,十個通訊設備各開一個線程,對cpu負擔很大,這時候應用的就是IO多路複用select,poll,epoll
順帶一提,對於cpu讀寫的負擔使用的是緩存和緩衝。apache

暫未了解 併發 nginx,apache,tomcat,編程

進程的切換=進程中線程的切換segmentfault

暫未理解使用socket麻煩的地方,頭,協議,封裝,配置成本?
暫未了解IPC,RPC,API網關緩存

第一章
文件和目錄的區別?
在linux中,都是以文件描述的,他們的文件類型不一樣。
目錄文件存儲了目錄下全部文件名和inode的映射關係。tomcat

把文件rm掉會發生什麼?
1)使用unlink減小連接數量,
2)若是連接數爲0釋放inode,則數據塊放到可用空間列表中;
3)刪除目錄中的目錄項
https://blog.csdn.net/weixin_...服務器

爲何同一個文件系統移動文件很快?
由於只刪除了目錄中原位置的對應關係,在移動後的位置加上了新的對應關係,沒有對數據進行寫處理。
不一樣文件系統使用的是rm+cp

格式化?
inode-table也是須要佔用存儲空間的。

第三章
緩衝和緩存
見個人文章 buffer and cache
https://segmentfault.com/a/11...

第七章
已經忘記 fork和vfork
暫未理解 如何保存密碼,將密碼寫入環境變量中

第十章
kill -9 init會發生什麼?
The only signals that can be sent to process ID 1, the init process, are those for which init has explicitly installed signal handlers. This is done to assure the system is not brought down accidentally.
根據上文,什麼都不會發生,由於init沒有對SIGTERM創建signal handler?
https://unix.stackexchange.co...

第十一章?
cpu上下文切換分爲進程上下文切換,線程上下文切換,中斷上下文切換

進程和線程的異同點?
(1)
線程是調度的基本單位,而進程則是資源擁有的基本單位
進程時系統資源分配的最小單位
線程時cpu操做和調度的最小單位,本質是一組寄存器的狀態,是操做系統對寄存器狀態的抽象
e.g. 進程就是一我的,線程就是這我的收到的一件事情,對於不少事情,一我的能夠作多件事情,或者能夠喊不少人每一個人作一件事。
(2)
上下文切換成本 進程遠大於線程
進程的上下文不只包括了虛擬內存、棧、全局變量等用戶空間的資源,還包括了內核堆棧、寄存器等內核空間的狀態。
線程上下文切換線程局部存儲 (TLS) ,棧和寄存器等
這兩種上下文切換的處理都是經過操做系統內核來完成的。
內核的這種切換過程伴隨的最顯著的性能損耗是將寄存器中的內容切換出。
(3)
進程中的線程共享地址空間,進程間的通訊的代價遠大於線程間的通訊
得設立管道,共享隊列,信號,信號量,socket
(4)
線程的建立成本遠遠低於進程,由於線程中包含的數據量少於進程,線程只須要執行相關的數據便可,如,pc,寄存器,棧,執行狀態

第十一章
線程之間獨有的資源有
https://cloud.tencent.com/dev...
棧區
同時函數運行時須要額外的寄存器來保存一些信息,像部分局部變量之類,這些寄存器也是線程私有的,一個線程不可能訪問到另外一個線程的這類寄存器信息。
所屬線程的棧區、程序計數器、棧指針以及函數運行使用的寄存器是線程私有的。這些信息有一個統一的名字,就是線程上下文,thread context。
那麼嚴格意義上線程除了TLS之外沒有私有變量?只要得到了指針,即可以對其餘線程的數據進行修改。
TLS -> Thread Local Storge?
存放在該區域中的變量是全局變量,全部線程均可以訪問
他是全局的,可是每一個線程在訪問的時候都會存儲一份成爲本身的局部變量,修改就不會相互影響了
雖然看上去全部線程訪問的都是同一個變量,但該全局變量獨屬於一個線程,一個線程對此變量的修改對其餘線程不可見。
實現原理相似有一個全局的詞典,詞典的key是線程id,value就是共享的全局變量的副本。
http://blog.hacksmeta.com/201...

線程共享的資源
代碼區 編譯後的代碼
數據區 全局變量,靜態變量。
堆區 C/C++中用malloc或者new出來的數據就存放在這個區域,只要知道指針,任何一個線程均可以訪問指針指向的數據,所以堆區也是線程共享的屬於進程的資源。
棧區 若是一個線程能拿到來自另外一個線程棧幀上的指針,那麼該線程就能夠改變另外一個線程的棧區,也就是說這些線程能夠任意修改本屬於另外一個線程棧區中的變量。
動態連接庫 動態連接的部分生成的庫就是咱們熟悉的動態連接庫,在Windows下是以DLL結尾的文件,在Linux下是以so結尾的文件。
文件
若是程序在運行過程當中打開了一些文件,那麼進程地址空間中還保存有打開的文件信息,進程打開的文件也能夠被全部的線程使用,這也屬於線程間的共享資源。

忘記問題是什麼 cpu密集型中下降cpu使用率?
①增長cpu
②下降系統進程,線程數

鎖的使用場景
見個人文章UNIX環境高級編程第十一章遺留問題筆記
https://segmentfault.com/a/11...

第十四章
阻塞,非阻塞
阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.
阻塞調用是指調用結果返回以前,當前線程會被掛起。調用線程只有在獲得結果以後纔會返回。
非阻塞調用指在不能馬上獲得結果以前,該調用不會阻塞當前線程。程序定時?查看調用是否完成。

同步和異步
同步與異步同步和異步關注的是消息通訊機制 (synchronous communication/ asynchronous communication).
所謂同步,就是在發出一個調用時,在沒有獲得結果以前,該調用就不返回。可是一旦調用返回,就獲得返回值了。換句話說,就是由調用者主動等待這個調用的結果。而異步則是相反,調用在發出以後,這個調用就直接返回了,因此沒有返回結果。換句話說,當一個異步過程調用發出後,調用者不會馬上獲得結果。而是在調用發出後,被調用者經過狀態、通知來通知調用者,或經過回調函數處理這個調用。

第十五章
https://www.jianshu.com/p/498...
進程間通訊有什麼類型?他們的應用場景分別是什麼?
內核空間和用戶空間都是虛擬內存的一部分?

消息隊列和管道基本上都是4次拷貝,而共享內存(mmap, shmget)只有兩次。
1、管道
它是半雙工的(即數據只能在一個方向上流動),具備固定的讀端和寫端。
它只能用於具備親緣關係的進程之間的通訊(也是父子進程或者兄弟進程之間)。
它能夠當作是一種特殊的文件,對於它的讀寫也可使用普通的read、write 等函數。可是它不是普通的文件,並不屬於其餘任何文件系統,而且只存在於內存中。
應用場景?

2、FIFO
FIFO,也稱爲命名管道,它是一種文件類型。
FIFO能夠在無關的進程之間交換數據,與無名管道不一樣。
FIFO有路徑名與之相關聯,它以一種特殊設備文件形式存在於文件系統中。
應用場景?

3、消息隊列
消息隊列,是消息的連接表,存放在內核中。一個消息隊列由一個標識符(即隊列ID)來標識。
消息隊列是面向記錄的,其中的消息具備特定的格式以及特定的優先級。
消息隊列獨立於發送與接收進程。進程終止時,消息隊列及其內容並不會被刪除。
消息隊列能夠實現消息的隨機查詢,消息不必定要以先進先出的次序讀取,也能夠按消息的類型讀取。
應用場景
優勢上面已經說了,就是在特殊場景下有其對應的好處,解耦、異步、削峯
系統可用性下降:系統引入的外部依賴越多,越容易掛掉,原本你就是A系統調用BCD三個系統的接口就行了,人ABCD四個系統好好的,沒啥問題,你偏加個MQ進來,萬一MQ掛了咋整?MQ掛了,整套系統崩潰了,你不就完了麼。
系統複雜性提升:硬生生加個MQ進來,你怎麼保證消息沒有重複消費?怎麼處理消息丟失的狀況?怎麼保證消息傳遞的順序性?頭大頭大,問題一大堆,痛苦不已
一致性問題:A系統處理完了直接返回成功了,人都覺得你這個請求就成功了;可是問題是,要是BCD三個系統那裏,BD兩個系統寫庫成功了,結果C系統寫庫失敗了,咋整?你這數據就不一致了。
https://zhuanlan.zhihu.com/p/...
消息隊列和管道基本上都是4次拷貝,而共享內存(mmap, shmget)只有兩次。
第一步讀磁盤文件是要通過一次系統調用的,它首先將文件內容從磁盤拷貝到內核空間的一個緩衝區,而後再將這些數據拷貝到用戶空間,其實是兩次數據拷貝。第三步回寫也同樣也要通過兩次數據拷貝。
4次:1,write()輸入從磁盤到A內核空間。2,寫進B用戶空間。3,B調用read()讀入內核空間。4,從內核空間中放入磁盤.
而內存映射文件是操做系統的提供的一種機制,能夠減小這種沒必要要的數據拷貝,從而提升效率。它由mmap()將文件直接映射到用戶空間,mmap()並無進行數據拷貝,真正的數據拷貝是在缺頁中斷處理時進行的,因爲mmap()將文件直接映射到用戶空間,因此中斷處理函數根據這個映射關係,直接將文件從硬盤拷貝到用戶空間,因此只進行了一次數據拷貝 ,比read進行兩次數據拷貝要好上一倍,所以,內存映射的效率要比read/write效率高。
2次:1,輸入到用戶空間。 2,用戶空間到輸出。
零拷貝?
消息隊列和管道都是內核對象,所執行的操做也都是系統調用,而這些數據最終是要存儲在內存中執行的。所以不可避免的要通過4次數據的拷貝。可是共享內存不一樣,當執行mmap或者shmget時,會在內存中開闢空間,而後再將這塊空間映射到用戶進程的虛擬地址空間中,即返回值爲一個指向一個內存地址的指針。當用戶使用這個指針時,例如賦值操做,會引發一個從虛擬地址到物理地址的轉化,會將數據直接寫入對應的物理內存中,省去了拷貝到內核中的過程。當讀取數據時,也是相似的過程,所以總共有兩次數據拷貝。
優勢:

A. 咱們能夠經過發送消息來幾乎徹底避免命名管道的同步和阻塞問題。
  B. 咱們能夠用一些方法來提早查看緊急消息。

缺點:

A. 與管道同樣,每一個數據塊有一個最大長度的限制。
  B. 系統中全部隊列所包含的所有數據塊的總長度也有一個上限。

4、信號量
信號量(semaphore)與已經介紹過的 IPC 結構不一樣,它是一個計數器。信號量用於實現進程間的互斥與同步,而不是用於存儲進程間通訊數據。
信號量用於進程間同步,若要在進程間傳遞數據須要結合共享內存。
信號量基於操做系統的 PV 操做,程序對信號量的操做都是原子操做。
每次對信號量的 PV 操做不只限於對信號量值加 1 或減 1,並且能夠加減任意正整數。
支持信號量組。

信號量的雙用途:互斥 相似於mutex,可是mutex只能是加鎖的人解鎖 與  同步 -> 線程1和線程2 -> 線程3

5、共享內存
共享內存(Shared Memory),指兩個或多個進程共享一個給定的存儲區。
共享內存是最快的一種 IPC,由於進程是直接對內存進行存取。
由於多個進程能夠同時操做,因此須要進行同步。
信號量+共享內存一般結合在一塊兒使用,信號量用來同步對共享內存的訪問。

使用場景
傳遞很大的數據
大量讀同一數據的場景

6、信號
使用場景

接收進程某個時間已經發生,死亡。

7、套接字
使用場景

8、unix域套接字
使用場景

Linux-進程間通訊(N): 各類IPC的使用場景

  1. 管道:只能用於具備親緣關係的進行通訊,使用面相對較窄,實際開發中較少使用;
  2. FIFO(命名管道):能夠用於任意進程間的通訊,對於大塊數據的傳輸效率較高,可應用於單進程大量數據傳遞,和多個進程向一個進程傳遞數據;
  3. 信號:沒法傳遞數據,並且信號的種類有限,只適用於完成一些簡單的事件通知任務,如配置跟新信號通知,一個服務經過信號告知另外一個服務自身狀態;
  4. 文件鎖:不能用來傳遞數據,用來對操做進行協調,利用文件鎖實現多個進程對於某個資源的排隊請求,或者多個進程對系統某個全局資源進行讀寫操做,能夠經過文件鎖實現進程間讀寫鎖的功能;

XSI IPC:

  1. 共享內存:最爲高效的進程間通訊方式,進程能夠直接讀寫內存,不須要任何數據拷貝,適用於多個進程共享數據,或進程間頻繁的進行大量的數據交互;--建議使用mmap方式;
  2. 消息隊列:進程間傳遞簡單的命令和控制消息,如配置更新通知,多進程對多進程的通訊等,能夠簡化代碼邏輯;--建議使用全雙工管道替代;
  3. 信號量:某種資源數爲N,多個進程都在使用該資源,爲了進行進程間的互斥,可使用初始值爲N的信號量;--建議使用記錄鎖替代;

套接字IPC:

  1. unix域套接字:某個服務與多個服務同時通訊,此時須要維護多個通訊通道,使用unix套接字,可使用linux IO多路複用功能;--建議優先考慮網絡套接字;
  2. 網絡套接字:若是系統須要支持分佈式部署,服務可能在同一設備或者不一樣設備,此時使用網絡套接字比較合適,提升了擴展性;

第十六章
實現一個多客戶端單服務端的聊天室應用。
見個人文章多人聊天室(多線程||epoll)
https://segmentfault.com/a/11...

相關文章
相關標籤/搜索