數據庫工程師四級學習筆記||絕知此事要躬行。

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
寫完篇1的我內心是崩潰的,還有繼續更新大家說我要禿頭了

進程,線程,CPU

  • 進程:電腦正在運行的程序,比如網易雲音樂,微信這都是電腦的進程
  • 線程:線程可以理解爲微信裏不同的功能,比如你在跟別人聊天的時候,還可能同時跟另一個人在視頻,這時就是一個進程的兩個線程。爲什麼CPU的核越多越好,核越多就像是工作人員越多,那麼,進程被調度到不同工作人員的崗位效率肯定更高。
  • CPU: 服務器可以擁有多個CPU,CPU又可以有多個內核。

死鎖, 活鎖, 飢餓

在數據庫三級中我們接觸到的是死鎖, 活鎖。對於我個人無法理解,但是在瞭解“進程,線程,CPU”以後才能更好理解。
一個常識性問題: 6核12線和8核8線相比較,哪個的效率更高?
當然是8核8線! 6核12線就是6個人完成12個任務,後者則是8個人完成8個任務,所以核纔是最優先的比較標準。
其次拓展一點:CPU的頻率又是怎麼回事,核的數目一般不會影響頻率。
下圖是mac的任務監視器,顯示了不同進程的情況mac 任務監視器

  • 死鎖:

  • 死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象。

  • 其實就是,CPU的資源沒有分配很好的分配給不同應用程序,造成線程無法順利調度

這裏的資源指的是計算機程序運行時所需的CPU資源、內存資源

所以哪些情況會造成死鎖?死鎖又怎麼解決?
當一組等待進程 {P0,P1,…,Pn},P0 等待的資源爲 P1 佔有,P1 等待的資源爲 P2 佔有,…Pn-1 等待的資源爲 Pn 佔有,Pn 等待的資源爲 P0 佔有。每一個進程都在等待對方先放手

  • 多選題: 當檢測到系統發生死鎖以後,解除死鎖的方法是()
    A. 剝奪某些進程所佔資源
    B. 修改註冊表
    C. 撤銷某些進程
    D. 進入安全模式
    E. 重新啓動系統

解析:答案是:ACE

  • 關於解除死鎖辦法的人話解釋版本:
    - 撤消陷於死鎖的全部進程(對應於選項E),一杆子打死所有進程–約等於重新啓動系統
    - 逐個撤消陷於死鎖的進程,直到死鎖不存在,對應於選項C
    - 從陷於死鎖的進程中逐個強迫放棄所佔用的資源,直至死鎖消失。
    - 自己的不夠用,搶別人的資源,對應選項A也就是從別的進程那裏強行剝奪足夠數量的資源分配給死鎖進程,以解除死鎖狀態
  • 百度超能解釋版本: 詳見鏈接🔗:百度超能解釋版本,具體見鏈接中的排除死鎖部分
  • 對於D選項,什麼是安全模式?這個問題其實也是一個曾經出現的選擇題
  • 下列關於死鎖與安全狀態的敘述中,那一個是正確的?
    A. 死鎖狀態一定是不安全狀態
    B.從安全狀態有可能進入死亡狀態
    C.不安全狀態就是死鎖狀態
    D.死鎖狀態有可能是安全狀態

安全狀態:指系統能按某種順序如(P1,P2,…,Pn),來爲每個進程分配所需要的資源,直至最大需求,使每個進程都可以順序完成。若系統不存在這樣一個安全序列,則稱系統處於不安全狀態。對於C,其實進入了不安全狀態僅說明當前情況下的資源分配出現不安全的因素,而隨着時間的推移,資源的分配可能會發生變化的

其次,註冊表是存放Windows系統和應用程序配置信息的一個巨大的樹狀分層的數據庫。 理解性的來說,註冊表記錄了Windows中的各種配置參數。

掛起,撤銷

引起進程調度的主要原因:

  1. 有CPU資源被讓出
  2. 因此進程在被撤銷狀態和就緒狀態時都可以被調度
    讓一些進程暫時性休息,轉換至外存
    這是解決死鎖進程的措施。當檢測到系統中已發生死鎖時,須將進程從死鎖狀態中解脫出來。常用的方法是撤銷或掛起一些進程,以便回收一些CPU資源,再將這些資源分配給已處於阻塞狀態的進程,使之轉爲就緒狀態,以繼續運行。可使系統獲得較好的資源利用率。

