CSAPP-【第十二章】并行编程-补充阅读与总结【转载】
补充阅读材料:
https://fengmuzi2003.gitbook.io/csapp3e/di-12-zhang-bing-fa-bian-cheng
学习目标
理解并行的几个层次:进程、事件、线程
了解 Posix 标准
了解同步问题产生的背景,以及信号量的工作机制
了解『生产者-消费者问题』和『读者-写者问题』
理解线程安全和一致性问题
并行方法
首先一定要清楚地意识到:『并行编程不简单』!最主要的原因恐怕就是我们自己的大脑,人脑实际上是一个非常精妙的系统,所采取的并行策略是一明一暗两条线,但是对于明线来说,是线性的,于是就和计算机中并行的概念冲突了。另外时间这个概念也是线性的,这就导致了想要处理好并行程序可能出现的各种问题几乎是不可能的(或者常常要出错)。
常见的错误有仨:竞争条件[2]、死锁[3]和活锁[4],尤其是在现在的多核处理器架构中,更容易出现这类并行问题。
我们前面实现的服务器,一次只能处理一个请求,只有当前的请求处理完了,才能继续处理下一个。
这里具体讲解一下:Client 1 向 Server 发送连接请求(connect),Server 接受(acc ...
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
...
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 价格的百分之一)。
...
2020年度总结
上半年:
论文在小修后发表在了PR上,实验室规矩硕士生论文的一作必须给导师…,不过因为我不打算读博,感觉影响不大,也没有做太多争辩
工作:
人体建模姿态优化:解决人体姿态漂浮感严重、帧间抖动的问题
模型部署:讲人体重建的模型部署到T4服务器上
学习:
清华大学-邓俊辉-计算几何
MIT-算法导论
书籍-CSAPP
书籍-算法导论(未读完)
书籍-计算几何:算法与应用(未开始)
CSAPP-【三四五】机器指令与程序优化-补充阅读与总结【转载】
补充阅读材料:
https://fengmuzi2003.gitbook.io/csapp3e/di-3-zhang-ji-qi-ji-bian-cheng
https://fengmuzi2003.gitbook.io/csapp3e/di-4-zhang-chu-li-qi-ti-xi-jie-gou
https://fengmuzi2003.gitbook.io/csapp3e/di-5-zhang-cheng-xu-de-you-hua
学习目标
了解基本的 CPU 架构,以及 CPU 如何进行指令计算
掌握基本的汇编语法,常见的寻址方式和运算方式
理解如何通过条件代码进行流程控制
理解过程调用和递归的底层实现机制
理解数据在内存中的存储方式
了解程序在内存中的组织形式以及缓冲区溢出漏洞攻击
利用代码执行的机制来优化已有代码
这一讲的内容比较多,考虑到现在接触汇编的机会着实不多,部分涉及具体细节的内容有删减,详情请参考书本。
基础知识
从 8086 到 Core i7
1978 年,Intel 发布了第一款 x86 指令集的微处理器——Intel 8086[1],以此拉开了 ...
CSAPP-【第二章】信息的表示和处理-补充阅读与总结【转载】
补充阅读材料:
https://fengmuzi2003.gitbook.io/csapp3e/di-er-zhang-zhong-dian-jie-du
学习目标
理解计算机系统的复杂与和理论抽象描述的不同
理解内存中数据的保存形式,以及这种方式的好处以及限制
注意避开一些常见的关于计算机的迷思
区别整型和浮点数的表达机制,并理解为什么会有这种差异
简单理解溢出出现的条件
编程迷思
无论是计算机科班出身的学生,还是半路出家的爱好者,因为现在编程难度的大幅度降低,很多时候并不需要理解底层的实现就已经可以写出过得去的代码。但是网上的一些错误理解以及教材中由于内容编排对概念所做的抽象,导致了许多『想当然』的问题。要深入理解计算机系统,得先把这些『迷思』弄清楚,这样接下来的旅程会好走很多。
计算机不只是执行程序的机器
计算机脱胎于图灵机的构想,简单来说,就是能够执行有限逻辑数学过程的计算模型。图灵机的概念很有意思,但是这里由于篇幅问题不再深入,感兴趣的话可以从维基百科[1]入门,然后就可以看看《图灵的秘密》[2]这本书,从生平到提出图灵机的论文研读都非常不错。
图灵机中最重要的两个『物理 ...