摘要: time.After golang实现计时器: 可能遇见的问题: 到时间才释放对应的内存(如果没有主动关闭,退出函数时不会立即释放) func () { select { case b := 阅读全文
posted @ 2018-12-14 16:39 Przz 阅读(518) 评论(0) 推荐(0) 编辑
摘要: base 字典: 在redis字典中值只能是字符串,使用渐进式进行rehash。在rehash的过程中,会保留两个hash结构;查询时会同时查询两个结构;逐渐完成hash的迁移。 如果大部分时候使用结构中的大部分数据,可以选择将整个结构序列化,使用string类型存储。 如果大部分时候使用结构中的小 阅读全文
posted @ 2018-08-29 17:33 Przz 阅读(231) 评论(0) 推荐(0) 编辑
摘要: 在 Go 中使用命名返回变量捕获 panic 在下面代码中,如果pressButton发生panic,那么不会执行到return err,导致返回的err是nil。 可以使用命名返回变量解决,即使我们从未触碰到 doStuff 函数的末尾的返回语句,也会立刻返回这个 err 变量。 重新切片(sli 阅读全文
posted @ 2018-08-22 17:30 Przz 阅读(267) 评论(0) 推荐(0) 编辑
摘要: 转载: 突然想到epoll的内核实现,但是有点不明白设置了回调函数添加到等待队列后是如何唤醒的。所以找到了这篇文章。 Linux将进程状态描述为如下五种: :可运行状态。处于该状态的进程可以被调度执行而成为当前进程。 :可中断的睡眠状态。处于该状态的进程在所需资源有效时被唤醒,也可以通过信号或定时中 阅读全文
posted @ 2017-05-29 17:29 Przz 阅读(429) 评论(0) 推荐(0) 编辑
摘要: 1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。 2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。 3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域.data,未初始 阅读全文
posted @ 2017-05-19 12:11 Przz 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap: 1.brk是将数据段的(.data)的最高地址指针_edata往高地址推 2.mmap是虚拟地址空间找一个空闲的虚拟内存 如果malloc 阅读全文
posted @ 2017-05-19 12:08 Przz 阅读(382) 评论(0) 推荐(0) 编辑
摘要: 在学习内核之前,因为虚拟内存的关系看过这篇文章,但是有的地方不是很懂。 现在对内核学习一段时间后,感觉这篇博客不错。 虚拟内存: 第一层理解 1.每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构 2.一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到 阅读全文
posted @ 2017-05-19 10:17 Przz 阅读(4000) 评论(0) 推荐(0) 编辑
摘要: 买了《深入Linux内核架构》这本书准备了解一下linux内核机制。但是最开始看了十几页感觉看着很累,本来都准备弃了 过了段时间看见一个面经有linux内核的内容,于是就照着那个先把内存管理学习了下。静下心来看发现这本书还是不错,我跳过了很多细节部分,先对内核管理有个大致了解。 水印+冷热页+伙伴系 阅读全文
posted @ 2017-05-19 10:12 Przz 阅读(460) 评论(0) 推荐(0) 编辑
摘要: ps:参考了很多博客,但是当时没记下链接。。。 互斥器和条件变量用法如下: 上面那个while能换成if吗?答案是不能,否则会导致spurious wakeup虚假唤醒。因为不仅要在pthread_cond_wait前要检查条件是否成立,在pthread_cond_wait之后也要检查。因为pthr 阅读全文
posted @ 2017-05-19 09:56 Przz 阅读(388) 评论(0) 推荐(0) 编辑
摘要: 在create后会创建eventpoll对象保存在一个匿名fd的file struct的private指针中,然后进程睡在等待队列上面。 对于等待的fd,通过poll机制在准备好之后会调用相应的call_back函数。在函数中将当前fd加入对应eventpoll的队列中。 然后唤醒等待队列上面的进程 阅读全文
posted @ 2017-05-19 09:54 Przz 阅读(1208) 评论(0) 推荐(0) 编辑