
操作系统设计与实现
[T]
这个作者很懒,什么都没留下…
展开
-
三十、现代存储系统(管理数据库和分布式存储系统)
1、把SQL查询翻译成read,write,lseek,fsync的调用。2、put(k,v)都直接把k,v追加写到文件尾部。1、snapshot()返回当前文件的长度。三、分布式数据模型Key-Valie。3、支持快照(对某个状态瞬间只读快照)1、单进程(多线程),按Key排序。2、支持transactions。3、get(k,v)遍历整个文件。虚拟磁盘(文件)上的数据结构。大规模数据,高效原子操作。2、并发控制(事务处理)(1)效率极低(读放大)三、分布式系统的基础。...原创 2022-07-17 20:52:10 · 716 阅读 · 0 评论 -
二十九、Xv6文件系统实现(gdb追踪mkfs,buffer cach和log)
1、通过一个buffercache保存一份inode。奔溃恢复(正常写入步骤中,系统发生错误时,恢复数据)1、log写日志,将所有磁盘操作写入日志。bootblock引导块。二、mkfs创建文件系统。原创 2022-07-17 10:27:06 · 247 阅读 · 0 评论 -
二十八、持久数据的可靠性(RAID(Redundant Array of Inexpensive Disks),奔溃一致性;FSCK和日志)
一、Redundant Array of Inexpensive Disks1、性能2、可靠性二、将磁盘阵列虚拟化1、冗余镜像(容错,读取双倍带宽,写入一半带宽)Vi -》{Ai,Bi}2、顺序拼接V1 -》 A1,V2 -》 A2,。。。Vn+1 -》 B1,Vn+2 -》 B2, 。。。3、交错排列(读取双倍带宽)V1 -》A1, V2 -》 B1V3 -》A2, V4 -》 B2V2n-1 -》An,V2n -》 Bn4、RAID-4:Parity Disk留一块磁盘作为奇偶校验盘{V1,V2,V3}原创 2022-07-13 22:24:57 · 470 阅读 · 0 评论 -
二十七、FAT和UNIX文件系统(数据结构视角的文件系统;FAT手册和目录树遍历)
一、文件系统实现在一个IO设备(块设备)实现所有文件系统APIbread(int id, char *buf)bwrite(int id, const char* buf)二、数据结构的实现Block device提供的设备抽象在bread/bwrite上实现块设备的分配和回收(类似pmm)int balloc();void bfree(int id);三、FAT文件系统扇区格式格式11、优点:实现简单、无须单独开辟空间2、缺点:数据大小不是2^k,单独的lseek需要读取整块数据格式21原创 2022-07-11 22:25:09 · 719 阅读 · 0 评论 -
二十六、文件系统API(设备在应用间的共享;目录和文件API)
一、设备咱应用程序之间的共享终端1、多个进程并行打印,如何保证不混乱2、多个进程并行读,就会发生竞争GPU(CUDA)1、每个CUDA应用程序都是一系列CUDA的API调用2、全部有驱动实现调度(隔离)磁盘需要支持数据的持久化1、应用程序的数据(1)可执行文件和动态链接库2、用户数据3、系统数据(1)manpage(2)系统配置二、文件系统:虚拟磁盘目标:1、提供合理的API使得多个应用程序能共享数据2、提供一定的隔离,使得恶意/错误不会大量奔溃存储设备(字节序列)的虚拟化1、磁盘(I/O设备)=一个可以读原创 2022-07-04 21:52:33 · 529 阅读 · 0 评论 -
二十五、设备驱动程序(Linux设备驱动、GPU和COUA;存储设备抽象)
一、IO设备抽象1、主要功能:输入和输出操作系统:设备=支持各类操作的对象(文件)1、read:从指定位置读取数据2、write:从指定位置写入设备3、ioctl:读取/设置设备状态二、设备驱动程序1、一些普通内核程序2、例子:(1)/dev/pts/[x] //终端(2)/dev/zero //零设备(读零)(3)/dev/null //“null”设备(接收写)(4)/dev/random,/dev/urandom //随机数生成器三、Linux设备原创 2022-06-30 22:48:35 · 513 阅读 · 0 评论 -
二十四、输入输出设备模型(串口/键盘/磁盘/打印机/总线/中断控制器/DMA和GPU)
一、计算机接口CPU工作:取指令,译码,执行1、串口,字符输入输出2、键盘二、总线、中断控制器和DMA1、总线,特殊的IO设备(1)提供设备注册和地址到设备转发(2)PCI总线 USB总线挂在PCI上2、中断控制器3、DMA,Direct Memory Access(1)CPU将数据传递到设备,效率会很低(2)使用一个简单的运算单元来搬移数据,结束后通过中断通知CPU,可以很大的提高CPU效率三、GPU和异构计算1、PPU(NES Picture Processing Unit)2、2D实现3原创 2022-06-29 21:46:24 · 438 阅读 · 0 评论 -
二十三、1-Bit数据的存储(延迟线/磁芯/DRAM/SRAM/磁带/磁盘/光盘/Flash SSD)
一、存储设备原理机器指令集模型1、寄存器rax,rbx,rcx,...2、物理内存存储当前状态的需求1、可以快速访问(1)根据编号读写数据2、访问速度很快(1)(甚至)允许掉电丢失(2)memory hierarchy二、临时存储器1、磁芯内存(1)掉电不丢失2、SRAM/DRAM:电容三、永久存储器1、磁带2、软盘3、光盘(1)只能读,不能写...原创 2022-06-26 22:27:19 · 322 阅读 · 0 评论 -
二十二、操作系统(内存管理;线程和信号量;进程和lputc,sleep,fork)
一、内存管理(多处理器)共享内存多处理器状态机1、多个c语言状态机,拥有独立堆栈且共享内存2、Data race(数据竞争)=undefined behavior atomic_xchg原子数据交换,实现多处理器的同步问题二、线程和信号量三、管理地址空间1、protect/unprotect管理地址空间2、map可以修改地址映射(虚拟地址映射到物理地址)...原创 2022-06-26 17:36:22 · 324 阅读 · 0 评论 -
二十一、操作系统设计(POSIX;Windows API;Micro/Exo/Unikernel)
一、The Base Specifications Issue 7XDB:Base DefinitionsXSH:System InterfacesXCH:Shell & UtilitiesXRAT:Rationale二、Windows API index - Win32 apps | Microsoft Docs三、微内核与宏内核1、宏内核 文件,IPC等都在系统内核中完成2、微内核 将驱动和问价系统等放在用户态(IPC还在内核态,无法放在用户态)四、Minix全功能操作系统1原创 2022-06-26 12:05:01 · 405 阅读 · 0 评论 -
二十、处理器调度(RR时间片轮转,MLFQ多级反馈队列,CFS完全公平调度器,优先级翻转;多处理器调度)
一、简化的处理器调度问题中断机制1、处理器一固定的频率被中断(1)linux kernel可以设置为:100/250/300/1000Hz2、中断/系统调用返回时可以自由选择进程/线程处理器调度问题的简化假设1、系统中有一个处理器2、系统中有多个进程/线程共享CPU(1)系统调用(进程/线程的一部分代码在syscall中执行)(2)等待I/O返回,不适用CPU二、策略1、RR(Round-Robin)时间片轮转2、优先级(1)Unix niceness -20 ~ 19值越大,表示对CPU资源原创 2022-06-23 21:00:52 · 364 阅读 · 0 评论 -
十九、Xv6上下文切换(上下文切换的实现;状态机的封装与恢复)
一、处理器虚拟化为什么死循环不能使得计算机彻底卡死?原理上:1、硬件会发生中断(类似于“强行插入”的ecall(rics-v的系统调用,类似与x86的syscall))2、切换到操作系统代码执行3、操作系统代码可以切换到另一个进程执行协程库:co_yield(); //切换协程二、虚拟化:状态机管理寄存器组($x0...$x31,$pc),物理内存只有一份1、寄存器虚拟化:将寄存器状态保存至内存2、内存虚拟化:$satp的数据结构(Supervisor Address Translation and Pro原创 2022-06-21 22:07:14 · 392 阅读 · 0 评论 -
十八、Xv6代码导读(调试工具配置;调试系统调试执行)
一、原创 2022-06-19 22:42:29 · 751 阅读 · 0 评论 -
十七、动态链接和加载(静态ELF加载器实现;调试Linux内核;动态链接和加载)
一、静态ELF加载器:实现可执行文件1、一个描述了状态机的初始状态(迁移)的数据结构(1)不同与内存的数据结构,指针都被偏移量代替(2)数据结构各个部分定义:/usr/include/elf.h加载器(loader)1、解析数据结构+复制到内存+跳转2、创建进程运行时初始状态(argv,envp) 搬移可执行文件头与文件内容 构建执行初始化的堆栈栈指针跳转二、Linux内核加载1、编译(1)解压(2)配置make menuconfig(生成.condif文件)(3)编译make原创 2022-06-18 22:32:34 · 544 阅读 · 0 评论 -
十六、可执行文件(调试信息;stack unwinding;静态链接中的重定位)
一、可执行文件:状态机的描述操作系统为程序提供执行环境1、可执行文件是最重要的操作对象一个描述了状态机的初始状态+迁移的数据2、寄存器大部分有ABI规定,操作系统负责设置3、地址空间(内存)二进制文件+ABI共同决定二、常见的可执行文件Windows 95/NT+1、PELinux/UNIX1、a.out2、ELF(Executable Linkable Format)3、She-bang #! ./a.out三、可执行文件解析1、生成可执行文件 (1)ld(linker),as原创 2022-06-16 22:05:11 · 160 阅读 · 0 评论 -
十五、fork的应用(描文件述符的复制;写时复制;“平行操作”)
一、文件描述符flags:O_CLOEXEC:进程执行exec时,会被关闭O_ADDEND:追加写文件描述符:0:stdin1:stdout2:stderr二、写时拷贝(copy-on-write)进程fork之后,新的进程并没有立即拷贝一个新的内存页,而是指向父进程的内存页;当读取时,直接读取父进程的内存页数据;当写发生时,如果权限允许,则立即拷贝一个内存页,然后实现写操作。fast path:在fork的子进程没有写操作时,效率就很高slow path:当fork子进程有写操作时,拷贝内存页三、状原创 2022-06-15 21:01:36 · 275 阅读 · 0 评论 -
十四、操作系统上的程序(程序与编译器)
一、c标准库的实现1、libc数据计算string.h:字符串/数组操作math.h:数学计算排序和查找2、文件描述符stdio.h3、进程/操作系统功能4、地址空间多处理器,申请和释放设置两套系统fast path(1)性能极好,并行度高,覆盖大部分情况(2)但会有小的概率会失败slow path(1)把困难的事情做好...原创 2022-06-13 22:15:14 · 113 阅读 · 0 评论 -
十三、系统调用和Shell(freestanding shell, 终端和 job control)
一、为用户封装操作系统API系统需要一个可以直接操作的界面,Shell(内核提供系统调用,Shell提供用户接口)二、Unix Shell包裹kernel与用户交互的壳。原创 2022-06-09 22:17:29 · 326 阅读 · 0 评论 -
十二、进程地址空间(pmap;vdso;mmap)
进程地址空间(pmap;vdso;mmap)原创 2022-06-08 20:42:00 · 610 阅读 · 0 评论 -
十一、操作系统的进程(最小Linux;fork;execvc和exit)
一、操作系统启动1、从系统启动到第一个进程CPU Reset -》Firmware -》BootLoader -》Kernel_start()(1)操作系统会加载“第一个程序”如果没有指定启动选项init=,按照“默认列表”尝试一遍从此之后,Linux Kernel进入后台,成为“中断/异常处理程序”2、定制最小的Linux35:00二、进程管理...原创 2022-05-25 22:55:07 · 126 阅读 · 0 评论 -
十、状态机模型的应用(细胞自动机;gdb/rr/perf;代码验证工具)
一、状态机模型:理解编译器和现代CPU二、查看状态机执行1、trace和调试器程序执行=状态机执行(1)观察状态机执行strace/gdb41:40原创 2022-05-24 21:52:45 · 191 阅读 · 0 评论 -
九、操作系统状态机模型(操作系统的加载,thread-os代码)
一、软件和硬件的桥梁1、Bare metal与程序的约定为了让计算机运行任何程序,一定存在软件/硬件的约定(1)CPU reset后,处理器处于某一个确定的状态PC指针一般指向一段memory mapped ROM(内存映射)ROM存储了厂商提供的firmware(固件)处理器的大多特性处于关闭状态缓存,虚拟存储。。。(2)Firmware(固件,厂商提供的代码)...原创 2022-05-23 22:01:59 · 359 阅读 · 0 评论 -
八、并发Bug和应对
一、应对并发Bug方法1、防御性编程assert(); 测试某个关键变量或条件CHECK_HEAP(p); //指针地址在堆区二、死锁和数据竞争1、死锁,线程之间相互等待避免死锁死锁产生的必要条件(1)互斥:一个资源每次只能被一个进程使用(2)请求与保持:一个进程请求资源阻塞时,不释放已经获取的资源(3)不剥夺:进程已经获得的资源不能被强行剥夺(4)循环等待:若干进程之间形成头尾相接的循环资源关系AA-Deadlock(1)AA型死锁容易检测,及早报告,及原创 2022-05-18 22:38:20 · 140 阅读 · 0 评论 -
七、并发编程(高性能计算/数据中心/人机交互并发)
一、高性能计算中的并发编程1、主要挑战(1)计算任务如何分解计算图需要容易并行化机器-线程两级任务分解生产者-消费者解决一切问题(2)线程如何通信通信不仅发生在节点/线程之间,还发生在任何共享内存访问二、数据中心里的并发编程1、特点(1)以数据存储为中心互联网搜索:Google、社交网络Facebook互联网应用:微信/QQ/支付宝/游戏(2)算法/系统对HPC...原创 2022-05-14 16:02:37 · 194 阅读 · 0 评论 -
六、并发编程:同步(条件变量、信号量、生产者-消费者)
一、线程同步两个或两个以上随着时间变换,值的变化过程保持一定的相对关系二、条件变量1、条件变量API等待:wait(cv, mutex)单个唤醒:signal/notify(cv)所有都唤醒:broadcast/notify(cv)2、生产者与消费者关系实现生产者:任务队列不满,上锁、加任务队列消费者:任务队列不空,上锁、释放一个任务三、信号量等待信号量(信号量值不为零)信号量减一释放信号量,信号量值加一...原创 2022-05-12 22:23:38 · 87 阅读 · 0 评论 -
五、并发控制:互斥(自旋锁、互斥锁和futex)
一、实现原理假设硬件设备可以为系统提供一条“瞬间完成”的读+写指令,并发控制就变得容易许多。处理器保证带有lock的指令被顺序执行。1、x86提供的原子操作,x86提供了许多原子操作机制long sum=0;void threadwork(){ for(int i=0;i<1000;i++) { asm volatile("lock addq $1, %0": "+m"(sum)); }}creat_pthread(thr...原创 2022-05-09 22:15:36 · 550 阅读 · 2 评论 -
四、理解并发程序的执行
一、互斥算法lock(&lk);sum++;unlock(&lk);1、一个失败的尝试#define LOCK 1#define UNLOCK 0if(locked != UNLOCK){ return;}locked = LOCK;sum++;locked = UNLOCK;当两个线程同时访问locked变量时,就会出现两个线程都认为locked=UNLOCK。同时给locked 赋值为LOCK,这看似没有什么问题,但是这实际没有实现两个或原创 2022-05-08 20:22:26 · 79 阅读 · 0 评论 -
三、多处理器编程
一、并发程序的状态机模型全局区和堆区共享,栈区线程独有。通过栈区切换线程执行交替,实现并发。1、并发的基本单位:线程共享内存的多个执行流执行流拥有独立的堆栈指针/寄存器共享全部的内存(指针可以互相引用)二、线程库thread.h1、create(fn)创建一个函数入口是fn的线程,并立即开始执行void fn(int tid){...}参数tid从1开始编号语义:在状态中新增stack frame列表并初始化为fn(tid)1、...原创 2022-04-28 21:51:54 · 181 阅读 · 0 评论 -
二、操作系统上的程序(程序和编译器)
一、程序程序就是状态机程序=计算+syscall1、状态机和数字电路数字逻辑电路:数码管状态=寄存器保存的值初始状态=RESET迁移=组合逻辑电路计算寄存器下一个值2、c程序的状态机模型:汉诺塔状态=堆+栈初始状态=main函数第一条语句迁移=执行一条代码3、特殊的指令 syscall调用操作系统syscall,把(M内存,R寄存器)交给系统,任...原创 2022-04-27 21:33:22 · 2701 阅读 · 0 评论 -
一、操作系统概述
一、为什么要学习操作系统有关编程,有些东西一直在使用,但是不明白,有些特殊情况,无法理解有些功能熟悉却不能实现,如浏览器,编译器,IDE等等二、什么是操作系统操作系统(operating system,简称OS),是管理软硬件资源,为程序提供服务的程序。操作任务的系统,批处理=自动切换处理任务。三、操作系统根本1、为谁提供服务程序=状态机多线程Linux应用2、为程序提供什么样的服务操作系统=对象+A...原创 2022-04-24 21:19:56 · 2019 阅读 · 0 评论