0%

对象存储由于其价格低廉、结构简单易用、可扩展性强等特点被大量应用,几乎已经成为云存储的代名词,例如AWS S3,Google Cloud、阿里云OSS等。

与传统的文件存储不同,对象存储是一种基于HTTP的存储服务,需要通过例如GetObjectListObjectsPutObjectDeleteObjectHeadObject 等接口完成类似文件系统read,write,readdir,getattr的操作。而HTTP接口的网络时延很大,一般在几十到几百毫秒之间,所以其存储服务是一种带宽型的业务。

这其中,ListObject是一种可以列举Bucket中对象的接口,类似文件系统的readdir

虽然在通常的业务中不常用,但是在例如对象存储文件网关、或者GCSFuse、Mountpoint这种对象存储POSIX客户端中被大量使用。在AI场景中也有大量的遍历数据集文件的操作(例如把数据从对象存储拉到例如高性能的并行文件系统中做训练/推理),ListObject速度就成为一个问题:

阅读全文 »

并发概念

  • 同一个系统中多个活动同时进行

并发的方式

  • 多进程
    • 进程间通信:
      • 设置复杂或者速度慢
      • OS有额外保护或者高级通信机制
  • 多线程
    • 共享内存带来隐患
阅读全文 »

1. UNIX 标准

  • ISO C
    • 历史
      • ANSI C89
      • C99
        • restrict
        • long long
        • 单行注释
        • 分散代码与声明
      • C11
        阅读全文 »

FUSE是一个用户态文件系统
优点:

  • 编程简单,便于调试

缺点:

  • 访问路径长
  • 用户态内核态频繁切换
  • 增加数据复制

应用程序调用read,write,首先也会进入VFS,然后VFS通过调用注册的FUSE的相对应操作,封装成request加入队列中(fuse内核驱动)。然后FUSE daemon通过/dev/fuse从队列中把数据拷贝出来,解析request,之后根据请求执行相对应的操作,调用链长很多。

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

阅读全文 »