日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java程序员需要掌握的计算机底层知识(五):内核同步方法

發布時間:2024/2/28 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

    制作啟動軟盤

  • dd if=/dev/zero of=floppy.img bs=1474560 count=1 生成空白軟盤鏡像
  • dd if=boot.bin of=myos.img bs=512 count=1 制作包含主引導記錄boot.bin的啟動鏡像文件
  • dd if=floppy.img of=myos.img skip=1 seek=1 bs=512 count=2879 在 bin 生成的鏡像文件后補上空白,成為合適大小的軟盤鏡像,一共2880個扇區,略過第一個
  • 用軟盤啟動系統

  • 將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程序员需要掌握的计算机底层知识(五):内核同步方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。