CHuiL

go二级线程模型实现

go学习记录

PMG介绍 G: .表示Goroutine,每个Goroutine对应一个G结构体,G存储Goroutine的运行堆栈、状态以及任务函数,可重用。G并非执行体,每个G需要绑定到P才能被调度执行。 P: Processor,表示逻辑处理器, 对G来说,P相当于CPU核,G只有绑定到P(在P的local runq中)才能被调度。对M来说,P提供了相关的执行环境(Context),如内存...

go slice的一些坑

go学习记录

slice其实是具有一个包含指向连续内存区域的指针,表示当前元素个数的整形变量和当前切片能够容纳的元素个数的整形变量的结构体 赋值操作仅仅是开辟一个新的指针指向同一片内存空间。并赋值元素个数和从指针位置开始算起到末尾的容量。 容量在我看来,就是预先留好的空间。不足就要扩容。 appen时的问题,如果一个数组array:=[4]int{10,20,30,40} slice:=array[1...

服务器程序设计范式

单进程单线程使用select同时监听多个socket文件描述符 大致的处理过程就是将监听和其他客户已连接socket都放入到select的set中,然后阻塞等待文件描述符就绪; 一旦返回,便返回就绪的个数,就绪后就要依次判断是否是监听文件描述符就绪,是的话就从中取出新建立的socket,设置进set中以便监听,同时设置进本地保存的客户数组; 如果是连接的socket,则依次遍历客户数组,找出...

TCP Socket连接原理

connect() 在调用connect()函数的时候,会激发TCP三次握手,直到成功或者失败了才会返回,而且返回的失败中有 1、超时 2、收到RST(复位)响应,表示服务主机没有对应的端口进程在等待连接,硬错误; 3、若收到ICMP的主机不可达错误,是会想保存该错误信息然后当作超时处理在重新发送SYN分组,因为该错误时可能被修复的; 非阻塞connetc() 由于conncet()调用后...

从2-3树到红黑树

应用场景 c++中用来实现map和set的数据结构 Java中实现HashMap,TreeMap Linux内核中完全公平调度器,大量实时计算程序 从2-3树查找树说起 2-3树指的是树的节点是由2-节点或3-节点组成的;所谓2-节点指的是该节点有1个值,两条链;3-节点就是有2个值,3条链; 如下图,3-节点中,两个值是左边小于右边,最左边的链接链的节点表示小于3-节...

redis数据类型底层编码原理

redisObject 对象:redis中使用对象来表示键值对,底层结构都是redisObject typedef struct redisObject { unsigned type:4; //对象类型,有五种 unsigned encoding:4; //对应的编码方式 unsigned lru:LRU_BITS; /* LRU time (relative t...

go 读写锁源码分析

go学习记录

mutexLocked = 1 << iota // mutex is locked mutexWoken mutexStarving mutexWaiterShift = iota go中的读写锁 type RWMutex struct { w Mutex // held if there are pending writers(写者锁) ...

redis中的数据结构—跳跃表

底层原理 跳跃表:可以实现链表O(logN)的时间复杂度找到插入位置;空间复杂度为O(N)比一般的链表要多额外的存储空间来存储索引节点; 以下是redis中跳跃表的结构 typedef struct zskiplistNode {//跳跃表节点 sds ele; //值,sds结构 double score; //分数,根据分数来排序 struct zskiplist...

redis持久化原理

RDB持久化 RDB是保持在硬盘中的经过压缩的二进制文件; 触发机制 SAVE命令 save命令是同步命令,其他客户端会阻塞等待save命令执行完成; bgsave命令 bgsave是异步命令,会fork一个子进程去执行save操作(fork时会阻塞,不过时间很短),redis服务器进程则继续响应请求; 自动触发 配置”save m n “表示在m秒内有n次修改时自动触发bg...

redis中的数据结构—压缩列表

压缩列表的结构如下图 他是一系列特殊编码的连续内存块组成的顺序型数据结构,即将一系列数据与其编码信息存储在一块物理上连续的内存空间上,但是逻辑上确是分作多个部分,其目的是在一定可控的时间复杂度读条件下尽可能的减少不必要的内存开销,从而达到节省内存的效果; 当列表键和哈希键只包含少量的项并且每个列表项要么是比较小的整数值或者比较短的字符串时,就会使用压缩列表; 节点结构如下 type...