0%

状态转移和复制状态机

状态转移(State Transfer):Primary将自己的完整状态(例如内存中的内容),拷贝发给Backup

复制状态机(Replicated State Machine):将来自客户端的操作或其他外部事件,从Primary传到Backup。由于外部操作比服务的状态要小得多,所以大多采用该方法,缺点是同步会比较复杂

架构

主虚拟机(Primary VM)简称为主机,Backup VM 简称为备机

VMware FT 需要两台物理服务器,主机与备机保持同步,虚拟机的虚拟磁盘在共享存储上。

所有的输入(如网络、鼠标、键盘等)都会输入到主机,然后通过 Logging channel 转发到备机,对于非确定性的操作,还将发送额外的信息,确保备机以确定性的方式执行这些操作。

两台虚拟机都会执行输入操作,但只有主机的输出会返回客户端,备机的输出会被管理程序丢弃

非确定性事件

Read more »

摘要

GFS是一个可以支持上千个机器和硬盘,上百用户同时访问的文件系统

介绍

问题或现象 解决办法
机器错误 持续监控,错误发现,错误处理,自动恢复
文件过大 设计IO操作和block大小
大部分文件写为append而不是overwrite 只优化append保证性能和原子性
引入GFS特有文件读写方式 复用部分文件系统API

设计概述

假设
  • 系统通过廉价机器组成
  • 日常处理GB级的文件
  • 写大部分为append
  • 多个用户看到的同一个文件必须相同
  • 保证高频使用的准确性
接口

GFS不使用类似于POSIX的标准API

架构

Read more »

GDB使用手册

编译时加上-g选项

命令名称 命令缩写 命令说明
run r 运行一个待调试的程序
continue c 让暂停的程序继续运行
next n 运行到下一行
step s 单步执行,遇到函数会进入
until u 运行到指定行停下来
finish fi 结束当前调用函数,回到上一层调用函数处
return return 结束当前调用函数并返回指定值,到上一层函数调用处
jump j 将当前程序执行流跳转到指定行或地址,不运行跳过的代码
print p 打印变量或寄存器值
backtrace bt 查看当前线程的调用堆栈
frame f 切换到当前调用线程的指定堆栈
thread thread 切换到指定线程
break b 添加断点
tbreak tb 添加临时断点
delete d 删除断点
enable enable 启用某个断点
disable disable 禁用某个断点
watch watch 监视某一个变量或内存地址的值是否发生变化
list l 显示源码
info i 查看断点 / 线程等信息
ptype ptype 查看变量类型
disassemble dis 查看汇编代码
set args set args 设置程序启动命令行参数
show args show args 查看设置的命令行参数
Read more »

我的疑问

  1. header中防御式声明的目的
  • 防止两个头文件相互include时的循环include
  • 防止cpp在include不同头文件时可能产生的重复定义
  1. inline

将函数声明为inline可以避免函数调用的开销,空间换时间

常规的函数调用需要用到栈,需要返回地址和参数压栈,但通过inline展开后就为普通的顺序执行

与define的区别

  • define无类型检查,inline有
  • define编写时运算符的优先级较难处理
  • define在预处理时展开,inline由编译器实现展开
  1. const

const对象的值创建后值不能再改变,所以必须初始化

Read more »

模版函数(template function)为声明不是定义,在使用时根据输入类型定义

使用模版时,不会使用隐式类型转换

类模版里的每个函数都是函数模版,需要在声明前加上template

1
2
3
4
5
template <typename elemType>
class BinaryTree{
private:
BTnode<elemType> *_root;
}
Read more »

后置递增运算符的优先级高于解引用运算符,因此*p++等同于*(p++)

将p+1后返回p的初始值

Read more »

inline 函数

将函数声明为inline可以避免函数调用的开销,空间换时间

调用函数步骤:

  1. 返回地址压栈
  2. 函数参数压栈
  3. 计算返回值
  4. 函数部分所有元素出栈,返回值

普通函数与inline函数的汇编代码对比

inline函数不是定义是声明,应该写在头文件里,保证编译器将其作为inline函数展开

宏定义与inline函数的区别

宏定义 inline函数
类型检查
实现方式 预处理时展开 由编译器实现展开,是否将函数作为inline依赖于编译器的判断
其他 容易引发运算符优先级的问题,不可调试 可以调试
Read more »

六大部件

stl_items.png

分配器:为容器分配内存

迭代器:算法只能通过迭代器访问容器

容器

stl.png

Array

定长数组

_M_instance:指向数组首元素的指针(int a[10]的a)

array_overview.png
Read more »

限制条件

只能重载存在的运算法

重载运算符必须保留相同操作数数量和优先级

成员或全局函数

单目运算符应该做成成员函数

= () []只能做成成员函数

所有其他二元运算符做成非成员函数

其他

成员函数左操作数(reciver)必须是隶属于同一个class的对象

加const可以防止返回结果做左值

Read more »