MIT 6.s081 Operating System Engineering
前言(Intro) MIT 6.s081 作为著名的操作系统导论级课程,对于操作系统的设计和实现,以及它们作为系统编程基础的使用有着非常独到而易懂的讲解。在结束计算机体系结构基础的粗浅学习后,笔者毫不犹豫地选择了它开始了对作为计算机三大浪漫之一的OS的初步学习。
在Fall2020的版本中,lecture的主题包括虚拟内存、文件系统、线程、上下文切换、内核、中断、系统调用、进程间通信、软件和硬件之间的协调和交互等等;而对于lab,这门课专门开发了一个新的基于 RISC-V 的教学用多处理器操作系统 xv6,它是一个类似于 Unix v6 的操作系统,而不是最新最好版本的 Linux、Windows 或 BSD Unix,但 xv6足够大,足以说明操作系统中的基本设计和实现思想。另一方面,xv6 比任何现代生产操作系统都要小得多,因此也更容易理解。 xv6 具有与许多现代操作系统类似的结构,在探索xv6的过程中,也会发现 Linux 等内核内部有很多熟悉的内容。
简介(Synopsis)Lab 指引官方难度参考:🟩 easy:小于 1 小时。通常是为后续练习的热身🟧 mod ...
Effective Modern C++ Notes (7)
CHAPTER 7 The Concurrency APIC++11的伟大成功之一是将并发整合到语言和库中。熟悉其他线程API(比如pthreads或者Windows threads)的开发者有时可能会对C++提供的斯巴达式(译者注:应该是简陋和严谨的意思)功能集感到惊讶,这是因为C++对于并发的大量支持是在对编译器作者约束的层面。由此产生的语言保证意味着在C++的历史中,开发者首次通过标准库可以写出跨平台的多线程程序。这为构建表达库奠定了坚实的基础,标准库并发组件(任务tasks,期望futures,线程threads,互斥mutexes,条件变量condition variables,原子对象atomic objects等)仅仅是成为并发软件开发者丰富工具集的基础。
在接下来的条款中,记住标准库有两个future的模板:std::future和std::shared_future。在许多情况下,区别不重要,所以我们经常简单的混于一谈为futures。
Item 35: Prefer task-based programming to thread-based异步执行的方法如果开发者 ...
Effective Modern C++ Notes (6)
CHAPTER 6 Lambda Expressions与lambda相关的词汇与lambda相关的词汇可能会令人疑惑,这里做一下简单的回顾:
lambda*表达式(lambda expression*)就是一个表达式。下面是部分源代码。在
12std::find_if(container.begin(), container.end(), [](int val){ return 0 < val && val < 10; }); //译者注:本行高亮
中,代码的高亮部分就是lambda。
闭包(enclosure)是lambda创建的运行时对象。依赖捕获模式,闭包持有被捕获数据的副本或者引用。在上面的std::find_if调用中,闭包是作为第三个实参在运行时传递给std::find_if的对象。
闭包类(closure class)是从中实例化闭包的类。每个lambda都会使编译器生成唯一的闭包类。lambda中的语句成为其闭包类的成员函数中的可执行指令。
lambda通常被用来创建闭包,该闭包仅 ...
Effective Modern C++ Notes (5)
CHAPTER 5 RValue References, Move Semantics and Perfect Forwarding当你第一次了解到移动语义(move semantics)和完美转发(perfect forwarding)的时候,它们看起来非常直观:
移动语义使编译器有可能用廉价的移动操作来代替昂贵的拷贝操作。正如拷贝构造函数和拷贝赋值操作符给了你控制拷贝语义的权力,移动构造函数和移动赋值操作符也给了你控制移动语义的权力。移动语义也允许创建只可移动(move-only)的类型,例如std::unique_ptr,std::future和std::thread。
完美转发使接收任意数量实参的函数模板成为可能,它可以将实参转发到其他的函数,使目标函数接收到的实参与被传递给转发函数的实参保持一致。
右值引用是连接这两个截然不同的概念的胶合剂。它是使移动语义和完美转发变得可能的基础语言机制。
Item 23: Understand std::move and std::forwardstd::move可能会被隐式转化成拷贝操作假设你有一个类,它用来表示一段注解。这个类的构造 ...
Effective Modern C++ Notes (4)
CHAPTER 4 Smart PointersWhy not original pointers?我们可以试着枚举一些为什么原始指针很难被爱的原因:
它的声明不能指示所指到底是单个对象还是数组。
它的声明没有告诉你用完后是否应该销毁它,即指针是否拥有所指之物。
如果你决定你应该销毁指针所指对象,没人告诉你该用delete还是其他析构机制(比如将指针传给专门的销毁函数)。
如果你发现该用delete。 原因1说了可能不知道该用单个对象形式(“delete”)还是数组形式(“delete[]”)。如果用错了结果是未定义的。
假设你确定了指针所指,知道销毁机制,也很难确定你在所有执行路径上都执行了恰为一次销毁操作(包括异常产生后的路径)。少一条路径就会产生资源泄漏,销毁多次还会导致未定义行为。
一般来说没有办法告诉你指针是否变成了悬空指针(dangling pointers),即内存中不再存在指针所指之物。在对象销毁后指针仍指向它们就会产生悬空指针。
原始指针是强大的工具,当然,另一方面几十年的经验证明,只要注意力稍有疏忽,这个强大的工具就会攻击它的主人。
啥是智能指针(smart p ...
Effective Modern C++ Notes (3)
CHAPTER 3 Moving to Modern C++Item 7: Distinguish between () and {} when creating objects统一初始化(uniform initialization)C++11使用统一初始化(uniform initialization)来整合这些混乱且不适于所有情景的初始化语法,所谓统一初始化是指在任何涉及初始化的地方都使用单一的初始化语法。 它基于花括号,出于这个原因我更喜欢称之为括号初始化。统一初始化是一个概念上的东西,而括号初始化是一个具体语法结构。
括号初始化让你可以表达以前表达不出的东西。使用花括号,创建并指定一个容器的初始元素变得很容易:
1std::vector<int> v{ 1, 3, 5 }; //v初始内容为1,3,5
括号初始化也能被用于为非静态数据成员指定默认初始值。C++11允许”=”初始化不加花括号也拥有这种能力:
12345678class Widget{ …private: int x{ ...
Effective Modern C++ Notes (1-2)
Chapter 1 类型推导Item 1: Understand template type deduction如果你不介意浏览少许伪代码,我们可以考虑像这样一个函数模板:
12template<typename T>void f(ParamType param);
它的调用看起来像这样
1f(expr); //使用表达式调用f
在编译期间,编译器使用expr进行两个类型推导:一个是针对T的,另一个是针对ParamType的。这两个类型通常是不同的,因为ParamType包含一些修饰,比如const和引用修饰符。
我们可能很自然的期望T和传递进函数的实参是相同的类型,也就是,T为expr的类型。在上面的例子中,事实就是那样:x是int,T被推导为int。但有时情况并非总是如此,T的类型推导不仅取决于expr的类型,也取决于ParamType的类型。这里有三种情况:
ParamType是一个指针或引用,但不是通用引用(关于通用引用请参见Item24。在这里你只需要知道它存在,而且不同于左值引用和右值引用)
ParamType ...
CS15-213 Introduction to Computer Systems
前言(Intro) 计算机系统或者说体系结构,素来属于计算机专业学生的基本功,于是为了加深对系统的理解,笔者开启了这门著名的Computer Systems: A Programmer’s Perspective (CS:APP)。在欧洲进行交换项目的同时,笔者用了大概一个半月的时间收掉了这门课。从刚开始对于bit\byte都不太熟悉,到最后手搓Malloc函数、设计自己的proxy服务器、实现简易的类shell的命令行解释器tsh,整个过程让我如痴如醉,对计算机系统的理解肉眼可见地日益加深。
本书目录分为:
123456789101112Chapter 1 A Tour of Computer SystemsChapter 2 Representing and Manipulating InformationChapter 3 Machine-Level Representation of ProgramsChapter 4 Processor ArchitectureChapter 5 Optimizing Program PerformanceChapter 6 The Me ...
Linux系统(Ubuntu/Arch)下Kitty安装指南
KittyOutlookThe fast, feature-rich, GPU based terminal emulator
This is a set of config files based on Kitty by Hydraallen.
Introduction kitty is designed for power keyboard users. To that end all its controls work with the keyboard (although it fully supports mouse interactions as well). Its configuration is a simple, human editable, single file for easy reproducibility (I like to store configuration in source control).
The code in kitty is designed to be simple, modular a ...
CS142 Web Applications 复盘笔记及结课感想
前言(Intro) 为了兼顾课业以及同期开始的Computer Organization,笔者收掉这门课的跨度大概是两个月的时间。最开始的目的只是熟悉基本的框架和操作,但其中的project一脉相承,算是比较不错的练习(唯一的缺点就是Slides过于简略也没有配套视频,以及课程相对冷门缺少一些讨论交流的空间)
打算开始学习这门课程之前,笔者也横向对比过MIT Web Development Crash Course ,其优势是除Slides外还有配套的视频讲解,不至于像142中需要自己查找大量的资料来辅助理解,当然最重要的一点是,142的框架相较于前者比较单一的前端开发和页面设计更加全面:
123456789101112131415161718192021222324252627282930313233343536373839$ CS142Content├── Foundation│ ├── HTML│ ├── CSS│ ├── URLs│ └── JavaScript│ ├── DOM│ └── Events Handling├── ...