自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Lyn&Xx

勤奋小李(•̀ᴗ•́)و ̑̑

  • 博客(100)
  • 收藏
  • 关注

原创 k8s中pod存在的意义

概念介绍k8s:Kubernetes 一个容器编排工具(以pod为单位进行编排)容器 :进程级别的虚拟化技术,常和虚拟机进行对比,它的容器更加轻量。虚拟机是硬件级别的隔离,拥有自己独立的内核和操作系统;而容器采用cgroup限制资源,namespace限制网络环境等,和本机共享内核等资源。pod:k8s中创建和管理的最小计算单位,由一组紧密关联的容器组成,这些容器共享存储、网络、一级怎么样运行这些容器的声明。它是k8s中最重要的核心概念之一。pod为什么存在?Q:为什么k8s不直接使用容器作

2021-07-29 10:43:21 744

原创 关于Golang make关键字的二三事

关于Golang make关键字的二三事make的介绍make的作用是初始化内置的数据结构,切片、哈希、管道它的使用方式无非是//初始化切片 s := make([]string, 0, 10)//初始化map(map必须初始化后使用)m := make(map[string]string, 10)make的原理make严格意义上来说是golang提供给开发者的语法糖,在编译期间,make会被替换为具体的特性函数。 case OMAKE: ar

2021-04-20 20:36:05 1136 1

原创 关于Golang数组的要点

关于Golang数组的要点文章目录关于Golang数组的要点初始化要点数组的访问要点总结初始化 a := [3]int{1,2,3} b := [...]int{1,2,3}要点数组在内存中为一片连续空间。数组一旦创建,长度不可变。使用...的方式创建数组,在编译阶段会进行推导,即遍历一次数组,会提前转换为a的形式;运行时没有差别。在编译阶段,当数组长度小于4,则直接在栈中初始化;数组长度大于4,在静态区初始化后,运行时拷贝到栈中。(原因猜测:栈中初始化速度慢)数组的访

2021-04-12 14:59:30 410

原创 Golang map 并发读写问题源码分析

map介绍及问题描述map主要用来存储kv数据,其底层使用的是开链法去冲突的hashtable,拥有自动扩容机制。使用map最方便的一点是可以O(1)快速查询(目前slice并没有提供查询接口,只能通过自己写算法实现某个元素是否存在)。map虽然好用,但是可能不适用。但是map有一个非常致命的坑点,在并发场景下,并发读/写都可能会出现fatal error:concurrent map read and map write的错误,刚开始使用map的时候天真的认为只要不对同一个key进行并发操作就行,但

2020-08-18 09:10:13 2924

原创 Golang Slice

Slice介绍Slice也叫做切片,是golang中最为常用的一个结构之一,跟数组相比,它更加灵活便利,拥有自动扩容策略,但是也存在着一些比较容易被忽略的坑点,文章会先介绍Slice的基本使用方式,接着会介绍Slice的内部实现,最后会总结一些我遇到过的坑点(这一点可能会持续更新)~使用方式Slice切片初始化slice的初始化和数组的初始化方式特别相似,但是这是两种完全不同的数据结构,数组的容量大小是不允许被调整的。//slice的初始化s2 := []int{}s3 := []int{1,

2020-07-09 11:54:53 295

原创 跳台阶/变态台阶之多种解法

跳台阶/变态台阶之多种解法一句话总结动态规划Those who cannot remember the past are doomed to repeat it.不吸取过去教训的人注定要重蹈覆辙很多人听闻动态规划就生畏(我也是),动规其实就像上面那句话,它的过程是每次决策依赖于当前状态,所以动规的重点是找出其状态转移方程。跳台阶一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳...

2019-09-05 11:40:52 358

原创 为什么模板不支持分离式编译?

概念了解分离式编译一个项目由若干个源文件共同实现,而每个源文件(.cpp)单独编译成目标文件(.obj),最后将所有目标文件连接起来形成单一的可执行文件(.exe)的过程。编译过程预处理–》编译–》汇编–》链接预处理阶段头文件展开、条件编译指令、宏替换编译阶段将第一步产生的文件同其他文件一起编译成汇编代码汇编阶段将汇编源码转换成可重定位目标文件链接阶段进行符号解析和重定位...

