摘要: Paxos 节点角色 Proposer:用于接收客户端的请求,客户端的请求到达 Proposer 之后,它会将这个请求封装为提案,然后把这个提案广播给所有的 Acceptor。 Acceptor:决定是否批准提案,会给 Proposer 返回一个类似于 yes or no 的响应。Proposer 阅读全文
posted @ 2022-08-15 21:37 Kayden_Cheung 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 准备工作 在做该实验前,需要熟读论文《In Search of an Understandable Consensus Algorithm (Extended Version)》,主要根据 Figure 2 来实现代码。 此外,在做实验的过程中,如果遇到了问题可以去看一下助教写的raft指南:Stu 阅读全文
posted @ 2022-07-14 17:06 Kayden_Cheung 阅读(550) 评论(1) 推荐(0) 编辑
摘要: 准备工作 在做该实验前需要先阅读下论文《MapReduce: Simplified Data Processing on Large Clusters》 Lab1 的实验任务是实现 Word Count,测试文件在 src/main 下,以 pg-*.txt 格式命名。 由于该系列课程是使用 Go 阅读全文
posted @ 2022-07-14 17:05 Kayden_Cheung 阅读(407) 评论(0) 推荐(0) 编辑
摘要: 解决问题 MVCC(Multiversion Concurrency Control),多版本并发控制。MVCC 的目的是为了提高数据库并发性能,用更好的方式去处理读-写冲突、同时做到不加锁、非阻塞并发读写。 MVCC 可以解决脏读、不可重复读,MVCC 使用快照读解决了部分幻读问题,而在当前读时还 阅读全文
posted @ 2022-06-30 18:53 Kayden_Cheung 阅读(67) 评论(0) 推荐(0) 编辑
摘要: malloc的线程安全 线程安全就是多个线程并发执行相同代码,程序的结果依然是正确的。malloc 由于操作的是堆上的空间,所以如果要实现线程安全,就需要对 malloc 加锁。 malloc 的不可重入性 可重入函数简单来说就是可以被中断的函数,在这个函数执行的任何时刻中断它,转入 OS 调度下去 阅读全文
posted @ 2022-06-30 10:55 Kayden_Cheung 阅读(1680) 评论(0) 推荐(0) 编辑
摘要: template <typename T> class poor_unique_ptr { public: explicit poor_unique_ptr(T* ptr=nullptr): ptr_(ptr) {}; ~poor_unique_ptr() { if (ptr_) { delete 阅读全文
posted @ 2022-06-22 19:52 Kayden_Cheung 阅读(104) 评论(0) 推荐(0) 编辑
摘要: 1 redo log 和 binlog 的区别 redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。 redo log 是物理日志,记录的是“在某个数据页上做了什么修改,实现 crash-safe,即使数据库发生异常重启,之前 阅读全文
posted @ 2022-05-07 15:27 Kayden_Cheung 阅读(416) 评论(0) 推荐(0) 编辑
摘要: 1 线程池 为了避免多线程操作过程种线程频繁申请和释放所带来的性能消耗,可以提前创建多个线程,当有任务到来时从线程池中选择一个线程执行,执行完后继续在线程池中待命。 核心是使用一个工作队列,主线程往工作队列中添加工作,工作线程从队列中取出工作并执行。 对工作队列的操作就是经典的生产者—消费者模型,需 阅读全文
posted @ 2022-04-20 09:49 Kayden_Cheung 阅读(60) 评论(0) 推荐(0) 编辑
摘要: 1 C 中的 const 内存分配 1.1 修饰全局变量 #include<stdio.h> const int n = 5; int main(){ int* p = (int*)(&n); *p = 10; printf("%x\n", &n); printf("%x\n", p); print 阅读全文
posted @ 2022-04-18 10:58 Kayden_Cheung 阅读(86) 评论(0) 推荐(0) 编辑
摘要: 在 C++11 中,我们可以使用 mutex 来实现线程的同步,mutex 包括上锁和解锁两个步骤。 lock_guard 的功能也是实现线程同步,可以进一步偷懒以及避免在锁定期间可能出现异常的情况,它的思想就是 RAII,在构造对象时就完成上锁的操作,当对象离开作用域时自动调用析构函数解锁。 te 阅读全文
posted @ 2022-04-17 13:29 Kayden_Cheung 阅读(316) 评论(0) 推荐(0) 编辑
摘要: 生产者消费者是典型的线程同步问题,生产者往共享区域中生产加入产品,消费者往共享区域中消费取出产品。 生产者:若共享区域未满,则加入产品,并通知消费者;若共享区域已满,则等待消费者消费。 消费者:若共享区域为空,则等待生产者生产;若共享区域未满,则消费并通知生产者。 #include<stdio.h> 阅读全文
posted @ 2022-04-16 21:34 Kayden_Cheung 阅读(117) 评论(0) 推荐(0) 编辑
摘要: while(条件判断){ pthread_cond_wait(&cond, &lock); } 在上面的情况中,如果我们不使用互斥锁,可能在 while 语句之后,当前线程还未进入 wait ,但是另一个线程调用了 pthread_cond_singal,就会导致唤醒丢失。 所以,在操作条件变量时需 阅读全文
posted @ 2022-04-16 21:25 Kayden_Cheung 阅读(542) 评论(0) 推荐(0) 编辑
摘要: 1 为何需要线程同步? 由于线程共享进程的资源,会产生竞态条件,在某些情况下需要协调指令执行的先后顺序,也就是实现线程同步。 下面是一个常见的多线程累加程序,由于sum++并不是一个原子操作,所以多个线程互相抢占从而造成计算错误。 #include<stdio.h> #include<stdlib. 阅读全文
posted @ 2022-04-16 15:55 Kayden_Cheung 阅读(43) 评论(0) 推荐(0) 编辑
摘要: 半连接队列和全连接队列 在 socket 编程中, 服务器通过 listen 函数进行监听: #include<sys/socket.h> int listen(int sockfd, int backlog) 这个 backlog 的作用时什么呢?这就涉及到 TCP 的细节了。 服务器第一次收到客 阅读全文
posted @ 2022-03-25 14:49 Kayden_Cheung 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 1 auto auto 的功能是类型推断,它使用的是模板类型推导的机制,auto 会被一个虚构的模板类型参数T替代,然后进行推断。 例如下面的 auto x = 5,编译器就会认为它有一个模板 func_for_x,从而去推断出T的类型。 template <typename T> void fun 阅读全文
posted @ 2022-03-24 14:26 Kayden_Cheung 阅读(75) 评论(0) 推荐(0) 编辑
摘要: 修饰普通变量:改变变量的存储区域和生存周期,变量保存在静态区。 修饰普通函数:该函数仅在定义该函数的文件内使用,在不想其他文件使用的情况下可以加static。 修饰成员变量:不管声明多少个实例,都使用同一份变量。 修饰成员函数:不需要生成对象就可以使用该函数。 阅读全文
posted @ 2022-03-22 22:33 Kayden_Cheung 阅读(25) 评论(0) 推荐(0) 编辑
摘要: #include<iostream> class SharedCount{ public: SharedCount():count_(1){} void AddCount(){ ++count_; } long ReduceCount(){ return --count_; } long GetCo 阅读全文
posted @ 2022-03-20 17:00 Kayden_Cheung 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 1 控制块 shared_ptr 继承自 _Ptr_base,它包含两个成员变量:指向目标对象的指针 _Ptr 和 引用计数基类指针 _Rep。 private: element_type * _Ptr{nullptr}; _Ref_count_base * _Rep{nullptr}; 引用计数的 阅读全文
posted @ 2022-03-10 21:43 Kayden_Cheung 阅读(750) 评论(0) 推荐(0) 编辑
摘要: 1 _Ptr_base _Ptr_base 是智能指针的基类,它包含两个成员变量:指向目标元素的指针 _Ptr 和 引用计数基类指针 _Rep。 private: element_type * _Ptr{nullptr}; _Ref_count_base * _Rep{nullptr}; 1.1 e 阅读全文
posted @ 2022-03-09 20:00 Kayden_Cheung 阅读(92) 评论(0) 推荐(0) 编辑
摘要: cfs_rq 每个 cpu 都有一个对应的运行队列 rq,在 rq 中维护着不同调度策略的调度队列。 struct rq { ... struct cfs_rq cfs; struct rt_rq rt; struct dl_rq dl; ... }; cfs的调度队列通过红黑树维护,在 cfs_r 阅读全文
posted @ 2022-03-08 18:58 Kayden_Cheung 阅读(301) 评论(0) 推荐(0) 编辑
//目录