南京大学-操作系统-写在前面
在做项目的时候感觉有一些计算机系统底层的知识欠缺,所以打算补一补操作系统的知识,在知乎上检索后发现南京大学蒋炎岩老师开始的操作系统课程讲的非常好,于是打算跟着学习。
b站链接:https://www.bilibili.com/video/BV1HN41197Ko/
老师是直接现场coding,直接调虚拟机进行debug,结合知识点进行讲解和展示,第一次体验到这种上课模式。感觉挺有趣的,就像在听脱口秀一样。
MIT-算法导论-写在后面
daf9e1003c8b639b6138b233a833233965d135783ea2701cf91ced3bed71d1bb7964e998be7bc3a692d9d6bebf4176329edf02e57f3edeccd9b6f9ba5ddb7821c399c902a70ed6166c96cabdd680f045d8e81dec759ecdb142e8bf0ea4620dfbaee4362c2138add1b428484efd15b5c684d323508a98236f2f5adc301e5f176bcd38fddf7db3395cd268d3f8d0d479709cfa08398ba732b7664614730d255fa77ef2faa013d6205e27b0a8b2d7d72e5560431fdc12324e4401910818d9cacdd7cfaf0f19671dd9f54b27fe70318266f90173c94bead1de654981ba6f4aafdd895706be34483ca652978bb14b96ff28afc0a236482f50bb134 ...
CSAPP-【第十二章】并行编程-补充阅读与总结【转载】
补充阅读材料:https://fengmuzi2003.gitbook.io/csapp3e/di-12-zhang-bing-fa-bian-cheng
学习目标
理解并行的几个层次:进程、事件、线程
了解 Posix 标准
了解同步问题产生的背景,以及信号量的工作机制
了解『生产者-消费者问题』和『读者-写者问题』
理解线程安全和一致性问题
并行方法首先一定要清楚地意识到:『并行编程不简单』!最主要的原因恐怕就是我们自己的大脑,人脑实际上是一个非常精妙的系统,所采取的并行策略是一明一暗两条线,但是对于明线来说,是线性的,于是就和计算机中并行的概念冲突了。另外时间这个概念也是线性的,这就导致了想要处理好并行程序可能出现的各种问题几乎是不可能的(或者常常要出错)。
常见的错误有仨:竞争条件[2]、死锁[3]和活锁[4],尤其是在现在的多核处理器架构中,更容易出现这类并行问题。
我们前面实现的服务器,一次只能处理一个请求,只有当前的请求处理完了,才能继续处理下一个。
这里具体讲解一下:Client 1 向 Server 发送连接请求(connect),Server 接受(accept ...
CSAPP-【第十一章】网络-补充阅读与总结【转载】
补充阅读材料:https://fengmuzi2003.gitbook.io/csapp3e/di-11-zhang-wang-luo-bian-cheng
学习目标
了解网络的基本架构
了解常见的网络协议
掌握基本的网络相关编程技巧
学会编写 web 服务器
网络架构计算机网络的知识可谓是非常『保值』的,因为这么多基础设备还在运行着,基本机制在短时间内很难改变,关于网络的相关的讲解还有参考链接[1][2],我觉得也非常不错,大家感兴趣可以看看。
客户端-服务器模型是网络应用最广泛使用的模型,客户端进程发送请求给服务器进程,服务器进程获取所需资源并响应客户端进程的请求,客户端进程收到响应后展示给用户。网络相关的处理,都是通过网络适配器来完成的,具体在硬件上为(右下角):
根据网络的应用范围和架构层级,可以分成三个部分:
SAN - System Area Network
Switched Ethernet, Quadrics QSW, …
LAN - Local Area Network
Ethernet, ..
WAN - Wide Area Network
High ...
CSAPP-【第十章】系统级IO-补充阅读与总结【转载】
补充阅读材料:https://fengmuzi2003.gitbook.io/csapp3e/di-10-zhang-xi-tong-ji-io
学习目标
理解 Unix I/O 的设计与应用
了解不同的文件类型
理解文件描述符(file descriptor)及在读写中的应用
了解元数据的相关概念及访问方法
理解输入输出重定向的实现机制
简单了解 C 标准库中的标准 I/O 函数
知道如何根据不同场景选择对应的 I/O 方式
Unix I/O在 Linux 中,文件实际上可以看做是字节的序列。更有意思的是,所有的 I/O 设备也是用文件来表示的,比如:
./dev/sda2 (/usr 磁盘分区)
/dev/tty2 (终端)
甚至连内核也是用文件来表示的:
/boot/vmlinuz-3.13.0-55-generic (内核镜像)
/proc (内核数据结构)
因为 I/O 设备也是文件,所以内核可以利用称为 Unix I/O 的简单接口来处理输入输出,比如使用 open() 和 close() 来打开和关闭文件,使用 read() 和 write() 来读写文件,或者 ...
CSAPP-【第九章】虚拟内存-补充阅读与总结【转载】
补充阅读材料:https://fengmuzi2003.gitbook.io/csapp3e/dixzhang-xu-ni-nei-cun
学习目标
了解物理地址和虚拟地址的区别
理解虚拟内存在缓存、内存管理与保护中所扮演的角色
掌握虚拟内存到物理内存的翻译机制
理解现代计算机系统中虚拟内存的应用
理解动态内存分配的基本概念
区别内部碎片与外部碎片
掌握管理动态内存分配的三种方法
了解垃圾回收的基本原理
了解内存使用中常见的错误
这一讲的内容,跟之前介绍的缓存系统有异曲同工之妙,唯一的差别是,因为涉及的概念和横跨的系统层级增多,难度更大了。如果遇到不明白的地方,一定要结合原书进行细致阅读理解。
从物理内存到虚拟内存物理地址一般应用在简单的嵌入式微控制器中(汽车、电梯、电子相框等),因为应用的范围有严格的限制,不需要在内存管理中引入过多的复杂度。
但是对于计算机(以及其他智能设备)来说,虚拟地址则是必不可少的,通过 MMU(Memory management unit)把虚拟地址(Virtual Address, VA)转换为物理地址(Physical Address, PA),再由此 ...
CSAPP-【第八章】异常流控制-补充阅读与总结【转载】
补充阅读材料:https://fengmuzi2003.gitbook.io/csapp3e/di-08-zhang-yi-chang-kong-zhi-liu
学习目标
了解异步异常与同步异常,以及异常控制流与平时的逻辑控制流的差异
理解进程的工作机制,如何通过异常来进行进程切换
理解 Linux 的进程控制机制,掌握 fork 的基本用法
了解信号的基本原理以及如何处理信号
掌握如何避免进程竞争的方法
了解非本地跳转的概念和意义
前面提到过,进程可能是计算机系统中最伟大的抽象。进程这个概念背后,其实隐藏着一整套系统级机制,从进程切换、用户态与内核态的转换到系统实时响应各种事件,都离不开一个相当熟悉又陌生的概念——异常。在这个基础上,我们会一起来看看,操作系统到底是如何工作的,为什么可以同时执行不同的程序,具体又是通过什么机制来管理这一切的呢?这一讲我们就来看看这之中的奥秘。
异常控制流从开机到关机,处理器做的工作其实很简单,就是不断读取并执行指令,每次执行一条,整个指令执行的序列,称为处理器的控制流。到目前为止,我们已经学过了两种改变控制流的方式:
跳转和分支
调用和返回
这 ...
CSAPP-【第七章】链接-补充阅读与总结【转载】
补充阅读材料:https://fengmuzi2003.gitbook.io/csapp3e/di-07-zhang-lian-jie
学习目标
理解从源代码转换到计算机可执行的二进制代码之间需要经过的处理
理解编译过程
理解链接过程,尤其是程序的组织部分
理解库的使用方式
理解 Library Interpostion 的机制及几种不同的类型
使用集成开发环境(IDE)很方便,但是在『执行』的按钮背后,其实发生了太多太多的事情。当然,作为初学者,一开始避开过多的复杂专注于学习编写代码无可厚非,但是该学的永远逃不掉,不了解自己的代码是如何一步步成为计算机课执行的程序的,就很难在遇到各种疑难杂症的时候快速定位问题所在。另外,无论是编译器还是链接器,都可以通过不同的参数进行各种定制,如果不搞清楚,恐怕只能永远依赖 IDE 了。IDE 很好,但任何东西都不能过分依赖,真正合理的应该是庖丁解牛后,挑选最适合自己的。
编译C 语言代码最终成为机器可执行的程序,会像流水线上的产品一样接受各项处理:
预处理器:将 C 语言代码(da.c)转化成 da.i 文件(gcc –E),对应于预处理命令 ...
CSAPP-【第六章】存储器层次结构-补充阅读与总结【转载】
补充阅读材料:https://fengmuzi2003.gitbook.io/csapp3e/di-06-zhang-cun-chu-qi-ceng-ci-jie-gou
学习目标
了解存储相关的概念
理解传统机械硬盘的工作机制以及如何通过总线进行数据传输
掌握局部性原理
了解内存的不同层级以及具体的应用方法
掌握缓存的机制,如何存储、载入和替换
缓存是一个非常精妙的系统,利用有限的资源给系统带来了显著的性能提升。这一讲前半部分主要是存储系统相关的概念介绍,之后我们会深入研究缓存系统并用实际的例子来学习如何最大程度利用好缓存。
概念学习随机存取存储器了解存储设备所用的技术以及发展趋势,对我们理解内存层级背后的原因很有帮助。
随机存取存储器(RAM, Random-Access Memory) 有两种类型:SRAM(Static RAM) 和 DRAM(Dynamic RAM),SRAM 非常快,也不需要定期刷新,通常用在处理器做缓存,但是比较贵;DRAM 稍慢一点(大概是 SRAM 速度的十分之一),需要刷新,通常用作主内存,相比来说很便宜(是 SRAM 价格的百分之一)。
无论是 ...
Effective C++系列
TODO