2019-08-22 16:29:54 624

原创 简单推荐架构模型介绍

简单推荐架构模型介绍前言推荐是视频、购物等软件中必不可少的一部分,推荐产品的质量,用户满意程度上决定了用户的留存率。推荐架构涉及到的东西很多,博主目前知识储备仍浅薄,下面主要介绍一下常规的推荐架构模型。模型介绍APP中的数据向主要有三个,日志、feed流、发表的新视频,这些数据流向了不同的地方,发挥了不同的作用。king logic可以简单理解为推荐的上游日志这部分其实是推荐架构...

2019-07-12 18:51:29 767

原创 TCP三次握手、四次挥手及特殊情况总结

TCP三次握手、四次挥手及特殊情况总结前言TCP协议是一个非常重要的传输层协议,它是一个基于连接的、具有可靠性的数据流协议。TCP三次握手流程发送方向接受方发送SYN,进入SYN_SENT阶段。接受方收到后若接受连接请求,向发送方发送SYN ACK,进入SYN_RCVD阶段。发送方收到后,向接受方发送ACK,进入ESTABLISHED阶段。接受方收到ACK后进入ESTABLIS...

2019-07-12 17:11:51 799 1

原创 解决python3.* 安装后使用 pip3出现 Can't connect to HTTPS URL because the SSL module is not available问题

解决python3.* 安装后使用 pip3出现 Can’t connect to HTTPS URL because the SSL module is not available问题博主使用的linux是centos7前言博主在安装了python3.6后使用pip3安装redis,结果报错 Can’t connect to HTTPS URL because the SSL module...

2019-04-24 19:15:54 10326 1

原创 LevelDB源码阅读-key

levelDB中的key前言在levelDB中有五种不同的key,在正式分析memtable之前我们先介绍一下这5中不同的keyuser_keyParsedInternalKeyInternalKeyLookupKeyMemtableKeyuser_key(用户key)user_key是Slice结构体来表示的,其内部就是简单封装了字符串和它的size。顾名思义,这个key...

2018-12-24 10:46:04 774

转载 LevelDB源码阅读-coding

LevelDB源码阅读-coding原文:https://blog.csdn.net/caoshangpa/article/details/78815940LevelDB默认使用的是小端字节序存储,低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。编码分为变长的EncodeVarint和固定大小的EncodeFixed两种,每种又分32位和64位。一.EncodeFixedvo...

2018-12-19 17:47:59 345

原创 levelDB源码阅读-内存池arena

levelDB源码阅读-内存池arena前言直接使用系统调用分配内存是非常不明智的频繁调用malloc/new是非常耗时的,且系统需要根据一些算法在内存空闲块表中查找可能会产生大量的内存碎片如果使用不细心也很容易造成内存泄漏采用内存池,预先申请一块比较大的空间供申请,可以根据程序的实际需要指定申请的规则,并且对这些内存资源统一管理。使用内存池的好处申请内存的时间会更快,直接在...

2018-12-18 16:44:29 265

原创 levelDB源码阅读-skiplist跳表下

levelDB中的skiplist跳表 下前言在跳表 上 中介绍了跳表的基本结构,接下来将要介绍跳表的迭代器和其内部实现的方法。Iterator -跳表的迭代器跳表的迭代器实现非常简单,调用了跳表内部的一些实现方法。 // Iteration over the contents of a skip list class Iterator { public: // In...

2018-12-17 11:15:29 332

原创 levelDB源码阅读-skiplist跳表 上

levelDB中的skiplist跳表 上前言在之前的博客中已经简要介绍了跳表的原理,接下来将介绍跳表在levelDB中的实现。本小节主要讲一下跳表和其Node的实现结构,关于具体的方法将在下一节中讲到。代码位置:leveldb-master/db/skiplist.h深入源码skiplist结构template<typename Key, class Comparator&g...

