操作系統基礎

一 計算機基礎總結

1 x86架構及基本術語

1 特權級別和用戶指令級別


環0 特權區
環3 用戶指令級,不發送系統調用,則直接在CPU 中運行,如果涉及到調用,如果是內核的功能,則需要轉換爲特權模式的功能,一旦發起系統調用,調用執行別的函數或庫,如果調用的是內核的功能,則CPU需要轉換爲特權模式,在特權模式中執行的一定是內核的代碼,如果程序本身沒有調用內核的操作,則程序在運行到需要調用內核的操作時,需要通過程序給內核發送一個指令,通過在內核中運行指令,並將結果返回到對應的程序中,這個程序將繼續進行操作,內核模式只是支撐用戶模式來完成內核模式需要的操作的。

shell : 負責特權區和用戶區之間的切換,任何一個沒有shell的操作系統,如果需要做一些特定的操作,則不能成功

2 操作系統能力評估

操作系統能否提升能力,通常需要看他是不是在用戶空間佔用了大量的空間,如果一個程序的用戶控件佔用率很大而內核空間佔用率較小則表明其程序的設計並沒有產生很大的效率。內核模式本身並不產生能力

3 守護程序

操作系統完成基本功能的需要

4 其他相關術語概述

上下文切換:進程之間的切換
保存現場: 用於在切換時將被切換進程的信息保存在內存的情況
線程: 將串行執行流修改成並行執行流,此稱爲線程


南橋:內存和CPU 之間的鏈接是通過南橋芯片實現的
北橋:北橋芯片負責的是和IO之間的鏈接


程序局部性原理:
1 空間局部性: 一個數據被訪問後,其臨近的數據也會很快被訪問到
2 時間局部性: 當執行完某個指令後,有可能很快後又會調用該指令


1 設備控制器: 集成在主板上的一塊芯片或一組芯片,負責控制對應設備,通過從操作系統獲取指令並執行相應的操作,將操作轉換成對應的操作
寄存器: 被集成在控制器內部的

IO地址空間:所有的控制器的寄存器加起來成爲這個設備的IO地址空間,也叫IO端口空間

2 計算機歷史

1 真空管:穿孔卡片
2 晶體管:此時出現了批處理系統,主機的個頭較大。在某一時刻,只能運行一個實例。
批處理: 一次上傳多個,一次處理一個

3 集成電路芯片 多道處理,程序的運行起始到結束通過監控實現,監控程序負責在系統上運行多個程序,此時便產生了進程,
多道處理:相當於進程,分時系統

4 大規模集成電路

3 操作系統基本體系:

1 各設備之間連接需要總線,總線早期不是系統發展的瓶頸,星型結構需要CPU的大量工作,因此不適用於發展
計算機的總線:
地址總線:數據尋址
數據總線:數據傳輸
控制總線

4 CPU

1 CPU運行步驟及其組件

1 步驟

從內存中取出指令並運行它
需要經過四個步驟:
1 取出指令
2 解碼指令
3 確定類型
4 執行指令

2 三大組件:

1 取址單元
2 解碼單元
3 執行單元
三個功能可以通過一個芯片來完成

2 指令計數器

CPU的寄存器 :每完成一個指令會記錄其配置,控制芯片和存儲芯片,其週期和CPU的週期相同,這些被成爲CPU的寄存器


上下文切換:操作系統必須清楚的瞭解每一個寄存器,在多進程中,操作系統通常會掛起某一個進程轉而運行其他的進程。這叫上下文切換,將其進程掛起時,狀態將會被記錄。需要將進程中的各種數字,計數器等必須進行保存,這個稱謂保存現場。保存和恢復需要時間,其保存在內存中。


複用技術 : 如果進程很多的情況下,每一個進程切換則會浪費很多時間,nginx可以做到進程的不切換和進程的複用技術


進程的綁定: 將某一進程與CPU 之間的綁定,如此可以成爲CPU 的調優

3 基本調優:

1 進程不切換,實現複用(nginx)
2 進程與CPU 綁定
3 提高緩存,命中率的方式,將一個進程綁定到一個核心上是爲了提高緩存命中率

4 CPU 的升級

1 進行三個取值單元,解碼單元和執行單元的三級流水,同一時刻,每個單元都不能閒着
操作系統基礎

2 多核心,超線程(多線程)
一顆CPU 在兩個不同線程之間進行切換,在CPU內部引入一個類似的寄存器
一個CPU 在同一時刻執行兩個程序
早期CPU 的頻率是依靠其工作頻率來實現的,時鐘在一秒內完成的操作個數
一個進程的執行通常只能用到一個CPU
將串行執行流修改成並行執行流,稱爲線程


5 其他相關

並行編程問題:
同時執行,能否同時結束
線程之間協調不明確問題


Linux對每一個線程的調度仍然是進程級別的

CPU 和內存之間的協調

