0%

1. 语言特性

1.1 常量

nullptr代替NULL
传统C++会把NULL,0视为同一个东西,有些定义((void*)0),有些会定义为0,但是有问题:

  • C++不允许void * 隐式类型转换,void* 0
  • 0会给C++重载特性带来混乱

constexpr
明确声明函数或者对象在编译期会成为常量表达式, C++14开始,constexpr函数可以使用局部变量、循环、分支等简单语句。

1
2
3
4
5
6
constexpr int fibonacci(const int n) {
//c++11 编译不了
if(n == 1) return 1;
if(n == 2) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
阅读全文 »

1. 历史

  • 穿孔卡
  • 穿孔纸带
  • 磁带
  • 硬盘存储器
    • IBM Model 250 Disk File 1956年 50张 24 inch盘片
  • 软盘
    • IBM 在1971年引入
  • 光盘
  • Flash芯片
  • 磁盘阵列
  • 网格化磁盘阵列

2. IO

总线

assignment 0 C++ primter

目的是熟悉一下C++,这里的提交需要注意一下格式,比如statement必须在{}之间的要求等等,否则gradescope通过不了。我的第一次提交就有这样的问题,这个评测系统对于格式的要求很高。

GDB:

顺便复习了一下智能指针:

  • 某一时刻只能有一个 unique_ptr<T>指向对象,不支持拷贝赋值
  • shared_ptr<T>可以拷贝赋值,内有自己的计数器
阅读全文 »

要点

  1. 编码风格清晰一致
  2. 合理命名,并有注释
  3. header干净,除非绝对需要,不在header文件中添加系统头文件
  4. class 的private成员不暴露,所有数据成员都应该是私有的,并加下划线标记
  5. 尽可能使用const
  6. 可移植性,不依赖特定大小的long或者unsigned类型
  7. 内存问题

  • 遵循三/五法则
  • 不使用全局数据
  • 使用构造函数初始化列表

其他

《modern operating systems> 我看的是第四版,主要介绍了操作系统相关的理论性的东西,为了防止遗忘,记录下重点备查。

1 进程和线程

进程

进程是程序的一个正在执行的实例,包括相关的PC(program counter),寄存器和变量等。理论上说,每一个进程都有属于自己的虚拟CPU。

进程模型

  • 多道程序设计(multiprogramming): 指仅使用一个CPU(单核),在进程中来回切换,造成多个进程同时进行的效果。
阅读全文 »

基础语法

编译

  • 预处理 Preprocessing cpp test.cpp -> test.i
  • 编译 Compilation g++ -g -S test.i
  • 汇编 assembly as -o test.o test.s gcc -g -c test.c;
  • 链接 linker ld -o …

表达式

左值右值

lvalue, rvalue

阅读全文 »

模板练习

数组

Gossip 算法

在一个有界网络中,每个node传播message给随机的几个节点,经过杂乱无章的通信,最终所有节点都会达成一致。每个节点有可能知道所有的节点,也可能仅仅知道几个邻居节点,最后状态都是一致的,又称为反熵。

优点

  • 可扩展性
    • 使用$O(\log N)$ rounds 到达所有nodes,N为node的个数。
  • 容错
    • 从源头节点到目的节点路径不止一条,可以在不规则为止连接性的网络中运行。
  • 健壮性
    • 故障节点不会阻止其他节点发送消息,每个节点都可以随意加入和退出,不会严重啊影响服务质量
    • 但是如果消息有关于故障节点或者恶意节点,那么系统就不健壮
  • 收敛速度
    • 指数收敛速度

流程

两个概念

  • Cycle 传播一个消息的轮数
  • Fanout 每轮种node通信的节点数
  1. 周期性散播消息
  2. 每轮随机选择fanout个节点散播消息
  3. 每轮散播消息都选择尚未发送过的节点进行散播
  4. 收到消息的节点不再往send节点散播

Goosip 和 raft
raft是强一致性的,而gossip是最终一致

例子

  • Riak 使用gossip协议分享并通信ring state和bucket properties
  • CASSANDRA 分享周围nodes和自己的信息
  • serf:go实现的服务发现和治理的框架

POSIX thread

Portable operating system interface (POSIX) 是IEEE Computer Society为维持操作系统兼容性定义的一套标准。

POSIX 线程库规定了C/C++的线程API,相比于fork这种创造新进程的方式,使用线程开销更小。

  • 多处理器用多线程:效果最好
  • 单处理器使用多线程: 也有增益(一个线程等IO,另外的执行)

适用场景

  • 多任务同时进行
  • 阻止潜在的长时间IO等待
  • 一些地方很多CPU周期
  • 必须响应异步
  • 优先级中断
阅读全文 »