2018-12-17 10:22:45 417

原创 SkipList 跳表的原理

SkipList 跳表的原理前言在各类数据结构中,实现的方式无非两种,数组/链表,跳表是一种基于链表改进的数据结构,能够实现快速查找;levelDB中便用到了它。跳表是平衡树的一种替代的数据结构,但是和红黑树不同的是,跳表对于树的平衡的实现是基于一种随机化的算法也就是说跳表的插入和删除工作是比较简单的。接下来我们将了解跳表的实现原理。跳表的结构以下是一个普通的链表,假设我们需要访问...

2018-12-16 14:41:08 633

转载 levelDB的LSM文件树

前言下面是一篇转自简书的文章,介绍了leveldb所使用的LSM算法。作者:散入风中链接:https://www.jianshu.com/p/d578495f8557來源:简书LSM文件树是基于Bigtable思想用于levelDB数据库(google两位重量级架构,Jeff Dean和Sanjay Ghemawat所发起的开源数据库)的一个存储结构,在这里做一个简单的理解。LSM文件...

2018-12-15 19:15:38 629

原创 http请求报文和响应报文

http请求报文和响应报文前言http协议是一个应用层协议,其报文分为请求报文和响应报文当客户端请求一个网页时,会先通过http协议将请求的内容封装在http请求报文之中,服务器收到该请求报文后根据协议规范进行报文解析,然后向客户端返回响应报文。http报文结构为:起始行对报文进行描述头部向报文中添加了一些附加信息,是一个名/只的列表,头部和协议配合工作,共同决定了客户端和服务器...

2018-12-11 13:42:30 55232 1

原创 TCP拥塞控制算法(Tahoe/Reno/Newreno)

TCP拥塞控制算法(Tahoe/Reno/Newreno)前言TCP(Transmission Control Protocol),传输控制协议,是目前__Internet__上最重要的一个通信协议之一,其作用是对数据的传输进行一定的控制;而拥塞控制算法又是TCP中最重要的一个算法之一,接下来我们先来了解一下基本概念,再来详细介绍3个协议中的拥塞控制算法以及他们之间的区别。前期知识储备及名词...

2018-12-10 21:23:43 25705 6

原创 epoll的两种工作模式LT ET

epoll的两种工作模式LT ET前言之前已经介绍过了epoll的工作机制,以及它和select,poll之间的区别,传送门:https://blog.csdn.net/lyn_00/article/details/84839673接下来我们详细介绍一下它的两种工作模式。LT(level triggered)LT模式,也叫做水平触发模式。在该模式下,当有事件发生并调用epoll_wait...

2018-12-10 17:31:08 2596

原创 select、poll、epoll之间的区别

select、poll、epoll之间的区别前言在之前的博客中介绍了五种I/O模型(阻塞,非阻塞,多路复用,信号,异步)。https://blog.csdn.net/lyn_00/article/details/84780288select、poll和epoll是三种实现I/O的机制,本质上他们都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的。下...

2018-12-05 17:09:35 752

原创 几种常见进程间通信(IPC)方式之信号

几种常见进程间通信(IPC)方式-信号前言进程间通信是指在不同进程之间传播或交换信息,在Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间,进程之间不能相互访问。必须通过内核才能进行数据交换。如图:常见的通信方式有以下几种:管道pipe有名管道FIFO消息队列MessageQueue共享存储信号量Semaphore信号Signal套接字Socket...

2018-12-04 17:23:05 3060

原创 几种常见进程间通信(IPC)方式之共享存储

几种常见进程间通信(IPC)方式-共享存储前言进程间通信是指在不同进程之间传播或交换信息,在Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间,进程之间不能相互访问。必须通过内核才能进行数据交换。如图:常见的通信方式有以下几种:管道pipe有名管道FIFO消息队列MessageQueue共享存储信号量Semaphore信号Signal套接字Socket...

2018-12-04 15:30:25 32430 1

原创 五种I/O模型

