关注作者公众号,作者送的书。
分别讲了计算机网络、操作系统、计算机原理、数据库、编程语言的内容。建议先看原著再来看我总结的。
计算机网络
三次握手过程: tcp连接是虚拟的,连接状态信息在两端维持,而不在通路上。①发送端发送序号到接收端(包括地址和端口号),接收端确认发送端的发送能力和接收端自己的接收能力。②接收端发送序号到发送端,接收端确认自己和对方的收发能力。③发送端再发送给接收端,接收端最后确认发送端的接收能力和接收端自己的发送能力。完成连接过程。
建立连接后,开始发送数据。将数据分成小块,分块发送。每次发送一定数量的数据块,在规定时间内收到接收端的确认则继续发送新的数据块,若超时,说明数据块丢失(或确认信息丢失),就重发。数据块在网络中经过路由器,由路由器选择路径转发。发送完毕后,接收端在将数据块按序号组装成完整数据。TCP协议是在不可靠链路上建立可靠发送的办法。
网络设备获取IP地址的过程: 网卡等网络设备出厂时有一个全球唯一的MAC地址,网络设备工作在链路层,只认识MAC地址。当其联网时,发出DHCP报文,经打包后发给交换机,地址为FF:FF:FF:FF:FF:FF。交换机将其转发给所有与其连接的设备,其中包括DHCP服务器。DHCP服务器提供空余IP地址给发出报文的网络设备,包括给该设备的IP地址,网关路由器地址,DNS服务器地址。
DNS和ARP: ARP叫地址解析协议,通过IP地址查询同一子网内设备的MAC地址。网卡通过ARP查询到网关的MAC地址,然后将DNS查询发送给网关,由网关传送给DNS服务器。由DNS服务器将域名的IP地址传回。
HTTPS原理: 为了防止网络通讯被中间人截取,需要对信息加密。采用对称加密,需要在通讯双方交换密钥,密钥也有被截取的可能。于是采用非对称加密,公开公钥给对方。但公钥也有可能被中间人替换。于是采用从特定机构获取数字证书(主要是对方公钥和信息经过hash算法处理后得到的摘要,用证书机构的私钥加密),来验证对方的公钥是否被篡改。但这依赖于对证书机构的信任。
以太网: 局域网中网络传输的数据相互冲突的问题,若链路中通过载波侦听发现有数据冲突,就停止传输,随机时间(指数退避算法)后再开始,这叫碰撞检测。这套方法形成以太网。
网络传输的过程: 数据被TCP层加工成数据包,由IP层包装成IP数据包,有IP地址和端口。然后经过链路层形成链路层包,地址为MAC地址。在网路传输链路层包,经过路由器,交换机等,拆包,选择继续传递还是留下传给自己网络内的设备,传递过程中会更改源地址及端口。直至到达目的设备,再逐层拆包获得应用层数据。
HTTP传输: HTTP/1.1是逐项传输,速度较慢,对网络利用率不高。HTTP/2使用流(Stream)的形式,每个流包含多个数据,发送请求时也会拆分成帧(Frame),速度更快。
操作系统
程序加载运行过程: 操作系统的加载器建立进程,为程序分配虚拟页面。当程序运行时,缺页处理程序将程序代码和数据从磁盘加载到指定内存地址,开始运行。时间片用完后即切换进程。程序运行结束,清理进程所占内存。
**文件抽象: ** 在操作系统中输入输出设备及网络操作均被抽象为对文件的读写操作。
**hello world的执行过程: ** 编译器将程序与库程序链接,形成可执行程序。程序加载到内存,由cpu执行,其中标准库用到了系统调用,通过系统调用将指定位置和长度的字符串输出到输出设备,并返回结果。
进程、线程和协程: 操作系统一开始运行程序的方式是串联的批处理方式,同时只能运行一个应用程序,执行完了才允许下一个运行。后来出现了分时操作系统,以进程为单位分配资源,不同的进程由操作系统分配时间片等资源,快速切换,形成了伪并行,多任务。后来出现多核cpu,实现了真正的并行。在进程内部后来又出现了线程,线程成为操作系统调度的单位。不同线程共享进程的资源,于是可能产生冲突,需要采用生产者消费者算法等方法解决。后来又出现了协程,在程序内部合作调度,不会产生资源冲突。
计算机原理
CPU工作过程: 加电->从内存最顶端加载第一条指令->跳转至BIOS,自检,建立中断向量表->执行中断,加载操作系统->从磁盘、内存、缓存(局部性原理)上加载程序->执行指令(顺序或分支、流水线技术)->关机断电。
**计算原理: ** 所有可计算的问题都可以拆分成加法和乘法运算,通过事先编好的程序可以自动执行这些计算步骤。问题改变不用更改计算机的结构,修改程序即可。
整数和小数的进制转换: 10进制整数转2进制整数,用除2取余。10进制小数转2进制小数,用乘2。小数转换没有精确解的情况,先移动小数点转换为整数,再转换,最后转为小数。
cpu执行指令过程: 从某一内存地址开始读入其指令,将某地址内存上的值读入寄存器,根据指令使用运算器计算结果,放入某寄存器。再根据指令将数据从寄存器放入指定地址的内存中。还有跳转指令,跳转到指定内存地址继续执行指令。
函数调用: 使用栈的数据结构,保存调用函数的起始位置,运行结束后,地址从栈中弹出,返回至调用位置,继续执行后续程序。用ESP和EBP分别存储栈顶和当前位置。
数据库
关系数据库: 相互关联的数据形成数据表(关系),不同数据表之间通过共同的属性建立关系,它们之间的运算产生的还是关系(表)。合理的划分关系能避免冗余。
避免数据冲突: 一级事务隔离级别:写数据时加X锁,避免丢失数据;二级事务隔离级别:写数据加X锁,读数据加S锁,读完立即释放。避免丢失数据和脏数据;三级事务隔离级别,读写都加锁,直到事务结束。避免丢失数据、脏数据和不可重复读三个问题。数据库常用。串行化,两个事务不能同时执行,避免幻读。
故障时保证数据不丢失: 采用日志的方法,在进行磁盘操作改变数据前记录日志,在磁盘操作完成后再记录日志,如果因故障没有最后完成的日志,可根据最后的日志进行数据回滚操作。
编程语言
**汇编语言: ** 一切高级语言的鼻祖,只有数据传输类、算术和逻辑运算类、控制类语句。进程的虚拟内存布局:从顶向下为:栈帧、堆、数据段、代码段。栈帧包含上一个栈帧的地址、参数、返回地址。
字节码 源代码先编译成字节码,然后在各个平台用相应的虚拟机来运行,这样就具备了平台独立性,又比纯解释语言高效。JAVA开始的,其它语言纷纷效仿。
不同语言的比较: 差异很大,选择合适的。
面向对象: 数据和操作结合到一起,数据不对客户暴露(封装)。避免重复,提炼共同部分为父类,然后继承(继承、多态)。优先使用组合,面向接口编程。把系统需求抽象成高层的概念,然后在概念层次进行编程。
编程语言共通点: 面向对象、函数式编程、元编程、并发模型、虚拟机和垃圾回收、静态类型动态类型和类型推导、抽象语法树、指针。
最后说点感想。因为读作者的上一本书《码农翻身》,关注了作者。那本书我也是参加另一个公众号的活动送的,真是跟作者有缘。那本书我收获也很大,不过有很多讲java语言的相关东西,而我对java不熟。这本书就完全摆脱了语言的限制,用漫画的形式介绍了几门计算机核心课程的核心内容。尽管这几门课程我都看过,但还是有很多收获。尤其网络和数据库部分,比看教科书上这层,那层,这个范式那个范式要清楚多了。当然了这只能算科普入门,真要学还是要去啃那些硬书。更重要的是得实操。
感谢作者赠书!
我发文章的三个地方,欢迎大家在朋友圈等地方分享,欢迎点“在看”。
我的个人博客地址:https://zwdnet.github.io
我的知乎文章地址: https://www.zhihu.com/people/zhao-you-min/posts
我的微信个人订阅号:赵瑜敏的口腔医学学习园地