《码农翻身》读书笔记
计算机的世界你不懂
我是一个线程
- 不知道什么时候会被挑中执行
- 在执行的过程中随时会被打断
- 一旦出现硬盘、数据库这样耗时的操作,也得让出CPU去等待
- 数据来了,也不一定马上执行,得等着CPU挑选
TCP/IP
发送的信息被拆分成小包裹,编上序号,打乱顺序后发送,由服务端发送,客户端接收,接收后返回确认接收信息。 如果一定时间内没有收到确认信息,则代表信息丢失(可能是发出的包裹丢失,也可能是返回的确认信息丢失),重新发送该包裹。全部接收完成后按照序号重新组装成完整信息。
我是一个进程
- 一个正在运行的程序叫做进程
- 多个程序操作了同一段地址,内存中的数据就会被覆盖。解决办法:CPU添加一个寄存器,专门用来保存起始地址,只要遇到地址有关的指令,就需要把地址加上寄存器的值,这样才能得到真正的地址
- 局部性原理 (1)时间局部性:如果程序中的某条指令一旦执行,则不久之后该条指令可能再次被执行;如果某数据被访问,则不久之后该数据可能再次被访问。 (2)空间局部性:是指一旦程序访问了某个存储单元,则不久之后,其附近的存储单元也将被访问。
编程世界的那把锁
自旋锁:任何线程,只要你想操作一个共享变量,就得先去申请一把锁,拿到这个锁才能读取变量的值,修改值、将值写回内存,最后释放锁。并且检查是否锁定的操作是一个不可分割的原子操作。 信号量:所谓信号量,其实就是一个整数,基于这个整数有两个操作:wait 和 signal。利用它们做互斥
int lock = 1;
wati(lock); //相当于获得一个互斥锁
//在这里安全的做事情
singal(lock) //相当于释放锁
Java 帝国
由于本人并没怎么接触过 Java 语言,所以只记录了几个感兴趣的章节
一个著名的日志系统是怎样设计出来的
系统的正交性:Logger、Appender、Formatter,看成坐标系中的 X 轴、Y轴、Z轴,这三者可以独立变化而不受影响。
加锁还是不加锁,这是一个问题
浪潮之巅的Web
Web 的起源
一个故事讲完HTTPS
bill的公钥及身份信息通过HTTPS传输给CA服务器,并生成数字证书。
验证完证书后,除了对称秘钥是用非对称加密传输,其他请求都使用对称加密通信。
如何确保CA公钥的安全 CA本身也有证书来证明自己的身份,并且CA的信用是像树一样分级的,高层的CA给底层的CA做信用背书,而操作系统/浏览器中会内置一些顶层的CA的证书,相当于你自动信任了他们。 这些顶层的CA证书一定得安全地放入操作系统/浏览器当中,否则世界大乱。
从密码到token,一个有关授权的故事
后端风云
- 故障转移
- 高可用的 Nginx
- 高可用的 Tomcat
- 数据库的读写分离
Node.js 我只需要一个店小二
命令式编程 VS 声明式编程
-
命令式编程
int count = 0; Iterator<Student> iter = students.iterator(); while(iter.hasNext()){ Student s = iter.next(); if(s.getAge() < 18){ count++; } }
-
声明式编程
int count = students.stream().filter(s -> s.getAge() < 18).count();
老司机的精进
- 凡事必先骑虎上背
- 好奇心以及养成计算机的思维方式
- 抽象是计算机科学中极为重要的武器之一
- 要透彻地理解一门技术的本质
- 技术的领导力
- 写漂亮的代码
- 书籍里的知识,体系更加完整,有深度——看书好过碎片阅读
- 不要游走在各大语言的边缘
- 坚持写作(输出)