嵌入式面試

  1. 死鎖mysql

    • 四個必要條件linux

  2. fork()進程數ios

  3. 數據庫中事務相關內容算法

    事務定義 :數據庫事務是構成單一邏輯工做單元的操做集合sql

    BEGIN TRANSACTION  //事務開始 
    SQL1 
    SQL2 
    COMMIT/ROLLBACK   //事務提交或回滾

    特性 :acid數據庫

    1. a(Atomicity) 原子性 跟鎖仍是有區別,能夠兩個事務同時處理同一個資源,可是每一個事務的全部操做必需要麼都成功,要麼都失敗。ubuntu

    2. c(Consistency)一致性(能量守恆):事務的執行結果必須使數據庫從一個一致性狀態到另外一個一致性狀態。一致性狀態是指:1.系統的狀態知足數據的完整性約束(主碼,參照完整性,check約束等) 2.系統的狀態反應數據庫本應描述的現實世界的真實狀態,好比轉帳先後兩個帳戶的金額總和應該保持不變。併發

    3. i(Isolation)隔離性:併發執行的事務不會相互影響,其對數據庫的影響和它們串行執行時同樣。好比多個用戶同時往一個帳戶轉帳,最後帳戶的結果應該和他們按前後次序轉帳的結果同樣。性能

    4. d(Durability)持久性:操作系統

      img
      事務併發的三個問題

      1. 髒讀:A事務對數據進行修改的過程當中,B事務讀取該數據,A事務對該數據進行回滾,那麼B事務讀到了髒數據。

        img

        在事務1對A的處理過程當中,事務2讀取了A的值,但以後事務1回滾,致使事務2讀取的A是未提交的髒數據。

      2. 不可重複讀:A事務屢次讀取一個數據,在此過程當中,B事務對該數據進行了修改並進行了提交,致使A事務讀取同一數據時卻讀到了不一樣數值。

        img

        因爲事務2對A的已提交修改,事務1先後兩次讀取的結果不一致。

      3. 幻讀 :幻讀,是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的所有數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,之後就會發生操做第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺同樣.(幻讀和不可重複讀的區別在於,不可重複讀是針對肯定的某一行數據而言,而幻讀是針對不肯定的多行數據。於是幻讀一般出如今帶有查詢條件的範圍查詢中,好比下面這種狀況:)

        img

        事務1查詢A<5的數據,因爲事務2插入了一條A=4的數據,致使事務1兩次查詢獲得的結果不同

    事務的隔離級別

    ​ 事務具備隔離性,理論上來講事務之間的執行不該該相互產生影響,其對數據庫的影響應該和它們串行執行時同樣。而徹底的隔離性會致使系統併發性能很低,下降對資源的利用率,於是實際上對隔離性的要求會有所放寬,這也會必定程度形成對數據庫一致性要求下降.

    ​ 隔離級別從低到高依次是:讀未提交->讀已提交->可重複讀->串行化

    併發控制技術

    • 樂觀併發控制:對於併發執行可能衝突的操做,假定其不會真的衝突,容許併發執行,直到真正發生衝突時纔去解決衝突,好比讓事務回滾。

    • 悲觀併發控制:對於併發執行可能衝突的操做,假定其一定發生衝突,經過讓事務等待(鎖)或者停止(時間戳排序)的方式使並行的操做串行執行。

      基於鎖的併發控制

    ​ 鎖一般分爲共享鎖和排他鎖兩種類型

    • 1.共享鎖(S):事務T對數據A加共享鎖,其餘事務只能對A加共享鎖但不能加排他鎖。

    • 2.排他鎖(X):事務T對數據A加排他鎖,其餘事務對A既不能加共享鎖也不能加排他鎖

      對於可能發生衝突的併發操做,鎖使它們由並行變爲串行執行,是一種悲觀的併發控制。

    故障恢復技術

    - 事務故障:好比非法輸入,系統出現死鎖,致使事務沒法繼續執行。
    • 系統故障:好比因爲軟件漏洞或硬件錯誤致使系統崩潰或停止。

    事務的執行過程能夠簡化以下:

    1. 系統會爲每一個事務開闢一個私有工做區
    2. 事務讀操做將從磁盤中拷貝數據項到工做區中,在執行寫操做前全部的更新都做用於工做區中的拷貝.
    3. 事務的寫操做將把數據輸出到內存的緩衝區中,等到合適的時間再由緩衝區管理器將數據寫入到磁盤。

    因爲數據庫存在當即修改和延遲修改,因此在事務執行過程當中可能存在如下狀況:

    • 在事務提交前出現故障,可是事務對數據庫的部分修改已經寫入磁盤數據庫中。這致使了事務的原子性被破壞。
    • 在系統崩潰前事務已經提交,但數據還在內存緩衝區中,沒有寫入磁盤。系統恢復時將丟失這次已提交的修改。這是對事務持久性的破壞。

    數據庫系統是經過併發控制技術和日誌恢復技術來對事務的ACID進行保證的,從而能夠獲得以下的關於數據庫事務的概念體系結構。

    img

    垃圾回收算法

    • 標記清楚法(有缺點:標記清除後會產生大量不連續的內存碎片,空間碎片太多可能會致使,當程序在之後的運行過程當中須要分配較大對象時沒法找到足夠的連續內存而不得不觸發另外一次垃圾收集動做)
    • 複製算法:將可用內存按容量分爲大小相等的兩塊,每次只使用其中的一塊,當這一塊的內存用完了,就將還存活着的對象複製到另一塊內存上面,而後再把已使用過的內存空間一次清理掉。當回收時,將Eden和Survivor中還存活着的對象一次性地複製到另一塊Survivor空間上,最後清理掉Eden和剛纔用過的Survivor空間。固然,98%的對象可回收只是通常場景下的數據,咱們沒有辦法保證每次回收都只有很少於10%的對象存活,當Survivor空間不夠用時,須要依賴於老年代進行分配擔保,因此大對象直接進入老年代。
    • 標記-整理算法:在老年代中,對象存活率比較高,若是執行較多的複製操做,效率將會變低,因此老年代通常會選用其餘算法,如標記—整理算法。讓全部的對象都向一端移動,而後直接清理掉端邊界之外的內存

ubuntu的啓動過程

+ 系統開始時啓動bios(pc環境中,地址是0xFFFF0),第一階段任務就是上電自檢POST
+ bios第二階段,本地設備初始化和枚舉,runtime services,做用是檢測順序排在第一的可啓動設備,並啓動存放在設備中的操做系統。(當POST結束時,內存中POST相關代碼會被丟棄,而runtime services代碼一直保存在內存中)
+ 通常的linux會從磁盤中開始啓動,磁盤的第一個扇區有主引導記錄MBR(Master Boot Record)

img

​ 前446字節是primary bootloader,包含了可執行代碼和錯誤信息字符串。接下去64字節是磁盤的分區表,該分區表中包含了四條分區記錄,每條分區記錄爲16字節,分區記錄能夠爲空,若爲空則表示分區不存在。最後是2個字節的magic number,這兩個字節是固定的0xAA55,這兩個字節的magic number能夠用於判斷該MBR記錄是否存在。

​ primary bootloader的做用就是用於尋找並定位secondary bootloader,也就是Stage 2 bootloader。它經過遍歷分區表尋找可用的分區,當它發現可用的分區的時候,仍是會繼續掃描其餘分區,確保其餘分區是不可用的。而後從可用的分區中讀取secondary bootloader到內存中,並執行。

  • stage 2 BootOLoader 能夠更恰當地稱做kernel loader,將linux內核加載到內存中

相關文章
相關標籤/搜索