內存的工作頻率小於CPU,但會越來越好
內存和CPU 之間的鏈接是通過南橋芯片實現的,
北橋芯片負責的是和IO之間的鏈接

通過一定的限制來實現CPU 和內存之間的協調

緩存的目的: 空間換區資源

一級緩存和二級緩存是專用的

三級緩存時共享的

程序局部性原理 :
1 空間局部性: 一個數據被訪問後,和其內存位置近的數據也會被很快訪問到。

2 時間局部性: 當指令執行完成後,很快可能會被再次訪問到。


計算機的存儲層次:

機械硬盤----固態硬盤------內存------高速緩存----寄存器----CPU

SMP (對稱多處理器)
多個CPU 插槽 CPU socket

CPU 的速度一定比內存快 通過加緩存來實現(三級----二級-----一級)
一級緩存和二級緩存是專用的,三級緩存是共享的
CPU 的性能需要看一級和二級緩存的大小

5 IO 設備

1 IO設備概述:

1 IO設備組成:

1 設備控制器: 集成在主板上的一塊芯片或一組芯片,負責控制對應設備,通過從操作系統獲取指令並執行相應的操作,將操作轉換成對應的操作
2 設備本身

2 執行運行步驟

其指令執行步驟: 操作系統----驅動----設備本身
IDE 集成驅動電子設備
真正的硬件操作是由驅動完成的,此驅動程序應該由設備生產廠商研製。
驅動程序通常位於內核中
每一個控制器都有少量的用於實現通信的寄存器,此時被集成在控制器內部的

IO端口空間
每個控制器都有由少量的專門用於通信的寄存器,如一個硬盤控制器可能有用於指定硬盤地址和內存地址的寄存器,還有扇區技術,方向(讀寫)等相關的寄存器。任何時候要激活一個控制器,需要驅動程序從操作系統中接受指令然後將其轉換成對應設備的基本操作並把操作請求放置到寄存器中,所有的控制器的寄存器加起來成爲這個設備的IO地址空間,也叫IO端口空間,每個寄存器表現爲一個I/O端口。

2 IO 端口相關:

IO 端口被編址(16位),每一個IO端口都有一個獨立的編址,多個寄存器則需要有多個編址。
一個控制器可能有多個端口,及多個寄存器
不同主板上的設備控制器不同,沒辦法事先進行固定,需要動態指制定,當設備開機時,每一個IO設備都要向IO空間註冊地址端口
空間16位二進制 0-65535
CPU 和指定的IO進行通信,需要通過其IO端口來實現
對於某些衆所周知的設備,則使用一些特定的端口

3 實現輸入輸出的三種方式:

1 忙等待

用戶程序發起一個系統調用,內核將其翻譯成爲一個對應設備驅動的過程調用,設備驅動程序啓動IO並在一個連續不斷的循環中檢測設備,來看是否執行完成(忙等待)
缺點: 性能不好,輪訓機制,在固定的時鐘週期內查詢其是否需要執行的操作

2 中斷:

IO 設備主動發送通知這種方式成爲中斷,能夠中斷CPU執行的操作,來通知內核執行響應的請求,中斷控制器發送中斷信號
每一個IO設備要從中斷控制器中獲取一箇中斷向量

中斷切換: CPU進行中斷切換來指定IO 設備的相關操作,CPU觸發內核,內核將相關的進程掛起並自己運行在CPU上來根據
發出請求的IO設備來獲取數據或其中斷請求


中斷分爲兩步:
1 中斷的上半部:只是將中斷請求處理,並去讀到內核緩衝區中
2 中斷下半部:處理相關的數據

上半部通常要立即處理,但下半部則不一定

缺點: 當一個jar包到達時,其會被分解爲成千上萬的報文,則如果每一個報文觸發構建一次,則會非常耗時,則意味着
CPU的繁忙程度會成倍增加

3 DMA

直接內存訪問 IO設備上帶的具有智能性的控制芯片,當需要發生中斷時,CPU會通知對應的DMA,告訴DMA接下來的總線歸你使用,如此便完成了其複製的操作,DMA僅負責接入和接出CPU 通知內核讀取完成。

DMA 內核中的存儲空間,查看其目標IP,如果是自己的,則進行拆包,

網卡,硬盤等都有DMA

CPU 被抽象成程序線

1 CPU (MMU)

2 內存

3 多個IO設備,IO 設備的標識(寄存器) IO 端口


優化: 網卡設備的緩衝區可以進行適當的調整


網卡中斷
網卡觸發中斷,並將相關的數據包放置進入緩衝區,並進行觸發內核操作並將網卡緩衝區的數據複製到內核緩衝區中,內核中的存儲空間,查看其目標IP,如果是自己的,則進行拆包。

6 進程相關

1 術語

MMU : 用於轉換線性地址和物理地址的橋樑
TLB : 用於緩存線性地址和物理地址的映射
其線性地址和物理地址的映射關係保存在內核內存中
RAM : 隨機存儲器
ROM : 只讀存儲器


