内核同步机制

关于同步理论的一些基本概念

  • 临界区(critical area): 访问或操作共享数据的代码段
    简单理解:synchronized大括号中部分(原子性)
  • 竞争条件(race conditions)两个线程同时拥有临界区的执行权
  • 数据不一致:data unconsistency 由竞争条件引起的数据破坏
  • 同步(synchronization)避免race conditions
  • 锁:锁是完成同步的手段(门锁,门后是临界区,只允许一个线程存在)
    上锁解锁必须具备原子性(如果连上锁的过程都会被打断的话,就没有什么意义了)
  • 原子性(象原子一样不可分割的操作)
  • 有序性(禁止指令重排)
  • 可见性(一个线程内的修改,另一个线程可见)

互斥锁 排他锁 共享锁 分段锁

内核同步常用方法

了解一下Linux内核实现的一些同步方法,了解一些关于线程控制的理论知识,可以去印证Java层面的同步知识。
用的话要用C语言去调用。

  1. 原子操作 – Linux内核中提供了类似于 Java 中的 AtomicXXX 的原子操作,位于Linux内核源码的头文件<linux/types.h>,是从原语层面的支持,不需要实现CAS

  2. 自旋锁 – 内核中通过汇编支持的CAS自旋锁,位于<asm/spinlock.h>

  3. 读-写自旋 – 类似于ReadWriteLock,可以同时读,但只能一个写
    相当于:的时候是共享锁,的时候是排他锁

  4. 信号量 – 类似于Java中的Semaphore(PV操作,down up操作,就是占有锁和释放锁)
    是一个重量级锁,线程会进入wait,适合长时间持有的锁情况

  5. 读-写信号量 – downread upread downwrite upwrite
    (多个写,可以分段写,比较少用)(分段锁)

  6. 互斥体(mutex) – 特殊的信号量(二值信号量)

  7. 完成变量 – 特殊的信号量(A发出信号给B,B等待在完成变量上)
    vfork() 在子进程结束时通过完成变量叫醒父进程 类似于(Latch)
    在网络编程中有完成端口(Completion Port)

  8. BKL:大内核锁 Big kernel lock(早期,现在已经不用)

  9. 顺序锁(内核版本2.6之后新增加的): – 线程可以挂起的读写自旋锁
    序列计数器(从0开始,写时增加(+1),写完释放(+1),读线程不对计数器做任何操作)
    写的时候,不妨碍读线程:
    如果读线程发现是偶数,说明在读的时候没有任何人改变过。
    如果读线程发现是奇数,说明你读到的可能是中间状态,你可以选择继续自旋,等待值变为偶数。
    读前读后序列一样,说明没有写线程打断。

  10. 禁止抢占preempt_disable():我这个线程在执行过程中,不允许任何线程打断我。

  11. 内存屏障 – 见 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

制作启动软盘

  1. dd if=/dev/zero of=floppy.img bs=1474560 count=1 生成空白软盘镜像
  2. dd if=boot.bin of=myos.img bs=512 count=1 制作包含主引导记录boot.bin的启动镜像文件
  3. dd if=floppy.img of=myos.img skip=1 seek=1 bs=512 count=2879 在 bin 生成的镜像文件后补上空白,成为合适大小的软盘镜像,一共2880个扇区,略过第一个

用软盘启动系统

  1. 将myos.img下载到windows

  2. VMWare创建空的虚拟机
    2.1 文件 - 创建新的虚拟机 - 典型
    2.2 稍后安装操作系统
    2.3 其他
    2.4 一路next 完成
    2.5 虚拟机设置,去掉CD/DVD选项中“启动时连接”
    2.6 网络,选择“仅主机模式”,勾选“启动时连接”(好像无所谓)
    2.7 添加软盘驱动器 使用软盘映像 找到myos.img

  3. 启动虚拟机


从此可以开始制作你的操作系统之旅。

为什么是从 0x7C00 开始?

