学习《码农翻身》之精进
局部性原理
在一段时间内,整个程序的执行仅限于程序的某一部分,相应的,程序访问的存储空间也局限于某个内存区域。
- 时间局部性:如果程序中的某条指令一旦执行,则不久后该指令可能被再次执行;如果某数据被访问,则不久后该数据可能再次被访问。
- 空间局部性:一旦程序访问了某个存储单元,不久之后,其附近的存储单元也将被访问。
缓存(cache)
- 根据局部性原理,操作系统会把经常用到的数据从硬盘取到内存中,CPU会把经常用到的数据从内存取到自己的缓存中。
- 采用这种方法,等待的问题能得到极大的缓解。
- Web开发中,由于数据库太慢,大部分Web系统会把最常用的业务数据放到内存中缓存起来,以此加快访问速度。
抽象
计算机系统层抽象
- 指令集是对CPU的抽象
- 文件是对输入/输出的抽象
- 虚拟存储器是对程序存储的抽象
- 进程是对一个正在运行的的程序的抽象
- 虚拟机是对整个计算机(操作系统、处理器和程序)的抽象
应用层抽象
- Model-View-Control
日志工具
- Logger、Formatter、Appender
分层
网络协议分层
- 应用层
- 两个应用是如何交互的,如HTTP、SMTP、FTP
- 传输层
- 为应用程序建立连接,可靠地传递,如TCP
- 网络层
- 把一个分组从源主机移动到目标主机,跨越各个子网
- 链路层
- 将分组从一个节点移到下一个节点
- 物理层
- 传输介质:双绞线、同轴电缆、光纤
Web开发分层
- 表示层
- 业务逻辑层
- 数据访问层
- 数据库
分层的好处就是隔离变化,在接口不变的情况下,某一层的变化只局限于本层次内。
异步调用
- 我不及了,先去做别的事情,你做完了告诉我一声
- Node.js和Web服务器Nginx也是这样,一个或若干个线程处理所有的请求,遇到耗时操作,绝不等待,马上去做别的事情,等到耗时操作完成后,再来通知这些干活的线程。
- AJAX,当浏览器中的JavaScript发出一个HTTP请求的时候,也不会等待从服务器端返回数据,只是设置一个回调函数,服务器响应数据返回的时候调用一下就行了。
分而治之
- 将一个规模较大的问题分解为多个规模较小的子问题,这些子问题相互独立且与原问题性质相同,求出子问题的解,最后组合起来就可能得到原问题的解。
- 由于子问题和原问题的性质相同,所以很多时候可以用递归。
- 归并排序就是一个经典的例子。
- 在软件设计领域,可以认为是把一个大问题逐步分解的过程。
写作:
- 为什么要有这门技术,这门技术解决了什么问题,然后才是这门技术是怎么使用的。