Kickstart,我又回来了,今年是校招年了,所以加油吧。
常用语言的时间模块
在相当长的时间里面,与时间相关的库我总是很不熟练,每次用到总要卡一下,慢慢Google,这次索性直接记下来,这样下次遇到我就可以查自己的博客而不是Google了(反正我是不会记在脑子里面的是吧~)。
gRPC配置与用法
本文中介绍了如何配置gRPC和brpc。
C++智能指针的使用与实现
在C++史前时代只有一种智能指针std::auto_ptr<T>
,它的作用方式类似一个lock_guard<T>
,或者经过封装的RAII。但在使用中发现,依托于RAII是不够的,为了方便地实现更复杂逻辑下的资源管理,我们需要从资源的所有权上对智能指针进行更加细致的分类。在C++11之后,标准库引入了std::shared_ptr<T>
、std::unique_ptr<T>
、std::weak_ptr<T>
来替换之前的std::auto_ptr<T>
。
截至目前为止,我基本没怎么用过智能指针,一方面之前做的项目都比较局限,使用RAII或者对象池会更方便,另一方面智能指针和对C风格的兼容性也不是很好,例如很多C风格的代码要求bit-wise而不是member-wise的操作,而智能指针并不是trivial的,而且具有传染性,所以往往适用不了。
【未完待续】
C++历史标准的发展及常见的Workaround和最佳实践
C++历史概述
C++是一门历史悠久的语言,原来叫C with classes,自1979年以来已经出现了98/03/11/14/17五个标准,因此C++中的Workaround和Best practice是随着标准演化而推进的。因此这里首先概览一下C++从开始设计以来的特性的引入、废止与更新的过程,以及对C++11及以后引入的重要特性的一些论述。
csapp data lab
csapp中的lab非常出名,在这篇文章中我主要记载第一部分,也就是data lab的解法。所有lab的源码在我的Github上。在知乎的一篇文章中记录了一些和二进制处理相关的内容,我觉得也是非常好的学习材料
B树
B树的设计目的是减少磁盘存取,而不是诸如BST、RBT、AVL一样试图减少比较次数。根据局部性原理,当一个数据被访问时,那么它附近的数据很大概率会马上被访问,因此我们可以一同将其加载。这个原理常常被用在存取速度不同的两个设备间,如寄存器与主存(多级缓存)以及数据库系统中出现的磁盘与内存的情况。B树相对于一般的平衡BST的特点是高度低、出度大、节点大。一个高度低的树能有效减少检索磁盘的次数。一个具有较大的分支因子的树可以减少$k*log(n)$的常数$k$,其中$n$是总关键字数,也能减少磁盘存取。特别地,B树的节点设计不仅要考虑到容纳尽可能多的节点,也要同时考虑到从磁盘加载的便利性。
C++ atomic 库
因为《并发编程重要概念及比较》文章过长,所以将其中无锁队列部分拆出来。
Lockfree Queue
因为《并发编程重要概念及比较》文章过长,所以将其中无锁队列部分拆出来。
并发编程重要概念及比较
在本篇中比较了各种并发、并行技术。
并发(concurrency) 强调的是逻辑上的同时发生,是语义上的模型(semantic model),在实际上并发程序可能是由一个处理器同时(simultaneously)处理多个任务,因此并发过程中常出现一个线程等待其他资源的情况。此时常伴随着线程的阻塞和调度。并发过程通常可划分为多个级别:Blocking、Obstruction-Free、Lock-Free、Wait-Free,其中后三种统称为Non-blocking的。
并行(parallelism) 属于并发,是运行期的行为(runtime behavior),并行强调这两个并发事件实际上也是同时发生的,例如在多个处理器上运行的多个任务。但我们不能讲这两个概念绝对化,例如在处理器层面,流水线绝对是并发的,但在操作系统之上提供的机制来说,却体现出顺序的特性。
【未完待续】