操做系統設計的7個主題:
1. 進程描述和控制
2. 內存管理
3. 調度
4. I/O和文件管理
5. 併發和分佈式系統
6. 嵌入式系統
7. 安全linux
操做系統利用一個或多個處理器的硬件資源,爲系統用戶提供一組服務,還表明用戶來管理輔助存儲器和I/O設備。算法
CPU中斷的分類:
1. 程序中斷
2. 時鐘中斷
3. I/O中斷
4. 硬件失效中斷編程
DMA:直接內存存取安全
典型計算機系統的三個重要接口:
1. 指令系統體系結構ISA
2. 應用程序二進制接口ABI
3. 應用程序編程接口API網絡
三個部分:
1. 一段可執行的程序,
2. 程序所須要的相關數據(變量,工做空間,緩衝區等),
3. 程序的執行上下文,又稱進程狀態。上下文包括操做系統管理進程和處理器正確執行進程所須要的全部信息,包括:數據結構
1. 處理器寄存器的內容,2. 進程的優先級
把執行一個應用程序的進程劃分紅能夠同時運行的多個線程。
線程:
可分派的工做單元,他包括處理器上下文環境和棧中本身的數據區域。順序執行,而且可中斷。
進程:
一個或多個線程和 相關係統資源的集合。多線程
多線程切換涉及的處理器開銷比不一樣進程間切換開銷少。併發
81年基於MS-DOS開發的window 3.0, 僱傭戴夫.卡特勒89年基於VAX/VMS操做系統開發NT內核。異步
主要的內核組件的簡要介紹:分佈式
信號(Signal):內核經過信號通知進程。
系統調用(System Call):進程經過系統調用來請求系統服務。一共有幾百個系統調用,能夠粗略的分爲6類:文件系統,進程,調度,進程間通訊,套接字和其餘。
進程和調度器:建立、管理、調度進程。
虛擬內存
文件系統
網絡協議
字符設備驅動
塊設備驅動
網絡設備驅動
陷阱和錯誤
物理內存
中斷
chroot提供文件系統隔離。
chcontext分配一個新的安全上下文,提供進程隔離
chbind把產生的進程及其子進程鎖定到一個特定的IP地址,提供網絡隔離。
capability,提供根的隔離。
進程能夠惟一的表徵爲如下元素:
標識符
狀態
優先級
程序計數器
內存指針
上下文數據
I/O狀態信息
記帳信息
一個處理器在任什麼時候間最多隻有一個進程在執行。
進程的五個狀態:
- 新建,環境準備,但未進入內存
- 就緒
- 運行
- 阻塞/等待,I/O阻塞,等待資源或另外一個進程信息
- 退出
- 針對虛擬內存的:掛起態
操做系統維護四種不一樣類型的表:
內存 :跟蹤內外存
I/O: I/O狀態
文件:文件狀態,大部分狀態可能由文件管理系統維護和使用
進程:
用戶態運行
內核態運行
就緒,駐留在內存
睡眠,駐留在內存,等待某時間,一種阻塞態
就緒,被交換
睡眠,被交換
被搶佔 進程從內核態返回到用戶態,可是被內核搶佔
建立
僵死
Unix中有兩個獨特進程,進程0是系統啓動時建立,預約義的數據結構,是交換進程,啓動時進程0產生進程1,進程1稱爲初始進程。
Unix中建立進程是經過內核系統調用fork()實現的,fork請求時,系統執行如下功能:
1. 爲新進程在進程表中分配一個空項。
2. 爲紫禁城賦一個惟一的進程標識符
3. 聲場一個父進程上下文的邏輯副本,不包括共享內存區
4. 增長父進程全部的文件的計數器
5. 把子進程置爲就緒態
6. 向父進程返回子進程的進程號,對子進程返回零。
全部操做在父進程的內核態下完成。
在以前提出的進程概念包含兩個特色:
資源全部權:一個進程包括一個存放進程映像的虛擬地址空間。
調度/執行:一個進程沿着能夠經過一個或多個程序的執行路徑執行。一個進程具備一個執行狀態和一個被分配的優先級。它是一個可被操做系統調度和分派的實體。
爲了區分這兩個特色,分派的單位成爲線程或輕量級進程,而擁有資源全部權的單位稱爲進程process或task。
指在單個進程內支持多個併發執行路徑的能力。
進程是操做系統的最小調度單位,線程是CPU的最小調度單位。
線程的優勢:
線程建立比Unix中進程建立快10倍。
終止線程比進程快
線程切換比進程塊
縣城提升了不一樣執行程序間通訊的效率。進程間通訊須要內核的介入,同進程中的線程共享內存和文件。
多線程的特性在多處理器機器上才能生效,單處理器中主要簡化在邏輯上完成若干項不一樣功能的程序的結構。
線程能夠分爲兩大類:
1. 用戶級線程
2. 內核級縣城
有關線程管理都有應用程序完成,內核意識不到。任何應用程序均可以使用線程庫pthread設計多線程程序。該程序在執行時從但縣城開始運行被分配給一內核管理的進程。該程序的線程狀態受限於內核進程狀態。由此其線程狀態也將影響進程狀態。
優勢:
1. 該程序全部線程在用戶地址空間中,無需內核態特權,不需切換狀態。
2. 自定義調度算法
3. 跨系統,可移植
缺點:
1. 線程阻塞致使進程阻塞
2. 沒法使用多核性能,內核一次只把一個進程分配給一個處理器
全部線程管理都有內核完成。
優勢:
1. 同時調度線程到多核處理器
2. 進程中一個線程堵塞時,內核能夠調度該進程中另一個線程
缺點:
1. 把控制從一個線程傳到同一個進程的另一個線程時,須要內核的狀態切換。
多處理器系統中使用線程的例子:
前臺和後臺工做:電子表格處理,一個線程顯示並讀取輸入,一個線程執行命令更新表格。
異步處理:
執行速度:在一個線程I/O被阻塞時,另一個線程能夠繼續運行。
Linux的進程或任務有一個task_struct數據結構表示。包含了如下信息:
狀態
調度信息
標識符
進程間通訊
連接
時間和計時器
文件系統
地址空間
處理器專用上下文
進程的執行狀態有:
運行
可中斷,阻塞狀態,此狀態等待一個事件(如I/O操做的結束),一個可用資源或另外一個進程的信號
不可中斷,阻塞狀態,此狀態等待一個硬件條件,不接受任何信號
中止
僵死
Linux中複製當前進程的屬性建立一個新進程。使用clone命令代替fork命令建立進程。沒有爲線程單獨定義數據結構,當兩個進程共享相同的虛擬內存時,它們能夠看成是一個進程中的線程。clone()調用爲每一個進程建立獨立的棧空間,共享同一內存空間。
當Linux內核執行進程切換時,它將檢查當前進程的頁目錄地址是否和將被調度的進程相同,若是相同,此時上下文切換僅僅是從代碼的一處跳到代碼的另一處。
某些操做系統區分進程和線程的概念,前者涉及資源的全部權,後者涉及程序執行。用戶級的線程對操做系統是未知的,它們在用戶空間的線程庫建立並管理,此時線程的切換不須要狀態轉換,很是高效,但一個進程一次只有一個用戶級線程能夠執行,若是某一個線程阻塞,整個進程都被阻塞。內核級線程由內核維護,由此同一個進程中的線程能夠在多個處理器上併發執行,不會被某一個線程阻塞而阻塞整個進程,但當線程切換時須要進行模式轉換。