分类: ostep

26 篇文章

thumbnail
Ostep 40 File System Implementation
好久没更新,主要文件系统实际实现这段看完一次没有很看懂,过了段时间又看了第二次加深了理解,才好做总结 本章主要讲解了一下文件系统最简单的实现,以及设计一个文件系统需要考虑哪些点。 文件系统基本的数据结构 一个文件系统基本的数据接口,首先一般会将磁盘划分为多个固定大小的Region,这个Region你可以认为是页,理所当然,页的大小就是4k(内存页)…
thumbnail
Ostep 39 Interlude File and Directories
本书老套路,介绍文件系统的实现之前,先介绍一下相关的api和使用。 文件和目录的几个核心点 文件可以认为包含2种级别的定义。一个是低级别的inode number,可以认为是id。另一个是用户级别的,也就是filename 文件的后缀其实只是一种惯例。这个其实熟悉Linux的都知道,可执行文件不像windows一样一定要有exe,在shell中,只…
thumbnail
Ostep 38 Redundant Arrays of Inexpensive Disks
这章如名字,主要讲的是磁盘冗余阵列,也就是我们常说的RAID。一种扩展磁盘的容量、提升磁盘可靠性的技术。 RAID存在RAID0到RAID6等多种方案。评估一个RAID方案,主要从容量、可靠性、性能这三个方面。RAID的特点和前面的一些虚拟化一样,将多个磁盘虚拟化为一个磁盘,来对上游提供服务。 RAID 0 条带化分块 RAID0是最基础的思路,实…
thumbnail
Ostep 37 Hard Disk Drives
这章主要聚焦到了编写硬盘驱动上。 在开始编写之前,我们首先需要知道硬盘的实际构造以及查询逻辑。 磁盘构造 参考上图,上图表示了硬盘的一层,或者说一盘,实际硬盘是有多层堆叠起来的。我们介绍一下它 最上面的Rotates this way,表示了硬盘转动的方向 中间的点Spindle,表示了转轴,每片硬盘围绕着转轴旋转 图中从内到外我们可以看到分三圈,…
thumbnail
Ostep 36 Io Device
第三part持久化,开始讲设备I/O了。 体系结构 整个I/O的体系结构基本如图。 CPU通过一些专门的高速线路,直接连接显卡和内存 再通过DMI(Direct Media Interface),与专门的IO芯片相连 其他设备通过与IO芯片相连,以此连接到CPU(如网络的PCIE,USB的键鼠,eSATA硬盘) 硬件连接相关 硬件如何和OS交互? …
Ostep Second Part Summary
第二部分到此也就结束了。这边按照惯例做一下总结。 并发整块内容包括整章,主要还是描述了并发为什么会产生,以及操作系统如何结合CPU硬件去一步步构造一些使用的api来供开发者避免或者解决这些并发问题。 第二部分主要是通过一些思路来介绍的,更加详细的内容推荐美团技术团队的一篇文章,会有一些细节的补充 基本功 | 一文讲清多线程和多线程同步 其实博客总结…
Ostep 33 Event Based Concurrency
这章详细描述了之前20年看netty源码时就了解过的一个概念:eventloop,Netty以及Eventloop eventloop实际上是一个并发模型,基于事件驱动,用于实现在单线程或者单进程上的并发执行(是的,单线程也可以并发执行,没想到吧。 redis,node.js,浏览器,都大量使用到了这个并发模型。它的代码可能如下: while (1…
thumbnail
Ostep 32 Common Concurrency Problems
这章主要介绍并发场景下常见的bug,并发场景下主要常见的bug分2类:非死锁bug和死锁bug。文中列出了之前 Lu研究的目前常见的主流数据库和web server中包含的一些并发bug,并对其做了分类。 非死锁bug Atomicity-Violation Bugs 原子性违反 bug描述 这类bug的特点就是多线程之间,忽略了对共享变量的原子性…
thumbnail
Ostep 31 Semaphores
这章主要介绍了信号量的使用,如何使用信号量来实现并发编程。 信号量的定义 sem_init(&s, 0, 1); 初始化语句,第二个参数0表示是线程间的(信号量也存在进程间的),1表示信号量的值value int sem_wait(sem_t *s) { // Decrement the value of semaphore s by on…
Ostep 30 Condition Variables
除了锁之外,并发程序中另一个最重要的模式就是条件变量,与锁不同,条件变量用于解决线程间的同步问题。 条件变量的基本api 主要由2个方法就可以实现, pthread_cond_wait(pthread_cond_tc, pthread_mutex_tm); pthread_cond_signal(pthread_cond_t*c); 一个wait,…