《码农翻身》读书笔记

计算机的世界你不懂

我是一个线程

  1. 不知道什么时候会被挑中执行
  2. 在执行的过程中随时会被打断
  3. 一旦出现硬盘、数据库这样耗时的操作,也得让出CPU去等待
  4. 数据来了,也不一定马上执行,得等着CPU挑选

TCP/IP

TCP/IP之大明内阁

TCP/IP之蓟辽督师

TCP/IP 之 大明王朝邮差

image 发送的信息被拆分成小包裹,编上序号,打乱顺序后发送,由服务端发送,客户端接收,接收后返回确认接收信息。 如果一定时间内没有收到确认信息,则代表信息丢失(可能是发出的包裹丢失,也可能是返回的确认信息丢失),重新发送该包裹。全部接收完成后按照序号重新组装成完整信息。

我是一个进程

  1. 一个正在运行的程序叫做进程
  2. 多个程序操作了同一段地址,内存中的数据就会被覆盖。解决办法:CPU添加一个寄存器,专门用来保存起始地址,只要遇到地址有关的指令,就需要把地址加上寄存器的值,这样才能得到真正的地址
  3. 局部性原理 (1)时间局部性:如果程序中的某条指令一旦执行,则不久之后该条指令可能再次被执行;如果某数据被访问,则不久之后该数据可能再次被访问。 (2)空间局部性:是指一旦程序访问了某个存储单元,则不久之后,其附近的存储单元也将被访问。

编程世界的那把锁

自旋锁:任何线程,只要你想操作一个共享变量,就得先去申请一把锁,拿到这个锁才能读取变量的值,修改值、将值写回内存,最后释放锁。并且检查是否锁定的操作是一个不可分割的原子操作。 信号量:所谓信号量,其实就是一个整数,基于这个整数有两个操作:wait 和 signal。利用它们做互斥

int lock = 1;

wati(lock); //相当于获得一个互斥锁

//在这里安全的做事情

singal(lock) //相当于释放锁

Java 帝国

由于本人并没怎么接触过 Java 语言,所以只记录了几个感兴趣的章节

一个著名的日志系统是怎样设计出来的

系统的正交性:Logger、Appender、Formatter,看成坐标系中的 X 轴、Y轴、Z轴,这三者可以独立变化而不受影响。

加锁还是不加锁,这是一个问题

浪潮之巅的Web

Web 的起源

一个故事讲完HTTPS

image

bill的公钥及身份信息通过HTTPS传输给CA服务器,并生成数字证书。

image

验证完证书后,除了对称秘钥是用非对称加密传输,其他请求都使用对称加密通信。

如何确保CA公钥的安全 CA本身也有证书来证明自己的身份,并且CA的信用是像树一样分级的,高层的CA给底层的CA做信用背书,而操作系统/浏览器中会内置一些顶层的CA的证书,相当于你自动信任了他们。 这些顶层的CA证书一定得安全地放入操作系统/浏览器当中,否则世界大乱。

从密码到token,一个有关授权的故事

后端风云

  1. 故障转移
  2. 高可用的 Nginx
  3. 高可用的 Tomcat
  4. 数据库的读写分离

Node.js 我只需要一个店小二

命令式编程 VS 声明式编程

  1. 命令式编程

      int count = 0;
      Iterator<Student> iter = students.iterator();
      while(iter.hasNext()){
        Student s = iter.next();
        if(s.getAge() < 18){
           count++;
        }
      }
    
  2. 声明式编程

      int count = students.stream().filter(s -> s.getAge() < 18).count();
    

老司机的精进

  1. 凡事必先骑虎上背
  2. 好奇心以及养成计算机的思维方式
  3. 抽象是计算机科学中极为重要的武器之一
  4. 要透彻地理解一门技术的本质
  5. 技术的领导力
  6. 写漂亮的代码
  7. 书籍里的知识,体系更加完整,有深度——看书好过碎片阅读
  8. 不要游走在各大语言的边缘
  9. 坚持写作(输出)