月度归档: 2024 年 7 月

11 篇文章

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,…
Ostep 29 Lock Based ConcurConcurrency Data Structure
这章比较简单简短,主要介绍了并发数据结构的实现。 总结下的话,实现并发的数据结构,我们需要考虑主要2个点: 正确性。这个毋庸置疑,并发情况操作下,要保证数据的正确性。 性能。并发数据结构的性能其实分两部分 在实现正确性的情况下,结构本身的性能 在线程越来越多(并发越来越高)的情况下,性能下降的程度 从这些点来考虑的话,我们直接总结下这章说道的并发数…
Ostep 28 Locks
27章罗列了线程的api,所以就略过了 28章主要介绍了Lock 锁,上一章说到了,处理并发下的数据竞争最好的方式,就是使用锁来使得那段临界代码互斥,所以这一章主要介绍了锁。 锁的模型 锁的话,简单的模型其实也就2个功能:加锁、解锁 锁的评估 一般我们评估锁,从3个维度: 基本功能,是否提供了互斥 公平性,是否能提供对于争抢锁之间线程的公平性,也就…