操作系统与数据库知识点
操作系統(tǒng)
操作系統(tǒng)的主要目的:
管理系統(tǒng)資源,提高資源利用率,方便用戶使用
進程的三種基本狀態(tài):
- 就緒狀態(tài):進程已獲得除CPU外的所有必要資源,只等待CPU時的狀態(tài)。
- 執(zhí)行狀態(tài):進程已獲CPU,正在執(zhí)行。單處理機系統(tǒng)中,處于執(zhí)行狀態(tài)的進程只一個;多處理機系統(tǒng)中,有多個處于執(zhí)行狀態(tài)的進程。
- 阻塞狀態(tài):正在執(zhí)行的進程由于某種原因而暫時無法繼續(xù)執(zhí)行,即進程執(zhí)行受阻。
狀態(tài)轉(zhuǎn)換:
- 就緒->運行:經(jīng)過處理機調(diào)度,就緒進程得到處理機資源
- 運行->就緒:時間片用完或在可剝奪系統(tǒng)中有更高優(yōu)先級進程進入
- 運行->阻塞:進行需要的某一資源還沒準(zhǔn)備好
- 阻塞->就緒:進程需要的資源已準(zhǔn)備好
掛起
掛起進程在操作系統(tǒng)中可以定義為暫時被淘汰出內(nèi)存的進程。機器的資源是有限的,在資源不足的情況下,有的進程被暫時調(diào)離出內(nèi)存,當(dāng)條件允許的時候,會被操作系統(tǒng)再次調(diào)回內(nèi)存,解除掛起為就緒態(tài)。
同步機制的原則:
- 空閑讓進;
- 忙則等待(保證對臨界區(qū)的互斥訪問);
- 有限等待(有限代表有限的時間,避免死等);
- 讓權(quán)等待,(當(dāng)進程不能進入自己的臨界區(qū)時,應(yīng)該釋放處理機,以免陷入忙等狀態(tài))。
進程間通信(IPC,InterProcess Communication)方式
管道? ? ? 又稱無名管道
- 半雙工的(即數(shù)據(jù)只能在一個方向上流動),具有固定的讀端和寫端。
- 只能用于父子進程之間的通信。
- 可以看成是一種特殊的文件,對于它的讀寫也可以使用普通的read、write 等函數(shù)。但是它不是普通的文件,并不屬于其他任何文件系統(tǒng),并且只存在于內(nèi)存中。
FIFO? ? ? 又稱命名管道,一種文件類型
- 也是半雙工通信。
- FIFO可以在無關(guān)的進程之間交換數(shù)據(jù),與無名管道不同。
- FIFO有路徑名與之相關(guān)聯(lián),它以一種特殊設(shè)備文件形式存在于文件系統(tǒng)中。
消息隊列? ? ? 鏈接表,存放在內(nèi)核中,由一個標(biāo)識符來標(biāo)識?? ?
- 消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優(yōu)先級。
- 消息隊列獨立于發(fā)送與接收進程。進程終止時,消息隊列及其內(nèi)容并不會被刪除。
- 消息隊列可以實現(xiàn)消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取。
信號量? ? ? 計數(shù)器
- 信號量用于實現(xiàn)進程間的互斥與同步,而不是用于存儲進程間通信數(shù)據(jù)。
- 信號量基于操作系統(tǒng)的 PV 操作,程序?qū)π盘柫康牟僮鞫际窃硬僮鳌?/li>
共享內(nèi)存
- 共享內(nèi)存是最快的一種 IPC,因為進程是直接對內(nèi)存進行存取。
- 因為多個進程可以同時操作,所以需要進行同步。
- 信號量+共享內(nèi)存通常結(jié)合在一起使用,信號量用來同步對共享內(nèi)存的訪問。
上下文切換
內(nèi)核在 CPU 上對于進程(包括線程)進行以下的活動:
進程與線程
進程(Process)?計算機中的程序關(guān)于某數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的基本單位。
- 資源分配給進程,同一進程的所有線程共享該進程的所有資源。
- 同一進程中的多個線程共享常量池,堆,方法區(qū)。
組成:
- PCB進程控制塊:保存進程運行期間相關(guān)的數(shù)據(jù),是進程存在的唯一標(biāo)志
- 程序段:能被進程調(diào)度程序調(diào)度到CPU運行的程序代碼段
- 數(shù)據(jù)段:存儲程序運行期間的相關(guān)數(shù)據(jù),可以是原始數(shù)據(jù)也可以是相關(guān)結(jié)果
線程(thread)?操作系統(tǒng)能夠進行運算調(diào)度的最小單位,一個進程中可以并發(fā)多個線程。
- 每個線程擁有自己的棧。
區(qū)別:
- 進程有自己的獨立地址空間
- 進程是資源分配的最小單位,線程是CPU調(diào)度的最小單位
- 一個進程掛掉不會影響其他進程,而線程掛掉會影響其他線程
調(diào)度算法:
先來先服務(wù)算法FCFS
短作業(yè)優(yōu)先算法SJF
優(yōu)先級調(diào)度算法
- 非搶占式? ??分配給就緒隊列中優(yōu)先權(quán)最高的進程后,該進程便一直執(zhí)行下去,直至完成
- 搶占式? ? ? ? 在其執(zhí)行期間,一出現(xiàn)優(yōu)先權(quán)更高的進程就會停止當(dāng)前進程的執(zhí)行,將處理機分配給新到的優(yōu)先權(quán)最高的進程
高響應(yīng)比優(yōu)先算法
- 響應(yīng)比=(等待時間+需要執(zhí)行的時間)/需要執(zhí)行的時間
時間片輪轉(zhuǎn)調(diào)度算法
- 遵循了先來先服務(wù)的原則,就緒的進程隊列中每個進程輪流運行一次規(guī)定的時間片(比如100ms),沒有執(zhí)行完畢,進程丟到隊列的末尾,繼續(xù)就緒等待。
多級反饋隊列算法
- 多個反饋隊列,隊列有優(yōu)先級排序,優(yōu)先級越高的隊列時間片越少。
- 進程調(diào)用,先進入頭隊列,多個進程則按FCFS,經(jīng)過時間片后沒有完成則進入下一個隊列,以此類推。
死鎖
在兩個或多個并發(fā)進程中,如果每個進程持有某種資源而又都等待別的進程釋放它或它們現(xiàn)在保持著的資源,在未改變這種狀態(tài)之前都不能向前推進,稱這一組進程產(chǎn)生了死鎖。
產(chǎn)生死鎖的必要條件:
- 互斥條件:資源不能被共享,只能由一個進程使用。
- 請求與保持條件:已經(jīng)得到資源的進程可以再次申請新的資源。
- 非搶占條件:已經(jīng)分配的資源不能從相應(yīng)的進程中被強制地剝奪。
- 循環(huán)等待條件:系統(tǒng)中若干進程組成環(huán)路,該環(huán)路中每個進程都在等待相鄰進程正占用的資源。
處理死鎖問題:
- 忽略該問題,鴕鳥算法。
- 仔細地對資源進行動態(tài)分配,使系統(tǒng)始終處于安全狀態(tài)以避免死鎖。
- 通過破除死鎖四個必要條件之一,來防止死鎖產(chǎn)生。
虛擬內(nèi)存
一種內(nèi)存管理技術(shù),將應(yīng)用程序所占的部分內(nèi)存暫時轉(zhuǎn)為外存,在需要時進行數(shù)據(jù)交換。
- 優(yōu)點:可以彌補內(nèi)存大小的不足;一定程度的提高反映速度;延長內(nèi)存使用壽命。
- 缺點:占用一定的物理硬盤空間;加大了對硬盤的讀寫;設(shè)置不得當(dāng)會影響整機穩(wěn)定性與速度。
調(diào)度方式:
- 分頁式:將邏輯和物理地址空間都分成固定大小的頁。沒有外碎片。
每頁大小為4KB,主存大小為4GB。則地址長度為32 位,其中0~11位為頁內(nèi)地址,即:12~31位為頁號,地址空間最多允許有2^20頁。
- 段式:按程序的邏輯結(jié)構(gòu)劃分地址空間,段長度可以動態(tài)改變。沒有內(nèi)碎片。
段號為16位,段內(nèi)偏移量為16位,則一個作業(yè)最多可有2^16=65536個段,最大段長為64KB。
- 段頁式:每個分段又被分成若干個固定大小的頁。
頁面置換算法
- OPT最優(yōu)算法:需要知道以后要被用到的頁,然后將不會被用到的頁換出內(nèi)存;如果所有頁都會被用到,就把需要使用時間離現(xiàn)在最長的頁換出。不可能實現(xiàn)的,因為當(dāng)前無法獲知以后哪些頁要被用到。不過最優(yōu)算法還是能夠作為其他算法優(yōu)秀程度的衡量。
- FIFO算法:置換出當(dāng)前已經(jīng)待在內(nèi)存里時間最長的那個頁。沒有考慮頁面的重要性的問題。
- LRU最近最少使用算法:將最近使用最少的頁面換出內(nèi)存。
中斷
計算機執(zhí)行程序的過程中,由于出現(xiàn)了某些特殊事情,使得CPU暫停對程序的執(zhí)行,轉(zhuǎn)而去執(zhí)行處理這一事件的程序。
每個中斷都有一個對應(yīng)的優(yōu)先級,當(dāng)處理器在處理某一中斷的時候,只有比這個中斷優(yōu)先級高的中斷可以被處理器接受并且被處理。
中斷一般分為三類:
- 內(nèi)部異常中斷:由計算機硬件異常或故障引起的中斷。
- 軟中斷:由程序中執(zhí)行了引起中斷的指令而造成的中斷。
- 外部中斷:由外部設(shè)備請求引起的中斷。
系統(tǒng)調(diào)用
操作系統(tǒng)的核心是內(nèi)核(kernel),它獨立于普通的應(yīng)用程序,可以訪問受保護的內(nèi)存空間,也有訪問底層硬件設(shè)備的所有權(quán)限。為了保證內(nèi)核的安全,現(xiàn)在的操作系統(tǒng)一般都強制用戶進程不能直接操作內(nèi)核。具體的實現(xiàn)方式基本都是由操作系統(tǒng)將虛擬地址空間劃分為兩部分,一部分為內(nèi)核空間,另一部分為用戶空間。
- 內(nèi)核態(tài):cpu可以訪問內(nèi)存的所有數(shù)據(jù),包括外圍設(shè)備。
- 用戶態(tài):只能受限的訪問內(nèi)存,且不允許訪問外圍設(shè)備。
用戶態(tài)切換到內(nèi)核態(tài)的方式:
- 系統(tǒng)調(diào)用:程序需要使用操作系統(tǒng)提供的服務(wù)時,比如說打開某一設(shè)備、創(chuàng)建文件、讀寫文件(這些均屬于系統(tǒng)調(diào)用)等,就需要向操作系統(tǒng)發(fā)出調(diào)用服務(wù)的請求,這就是系統(tǒng)調(diào)用。
- 異常:發(fā)生異常,由當(dāng)前進程切換到處理此異常的內(nèi)核相關(guān)程序中,也就轉(zhuǎn)到了內(nèi)核態(tài),比如缺頁異常。
- 外圍設(shè)備的中斷:當(dāng)外圍設(shè)備完成用戶請求的操作后,會向CPU發(fā)出相應(yīng)的中斷信號,這時CPU會暫停執(zhí)行下一條即將要執(zhí)行的指令轉(zhuǎn)而去執(zhí)行與中斷信號對應(yīng)的處理程序。
信號量(Semaphore)和互斥鎖(Mutex)
- 互斥鎖:只允許一個線程/進程訪問資源,保證了使用資源線程的唯一性和排他性,但是無法限制資源釋放后其他線程申請的順序問題,所以是無序的。
- 信號量:在初始化變量的時候可以控制允許多少個線程/進程同時訪問一個臨界區(qū),其他的線程/進程會被堵塞,直到有人解鎖。
信號量:利用PV操作實現(xiàn)互斥
- P操作即wait(S)?申請資源
- V操作即signal(S) 釋放資源
- S 表示可用資源的數(shù)量
數(shù)據(jù)庫
事務(wù):事務(wù)是并發(fā)控制的基本單元,事務(wù)是一個操作序列,要么都執(zhí)行,要么都不執(zhí)行,他是一個不可分割的工作單位,事務(wù)是維護數(shù)據(jù)庫一致性的單位。
事務(wù)特性ACID:
- A,?atomacity原子性:? ? ?要么都執(zhí)行,要么都不執(zhí)行。
- C,?consistency一致性: 數(shù)據(jù)改變前后狀態(tài)一致,如買家花100,賣家賺100。
- I,?isolation隔離性:? ? ? ? ?允許多個用戶并發(fā)訪問。
- D,?durability?持久性:? ? ?事務(wù)結(jié)束后,事務(wù)處理的結(jié)果必須得到固化。即一旦提交,對數(shù)據(jù)庫改變是永久的。
隔離級別:一個事務(wù)必須與由其他事務(wù)進行的資源或數(shù)據(jù)更改相隔離的程度。隔離級別從允許的并發(fā)副作用(例如,臟讀或虛擬讀取)的角度進行描述。
四種隔離級別:
- 未提交讀:所有事務(wù)都可以“看到”未提交事務(wù)的執(zhí)行結(jié)果,讀取未提交數(shù)據(jù),也被稱為“臟讀”。
- 已提交讀:只讀取提交的數(shù)據(jù)并等待其他事務(wù)釋放鎖。
- 可重復(fù)讀:保證同一事務(wù)的多個實例在并發(fā)讀取事務(wù)時,會“看到同樣的”數(shù)據(jù)行。
- 可序列化:制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問題。簡而言之,在每個讀的數(shù)據(jù)行上加鎖。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 臟讀? 不可重復(fù)讀 幻讀
Read uncommitted? ? ?√? ? ? ? ? ? √? ? ? ? ? ?? √
Read committed ? ? ? ? ×?? ? ? ? ? ?√ ? ? ? ? ? ??√
Repeatable read ? ? ? ? ×? ? ? ? ? ? ×? ? ? ? ? ? ?√
Serializable? ? ? ? ? ? ? ? ?× ? ? ? ? ? ?×? ? ? ? ? ? ?×
MYSQL的兩種存儲引擎
- MyISAM管理非事務(wù)表。它提供高速存儲和檢索,以及全文搜索能力。如果應(yīng)用中需要執(zhí)行大量的SELECT查詢,那么MyISAM是更好的選擇。
- InnoDB用于事務(wù)處理應(yīng)用程序,具有眾多特性,包括ACID事務(wù)支持。如果應(yīng)用中需要執(zhí)行大量的INSERT或UPDATE操作,則應(yīng)該使用InnoDB,這樣可以提高多用戶并發(fā)操作的性能。
索引
拿漢語字典的目錄頁(索引)打比方,我們可以按拼音、筆畫、偏旁部首等排序的目錄(索引)快速查找到需要的字。用于提高數(shù)據(jù)庫表數(shù)據(jù)訪問速度。
常見索引類
- 普通索引:最基本的索引,沒有任何限制
- 唯一索引:與"普通索引"類似,不同的就是:索引列的值必須唯一,但允許有空值。
- 主鍵索引:它 是一種特殊的唯一索引,不允許有空值。?
- 全文索引:僅可用于 MyISAM 表,針對較大的數(shù)據(jù),生成全文索引很耗時耗空間。
- 組合索引:為了更多的提高mysql效率可建立組合索引,遵循”最左前綴“原則。
最左前綴原則:顧名思義,最左優(yōu)先,比如,我們建立了一個以(a,b,c)為組合的索引,那么將會得到:a, ab,abc三種索引。若我們按列“b”進行查找,都不會使用到a, ab,abc三種索引。
Join
- INNER JOIN(內(nèi)連接,或等值連接):兩個表屬性的交集
- LEFT JOIN(左連接):取得左表完全記錄,即是右表并無對應(yīng)匹配記錄。?
- RIGHT JOIN(右連接):與 LEFT JOIN 相反,取得右表完全記錄,即是左表并無匹配對應(yīng)記錄。
?
聚集索引、哈希索引、b+樹索引
- B+樹的簡單定義:B+樹是為磁盤或其他存儲設(shè)備設(shè)計的一種平衡查找樹。B+樹中所有記錄都是按鍵值大小順序存放在葉子節(jié)點上,各葉子節(jié)點通過指針進行連接。
- 哈希索引(Hash indexes)采用哈希表來對鍵值進行查找,時間復(fù)雜度為O(1)。使用哈希索引時對于鍵值的等值查詢是非常快的,但是其他類型的查詢?nèi)绶秶樵儭⒛:樵儭⑴判虻仁遣荒苁褂霉K饕摹_@是哈希索引使用比較少的主要原因。
- 聚集索引(Clustered Index)又稱聚簇索引,其葉子節(jié)點存放記錄。每個InnoDB 表有一個特定的索引叫做聚集索引,存儲行的數(shù)據(jù)。如果你的表定義了主鍵那么主鍵就是聚集索引,如果沒有定義主鍵,MySQL 會選擇第一個非空唯一索引列作為聚集索引,如果表中也沒有唯一索引,InnoDB會生成一個類似RowId的隱藏的聚集索引。
語法
SELECT select_list
[ INTO new_table ]
FROM table_source
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]
Distinct
用途:被用作返回唯一的值。SELECT DISTINCT column-name(s) FROM table-name
Alias
用途:可用在表、結(jié)果集或者列上,為它們?nèi)∫粋€邏輯名稱。 SELECT column AS column_alias FROM table
聚集函數(shù):
count
用途:傳回選取的結(jié)果集中行的數(shù)目。
sum
用途:以表達式傳回所有值的總和,或僅 DISTINCT 值。SUM 僅可用于數(shù)值行。已忽略 Null 值。
avg
用途:傳回選取的結(jié)果集中值的平均值。已忽略 Null 值。
max
用途:傳回選取的結(jié)果集中值的最大值。已忽略 Null 值。
min
用途:傳回選取的結(jié)果集中值的最小值。已忽略 Null 值。
?
?
總結(jié)
以上是生活随笔為你收集整理的操作系统与数据库知识点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android—MVC、MVP、MVVM
- 下一篇: 在Windows 下使用OpenCL