openGauss通过docker运行
参考【openGauss】Ubuntu 三条命令装好 opengauss_ubuntu安装opengauss-CSDN博客
0x00 安装docker
1 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun |
如果官方docker源较慢,可以修改docker源。编辑/etc/docker/daemon.json
,添加以下内容:
1 | { |
参考【openGauss】Ubuntu 三条命令装好 opengauss_ubuntu安装opengauss-CSDN博客
1 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun |
如果官方docker源较慢,可以修改docker源。编辑/etc/docker/daemon.json
,添加以下内容:
1 | { |
简单地来说,Arc就是为了让变量能够再线程间共享,可以通过clone(并不会真正地深拷贝)的方式将数据的所有权给其他线程。但是如果数据要在多个线程之间修改的话,为了保证一致性,需要上锁,可供选择的方式有Mutex和RwLock等等。
RwLock.write()返回的是一个RwLockWriteGuard,我们可以解引用访问其内容,也可以通过解引用修改其内容。
转载自
rust
有自己的规则和约定用来组织模块,比如一个包最多可以有一个库crate
,任意多个二进制crate
、导入文件夹内的模块的两种约定方式...
知道这些约定,就可以快速了解rust
的模块系统。
先把一些术语说明一下:
包
是cargo的一个功能,当执行cargo new xxxx
的时候就是创建了一个包。crate
是二进制或者库项目。rust
约定在Cargo.toml
的同级目录下包含src
目录并且包含main.rs
文件,就是与包同名的二进制crate
,如果包目录中包含src/lib.rs
,就是与包同名的库crate
。包内可以有多crate
,多个crates
就是一个模块的树形结构。如果一个包内同时包含src/main.rs
和src/lib.rs
,那么他就有两个crate
,如果想有多个二进制crate
,rust
约定需要将文件放在src/bin
目录下,每个文件就是一个单独的crate
。crate根
用来描述如何构建crate
的文件。比如src/main.rs
或者src/lib.rs
就是crate根
。crate根
文件将由Cargo
传递给rustc
来实际构建库或者二进制项目。Cargo.toml
文件的包用来描述如何构建crate
,一个包可以最多有一个库crate
,任意多个二进制crate
。参考:
什么是自引用,如下面代码所示:
1 | struct SelfRef<'a> { |
对于每个进程,/proc
都有一个以进程ID(PID)命名的子目录,如/proc/1863
,其中包含了特定于该进程的信息。
以/proc/1863
为例,这是一个特定于PID为1863的进程的目录。下面是/proc/[pid]
目录中一些重要文件或子目录的作用:
既然左值引用和右值引用都是地址,那么它们和指针有什么区别呢?引用可以看做是被限制的指针,和普通指针的区别在于,引用只能在声明的时候初始化,且不可更改。可以发现,引用和指针常量在功能上是等同的。
1 | (gdb) info signal SIGUSR2 |
本文参考:
TOAST是“The Oversized-Attribute Storage Technique”(超尺寸属性存储技术)的缩写,主要用于存储一个大字段的值。
要理解TOAST,我们要先理解页(BLOCK)的概念。在PG中,页是数据在文件存储中的基本单位,其大小是固定的且只能在编译期指定,之后无法修改,默认的大小为8KB。同时,PG不允许一行数据跨页存储。那么对于超长的行数据,PG就会启动TOAST,将大的字段压缩或切片成多个物理行存到另一张系统表中(TOAST表),这种存储方式叫行外存储。
参考:
如果Datum 类型是 “byVal”,则Datum表示一个值。如果Datum 类型不是”byVal“,则Datum 表示一个指针:
typlen > 0, Datum 就指向固定长度字节流,比如int类型 typlen == -1, Datum 指向一个变长 varlena 结构体,比如char,varchar类型 typlen == -2, Datum 指向一个C语言风格的字符串;
因此,查看所有的变长数据类型:
1 | SELECT typname FROM pg_type WHERE typlen = -1 |