五种I/O模型引入我们知道,为了操作系统安全性等考虑,进程是无法直接操作I/O设备的,必须通过系统调用请求内核协助完成I/O操作。如图I/O操作中的阻塞、非阻塞、同步、异步阻塞:阻塞就是调用一个函数,这个调用没有得到结果之前,执行这个函数的线程会被挂起。非阻塞:是指一个函数不能立刻得到结果,这个函数不会阻塞该线程而立即返回。同步:这个词的可能会造成一些误解,同步实际上是协同步调,...

2018-12-03 21:50:52 377

原创 几种常见进程间通信(IPC)方式之有名管道FIFO

几种常见进程间通信(IPC)方式-有名管道FIFO前言进程间通信是指在不同进程之间传播或交换信息,在Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间,进程之间不能相互访问。必须通过内核才能进行数据交换。如图:常见的通信方式有以下几种:管道pipe有名管道FIFO消息队列MessageQueue共享存储信号量Semaphore信号Signal套接字So...

2018-12-03 19:00:22 626

原创 几种常见进程间通信(IPC)方式之管道pipe

几种常见进程间通信(IPC)方式-管道pipe前言进程间通信是指在不同进程之间传播或交换信息,在Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间,进程之间不能相互访问。必须通过内核才能进行数据交换。如图:常见的通信方式有以下几种:管道pipe有名管道FIFO消息队列MessageQueue共享存储信号量Semaphore信号Signal套接字Sock...

2018-12-03 16:48:53 3681 3

原创 SGISTL源码阅读二十七 基本算法 (stl_algobase.h)

SGISTL源码阅读二十七 基本算法 (stl_algobase.h)前言SGISTL将一些基本常用的算法定义于stl_algobase.h中,其他的一些算法定义于slt_algo.h中,下面我们分析stl_algobase.h中的一些算法。深入源码__iter_swap&&swap//交换两个迭代器//版本1template <class ForwardIt...

2018-11-19 13:05:56 283

原创 SGISTL源码阅读二十六 数值算法 (stl_numeric.h)

SGISTL源码阅读二十六 数值算法 (stl_numeric.h)前言上一篇博客我们简要介绍了一下STL中的算法,所有的数值算法都是放在<stl_numeric.h中的。深入源码accumulate该算法是做累加操作,将指向范围的元素累加到init上,并且将init作为返回值返回,若init为0,则是计算迭代器指定范围值的累加和。要求迭代器类型至少为InputIterator/...

2018-11-19 11:21:35 316

原创 SGISTL源码阅读 算法 前言

SGISTL源码阅读 算法 前言STL有六大组件,我们已经分析了空间配置器、迭代器和容器,现在将进入对算法的学习。STL中实现了很多极具复用价值的算法,排序(sorting),查找(searching),排列组合(permutation),用于数据移动、复制、删除、比较、组合、运算等的算法。所有STL算法都作用在由迭代器[first,last)所标示出来的范围内,在进入正式分析算法之前,我们先...

2018-11-19 10:04:11 313

原创 SGISTL源码阅读 map与hash_map之间的区别

SGISTL源码阅读 map与hash_map之间的区别前言之前我们已经学习过了这两种关联式容器,他们可以用来存放键值对,并且不可存放重复键值(因为内部调用了insert_unique),他们所提供的很多插入删除方法也是非常类似的。现在我们来分析一下他们之间的区别。我们知道map的底层容器是红黑树,hash_map的底层是hashtable,所以他们之间的区别主要是由他们底层的容器来带的,...

2018-11-17 11:08:54 313

原创 SGISTL源码阅读二十五 hash_map 关联式容器

SGISTL源码阅读二十五 hash_map 关联式容器前言前面我们已经分析了底层容器为红黑树的map和hashtable,而接下来我们要分析的hash_map,其底层容器为hashtable。深入源码hash_map的定义部分#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class Key, class T, class H...

2018-11-16 20:43:10 186

原创 SGISTL源码阅读二十四 hash_set 关联式容器