進程五態

  • 運行態:進程佔用CPU,並在CPU上運行
  • 就緒態(Runnable):進程已經具備運行條件,但是CPU還沒有分配過來,在等待資源。即除CPU之外,其它的運行所需資源都已全部獲得。
  • 阻塞態(Blocked):阻塞狀態是線程因爲某種原因放棄CPU使用權,暫時停止運行。
    直到線程進入就緒狀態,纔有機會轉到運行狀態
  • 新建狀態(New):新創建了一個線程對象。
  • 死亡狀態(Dead):線程執行完了或者因遇到error或exception退出了run()方法,該線程結束生命週期。
    在這裏插入圖片描述

進程的狀態根據其中的線程狀態來判斷,只要有線程處於運行狀態,那麼這個進程就是運行狀態。

同步,異步,阻塞,非阻塞

  • 同步:進程相互影響,像是你和男朋友或者女朋友一起出門;你必須等女朋友畫完妝才能一起出門,一起行動,你要是獨自離開,是絕對不可成立的。功能未結束之前,死等

  • 異步:你和同事下班後約飯堂,他突然要加班,你就自己前去,這個無傷大。功能結不結束無所謂,不干擾我,有結果通知我就好。
    同步對響應時間敏感,異步對響應時間不敏感

  • 阻塞:未接收到結果之前不結束,不返回

  • 非阻塞:調用函數立刻返回。
    應用程序是否返回

突如其來的例題:

在pthread線程包中,線程操作pthread_join()的含義是?
A. 創建一個新線程
B. 撤銷一個線程
C. 等待一個特定線程退出
D. 參加一個新線程

答案:C 當調用 pthread_join() 時,當前線程會處於阻塞狀態,直到被調用的線程結束後,當前線程纔會重新開始執行。且必須要完成整個函數才能返回。

P、V操作

和信號量的處理有關
P: 通過, V:釋放
阻塞信號量是正在等待的數目 P代表信號量減1,V代表信號量+1

  • 什麼是臨界區?
    臨界區指的是一個訪問共用資源(例如:共用設備,打印機)的程序片段,而這些共用資源又無法同時被多個線程訪問。當有線程進入臨界區段時,其他線程或是進程必須等待,確保這些共用資源是被互斥獲得使用,例如:semaphore。只能被單一線程訪問的設備,例如:打印機。
  • 什麼是信號量?
    信號量是用一種新的變量類型(semaphore)來記錄當前可用資源的數量。
    1)semaphore的取值必須大於或等於0。0表示當前已沒有空閒資源,而正數表示當前空閒資源的數量;
    2) semaphore的取值可正可負,負數的絕對值表示正在等待進入臨界區的進程個數。
  • 用P、V 操作管理臨界區時,把信號量mutex的初值設定爲1,當有k(k>1)個進程在mutex的等待隊列中,信號量的值爲(-k)
    解析:因爲mutex的初值爲1,說明一次只允許一個進程進入臨界區,又有k個進程在mutex的等待隊列中,因此根據信號量的解釋2)來看,mutex的值爲-k。

  • 代碼題目:
    想要試用信號量指示CPU資源使用情況時,需要先定義信號量(指示變量),一般命名爲full,empty比較有意義。

例如: 阻塞狀態的進程是3個,那麼此時的信號量就應該爲-3,5次P,2次V爲-3,那麼初值爲0,因爲每次執行P操作要對信號量的值-1,每次執行V操作要+1
這部分個人覺得有一位博主講的非常清晰,方便大家理解,此處轉載他的文章方便大家理解信號變量的設置:關於信號變量的命名和理解,轉自博主 ccnuacmhdu

★ 信號量、PV操作是解決進程間的同步與互斥問題的。
★ PV操作一定是成對出現的,但是這不意味着它會在一個進程內成對出現。
★ 對信號量爲1的,應該先執行V操作。
一般來說,三個常見信號量爲

empty 空閒的緩存區數量 初值爲n
full 已填充的緩存區數量 初值爲0
mutex 互斥進程數目 初值爲1
access 控制寫入互斥 初值爲1
rc 互斥訪問l量 初值爲0

這次先到這裏了,大概記錄了操作系統的部分內容,會繼續更新!

發佈了3 篇原創文章 · 獲贊 6 · 訪問量 422
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章