1.计算机的世界
- 线程:
- 线程运行步骤:就绪、等待、运行
- 多线程并发问题
- 加锁、死锁问题,按照资源顺序申请锁
- TCP/IP
- 不可靠通道进行可靠性传输
- TCP的三次握手和四次挥手
- 滑动窗口协议
- CPU
- CPU比内存快100倍,比硬盘快百万倍。
- 寄存器、程序计算器
- 局部性原理
- 进程
- 批处理系统
- 进程记录了寄存器的志、指令值、和消耗时间等
- 地址重定向
- 硬盘
- 磁道、扇区
- 文件、文件系统
- I/O设备
- 总线和端口
- 轮询、中断
- 数据库
- 查询
- 并发访问
- 原子性问题
- 安全问题
- socket
- 对TCP连接的封装
- 翻译器
- 机器语言、汇编语言、高级语言
- 翻译流程:源程序->词法分析->语法分析->语义分析->中间代码生成->代码优化->代码生成->目标程序
- 编程世界的锁
- 共享变量、锁争抢、自旋锁、锁的原子性、不可重入。
- 信号量:队列会对wait、signal、full、enpty封装
- 递归
- 函数栈帧
- 尾递归、复用栈帧
2.Java帝国
3.浪潮之巅的Web
- web起源
- 超文本标记语言
- 超文本传输协议
- 通信
- 共享内存通信
- socket通信:需要IP和端口,但是不安全
- web通信:HTTP(80)、HTTPS(443)
- HTTP报文段打包在TCP报文段中,放到IP层数据报中,形成链路层的帧,通过网关发出。
- HTTPS
- 对称加密
- RSA非对称加密
- 非对称加密+对称加密
- 中间人劫持非对称加密的公钥
- 数字证书
- CAS
- 共享session和共享cookie是比较局限的做法
- 认证中心:建立session、创建Ticket、重定向
- 2次重定向,一次验证Ticket
- Token和授权
- 返回授权码
- 根据授权码获取Token
- 数据库
- 结构化查询语句:SQL
- 数据库链接通道:需要缓冲区
- Redis
- 支持:key-value、List、Set、Sorted Set、Hash
- 余数算法:根据key的hash取余,对增加节点非常不友好
- 一致性Hash算法:增删服务器只会影响相邻节点的缓存数据
- Hash槽(slot):CRC16算法,对槽值取余,增加节点可以做数据迁移,访问重定向。
- Redis Cluster:故障转移、数据备份
- 高可用Nginx
- 多台服务器使用Keepalived形成master-slave结构
- 对外只提供一个IP
- 高可用Tomcat
- Tomcat集群
- 负载均衡
- 失效转移:服务器集群的请求转移,状态信息需要保留,可通过redis。
- 高可用Mysql
- 数据库读写分离
- 需要在一个分布式环境中,保持数据的强一致性。
- 一master,多个slave结构。
- 函数
- 本地过程调用:所有调用都发生在本机内的一个进程中。
- 远程过程调用(RPC):客户代理(Stub)接收参数,然后通过socket交给服务端代理(Skeleton)处理,把复杂的网络细节隐藏了起来。
- 框架
- 框架就是把功能单元抽取出来,形成可复用的东西。
- 最佳实践:系统架构设计、缓存、性能、高可用性、分布式、安全、备份。
- HTTP Server1.0
- 接收HTTP Request,处理完.html后,把文件通过文本方式发送回去HTTP Response。
- 需要建立HTTP层下面的TCP通道,这个链接通道是通过Socket建立的。比如:socket、bind、listen、accept。默认为80通道,一般也不会被防火墙拦截。
- 此为单进程,容易阻塞。
- HTTP Server2.0
- 多进程并发
- 进程切换消耗大量资源
- HTTP Server3.0
- select模型:
- 一个socket链接是一个文件描述符fd,是一个整数,fd背后是一个简单的数据结构。
- HTTP Sever和操作系统之间传递的是一个fd_set的数据结构
- 操作系统检测是否有数据,然后标记有数据的socket,最后唤醒HTTP Server执行。
- select模型:
- HTTP Server4.0 epoll模型
- 和select模型类似,都是操作系统检测是否有读写数据socket,然后通知HTTP Sever遍历1024个链接执行。
- 不同的地方是操作系统只会告诉HTTP Server可以读写的socket,不用HTTP Sever遍历所有socket链接。
4.代码管理的那些事
- 人肉版本管理
- 锁定文件:避免互相覆盖
- 允许冲突:退一步海阔天空
- 分支:多版本并行
- 分布式管理
5.我的编程语言简史
- Javascript
- 浏览器端运行验证而出世
- XMLHttpRequest进行局部刷新
- JSON字符串
- 前端三剑客:HTML、CSS、Ajax和JSON
- Node.js服务其语言
- Java和C的区别
- Java有虚拟机,抽象层屏蔽底层平台的API
- C语言一旦编辑就可以独立执行,拥有独立的进程和独立的地址空间
- Java编译之后是.class,C语言预处理、编译、汇编之后是目标文件。
- C语言是编译时的静态链接,Java时运行时的动态链接。
- 编程语言
- C语言是贴近硬件的系统级编程
- VB桌面应用开发
- Java适合后端编程,后端编程:负载均衡、灾难恢复、缓存、消息、分布式、数据备份、搜索等
- 命令式编程和声明式编程
- 命令式编程就是对硬件操作的抽象
- 程序员就是把复杂、容易产生歧义的人类自然语言编译成精确的计算机语言指令。
- 声明式编程:代表是SQL
6.老司机的精进
- 凡事必先骑上虎背
- 世上没有等完全准备好后才开始的事情,等你觉得完全准备好后,黄花菜都凉了。
- 对于性格内向的程序员,很多时候你认为基本准备好了其实就够了。
- 码农需要知道的“潜规则“
- 上帝的规矩,局部性原理:时间局部性、空间局部性
- 坐飞机的怎么和坐驴车的打交道
- 抛弃细节:抽象
- 我只想和邻居打交道:分层,应用层、传输层、网络层、链路层、物理层。
- 我怕等不及:异步调用
- 大事化小,小事化了:分而治之
- 一名架构师的总结
- 好奇心
- 养成计算机的思维方式
- 扎实基础,融会贯通
- 要透彻的理解一门技术的本质
- 能写漂亮的代码
- 抽象的能力
- 技术领导力
- 对自己狠一点,开始写作吧
7.《码农翻身》读后感
”码农“是一个贬义词,这个词对于很多软件工程师来说是一个准确描述。技术更新换代频繁、社会发展迅速,使得软件这个行业的工作者,很多时候都疲于奔命,沉寂在不断更换技术的怪圈。而《码农翻身》一书能帮助更多的”码农“从技术本质上打破这个限制。
在《码农翻身》一书中不仅能学到了进程、线程、CPU、硬盘、I/O设备等计算机基础知识,也学到了TCP/IP、socket、HTTP等通信协议方面的知识。同时在应用编程方面和工作规划上也有一定的参考价值,是一本很值得看的书籍。
从不同角度来看《码农翻身》它描述了一个软件工程师的职业生涯历程,不管是对初学者,还是有一定经验的积累者,都能提供指路的明灯。
原文地址:https://www.cnblogs.com/wuchangliang/p/11080151.html
时间: 2024-11-05 17:26:01