SGISTL源码阅读二十四 hash_set 关联式容器前言前面我们已经分析了set和hashtable,set的底层容器是红黑树,而接下来我们要分析的hash_set,是底层为hashtable的集合。深入源码hash_set的定义部分#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class Value, class Has...

2018-11-14 21:26:13 151

原创 SGISTL源码阅读二十三 hashtable下

SGISTL源码阅读二十三 hashtable下前言之前介绍了hashtable的基本结构和它的构造方法,现在我们继续来学习它的迭代器和一些常用方法。深入源码hashtable的迭代器//迭代器的声明template <class Value, class Key, class HashFcn, class ExtractKey, class EqualKe...

2018-11-14 20:08:57 198

原创 SGISTL源码阅读二十二 hashtable上

SGISTL源码阅读二十二 hashtable上前言hashtable的部分基本知识hashtable,哈希表,也可称为散列表。哈希表用于以常数平均时间执行插入、删除和查找操作,每个关键字按照某种规定被映射到从0-TableSize-1这个范围中的某个数,并且被放到适当的单元中。时间复杂度可以达到常数级别听起来让人觉得很兴奋,但是它也是需要付出代价的,哈希表的一个最重要的问题就是解决冲突...

2018-11-14 17:41:30 230

原创 SGISTL源码阅读二十一 piar的实现

SGISTL源码阅读二十一 piar的实现前言在之前set和map的学习中,我们已经见过了pair,它的作用就是把一对值封装成一个。而且这一对值可以是不同数据类型的,对于set和map来说是绝佳的选择。深入源码pair的定义及拷贝构造函数template <class T1, class T2>struct pair { //声明别名 typedef T1 firs...

2018-11-14 15:45:51 219

原创 SGISTL源码阅读二十 map关联式容器

SGISTL源码阅读二十 map关联式容器前言map是一种关联式容器,底层同样是红黑树实现的,所有的元素都会根据元素的键值自动被排序。map中所有的元素pair,pair将两个数据合成一个,将pair的第一个值视为键值,第二个值视为实值,非常符合key``````value的要求。我们知道set保证了数据的唯一性,map也一样,在map中不允许两个元素拥有相同的键值。深入源码map的定义...

2018-11-14 15:23:45 418

原创 SGISTL源码阅读十九 set关联式容器

SGISTL源码阅读十九 set容器前言之前我们已经分析了vector,list,deque三个容器。如果按照“数据在容器中的排列”特性,容器可以分为序列式(sequence)和关联式(associative)两种,前面学习过的三种容器都是序列式容器。接下来我们将学习关联式容器。标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体muiltiset(多键集合...

2018-11-14 13:20:03 247

原创 SGISTL源码阅读十八 queue(队列)

SGISTL源码阅读十八 queue(队列)前言和上一篇文章提到过的stack一样,queue也是一种配接器(adapter),它们的实现非常类似。它是一种(First In First Out,FIFO)的数据结构,也没有提供遍历或指定位置访问等操作,只能从末端添加元素,顶部取出元素,所以它也没有迭代器。深入源码queue的定义部分#ifndef __STL_LIMITED_DEFA...

2018-11-14 11:01:57 254

原创 SGISTL源码阅读十七 stack(栈)

SGISTL源码阅读十七 stack(栈)前言前面我们已经学习了序列式容器vector,list和deque。本次要进行分析的是stack,它是一种先进后出(First In Lat Out,FILO)数据结构,在学习数据结构的时候应该都接触过,在这里stack是一个配接器(adapter),它默认以deque容器作为它的底部结构实现。接下来我们深入源码进行学习。配接器具有这种“修改某...

2018-11-14 10:32:01 386

原创 SGISTL源码阅读十六 deque容器下

SGISTL源码阅读十六 deque容器下前言通过之前的学习我们对deque已经有了一个比较深入的了解,如图所示:接下来将继续学习deque的相关操作深入源码插入操作向deque末尾插入一个元素void push_back(const value_type& t) { //如果deque还有足够的容量 if (finish.cur != finish.last - ...

2018-11-13 22:45:54 188

空空如也

空空如也

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

TA关注的人

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