置顶「数据库系统」事务特性的实现

&emsp;**事务** 指数据库中一个不可分的逻辑工作单元,它是数据库区别于文件系统的重要特征。 <p style="margin-top:-20px">&emsp;</p> ### 一、事务特性 &emsp;首先,来看看事务的四大特性(ACID): - 原子性(`Actomicity`):事务中的操作要么全部执行,要么都不执行; <p style="margin-top:-28px">&………


置顶「计算机系统」进程的内存视图

#### 进程的内存布局 &emsp;一个进程所占用的内存由很多部分组成,称之为“段”: - **文本段**,包含程序执行的程序机器语言指令。文本段为只读的,防止进程意外修改指令。因为多个进程可同时运行同一程序,所以文本段是可共享的,一份程序代码的拷贝可通过虚拟内存机制映射到所有这些进程的虚拟地址空间中(运行时程序代码被加载到内存中,虚拟内存系统能够将这一物理内存映射为多个进程的虚拟内存); ………


置顶「C++」拷贝控制

在定义一个类时,可以指定类的拷贝、移动、赋值或销毁时的动作,这些操作由5种成员函数来控制: 1. **拷贝构造函数** 2. **拷贝赋值运算符** 3. **移动构造函数** 4. **移动赋值运算符** 5. **析构函数** <br> &emsp;其中,拷贝和移动*构造函数* 定义了用同类型的对象初始化本对象时做什么,拷贝和移动*赋值运算符* 定义了将一个对象赋予同类型的另一个对………


「C++」面向对象特性

&emsp;面向对象的三个基本特征为: - 封装:将客观的事物抽象为类,封装具体属性与实现细节,向使用者提供访问接口; - 继承:在现有类的功能上进行拓展,提供代码复用; - 多态:使用基类的指针或引用可以访问派生类,提供更好的抽象与行为/代码共享,提供运行时决议。 &emsp;以下介绍多态的实现: <br> #### 多态的实现 &emsp;多态分为静态多态与动态多态: ##### 静………


「Redis」多机数据库

### 一、复制 &emsp;Redis 中,用户可通过执行 $$SLAVEOF$$ 命令或设置`slaveof`选项,让一个服务器成为其他主服务器的从服务器,从而去复制主服务器的数据;也可以通过 $$SLAVEOF NO ONE$$ 命令解除一个服务器从服务器的身份。进行复制中的主从服务器双方的数据库将保存相同的数据,概念上将这种状态称之为“数据库状态一致”。<br><p></p> &em………


「C++」多重继承与虚继承

### 一、多重继承 &emsp;多重继承是指从多个直接基类中产生派生类。尽管概念上简单,但多个基类相互交织产生的细节可能会带来错综复杂的设计问题。<br><p></p> &emsp;派生类的派生列表中可以包含多个基类,每个基类包含一个可选的访问说明符。若访问说明符被忽略了,则关键字`class`对应的默认访问说明符是`private`,关键字`struct`对应的是`public`。 ```c………


「C++」shared_ptr 的线程安全性

&emsp;多线程环境下,调用不同的 shared_ptr 实例的成员函数是不需要额外的同步手段的,即使这些 shared_ptr 管理的是相同的对象。<br><p></p> &emsp;多线程对于同一个 shared_ptr 实例的读操作(访问)可以保证线程安全;但对于同一个 shared_ptr 实例的写操作(改变一个 shared_ptr 指向的对象)则需要同步,否则会发生 race co………


「Redis」Redis 常见缓存问题与解决方案

&emsp;常见的三种缓存问题: - 缓存穿透 - 缓存击穿 - 缓存雪崩 &emsp;以下缓存问题的讨论都是基于以下应用架构讨论的: <center><img src="/media/blog_image/u=2546654357,3169296496&fm=253&app=138&f=PNG.png" width="590px"></center> &emsp; <br> #### ………


「Linux/UNIX 系统编程」内存分配

### 一、堆上分配内存 &emsp;进程可通过增加堆的大小来分配内存(即在堆空间中动态分配内存),所谓堆是一段长度可变的连续内存,**始于进程的未初始化数据段末尾**。通常将堆的当前内存边界称为“program break”。<br><p></p> &emsp;改变堆的大小(分配或释放堆空间),其实就是命令内核改变进程的 program break 位置。<br><p></p> &emsp;最………


「C++」命名空间

&emsp;命名空间为防止名字冲突提供了更加可控的机制。命名空间分割了全局命名空间,其中每个命名空间是一个作用域。<br><p></p> &emsp;通过在某个命名空间中定义库的名字,库的作者与用户可以避免全局名字固有的限制。 <br> ### 一、命名空间定义 &emsp;一个命名空间的定义包含两部分:首先为关键字`namespace`,随后为命名空间的名字,命名空间的后面是一系列由花括号括………


