天天看點

OS知識點OS知識點

OS知識點

1.程序和線程的差別

(1)定義

程序是具有一定獨立功能的程式關于某個資料集合上的一次運作活動,程序是系統進行資源配置設定和排程的一個獨立機關。

線程是程序的一個實體,是CPU排程和分派的基本機關,它是比程序更小的能獨立運作的基本機關。線程自己基本上不擁有系統資源,隻擁有一點在運作中必不可少的資源(如程式計數器,一組寄存器和棧),但是它可與同屬一個程序的其他的線程共享程序所擁有的全部資源。一個線程可以建立和撤銷另一個線程;同一個程序中的多個線程之間可以并發執行。相對程序而言,線程是一個更加接近于執行體的概念,它可以與同程序中的其他線程共享資料,但擁有自己的棧空間,擁有獨立的執行序列。

(2)差別

程序和線程的主要差别在于它們是不同的作業系統資源管理方式。程序有獨立的位址空間,一個程序崩潰後,在保護模式下不會對其它程序産生影響。是以多程序的程式要比多線程的程式健壯,但在程序切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,隻能用線程,不能用程序。

從邏輯角度來看,多線程的意義在于一個應用程式中,有多個執行部分可以同時執行。但作業系統并沒有将多個線程看做多個獨立的應用,來實作排程和管理以及資源配置設定。這就是程序和線程的重要差別。

2.線程和程序差別?為什麼還要提出線程這個概念?線程共享了什麼?協程呢?

(1)線程和程序差別

見第1題

(2)為什麼還要提出線程這個概念

a.程序隻能在一個時間幹一件事,如果想同時幹兩件事或多件事,程序就無能為力了。線程能夠使系統在同一時間能夠做多件事情。

b.當程序遇到阻塞時,例如等待輸入,線程能夠使不依賴輸入資料的工作繼續執行

c.可以有效地利用多處理器和多核計算機,在沒有線程之前,多核并不能讓一個程序的執行速度提高

(3)線程共享了什麼

a. 堆

由于堆是在程序空間中開辟出來的,是以它是理所當然地被共享的;是以new出來的都是共享的

b. 全局變量

它是與具體某一函數無關的,是以也與特定線程無關;是以也是共享的

c. 靜态變量

雖然對于局部變量來說,它在代碼中是“放”在某一函數中的,但是其存放位置和全局變量一樣,存于堆中開辟的.bss和.data段,是共享的

d. 檔案等公用資源

e.程序代碼段

f.程序的公有資料

利用這些共享的資料,線程很容易的實作互相之間的通訊

(4)協程

子程式,或者稱為函數,在所有語言中都是層級調用,比如A調用B,B在執行過程中又調用了C,C執行完畢傳回,B執行完畢傳回,最後是A執行完畢。是以子程式調用是通過棧實作的,一個線程就是執行一個子程式。子程式調用總是一個入口,一次傳回,調用順序是明确的。

而協程的調用和子程式不同。協程看上去也是子程式,但執行過程中,在子程式内部可中斷,然後轉而執行别的子程式,在适當的時候再傳回來接着執行。

  • 注意,在一個子程式中中斷,去執行其他子程式,不是函數調用,有點類似CPU的中斷。

看起來有點像多線程,但協程的特點在于是一個線程執行,那和多線程比,協程有何優勢?

  • 最大的優勢就是協程極高的執行效率。因為子程式切換不是線程切換,而是由程式自身控制,是以,沒有線程切換的開銷,和多線程比,線程數量越多,協程的性能優勢就越明顯。
  • 第二大優勢就是不需要多線程的鎖機制,因為隻有一個線程,也不存在同時寫變量沖突,在協程中控制共享資源不加鎖,隻需要判斷狀态就好了,是以執行效率比多線程高很多。

3.LRU了解嗎?說一下實作思路?

(1)LRU簡介

LRU全稱是Least Recently Used,即最近最久未使用的意思。

LRU算法的設計原則是:如果一個資料在最近一段時間沒有被通路到,那麼在将來它被通路的可能性也很小。也就是說,當限定的空間已存滿資料時,應當把最久沒有被通路到的資料淘汰。

(2)實作:lc.146

繼續閱讀