操作系統筆記之進程與線程


背景

操作系統設計的7個主題:
1. 進程描述和控制
2. 內存管理
3. 調度
4. I/O和文件管理
5. 併發和分佈式系統
6. 嵌入式系統
7. 安全

操作系統利用一個或多個處理器的硬件資源,爲系統用戶提供一組服務,還代表用戶來管理輔助存儲器和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內核。

UNix

主要的內核組件的簡要介紹:

  • 信號(Signal):內核通過信號通知進程。

  • 系統調用(System Call):進程通過系統調用來請求系統服務。一共有幾百個系統調用,可以粗略的分爲6類:文件系統,進程,調度,進程間通信,套接字和其他。

  • 進程和調度器:創建、管理、調度進程。

  • 虛擬內存

  • 文件系統

  • 網絡協議

  • 字符設備驅動

  • 塊設備驅動

  • 網絡設備驅動

  • 陷阱和錯誤

  • 物理內存

  • 中斷

Linux Vserver

chroot提供文件系統隔離。
chcontext分配一個新的安全上下文,提供進程隔離
chbind把產生的進程及其子進程鎖定到一個特定的IP地址,提供網絡隔離。
capability,提供根的隔離。

進程

進程可以唯一的表徵爲以下元素:

  • 標識符

  • 狀態

  • 優先級

  • 程序計數器

  • 內存指針

  • 上下文數據

  • I/O狀態信息

  • 記賬信息
    一個處理器在任何時間最多隻有一個進程在執行。

進程的五個狀態:
- 新建,環境準備,但未進入內存
- 就緒
- 運行
- 阻塞/等待,I/O阻塞,等待資源或另一個進程信息
- 退出
- 針對虛擬內存的:掛起態

操作系統維護四種不同類型的表

  • 內存 :跟蹤內外存

  • I/O: I/O狀態

  • 文件:文件狀態,大部分狀態可能由文件管理系統維護和使用

  • 進程:

Unix的進程狀態

  • 用戶態運行

  • 內核態運行

  • 就緒,駐留在內存

  • 睡眠,駐留在內存,等待某時間,一種阻塞態

  • 就緒,被交換

  • 睡眠,被交換

  • 被搶佔 進程從內核態返回到用戶態,但是被內核搶佔

  • 創建

  • 僵死

Unix中有兩個獨特進程,進程0是系統啓動時創建,預定義的數據結構,是交換進程,啓動時進程0產生進程1,進程1稱爲初始進程。
Unix中創建進程是通過內核系統調用fork()實現的,fork請求時,系統執行以下功能:
1. 爲新進程在進程表中分配一個空項。
2. 爲紫禁城賦一個唯一的進程標識符
3. 聲場一個父進程上下文的邏輯副本,不包括共享內存區
4. 增加父進程所有的文件的計數器
5. 把子進程置爲就緒態
6. 向父進程返回子進程的進程號,對子進程返回零。

所有操作在父進程的內核態下完成。

線程

在之前提出的進程概念包含兩個特點:

  • 資源所有權:一個進程包括一個存放進程映像的虛擬地址空間。

  • 調度/執行:一個進程沿着可以通過一個或多個程序的執行路徑執行。一個進程具有一個執行狀態和一個被分配的優先級。它是一個可被操作系統調度和分派的實體。
    爲了區分這兩個特點,分派的單位成爲線程或輕量級進程,而擁有資源所有權的單位稱爲進程process或task。

多線程

指在單個進程內支持多個併發執行路徑的能力。
進程是操作系統的最小調度單位,線程是CPU的最小調度單位。

線程的優點:

  • 線程創建比Unix中進程創建快10倍。

  • 終止線程比進程快

  • 線程切換比進程塊

  • 縣城提高了不同執行程序間通信的效率。進程間通信需要內核的介入,同進程中的線程共享內存和文件。

多線程的特性在多處理器機器上才能生效,單處理器中主要簡化在邏輯上完成若干項不同功能的程序的結構。

線程的分類

線程可以分爲兩大類:
1. 用戶級線程
2. 內核級縣城

wKioL1j4XXDQ4pZdAAE1hrjvzQ8772.png-wh_50

用戶級線程

有關線程管理都有應用程序完成,內核意識不到。任何應用程序都可以使用線程庫pthread設計多線程程序。該程序在執行時從但縣城開始運行被分配給一內核管理的進程。該程序的線程狀態受限於內核進程狀態。由此其線程狀態也將影響進程狀態。
優點:
1. 該程序所有線程在用戶地址空間中,無需內核態特權,不需切換狀態。
2. 自定義調度算法
3. 跨系統,可移植
缺點:
1. 線程阻塞導致進程阻塞
2. 無法使用多核性能,內核一次只把一個進程分配給一個處理器

內核級線程

所有線程管理都有內核完成。
優點:
1. 同時調度線程到多核處理器
2. 進程中一個線程堵塞時,內核可以調度該進程中另外一個線程
缺點:
1. 把控制從一個線程傳到同一個進程的另外一個線程時,需要內核的狀態切換。

多核與多線程

多處理器系統中使用線程的例子:

  • 前臺和後臺工作:電子表格處理,一個線程顯示並讀取輸入,一個線程執行命令更新表格。

  • 異步處理:

  • 執行速度:在一個線程I/O被阻塞時,另外一個線程可以繼續運行。

Linux的進程和線程管理

Linux的進程或任務有一個task_struct數據結構表示。包含了以下信息:

  • 狀態

  • 調度信息

  • 標識符

  • 進程間通信

  • 鏈接

  • 時間和計時器

  • 文件系統

  • 地址空間

  • 處理器專用上下文

進程的執行狀態有:

  • 運行

  • 可中斷,阻塞狀態,此狀態等待一個事件(如I/O操作的結束),一個可用資源或另一個進程的信號

  • 不可中斷,阻塞狀態,此狀態等待一個硬件條件,不接受任何信號

  • 停止

  • 僵死

Linux中複製當前進程的屬性創建一個新進程。使用clone命令代替fork命令創建進程。沒有爲線程單獨定義數據結構,當兩個進程共享相同的虛擬內存時,它們可以當作是一個進程中的線程。clone()調用爲每個進程創建獨立的棧空間,共享同一內存空間。
當Linux內核執行進程切換時,它將檢查當前進程的頁目錄地址是否和將被調度的進程相同,如果相同,此時上下文切換僅僅是從代碼的一處跳到代碼的另外一處。

總結

某些操作系統區分進程和線程的概念,前者涉及資源的所有權,後者涉及程序執行。
用戶級的線程對操作系統是未知的,它們在用戶空間的線程庫創建並管理,此時線程的切換不需要狀態轉換,非常高效,但一個進程一次只有一個用戶級線程可以執行,如果某一個線程阻塞,整個進程都被阻塞。
內核級線程由內核維護,由此同一個進程中的線程可以在多個處理器上併發執行,不會被某一個線程阻塞而阻塞整個進程,但當線程切換時需要進行模式轉換。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章