自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(183)
  • 收藏
  • 关注

原创 Java ThreadLocal 源码解析

使用 ThreadLocal 时,可以将数据存储在一个特殊的对象中,这个对象会被自动关联到当前线程。如果想要在创建 ThreadLocal 对象时就设置初始值,可以使用如果想要删除 ThreadLocal 中的值,可以调用remove()方法。ThreadLocalMap 的创建是懒加载的;ThreadLocal 的实现是通过将一个 ThreadLocalMap 作为 Thread 对象的成员实现的;每个线程的全部 ThreadLocal 都保存在 ThreadLocalMap 中。

2023-12-28 23:33:27 519

原创 Golang sync.Once 源码浅析

本文分析了Golangsync.Once源码,并由此引申,简单讨论了单例模式的实现、atomic包的作用和 Java volatile 的使用。sync.Once。

2023-02-19 17:15:25 638 1

原创 855. 考场就座

855. 考场就座

2023-02-16 13:17:30 362

原创 1997. 访问完所有房间的第一天

1997. 访问完所有房间的第一天

2023-02-15 11:43:40 361

原创 1124. 表现良好的最长时间段

1124. 表现良好的最长时间段

2023-02-14 13:50:14 331

原创 LevelDB LRU Cache 源码分析

LevelDB LRU Cache 源码分析

2022-06-16 22:08:31 331

原创 LevelDB memtable 原理和源码分析

LevelDB memtable源码分析。

2022-06-13 20:59:26 803

原创 Spanner 论文小结

Spanner 论文小结,TrueTime API,时间戳分配策略,事务执行流程,死锁预防策略,wait-die, wound-wait。

2022-06-07 14:56:40 380

原创 CockroachDB: The Resilient Geo-Distributed SQL Database 论文阅读笔记

前言本文绝大部分内容源自 CockroachDB 论文。介绍CockroachDB 是一个可扩展(Scalable)的 SQL DBMS,它主要用于支撑 OLTP 工作流,并保持高可用性(High Availability)和强一致性(Strong Consistency)。论文主要呈现了 CockroachDB 创新的事务模型,它在商用硬件上支持一致(Consistent)的分布式事务。论文在 Introduction 提出了一个情景:一个公司在欧洲和澳洲有一个大用户基数,并且美国的用户数也在迅速

2022-05-31 23:07:25 727 1

原创 CockroachDB 分布式事务源码分析之 TxnCoordSender

TxnCoordSenderTxnCoordSender实现了Sender和TxnSender接口,Sender抽象了发送方法Send:// crdb 在 client 侧及 server 侧均有 Sender 接口的实现类型。// 一些实现类型如 client.Txn, kv.TxnCoordSender, storage.Node,// storage.Store, storage.Replica.type Sender interface { // Send 方法发送一个batch用于估算

2022-05-30 14:51:56 645

原创 Golang map源码浅析

设计概述runtime/map.go开头描述了map的设计要点。一个map是一个哈希表(hashtable);数据被组织成bucket数组,每个bucket最多8个键值对;哈希值的低位用于选择bucket下标,每个bucket包含哈希值的若干高位,用于定位一个bucket内的键值对;如果多于八个键被哈希到一个bucket中,将一个额外的bucket连接到其后面(拉链法);当哈希表需要扩容时,分配一个两倍大小的bucket数组;在扩容后,bucket被增量地从旧的bucket数组移到新的buc

2022-03-14 23:41:30 1207

原创 Go HTTP服务器源码浅析

简单服务器 Demo在 Go 编写一个服务器非常简单:func main() { http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { writer.Write([]byte("hello, world!")) }) http.ListenAndServe(":8080", nil)}之后便可以访问:~ curl localhost:8080/hello, world!也可以用

2022-02-26 11:45:48 1334

原创 Go的五种mock技术

