Java程序员需要掌握的计算机底层知识(五):内核同步方法
內核同步機制
關于同步理論的一些基本概念
- 臨界區(critical area): 訪問或操作共享數據的代碼段
簡單理解:synchronized大括號中部分(原子性) - 競爭條件(race conditions)兩個線程同時擁有臨界區的執行權
- 數據不一致:data unconsistency 由競爭條件引起的數據破壞
- 同步(synchronization)避免race conditions
- 鎖:鎖是完成同步的手段(門鎖,門后是臨界區,只允許一個線程存在)
上鎖解鎖必須具備原子性(如果連上鎖的過程都會被打斷的話,就沒有什么意義了) - 原子性(象原子一樣不可分割的操作)
- 有序性(禁止指令重排)
- 可見性(一個線程內的修改,另一個線程可見)
互斥鎖 排他鎖 共享鎖 分段鎖
內核同步常用方法
了解一下Linux內核實現的一些同步方法,了解一些關于線程控制的理論知識,可以去印證Java層面的同步知識。
用的話要用C語言去調用。
原子操作 – Linux內核中提供了類似于 Java 中的 AtomicXXX 的原子操作,位于Linux內核源碼的頭文件<linux/types.h>,是從原語層面的支持,不需要實現CAS
自旋鎖 – 內核中通過匯編支持的CAS自旋鎖,位于<asm/spinlock.h>。
讀-寫自旋 – 類似于ReadWriteLock,可以同時讀,但只能一個寫
相當于:讀的時候是共享鎖,寫的時候是排他鎖
信號量 – 類似于Java中的Semaphore(PV操作,down up操作,就是占有鎖和釋放鎖)
是一個重量級鎖,線程會進入wait,適合長時間持有的鎖情況
讀-寫信號量 – downread upread downwrite upwrite
(多個寫,可以分段寫,比較少用)(分段鎖)
互斥體(mutex) – 特殊的信號量(二值信號量)
完成變量 – 特殊的信號量(A發出信號給B,B等待在完成變量上)
vfork() 在子進程結束時通過完成變量叫醒父進程 類似于(Latch)
在網絡編程中有完成端口(Completion Port)
BKL:大內核鎖 Big kernel lock(早期,現在已經不用)
順序鎖(內核版本2.6之后新增加的): – 線程可以掛起的讀寫自旋鎖
序列計數器(從0開始,寫時增加(+1),寫完釋放(+1),讀線程不對計數器做任何操作)
寫的時候,不妨礙讀線程:
如果讀線程發現是偶數,說明在讀的時候沒有任何人改變過。
如果讀線程發現是奇數,說明你讀到的可能是中間狀態,你可以選擇繼續自旋,等待值變為偶數。
讀前讀后序列一樣,說明沒有寫線程打斷。
禁止搶占 – preempt_disable():我這個線程在執行過程中,不允許任何線程打斷我。
內存屏障 – 見 volatile
匯編實現引導程序
bootloader被寫死在磁盤上固定的扇區,啟動后被加載到內存張一個固定的位置。BIOS去這個位置執行第一條指令。
編寫匯編碼
將程序燒到軟盤上,用軟盤啟動,模擬啟動過程
; 文件名 boot.asmorg 7c00h ; BIOS讀入MBR后,從固定的0x7c00h處開始執行。因此引導程序一定要放在這個位置才能執行。; 下面部分和10h有關中斷,10h中斷用來顯示字符 ; 8086CPU 16位寄存器想用20位尋址,于是加了段寄存器。為了向后兼容,后來一直保留 mov ax, cs 下來。 mov es, ax mov ax, msg mov bp, ax ; ES:BP表示顯示字符串的地址 mov cx, msgLen ; CX存字符長度 mov ax, 1301h ; AH=13h表示向TTY字符終端顯示字符,AL=01h表示顯示方式(字符串是否包含顯示屬性,01h表示不包含) mov bx, 000fh ; BH=00h表示頁號第0頁,BL=0fh表示顏色白色 mov dl, 0 ; 表示位于第0列 int 10h ; 在上面這些固定的寄存器當中放好數據后,直接調用中斷函數即可msg: db "hello world, welcome to OS!" msgLen: equ $ - msg ; 字符串長度 times 510 - ($ - $$) db 0 ; 填充剩余部分 dw 0aa55h ; 魔數,必須有這兩個字節BIOS才確認是MBR,即主引導記錄(是裝有Linux系統的硬盤的第一個扇區)編譯
nasm boot.asm -o boot.bin
制作啟動軟盤
用軟盤啟動系統
將myos.img下載到windows
VMWare創建空的虛擬機
2.1 文件 - 創建新的虛擬機 - 典型
2.2 稍后安裝操作系統
2.3 其他
2.4 一路next 完成
2.5 虛擬機設置,去掉CD/DVD選項中“啟動時連接”
2.6 網絡,選擇“僅主機模式”,勾選“啟動時連接”(好像無所謂)
2.7 添加軟盤驅動器 使用軟盤映像 找到myos.img
啟動虛擬機
從此可以開始制作你的操作系統之旅。
為什么是從 0x7C00 開始?
IBM一開始就是這么設定的,后來為了兼容一直延續。參考:
https://www.glamenv-septzen.net/en/view/6
總結
以上是生活随笔為你收集整理的Java程序员需要掌握的计算机底层知识(五):内核同步方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java程序员需要掌握的计算机底层知识(
- 下一篇: java美元兑换,(Java实现) 美元