「C++」异常处理

&emsp;异常使得我妈能够将问题的检测与解决过程分离开。程序的一部分负责检测问题的出现,然后将解决该问题的任务传递给程序的另一部分。检测环境无须知道问题处理模块的所有细节,反之亦然。 <br> ### 一、抛出异常 &emsp;在 C++ 中,我们通过抛出(throw)一条表达式来引发一个异常。**被抛出的表达式的类型以及当前的调用链共同决定了哪段处理代码(handler)将被用来处………


「Linux/UNIX 网络编程」信号驱动式 I/O

&emsp;信号驱动式 I/O 是指进程预先告知内核,使某个描述符满足对应条件时,内核使用信号通知进程。 <br> ### 一、套接字的信号驱动式 I/O &emsp;针对一个套接字使用信号驱动式 I/O(SIGIO)需要执行以下步骤: 1. 进程建立`SIGIO`信号的处理器函数; 2. 设置该套接字的属主(通常通过`fcntl()`的`F_SEROWN`操作设置); 3. 开启该套接字………


「Linux/UNIX 网络编程」非阻塞式 I/O

### 一、概述 &emsp;套接字的默认状态是阻塞的,这意味着当发出一个不能立即完成的套接字调用时,进程将被置于休眠状态,等待相应的操作完成。可能阻塞的套接字调用可分为以下四类: #### 1. 输入操作 &emsp;包括以下五个调用: - `read()` - `readv()` - `recv()` - `recvfrom()` - `recvmsg()` &emsp;若某个进程………


「Linux/UNIX 网络编程」基本 UDP 套接字编程

&emsp;UDP 客户/服务器程序所用的套接字函数: <center><img src="/media/blog_image/src=http___ww2.sinaimg.cn_large_00.jpeg" width="500px"></center>&emsp; <br> ### 1. recvfrom() 和 sendto() &emsp;`recvfrom()`和`sendto()`………


「Linux/UNIX 网络编程」I/O 多路复用技术

### 一、select() 函数 &emsp;调用`select()`可以告知内核我们对哪些描述符(就读、写或异常事件)感兴趣以及等待多长时间。 ```cpp #include <sys/select.h> #include <sys/time.h> int select(int nfds, fd_set *readset, fd_set *writeset, fd_set *excepts………


「Linux/UNIX 网络编程」五种 I/O 模型

&emsp;Unix 下有五种可用的 I/O 模型: - 阻塞式 I/O - 非阻塞式 I/O - I/O 多路复用(`select`/`poll`/`epoll`) - 信号驱动式 I/O(`SIGIO`) - 异步 I/O(POSIX的`aio_`系列函数) <p style="margin-top:-20px">&emsp;</p> #### 1. 阻塞式 I/O 模型 <cen………


「Linux/UNIX 网络编程」基本 TCP 套接字编程

&emsp;TCP 连接的通信过程与对应系统调用的关系: <center><img src="/media/blog_image/微信截图_20211101094554.png" width="520px"></center>&emsp; ### 1. socket() &emsp;`socket()`系统调用创建一个新 socket: ```cpp #include <sys/socket………


「Linux/UNIX 系统编程」SOCKET:高级主题

### 一、流式套接字上的部分读和部分写 &emsp;若**流套接字**上可用的数据比在`read()`中请求的数据少,则可能出现部分读的情况,此时`read()`返回实际读取的字节数。<br><p></p> &emsp;若没有足够的缓冲区传输请求的字节,且满足以下条件之一,则可能出现部分写: - 套接字工作在非阻塞模式(O_NONBLOCK)下; - `write()`调用传输了部分字节后被………


「网络编程」远程过程调用

#### 关于过程调用 &emsp;当讨论过程调用时,存在着三种不同类型的过程调用: <center><img src="/media/blog_image/file_1635562842000.png" width="550px" style="margin-bottom:20px"></center> - 本地过程调用:被调用的过程与调用过程处于同一个进程中; - 远程过程调用:被调用的过………


「网络编程」TCP 粘包问题

#### TCP 粘包问题 &emsp;TCP 粘包问题是指发送方多次发送的数据混合到了一起(具体体现为发送方多次 SEND 发送的数据,接收方一次 RECV 就能全部读取)。 <br> #### 造成 TCP 粘包问题的原因 &emsp;粘包问题的本质在于,TCP 本来就是面向字节流的协议,不会根据数据发送的次数保持数据的边界,导致接收方可能一下子读取到多个报文。<br><p></p> &e………