默認的內存頁大小是4K
在操作系統中被最基本的抽象出來的東西:
CPU 被抽象成時間線而後將程序分配爲進程,而後通過時間線將程序運行起來的過程
程序被抽象成進程,CPU 被抽象成時間線


早期的操作系統的組織方式:
內存的地址空間
1 操作系統位於內存中, 但進程整個是RAM(隨機存儲器,是與CPU直接交換的數據的內部存儲器) 內存空間和用戶空間

用戶程序運行在RAM中,操作系統運行在ROM(只讀存儲器,是一種只能讀出事先所存儲的固態半導體存儲器)中

os 在ROM中,

CPU 訪問內存空間,需要讀取內存對應的地址,程序知道自己運行的地址 變量命名時的內存空間,所以根據變量名就可以獲取
內存地址空間
CPU 有一個尋址單元,CPU 地址總線,數據總線, 控制總監 32 位 2^32=4G字節
CPU 64 爲則是64個字節4G的4G 4G^4G 則是一個海量空間
OS 中最重要的部分就是驅動程序

ROM(驅動)和RAM(OS)一起

多個應用程序產生的問題

內存的使用通過虛擬地址空間實現的
IO:磁盤IO在內核中表現爲文件的形式,我們的存儲纔會方便

2 進程:

資源集
CPU 時間
內存: 地址空間,被抽象成虛擬存儲空間(32bit:4G) 在Linux中,內核固定使用特定的內存,而進程則使用
其他的內存,線性地址空間,進程都有自己獨立的內存空間
IO 文件
鍵盤鼠標都屬於文件,不過都是設備文件
文件分類:
1 一般文件 正常文件
2 設備文件 塊設備 字符設備
3 管道文件 進行相關交互時使用
打開了多個文件
在進程內部,每個文件都有自己的文件標號 FD(file descriptor)
輸入0 標準輸出1 錯誤輸出2
一個主機如果是多進程的,則需要標識其自己的資源集,(task struct) 內核爲每個進程維護數據結構,內存空間

內核爲了追蹤進程的狀態,會在自己的內核的內存空間中建立一個連接,保存了進程的ID,打開文件量,內存的使用量
每一個進程需要保存程序計數器

每一個程序的執行只會加載目前所需要的環境,並不是加載所有環境,用戶空間的內存,內存將其切割成一個固定大小的存儲單元,
通常是4K一個存儲單元,每個葉匡都有其編號(page frame) 4G 有1M 的葉匡

每一個進程的啓動都會認爲自己有3G內存可用,但3G並沒有完全佔用,只是佔用了少量

地址空間: 代碼段,初始化爲0的數據段,離散的隨機空間,堆 沒有被使用,被映射進來的共享內存庫。
棧代碼段----數據段-----堆------棧
對進程來講,內存的最小單元是頁面,對內存來講,稱之爲葉匡
進程認爲內存是一起的,但在內核端存儲是離散的
當進程真的需要使用內存空間時,需要從申請對應的空間並由內核進程調用,並返回相對應的空間,其是一個一個的存儲
每一個進程的線程地址空間和內存地址空間之間是有轉換的
當某一個進程需要在CPU 上執行時,需要讀取響應的資源:
CPU 會從屋裏地址空間取出數據,但進程給的是線性內存空間,其線性地址和物理地址的映射關係保存在內核內存空間的映射表中,CPU需要完成
從線性地址到物理地址的轉換過程
其映射不是直接映射,而是使用多級映射,如果使用一對一的映射,則其映射空間是巨大的

MMU: 當進程切換時,MMU 需要切換,需要從各種狀態字和相關的映射關係MMU 完成的是物理尋找,頁表映射

在MMU 之前加入緩存,當程序發出一個地址之後,會先在緩存中查看其的映射關係,然後再進行操作,否則在MMU中查找,緩存空間通常都不大
使用大內存頁的原因是使其訪問速度更快
TLB 轉換後的緩衝器
在進程中的切換中MMU 是要被清空的,TLB 的轉化結果不會發生改變

早期 虛擬設備的進程需要經過兩次MMU 的轉換, 線性地址空間---主機地址----物理地址
現在的CPU已經有兩級MMU 完成,早期通過模擬的方式完成的

3 系統優化:

1 進程優化 進行進程和CPU 的綁定
2 內存優化 TLB 使用大內存頁,儘量使用本地內存,頁的分配回收,內存同步的算法
網絡優化和IO優化最終都要轉化爲內存優化

3 CPU

優化的是機制的本身,不是機制的結果

調整內核參數

硬盤的讀寫操作:
一般是取得讀操作,讀要優先滿足,寫是緩衝的,I/O調度變慢

尋道最花費時間

兩個緩衝器的調整和I/O算法的調整 磁盤的I/O隊列調度器

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