《代码的未来(松本行弘)》读书笔记:

GC

GC三种基本方式

  1. 标记清除方式(Mark and Sweep) 从根开始将可能被引用的对象用递归的方式进行标记,然后将没有标记到的对象作为垃圾进行回收。缺点:分配了大量对象,并且其中只有一小部分存货的情况下,消耗过多不必要时间。变形:标记压缩(Mark and Compact)
  2. 复制收集方式(Copy and Colection) 克服标记清除法中的缺点。从根开始,将被引用的对象递归复制到另外的空间中。缺点:存活对象比例较高,不利。优点:局部性(Locality)。
  3. 引用计数方式(Reference Count) 每个对象中保存该对象的引用计数,当引用增减时对计数进行更新。缺点:无法回收循环引用,增减计数的bug,不适合并行管理。优点:实现容易,瞬间释放,中断时间短。

进一步改良:

  1. 分代回收(Generational GC) 一般性程序所具备的性质:大部分对象都会在短时间内成为垃圾,而经过一定时间依然存活的对象往往拥有较长的寿命。记录集(remembered set)用于对来自老生代的引用进行记录。
  2. 增量回收(Incremental GC) 为了维持程序的实时性,不等到GC全部完成,而是将GC操作细分成多个部分逐一执行。采用写屏障,解决渐进GC过程中,程序运行时对对象的引用关系变化问题。
  3. 并行回收。

数据库

ACID特性(Atomicity,Consistency,Isolation,Durability)
CAP(Consistency,Availaility,Partition Tolerance) 解决大规模数据库不能满足ACID特性
BASE(Basically Available,Soft-state,Eventually consistent) CAP的解决方案

SQL Databases vs NoSQL Databases –Michael Stonebraker

  1. NoSQL的优势在于性能和灵活性。
  2. NoSQL的性能优于SQL这一说法,并非在所有情况下都成立。
  3. 通常认为NoSQL是通过牺牲SQL和ACID特性来实现其性能的,然而性能问题与SQL和ACID是无关的。

根据这篇文章,决定SQL数据库性能的,是客户端与服务器之间的通信开销,以及服务器上的事务处理开销。而通信开销可以通过将大部分处理放在服务器上的存储过程(Stored Procedure)在一定程度上得以解决。

而对于服务器上的处理,大致进行分类的话,主要有4个瓶颈,而对于这些瓶颈的应对就是决定性能的关键:

  1. 日志(Logging):为了防止磁盘崩溃等故障的发生,大多数关系型数据库都会执行两次写入。即数据库一次,日志一次。而且为了防治日志信息丢失(D),必须保证这些数据确实写入了磁盘中。
  2. 事务锁(Locking):为了防止其他线程对记录进行修改。
  3. 内存锁(Latching):指对锁和B树等共享数据结果进行访问时所需要的一种排他处理方式。
  4. 缓存管理(Buffer Management):数据库的数据是写入都固定长度的磁盘页面中的。对于哪个数据写入哪个页面,或者是哪个页面的数据缓存在内存中。

see VoltDB (比传统RDBMS高50倍的成绩)

  1. & 4. 内存数据库,持久性是通过复制(replication)的方式来维持的,也提供了定期将数据写入文件的快照功能。
  2. & 3. 数据库分割成多个分区(partition)来管理的,对于每个分区都分配了一个独立的管理线程。

Redis (对memcached的不满)

意大利程序员Salvatore Sanfilippo

  1. 内存型
  2. 支持永久化
  3. 支持分布
  4. 除字符串之外的数据结构
  5. 高速
  6. 原子性(单线程实现)
  7. 不兼容memcached协议

多核编译

ccache,distcc
# CC=’ccache gcc’ make -j4 # .ccche
# CC=’distcc gcc’ make -j4 # ~/.distcc/hosts

提高工作效率

  1. 减负,由惯性思维所产生的不必要不紧急的工作,如果能够砍掉的话,就能够大幅度提高工作效率。
  2. 拖延,按照紧急程度从高到低来完成任务的话,就可以进一步提高自己的工作效率。还要注意相互依赖关系。
  3. 委派,多核的困难:任务分割、通信开销、可靠性。

Node.js

事件驱动模型,在事件检测上,采用与连接数无关,能够维持一定性能的epoll(Linux)和kqueue(FreeBSD),减少每个连接所消耗的资源。


分布式

阿姆达尔定律:(通过并行计算所获得的)系统性能提升效果,会随着无法并行的部分而产生饱和。

活用多CPU的处理:

  1. 数据分割、分配
  2. 对已分配的数据进行并行处理
  3. 将已处理的数据进行集约

ZeroMQ
底层通信手段:
1. tcp
2. ipc 同一台计算机上进行进程间通信
3. inproc 统一进程中的线程间通信
4. multicast 采用UDP实现的多播通信

为分布式应用程序的构建提供的主要连接模型

  1. REQ/REP 应答模型,双向通信
  2. PUB/SUB 在服务器注册过的客户端都会收到该信息,数据分发布数等场合,单向通信
  3. PUSH/PULL 向队列中添加和取出信息的一种模型,应用场景:管道(一对一)、任务分配(一对多)、任务集约(多对一),单向通信
  4. PAIR 一对一双向
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值