IBM一开始就是这么设定的,后来为了兼容一直延续。参考:
https://www.glamenv-septzen.net/en/view/6

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

  1. 一网打尽:Java 程序员必须了解的计算机底层知识!

    公众号后台回复"面试",获取精品学习资料 扫描下方海报了解专栏详情 本文来自公众号读者cxuan的投稿 我们每个程序员或许都有一个梦,那就是成为大牛,我们或许都沉浸在各种框架中,以 ...

  2. Java程序员需要掌握的计算机底层知识(三):进程、线程、纤程、中断

    面试高频问题 问:进程和线程有什么区别? 答:进程是一个程序运行起来的状态(运行态),线程是一个进程中不同的执行路径(线程只是其中一个). 更为专业的回答:进程是操作系统用来分配资源的基本单位,线程是 ...

  3. Java程序员需要掌握的计算机底层知识(一):CPU基本组成、指令乱序执行、合并写技术、非同一访问内存 NUMA

    一些书籍 读书的原则:不求甚解,观其大略 你如果进到庐山里头,二话不说,蹲下头来,弯下腰,就对着某棵树某棵小草猛研究而不是说先把庐山的整体脉络跟那研究清楚了,那么你的学习方法肯定效率巨低而且特别痛苦, ...

  4. Java程序员需要掌握的计算机底层知识(四):内存管理

    内存管理 单进程DOS时代 DOS时代 - 同一时间只能有一个进程在运行(也有一些特殊算法可以支持多进程) windows9x - 多个进程装入内存存在的问题: 内存不够用 互相打扰 为了解决这两个问 ...

  5. Java程序员需要掌握的计算机底层知识(二):操作系统、内核、用户态与内核态、系统调用的执行过程

    操作系统 启动过程 通电 -> bios uefi 工作 -> 自检 -> 到硬盘固定位置加载bootloader -> 读取可配置信息 -> CMOS CMOS 用来存 ...

  6. 非科班的java程序员该如何补充计算机基础知识,需要看哪些书?

    java比较特殊,毕竟后端扛霸子,想要认真学好java,必须有好的计算机基础,可是为什么需要基础呢? 把这个问题弄明白,要学哪些基础知识就清楚多了. 第一个问题,10个用户使用的系统和1000000个 ...

  7. 简单计算机java程序_JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单...

    JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单 JAVA程序员需要知道的计算机底层基础10-操作系统引导程序的简单制作 汇编实现引导程序 ; 文件名 boot.asm org 7c ...

  8. Java程序员在面试中不通过的五个原因

    如今正是毕业生找工作的高峰期,那么在面试Java程序员的过程中会出现什么问题呢?有哪些问题是初入职场的Java程序员在面试中最容易犯的呢?下面,我总结了Java程序员在面试中不通过的五个原因,作为大家 ...

  9. 大厂招聘Java程序员是什么标准?大厂程序员条件

    学习Java技术开发很多时候是为了找到一份不错的工作,如果能顺利的进入大厂那就更不错了,最近人多人问大厂招聘Java程序员是什么标准?,下面我汇总了一份关于大厂招聘Java程序员有什么需求. 大厂Ja ...

最新文章

  1. HandlerInterceptor里@Autowired对象为空的解决方法
  2. 那天的延长线在今天β
  3. 《DB 查询分析器》中断SQL语句的执行
  4. vue 时间刻度_vue时间轴风格式的图片展示
  5. 常使用的webserver地址
  6. shell语法 06-Linux文本处理-grep
  7. 桩筏有限元中的弹性板计算_采用PKPM系列JCCAD软件桩筏筏板有限元方法计算的模型参数 -...
  8. 点对点借贷dApp Yield宣布流动性激励迁移至SushiSwap
  9. Visual Studio 与 Eclipse,谁是最强 IDE?
  10. 旷视发布3D感知全栈解决方案!现在,AI+3D只差杀手级应用了
  11. html经历了几个版本,HTML 的上一个版本诞生于 1999 年. 自从那以后, Web 世界已经经历了巨变....
  12. 【译】你不知道的 Chrome 调试工具技巧 第二十三天:Drawer tips 后续
  13. toString方法和valueOf方法以及Symbol.toPrimitive方法的学习
  14. eeglab使用与错误解决
  15. Qt输出PDF排版的技巧
  16. PAT-Basic Level-1001 害死人不偿命的(3n+1)猜想;
  17. App启动页倒计时圆形并且跳过功能实现
  18. error C2679: binary ‘<<‘ : no operator defined which takes a right-hand operand of type ‘class s
  19. 聊一聊JAVA指针压缩的实现原理(图文并茂,让你秒懂)
  20. 智能工厂 | 工业4.0

热门文章

  1. 洛谷 - P2764 最小路径覆盖问题(最大流+二分图最小路径覆盖+路径打印)
  2. HDU - 3966 Aragorn's Story(树链剖分+线段树)
  3. HDU - 5090 Game with Pearls(二分图最大匹配)
  4. python mysql链接安全_Python最佳实践和最安全的方法来连接MySQL和执行查询
  5. raid卡组不同raid_RAID有哪几种?有什么区别?
  6. 计算机python技术基础知识点_python基础--相关计算机基础知识
  7. keil 查看 stm32 io波形_如何系统地入门学习stm32?
  8. 滚动图片广告_张韶涵霸屏兴发广场,户外LED大屏广告:投放价值在哪?
  9. NEFU 635(二分+枚举)
  10. string基本字符系列容器