- 博客(41)
- 资源 (1)
- 收藏
- 关注
原创 zookeeper中的一致性协议zab
关于一致性协议说起分布式一致性协议的始祖,就不得不提到larmport大师发表的< The Part-Time Parliament>论文,但在这个论文中描述的paxos算法很长时间只停留在理论阶段,在实际的工程中又出现了很多的变种。Zookeeper的ZAB,Viewstamped Replication(VR),raft,multi-paxos,这些都可以被称之为Leader-...
2018-03-21 23:46:41 371
转载 CAS原理
转自:http://leexuehan.github.io/2015/09/03/CAS-%E5%8E%9F%E7%90%86/CASCAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。下面请先看一个简单的计数器的例子:class Counter { private int value; public sync
2017-09-26 14:25:51 372
转载 红黑树插入与删除
特性(1) 每个节点或者是黑色,或者是红色。 (2) 根节点是黑色。 (3) 每个叶子节点是黑色。 [注意:这里叶子节点,是指为空的叶子节点!] (4) 如果一个节点是红色的,则它的子节点必须是黑色的。 (5) 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。插入第一步: 将红黑树当作一颗二叉查找树,将节点插入。第二步:将插入的节点着色为”红色”。第三步: 通过一系列的旋
2017-09-25 18:53:53 308
原创 Linux进程调度算法
进程调度算法FCFS先来先服务(FCFS)调度算法是一种最简单的调度算法,当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。SJF
2017-09-25 01:04:59 1018 1
原创 数据库范式
范式的目标应用数据库范式可以带来许多好处,但是最重要的好处归结为三点:减少数据冗余(这是最主要的好处,其他好处都是由此而附带的)消除异常(插入异常,更新异常,删除异常)让数据组织的更加和谐…判断方法1NF:每个数据项都是最小单元,不可分割,其实就是确定行列之后只能对应一个数据,形象点就是你不对Exel作拆分单元格。 其实数据库管理系统生成的最起码也是第一范式。2NF:非主属性不部分依
2017-09-04 23:58:16 407
原创 NAT内网穿透
qq早期在线聊天使用udp实现的且是P2P的,其中一点优势就是P2P的udp的穿墙优势,其他包括效率高,占用资源少,速度快,但是其传输机制为不可靠传输,必须依靠辅助算法来完成传输控制。利用P2P点对点技术实现,需解决的两个问题。 1.实现内网之间机器的网络通信。 2.需要解决UDP出现的数据传输不稳定问题。NAT英文全称是“Network Address Translation”,中文意思是“网
2017-09-03 20:35:11 2771
转载 Linux信号处理机制
信号本质上是在软件层次上对中断机制的一种模拟,其主要有以下几种来源:程序错误:除零,非法内存访问;外部信号:终端Ctrl-C产生SGINT信号,定时器到期产生SIGALRM;显式请求:kill函数允许进程发送任何信号给其他进程或进程组。目前Linux支持64种信号。信号分为非实时信号(不可靠信号)和实时信号(可靠信号)两种类型,对应于 Linux 的信号值为 1-31 和 34-64。信号是
2017-09-03 15:26:21 580
转载 Reactor模型
模型详解Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程/进程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪(文件描述符或socket可读、写),多路复用器返回并将事先注册的相应I/O事件分发到对应的处理器中。Reactor是一种事件驱动机制,和普通函数调用的不同之处在于:应用程序不是主动的调用
2017-08-28 00:49:24 469
原创 STL源码分析(总结)
STL六大组件容器(containers):是一种class template,里面包含各种数据结构。算法(algorithms):是一种function template,里面包含各种算法。迭代器(iterators):是所谓的泛型指针,每个容器都有自己的专属的迭代器,知道如何遍历自己的元素。仿函数(functors):是一种重载了operator()的class或class templa
2017-08-24 20:04:07 4975 1
原创 浏览器打开一个网页时都发生了什么
转自:https://huozhi.github.io/2015/03/15/network/2014-06-17-What-Happened-After-Search-URL-in-Browser/浏览器解析URL选择协议并找出你请求的资源,你可能打开的是一个基于http协议的网站主页 Protocol “http:” 使用HTTP协议 Resource “/“ 请求的资源是根目录,一般是主页
2017-08-21 18:49:45 4629
原创 状态模式
设计理念允许对象在内部状态改变时改变他的行为。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。状态模式通过把各种状态转移逻辑分不到State的子类之间,相比于通过硬编码的状态机会减少相互间的依赖。UML类图Context: 环境类,它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的
2017-08-18 00:33:52 346
原创 代理模式
设计理念为另一个对象提供一个替身或占位符以控制对这个对象的访问。通过引入一个新的对象来实现对真实对象的操作或者将新的对 象作为真实对象的一个替身,这种实现机制即 为代理模式,通过引入代理对象来间接访问一 个对象,这就是代理模式的模式动机。代理模式通过引入一个新的对象,来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,即代理对象。它可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对
2017-08-17 20:58:18 205
原创 模板方法模式
设计理念在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。为了提高代码的复用性和系统的灵活性,模板方法模式将实现功能的每一个步骤所对应的方法称为基本方法(例如“点单”、“吃东西”和“买单”),而调用这些基本方法同时定义基本方法的执行次序的方法称为模板方法
2017-08-17 16:51:12 332
原创 外观模式
设计理念提供统一的接口,用来访问子系统中的一群接口。 外观模式有个最大的特点就是将细粒度的对象包装成粗粒度的对象,一般通过访问这个外观对象,来完成细粒度对象的调用。 外观模式一般是分布式应用和系统架构中的应用服务层的设计中常用的方式,并且一般结合外观模式+DTO(Data Transfer Object,数据传输对象)来完成服务层的设计,提供分布式应用服务的高效服务,外观模式我们可以这样理解,我
2017-08-17 10:00:45 303
原创 适配器模式
设计理念将一个类的接口,转换成客户期望的另一接口。适配器让原本接口不兼容的类可以无间合作。 适配器提供客户类需要的接口,适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作。这就是适配器模式的模式动机
2017-08-17 00:24:24 291
原创 TCP中的RST
RST:(Reset the connection)用于复位因某种原因引起出现的错误连接,也用来拒绝非法数据和请求。如果接收到RST位时候,通常发生了某些错误; 发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓冲区中的包,发送RST; 接收端收到RST包后,也不必发送ACK包来确认。哪些情况会发送RST(1)server关闭的情况下client发送数据 如果连接是CLOSE状态,
2017-08-16 00:33:54 713
原创 命令模式
设计理念将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。这就是命令模式的模式动机。考虑现实我们在开发的过程中经常会遇到这样的场景吧:我们需要执行一个时间特别长的任务,如果我们将这个长任务与其他的任务
2017-08-13 20:10:01 269
原创 单例模式
模式原理确保一个类只有一个实例,并提供一个全局的访问点。简单来说单利模式需要保证在整个程序的生命周期中,单例类只存在一个可访问的的实例。这样的应用场景有很多,如线程池或数据库连接池在程序中通常只允许存在一份实例,这时就可以通过单利模式来保证。 为了保证一份实例,单利类内部构造函数以及析构函数都作为私有成员,此时只有一个getter接口暴露出来供用户调用。对于一开始就生成一个静态实例和在有需要的情况
2017-08-10 15:41:36 202
原创 抽象工厂模式
设计原理提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。 这里还是举
2017-08-05 21:47:04 191
原创 工厂方法模式
模式原理定义了一个创建对象的接口,但由子类决定要实例化的是哪一个。工厂方法让类把实例化推迟到子类。 工厂方法将具体按钮的创建过程交给专门的工厂子类去完成,例如在特斯拉的汽车产品线中,我们先定义一些抽象的产品线工厂类,再定义具体的工厂类来生成发动机、轮、底盘,它们实现在抽象按钮工厂类中定义的方法。这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品,如果出现新的产品线,只需要为这种新
2017-08-05 20:24:04 182
原创 装饰者模式
设计理念动态的将责任附加到对象身上,若要拓展功能,装饰者提供了比继承更有弹性的替代方案。与继承关系相比,关联关系的主要优势在于不会破坏类的封装性,而且继承是一种耦合度较大的静态关系,无法在程序运行时动态扩展。在软件开发阶段,关联关系虽然不会比继承关系减少编码量,但是到了软件维护阶段,由于关联关系使系统具有较好的松耦合性,因此使得系统更加容易维护。当然,关联关系的缺点是比继承关系要创建更多的对象。使用
2017-08-04 23:12:55 159
原创 观察者模式
设计理念定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 我们可以想象订阅报纸的场景,当我们订阅某日报时当天的日报就会准时到达我们手中,而对于我们不关心的报刊只要我们不订阅他们我们就不会受到关于他们的信息。也就是说通过订阅的方式,我们与报刊之间产生了依赖的关系,而且通常是某日报同时发放到多个订阅者手中。当日报发生更新是,订阅者也会得到通知。
2017-08-04 22:03:37 189
原创 epoll模型讲解/源码分析
epoll模型在select/poll出现之前我们只能通过read/write的IO操作来从流中读取数据,当然在少量IO操作的时候完全是可靠的,但是当IO操作快速增长时甚至到了大规模并发阶段,这样的IO就显得捉襟见肘了。 首先我们来理解一个内核缓冲区的概念,假设A,B两个分别作为写入方与读出方,假设一开始内核缓冲区是空的,B作为读出方,被阻塞着。然后首先A往管道写入,这时候内核缓冲区由空的状态变到
2017-08-03 16:57:08 459
原创 Linux内存管理slab分配器
slab出现的缘由在Solaris 2.4以前,linux内核采用基于伙伴算法实现的分区页框分配器适合大块内存的请求。伙伴将空闲页面分为m个组,第1组存储2^0个单位的内存块,,第2组存储2^1个单位的内存块,第3组存储2^2个单位的内存块,第4组存储2^3个单位的内存块,以此类推.直到m组.但是伙伴算法是以页为单位分配的,即会产生内部碎片,slab算法的出现就是为了解决这个小粒度内存分配的问题出现
2017-07-30 00:26:25 520
原创 进程同步-管程
基本概念管程(monitor)是一种基本的,高级的同步构造,是为了解决信号量因不正确的使用而导致的一些时序错误而提出的一种高级语言构造。 管程也是进程同步的一种方式,相比于其他进程同步方式,管程将共享变量和对它们的操作集中在一个模块中,操作系统或并发程序就由这样的模块构成。这样模块之间联系清晰,便于维护和修改,易于保证正确性。 管程只是保证了同一时刻只有一个进程在管程内活动,即管程内定义的
2017-06-27 21:24:34 2308
原创 STL容器迭代器失效浅析
迭代器失效一般发生在对容器进行插入及删除操作时,插入/删除操作可能导致空间的重配置以及所指对象的位移而带来迭代器失效问题,我们可以归纳为以下两点:由于容器元素整体“迁移”导致存放原容器元素的空间不再有效,从而使得指向原空间的迭代器失效。由于删除元素使得某些元素次序发生变化使得原本指向某元素的迭代器不再指向希望指向的元素。容器插入删除操作的迭代器情况一般关联式容器的删除操作都会造成迭代器的失效下
2017-06-17 10:52:49 425
原创 C++菱形继承
在c++继承体系中,有一类问题是永远跑不掉的即菱形继承问题。此类问题又被称作钻石继承问题,只是一种较差的设计结构,刚好看到这个问题,特此总结一下。何为菱形继承先来看一下菱形继承的基本结构 A和B从基类Base中继承,而D多重继承于A,B。那就意味着D中会有Base中的两个拷贝。因为成员函数不体现在类的内存大小上,所以实际上可以看到的情况是D的内存分布中含有2组Base的成员变量。 又因其结构
2017-06-01 15:27:49 307
原创 策略模式
前言在《Effective c++》第35条例中,了解到有关策略模式的设计方法,在此梳理一遍策略模式的相关内容。Strategy的设计理念在《Effective c++》的条款35中有提到“人物健康指数的计算与人物类型无关”,与NVI手法(用一个non-virtual函数接口来调用相应的priavte virtual函数算法,即相当于嵌入了一层装饰参考Template Method模式)不同的是St
2017-04-29 18:52:40 256
原创 Regular Expression Matching
题目大意给定两个字符串a,b,要求判断a是否能匹配b,其中b中存在两类特殊字符’.’和’*’。 ”’ 匹配任何单个字符。 ‘*’匹配零个或多个前面的元素。 关于’*’: “ab” maches “a*b”; “aaaaaa” maches “a*”; “cab” maches “c*a*b”;解题思路从题目给的标签来看可以用回溯和动态规划来解题。解体的关键是如何处理字符’‘,对于字符’.
2017-04-21 18:44:55 283
原创 高效epoll原理
epoll简介epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44),它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。epoll常规用法epoll相关的系统
2017-04-17 21:59:24 259
原创 C++智能指针
什么是智能指针?智能指针是为了简化程序员管理在堆中动态分配空间而封装好的一些类。c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,如果我们不在每一个可能跳转或者返回的语句前释放资源,就会造成内存泄露。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。C++中的智能
2017-03-26 19:48:26 304
原创 C++多态
前言提到c++的多态,能想到的无非是一个接口多种方法,通过虚函数来实现的…OOP的四大特性有抽象,继承,封装,多态,作为OOP的始祖,多态可谓c++的精华,总结一下c++的多态特性的一些浅层面的理解方便日后查看。OOP中的多态多态(polymorphism),是指计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多
2017-03-26 19:23:38 372
原创 Linux进程间通信(IPC)
前言今天去面试的时候被面试官问到Linux进程间通信的方式,在操作系统课上只记得老师讲过的管道,信号,消息队列,共享内存。发现这部分内容有很多细节都没法记清,特总结一下以供日后查看。何为IPCIPC进程间通信(Inter-Process Communication)就是指多个进程之间相互通信,交换信息的方法。Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展
2017-03-25 00:24:41 425
原创 Partition算法
鲜为人知的partition算法最开始接触partition算法是在了解快拍后,这几天做笔试练习的时候经常发现他的存在,所以特总结一下方便以后复习。快速排序中用到的 partition 算法思想很简单,首先从无序数组中选出枢轴点 pivot,然后通过一趟扫描,以 pivot 为分界线将数组中其他元素分为两部分,使得左边部分的数小于等于枢轴,右边部分的数大于等于枢轴(左部分或者右部分都可能为空),最后
2017-03-19 19:11:56 1620
原创 线程和信号
每个进程都有自己的信号屏蔽字,但是在一个线程中调用signal或者sigaction等函数会改变所以线程中的信号处理函数,而不是仅仅改变调用signal/sigaction的那个线程的信号处理函数。在POSIX标准中定义了一些用于进程信号处理的接口。pthread_sigmask#include <signal.h>int pthread_sigmask(int how, const sigset
2016-10-26 19:57:27 406
原创 关于pthread_detach
前几天看了APUE关于线程部分的内容,这部分介绍的比较少没太理解,再回头看的时候有点感悟,特此记录下来。函数原型#include <pthread.h>int pthread_detach(pthread_t tid); //成功返回0;出错返回错误编号功能说明创建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即
2016-10-19 20:46:52 306
转载 The Differences Between BSD and System V Unix
There are dozens of sites and resources describing the differences between BSD and System V Unix.I am tired of reading 11 of them every few years when I want to remember some of those differences. So I
2016-10-06 20:09:31 333
转载 typedef使用的一些总结
用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,// 和一个字符变量;//以下则可行:typedef char* PCHAR;PCHAR pa, pb; 这种用法很有用,特别是char* pa, pb的定义,初学者往往认为是定义了两个字符型指针,其实不是,
2016-10-02 16:09:40 219
原创 内存寻址(下)
物理内存布局在初始化阶段,内核必须建立一个物理地址映射来指定哪些物理地址范围对内核可用而哪些不可用。内核将下列页框记为保留: 在不可用的物理地址范围内的页框 含有内核代码和已初始化数据结构的页框一般来说,Linux内核安装在RAM中从物理地址0x00100000开始的地方,也就是说,从第二个MB开始。所需页框总数依赖于内核的配置方案,典型的配置所得到的内核可以被安
2016-09-28 16:35:20 392
原创 内存寻址(中)
分页机制分页(paging)内存管理方案允许进程的物理地址空间可以是非连续的。分页避免了将不同大小的内存块匹配到交换空间上这样的麻烦,许多内存管理方案都有这个问题。各种形式的分页由于其优越性,因此常为绝大多数操作系统所采用。 传统上,分页支持一直是由硬件来处理的。然而,最近的设计是通过将硬件和操作系统相配合来实现分页。基本原理分页方法将物理内存分为固定大小的帧(frame);将逻辑内存分为对应大小
2016-09-26 15:06:32 360
ARM11+S3C6410_中文用户手册
2015-07-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人