简介良好的单元测试不仅可以在代码发布前验证代码是否可用,并且可以保护代码在以后的某一次修改中功能不被破坏。好的单元测试需要有自我隔离、可靠、无状态等特性。以下介绍五种 mock 技术。1. Higher-Order Functions当需要 mock 一个包级别函数的时候使用。以下代码打开一个数据库连接:func OpenDB(user, password, addr, db string) (*sql.DB, error) { conn := fmt.Sprintf("%s:%s@%s/%s"

2022-01-16 16:07:39 2434

原创 Go并发模式之Pipelines

简介Go的并发原语使构建流数据pipeline变得容易,流数据pipeline可以有效地利用I/O和多个CPU。本文介绍了此类pipeline的示例,强调了操作失败时出现的微妙之处,并介绍了干净地处理故障的技术。何为pipeline一个pipeline是指一系列用通道连接的阶段,每个阶段是一组运行同一个函数的go协程,在每一个阶段中的go协程:从上游管道接收数据在数据上执行一些操作,生成新的值将数据发到下游管道中例子:平方数第一个阶段将给定的数发到管道中,第二个阶段从管道接收数字,取平方

2021-11-16 15:14:26 1054

原创 Go并发模式之Context

简介在Go语言实现的服务器中,每个到达的请求被一个新的go协程处理。请求处理器经常开启额外的go协程访问后端,例如数据库、RPC服务。这一组服务同一个请求的go协程通常需要访问单个请求的某些值,例如终端用户的身份、权限token、请求的最后期限。context包让同一个请求处理的go协程间传值更为方便。它还能够在处理一个请求的一组go协程间传递取消信号、截止时间。ContextContext接口的源码如下:// Context的方法可以被并发调用type Context interface {

2021-11-15 17:01:43 509

原创 btcd交易流程之交易的打包上链(三)

为了了解交易是怎么被打包到区块,最后发布的,首先从 Bitcoin API Reference 以及 btcd API Reference 中查看相关的RPC调用。BitCoin RPCsgetblocktemplategetblocktemplate ( "template_request" )其描述如下:If the request parameters include a ‘mode’ key, that is used to explicitly select between the

2021-10-21 09:25:45 428

原创 btcd交易流程之交易的验证(二)

交易的验证从btcd.go中的main函数开始,调用了btcdMain,btcdMain中有以下代码: // Create server and start it. server, err := newServer(cfg.Listeners, cfg.AgentBlacklist, cfg.AgentWhitelist, db, activeNetParams.Params, interrupt)分析到底是什么Server:// newServer returns a new btcd s

2021-10-19 17:55:39 308

原创 btcd交易流程之交易的创建(一)

从btcd.go中的main函数开始,调用了btcdMain,btcdMain中有以下代码: // Create server and start it. server, err := newServer(cfg.Listeners, cfg.AgentBlacklist, cfg.AgentWhitelist, db, activeNetParams.Params, interrupt)我们看这个到底是什么Server:// newServer returns a new btcd serv

2021-10-19 17:35:45 13205

原创 6.824 Lab 4B: Sharded Key/Value Service

思路每个leader负责poll新的config,将一个config发到raft中,在applyCh收到该config后更新配置;leader依次poll下一个编号的config,并且只有在所有需要发送的shard已经被接收方接收、所有需要接收的shard已经收到后才会apply下一个config;接收shard、删除shard操作都需要写到raft日志中,让一个group里的majority都执行同样的操作;如果一个接收者5秒内没有接收一个shard(即发送AddShard RPC失败),则默认该

2021-09-11 20:36:46 458

原创 6.824 Lab 3B: Fault-tolerant Key/Value Service

简介一个长期运行的raft服务器会积累大量的日志,这些日志放在内存里将占用大量空间。为了压缩日志占用的空间,raft可以通过快照将当前kvserver的状态存储下来,并丢弃已经被apply的日志。思路日志压缩后,因为被包含在snapshot里的entry都被移除,entry的下标 ≠ entry index - 1,这时:entry下标 = entry index - lastIncludedIndex - 1或entry index = entry下标 + lastIncludedIndex

2021-08-27 12:32:14 695

原创 6.824 Lab 3A: Fault-tolerant Key/Value Service

简介lab3主要是用lab2实现的raft做一个容错的键值存储服务。lab3A主要是实现一个没有日志压缩功能的键值存储系统。理想情况下的kvraft思路首先实现一个不存在消息丢失情况下的解决方案。ClientClerk记录一个leaderId,每次发送RPC时从leaderId开始。需要不断重复发送RPC,直至请求成功。Server存储k/v的是一个简单的map[string]string;PutAppend、Get方法调用底层raft的Start方法并在对应的通道上等待消息;在serv

2021-08-22 15:04:39 817

原创 6.824 Lab 2: Raft

简介lab2主要是根据论文 In Search of an Understandable Consensus Algorithm (Extended Version) 做一个复制状态机(replicated state machine)并以此做一个有容错性的存储k/v的分布式系统。思路整个lab2分为ABC三个部分:lab2A主要完成leader election部分,从多个server中选举出一个leader,并让选出的leader周期性地发送心跳包给各follower;lab2B主要完成日志

2021-08-15 11:39:00 916

原创 6.824 Lab 1: MapReduce

lab源地址简介根据MapReduce Paper构造一个MapReduce系统。该系统主要包括master和worker。master主要负责分发任务、处理worker故障;worker主要负责根据map、reduce函数读写文件。思路任务分发:master将需要完成的任务放到通道中,让worker从通道中拿取任务,根据任务类型完成相应的操作。容错:master跟踪每个任务的完成情况,如果一个任务超过一定时间仍未完成,则重新发布该任务。完成情况判断:master直接判断当前目录的目标文件是否存

2021-07-31 14:15:38 377

原创 1115. 交替打印FooBar

题目描述我们提供一个类:class FooBar { public void foo() { for (int i = 0; i < n; i++) { print("foo"); } } public void bar() { for (int i = 0; i < n; i++) { print("bar"); } }}两个不同的线程将会共用一个 FooBar 实例。其中一个线程将会调用 foo() 方法,另

2021-04-30 23:40:42 297 1

原创 Go实现并发缓存

首先用一个例子演示函数记忆:// A Memo caches the results of calling a Func.type Memo struct { f Func cache map[string]result}// Func is the type of the function to memoize.type Func func(key string) (interface{}, error)type result struct { value interface

2021-04-18 21:28:01 457 2

原创 Go设计并发Web爬虫

串行爬虫首先用最简单的方法实现crawler,用串行的方式爬取页面:在这里用广度优先搜索,将搜索到的页面放到一个队列中,每次再从队列中拿出一个页面进行处理。//crawl函数能爬取一个页面的所有链接func crawl(url string) []string { fmt.Println(url) list, err := links.Extract(url) if err != nil { log.Print(err) } return list}func main() {

2021-04-16 23:47:04 329

原创 go自定义排序规则

实现自定义排序规则定义一个结构体及计算其length的函数:type Track struct { Title string Artist string Album string Year int Length time.Duration}func length(s string) time.Duration { d, err := time.ParseDuration(s) if err != nil { panic(s) } return d}样例数据如下:var

2021-04-15 22:17:04 931

原创 HashMap源码浅析

HashMap简介HashMap继承了AbstractMap,实现了Map, Cloneable, Serializable接口:HashMap的一些参数HashMap的默认起始大小为16,最大容量为2^30: /** * The default initial capacity - MUST be a power of two. */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // ak

2021-04-03 12:04:19 84

原创 ucore lab3

练习1:给未被映射的地址映射上物理页(需要编程)本实验要求完成do_pgfault函数,作用给未被映射的地址映射上物理页。具体而言,当启动分页机制以后,如果一条指令或数据的虚拟地址所对应的物理页框不在内存中或者访问的类型有错误(比如写一个只读页或用户态程序访问内核态的数据等),就会发生页错误异常。产生页面异常的原因主要有:1.目标页面不存在(页表项全为0,即该线性地址与物理地址尚未建立映射或者已经撤销);2.相应的物理页面不在内存中(页表项非空,但Present标志位=0,比如在swap分区或磁盘

2021-03-26 23:53:33 197

原创 ucore lab2

练习1:实现 first-fit 连续物理内存分配算法(需要编程)物理页面的结构体如下:/* * * struct Page - Page descriptor structures. Each Page describes one * physical page. In kern/mm/pmm.h, you can find lots of useful functions * that convert Page to other data types, such as phyical addr

2021-03-26 23:52:56 269

原创 ucore lab1

练习1:理解通过make生成执行文件的过程问题一:操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile中每一条相关命令和命令参数的含义,以及说明命令导致的结果)在Makefile中生成ucore.img的代码如下:# create ucore.imgUCOREIMG := $(call totarget,ucore.img)$(UCOREIMG): $(kernel) $(bootblock) $(V)dd if=/dev/zero of=$@ coun

2021-03-26 23:51:48 271

原创 ucore lab7

练习1 理解内核级信号量的实现和基于内核级信号量的哲学家就餐问题在理解信号量之前,先了解等待队列、定时器、关中断。等待队列到目前为止,用户进程或内核线程还没有睡眠的支持机制。在课程中提到用户进程或内核线程可以转入等待状态以等待某个特定事件(比如睡眠,等待子进程结束,等待信号量等),当该事件发生时这些进程能够被再次唤醒。内核实现这一功能的一个底层支撑机制就是等待队列wait_queue,等待队列和每一个事件(睡眠结束、时钟到达、任务完成、资源可用等)联系起来。需要等待事件的进程在转入休眠状态后插入到等待

2021-03-21 18:01:55 289

原创 ucore lab6

练习1: 使用 Round Robin 调度算法(不需要编码)调度框架首先看kern/schedule/sched.h下的sched_class封装了具体的调度算法,他是一个包含一系列函数指针的结构体:// The introduction of scheduling classes is borrrowed from Linux, and makes the // core scheduler quite extensible. These classes (the scheduler modul

2021-03-19 14:21:23 276

原创 ucore lab5

练习1: 加载应用程序并执行(需要编码)execve函数为了将一个新程序读进内存中执行,进程需要系统调用SYS_exec,该系统调用实际会调用do_execve:// do_execve - call exit_mmap(mm)&put_pgdir(mm) to reclaim memory space of current process// - call load_icode to setup new memory space accroding binary pro

2021-03-19 10:53:26 158

原创 ucore lab4

在ucore中进程控制块由proc_struct表示:struct proc_struct { enum proc_state state; // Process state int pid; // Process ID int runs; // the running times of Process

2021-03-17 17:03:25 132

原创 204. 计数质数

204. 计数质数统计所有小于非负整数 n 的质数的数量。思路利用埃筛得到小于n的所有质数:对于每个质数i,剔除所有以它为倍数的数,如质数2,剔除4,6,8,…,然后i++直到得到下一个质数3,再剔除6,9,13,…,最终到达i == n-1退出循环。class Solution { public int countPrimes(int n) { int count = 0; boolean[] isPrime = new boolean[n];

2021-01-05 11:51:34 87

原创 PAT考试总结

pat试题总结遍历问题的总结dfs中,如果是有环的图,要设置visited数组防止绕圈,同时在dfs函数退出前要将visited数组相应设置为false,否则其他路径就不能遍历该结点;在问题中,如果要求“从一个序列中选取若干个元素来满足条件”,可以考虑dfs,如1103 Integer Factorization (30分)和7-1 Forever (20分);字符串处理总结字符串处理中,注意利用sscanf,可以按照格式读取字符串中的数字,如sscanf(s, “The root is

2020-12-08 19:20:18 387 2

原创 7-1 Good in C (20分)

7-1 Good in C (20分)When your interviewer asks you to write “Hello World” using C, can you do as the following figure shows?Input Specification:Each input file contains one test case. For each case, the first part gives the 26 capital English letters A-

2020-07-24 23:04:24 150

原创 7-1 Forever (20分)

“Forever number” is a positive integer A with K digits, satisfying the following constrains:the sum of all the digits of A is m;the sum of all the digits of A+1 is n;the greatest common divisor of m and n is a prime number which is greater than 2.Now

2020-07-23 21:52:43 157 1

原创 1149 Dangerous Goods Packaging (25point(s))

When shipping goods with containers, we have to be careful not to pack some incompatible goods into the same container, or we might get ourselves in serious trouble. For example, oxidizing agent (氧化剂) must not be packed with flammable liquid (易燃液体), or it

2020-07-23 08:55:21 100

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除