🌓

九月

今天是星期天,是九月的第一天,亦是秋天的第一天。

秋天的到来,总是伴随着一种特殊的情感,那种既温柔又略带忧伤的感觉,在每一个秋日的清晨和黄昏里悄然蔓延。秋天是一个让人沉思的季节,树叶渐渐变黄,微风轻拂,带来丝丝凉意,仿佛在提醒我们时间的流逝和生命的无常。

阅读全文

《OSTEP》学习笔记(十)常见并发问题

从下面的统计中我们可以看出,常见的并发问题可以分为:「非死锁的缺陷」与「死锁缺陷」

阅读全文

《OSTEP》学习笔记(九)信号量

从前两篇文章可知条件变量必须和配合使用,那为什么不直接封装在一起呢?于是就有个信号量。

信号量只是将锁和单值条件的条件变量封装在一起,所以它不是一个全新的概念,它能实现的事锁加条件变量都能实现。对于比较复杂情况下的条件判断无法使用信号量解决,因为其只内置了一个简单的整型的 value 条件。

阅读全文

《OSTEP》学习笔记(八)条件变量

目前为止,我们已经形成了锁的概念,并且看到了硬件和操作系统是如何正确组合来实现锁的。但锁并不是并发程序设计所需要的唯一原语。

阅读全文

《OSTEP》学习笔记(七)基于锁的并发数据结构

通过锁可以使数据结构线程安全(thread safe),但具体如何加锁则决定了该数据结构的效率。本章将探讨怎么给数据结构加锁,才能让该结构功能正确的同时保证高性能。

阅读全文

《OSTEP》学习笔记(六)锁

并发编程要解决的最基本的问题:我们希望以原子方式执行一系列的指令,但由于中断的存在我们做不到这点。因此本章介绍了锁(lock)来解决这一问题。程序员在代码中加锁,放在临界区周围,保证临界区能够像单条原子指令一样执行。

阅读全文

《OSTEP》学习笔记(五)插叙:线程-API

本章主要是对 pthread 库进行粗略的介绍,更多 API 的细节可以查看文档和参考其他书籍。随后的章节会慢慢介绍锁和条件变量的概念,因此本章节可以作为参考。

本章解答的关键问题:如何创建和控制线程?
操作系统应该提供那些创建和控制线程的接口?这些接口如何设计得好用又实用?

阅读全文

《OSTEP》学习笔记(四)并发:介绍

前面我们已经看到了操作系统是如何将一个物理 CPU 编程多个虚拟 CPU,从而支持多个程序同时运行的假象;还看到了如何为每个进程创建巨大、私有的虚拟内存,让每个程序好像拥有自己的内存,而实际操作系统秘密的复用物理内存。 OSTEP 的第二部分将介绍并发相关的内容,因此本章将首先介绍为单个运行进程提供的新抽象:进程(thread)。经典的观点是一个程序只有一个...

阅读全文

《OSTEP》学习笔记(三)插叙:进程API

这一章的内容比较偏向实践,主要介绍了 UNIX 系统中的进程相关的 API,即一些列系统的调用,比如进程创建相关的fork()exec() ,进程间等待用的 wait()

阅读全文

《OSTEP》学习笔记(二)抽象:进程

这章讲的是操作系统提供的最基本的抽象——进程。进程简单的来说其实就是「运行中的程序」。程序本身只是存在磁盘的一些静态数据、指令。 我们在使用计算机的过程中,通常都会运行多个程序。比如:同时运行浏览器、播放器、游戏等等。除了这些我们熟知的程序外,系统内部还运行着上百个程序。现代的处理器一般都有多个核(注意,这里的核其实是指一个「运算单元」也就是一个 CPU,也...

阅读全文