摘要: golang中的gc采用三色标记法。在讲三色标记法之前,先了解一下Mark and Sweep算法,因为Mark and Sweep算法是三个标记法的一个改进版。 Mark and Sweep算法: 停止运行程序,遍历所有被引用的变量,被引用的对象被标记为“被引用”,没有被标记的进行回收。内存单元并 阅读全文
posted @ 2019-06-15 14:05 guhowo 阅读(5226) 评论(0) 推荐(0) 编辑
摘要: redis支持的数据类型较多,有如下几种: 1、string 底层实现是sds 2、list 底层数据结构是双向非循环列表。 3、Hash 4、set 5、sorted set 6、pub/sub 7、Transaction 阅读全文
posted @ 2019-05-14 00:06 guhowo 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 写在最前面 select为golang提供了多路IO复用机制,和其他IO复用一样,用于检测是否有读写事件是否ready。 本文将介绍一下golang的select的用法和实现原理。 实现原理 golang实现select的时候,实际上为每一个case语句定义了一个数据结构,select语句块执行的时 阅读全文
posted @ 2019-03-10 23:01 guhowo 阅读(5906) 评论(2) 推荐(0) 编辑
摘要: goroutine背后的系统知识 http://www.sizeofvoid.net/goroutine-under-the-hood/ 下周写完 阅读全文
posted @ 2018-10-29 01:27 guhowo 阅读(257) 评论(0) 推荐(0) 编辑
摘要: 对于一个接口来讲有:实现者和使用者。 传统的面向对象都是实现者实现接口,然后告诉大家接口规范(传餐和返回);而golang比较特别,是使用者们去分别实现符合自己需求的各自的接口方法的。而C++是实现者通过模版去实现适合各种调用者的方法的。golang这样设计非常灵活。 阅读全文
posted @ 2018-08-05 23:56 guhowo 阅读(523) 评论(0) 推荐(0) 编辑
摘要: 在讨论之前,先看如下代码: 上面这段代码createNode函数返回了一个局部变量的地址给main函数中的root,但是fmt.Println正常打印出来了新建的node的内容。这要是在C++中这么写,是个很典型的错误:返回局部变量的地址,该地址的内容在函数退出后会被自动释放,因为是在栈上的。 那么 阅读全文
posted @ 2018-08-04 11:04 guhowo 阅读(2274) 评论(0) 推荐(2) 编辑
摘要: 基本操作: 1、设置set k1 v1 2、选择库 select no. 3、删除对应的k-v: delete k1 4、删除当前库flushdb 5、删除所有库flushall 6、设置key的过期时间:expire keyname seconds 常用数据类型:五大 1、string:简单的k- 阅读全文
posted @ 2018-06-02 22:39 guhowo 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 何为右值? 下面两行代码中i是左值,10是右值;v是左值,getVar()返回的是个临时变量,也是右值,改临时变量在改行表达式结束后消失。 左值的特征,我的理解是能取地址的是左值,不能取指,生存周期仅限于某个表达式的是右值,如上面的10,我们是取不到地址的,因为该行表达式结束后变量即被释放,即使取址 阅读全文
posted @ 2018-05-26 00:57 guhowo 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 1、forwarding reference 2、move 3、 map的内部实现 rb tree,但rbtree优点是什么?使用情况?和b+有啥区别? 4、顺序容器和关联容器的区别: 本质区别是顺序容器是根据数据在容器中的顺序(位置)访问元素的,而关联容器是通过key访问元素的,如set,map, 阅读全文
posted @ 2018-05-25 00:45 guhowo 阅读(82) 评论(0) 推荐(0) 编辑
摘要: Go 中的 interface 所具有的最基本的功能:作为一种 abstract type,实现各种 concrete type 的行为统一。 interface是一种类型。只有是实例化后才能调用interface中的方法,没毛病。 interface的定义 基本形式如下; interface内部由 阅读全文
posted @ 2018-05-18 20:48 guhowo 阅读(463) 评论(0) 推荐(0) 编辑
摘要: 值类型: int/uint :根据系统确定是32还是64位。此外还有int8/uint8、int16/uint16、int32/uint32、int64/uint64 byte:字节型,相当于uint8。 float:go语言中没有double型,因为已经有了float32/float64,分别精确 阅读全文
posted @ 2018-05-13 22:47 guhowo 阅读(1062) 评论(0) 推荐(0) 编辑
摘要: ET模式下,需要循环从缓存中读取,直到返回EAGAIN没有数据可读后,一个被通知的事件才算结束。如果还读取过程中,同一个连接又有新的事件到来,触发其他线程处理同一个socket,就乱了。EPOLL_ONESHOT就是用来避免这种情况发生的。将事件设置为EPOLL_ONESHOT后,每次事件触发后就会 阅读全文
posted @ 2018-03-29 21:50 guhowo 阅读(811) 评论(0) 推荐(0) 编辑
摘要: ZeroTierOne: 1、ZeroTierOne的架构 2、ZT的多线程和多进程(使用的线程池,怎么实现,为什么) 3、使用到的设计模式(Topology是单例模式,。。。工厂模式。。抽象工厂模式) 4、如何着手开源项目(review源码->注释掉加密压缩函数->抓包->对着代码分析报文格式-> 阅读全文
posted @ 2018-03-22 23:26 guhowo 阅读(182) 评论(0) 推荐(0) 编辑
摘要: https://www.cnblogs.com/yuuyuu/p/5103744.html 这篇文章已经写的很清楚了,暂时不展开论述了。 http://blog.csdn.net/weiyuefei/article/details/52242867 阅读全文
posted @ 2018-03-20 23:58 guhowo 阅读(212) 评论(0) 推荐(0) 编辑
摘要: epoll项目中用了几次,但是对于其原理只是一知半解。我希望通过几篇blog能加深对她的理解。 我认为epoll是同步IO,因为他在调用epoll_wait时,内核在有I/O就绪前是阻塞的,虽然可以将timeout设置为0,此时就是非阻塞的了。但这不是变成忙轮询了么? select和epoll的比较 阅读全文
posted @ 2018-03-18 23:18 guhowo 阅读(1240) 评论(0) 推荐(1) 编辑
摘要: 写一下我自己的理解。 阅读全文
posted @ 2018-03-18 23:17 guhowo 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 条件变量(二)这边文章主要纠结了pthread_cond_wait(&cond,&mutex)函数以及为何判断条件时要用while而不是if。 本文还想弄清楚另外两个关于pthread_cond_signal(&cond)的问题: 1、先改变条件值还是先调用pthread_cond_signal? 阅读全文
posted @ 2018-03-16 23:34 guhowo 阅读(254) 评论(0) 推荐(0) 编辑
摘要: 条件变量是用来等待某个条件是否成立的等待原语。主要有两个函数: 1、 pthread_cond_signal(&cond) :用来发送信号,唤醒正在wait()ing的线程。要搞清楚这里所谓唤醒,要知道其实线程中有两个队列cond_wait和mutex_lock。signal的唤醒只是将cond_w 阅读全文
posted @ 2018-03-15 23:59 guhowo 阅读(304) 评论(0) 推荐(0) 编辑
摘要: 从长链接说起 TCP是长链接的,也就是说连接建立后,及时数年没有通信连接仍然存在。这样做的好处是:免去了DNS解析的时间,连接建立等时间,大大加快了请求的速度,同时也有利于接受服务器的实时消息。但前提是连接可用。 TCP的keepalive机制 服务器为了探测对端是否还活着,于是每隔两小时发送一个k 阅读全文
posted @ 2018-03-14 00:29 guhowo 阅读(352) 评论(0) 推荐(0) 编辑
摘要: 互斥器mutex用来排他性的访问共享数据,他不是等待原语。若要等待某个条件成立,我们应该使用条件变量(condition variable)。条件变量顾名思义就是一个或多个线程等待某个布尔表达式为真,即等待别的线程唤醒它。 条件变量只有一种使用方式,wait端: 1、必须与Mutex一起使用,以保护 阅读全文
posted @ 2018-03-12 23:55 guhowo 阅读(703) 评论(0) 推荐(0) 编辑