自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 网络协议:HTTP

本文将讨论:1、HTTP的基础概念2、HTTP的连接3、HTTP的高速缓存HTTP的基础概念早期的Internet,主要用的是FTP。后来,web飞速发展,占据市场主体。所以,大多数公司都会有web站点。对于大多数用户来说,web和internet是难以区分的。web由一个很大的文档组成,称为web页。用过internet能够访问这些文档。用户在使用web浏览器的时...

2017-07-31 14:33:36 964

原创 设计模式:观察者模式

如果现在你、我都要去买一台手机,这台手机现在3000块。我们手上的钱都不够。那么我们需要等待它降价才能购买。或许我们应该有了这么一个思路:我们在它的购买系统里注册一下,等到它降价了,就通知我们。这样我们就不用时时刻刻都去关注着它。 下面我们用C++来实现观察者模式。Customer.cpp: Customer.cpp#includeusing namespace

2017-07-28 02:03:44 251

原创 网络协议:用户数据报协议(UDP)

本文将讨论:UDP的基本概念;UDP报文伪首部 UDP的基本概念; 在TCP/IP协议族中,用户数据包协议UDP提供应用间传输数据报的基本机制。UDP使用底层的协议传输报文,提供与IP一样的不可靠、无连接数据报交付服务,他没有使用确认来确保报文到达,也没有对传入的报文排序,也不提供反馈信息来控制机器之间信息流动的速度。所以,UDP报文可能会出现丢失,重复或者乱序到达的现

2017-07-19 11:05:15 1254

原创 算法:一致哈希及C++实现

在负载均衡中,我们需要在服务器列表中选择一个服务器,那么,我们该怎么选呢? 我们当然可以轮询。但是轮询却不能够实现回话保持。那么我们该怎么办呢?下面介绍一种算法,一致哈希。 一致哈希理解起来不困难,我们把服务器节点放在一个0~2^32上的圆环里,并把客户端的地址hash,选择大于hash值的最小节点。这样来实现负载均衡。同时也保证了回话保持。如图如果,两个服务器的h

2017-07-18 12:10:27 401

原创 网络协议:可靠的数据流传输服务TCP

本文将讨论:TCP的基本概念;数据流的收发;TCP报文;建立和关闭连接;糊涂窗口; 现在所用的网络上,我们常用的运输层协议是TCP和UDP。现在我们来讨论TCP。 TCP具有的特征有4个,面向数据流(面向字节)、虚电路连接、传输缓冲和全双工连接。下面来依次细讲。 在两个进程相互传输数据的时候,我们实际上是以八位组的比特流来传输的,当然我们同时将这个八位组

2017-07-10 23:18:10 1687

原创 Linux select、poll、epoll解析

一个已打开的文件可以是一个常规文件,也可以是一个设备文件,还可以是进程为了实现通信建立的管道或者套接字等等。如果现在有一个进程要监听一个打开文件,while循环就好了。但是如果要监听多个文件,那就得是异步IO。这就是我们今天要讨论的三种方法。 我们先从select开始  int select(int maxfdp1,//一共有多少个文件描述符fd_set *readset,

2017-06-18 21:00:09 395

原创 Linux socket浅谈

限于篇幅,本文将主要讨论在同一计算机下的socket进程间通信 从概念上说,socket和管道没多大区别。但是从实现上来说,管道传递的是无结构的字节流,但是socket传递的是报文。 与V IPC相同,内核为socket设置的总入口为sys_socketcall() sys_socketcall(int call, unsigned long *args)  之后会

2017-06-11 21:33:44 444

原创 Linux 消息队列、共享内存、信号量(二)共享内存和信号量

Linux 消息队列、共享内存、信号量(二)共享内存和信号量 一般来说,进程间通信会加上一个进程间同步或者互斥的功能,比如管道,读进程没有东西读的时候会进入睡眠,写进程在缓冲区满的时候也会进入睡眠。虽然这两个过程从宏观上来说是并发的,但是从微观上来说是原子的。但是共享内存不一样,在一个进程对该内存读的时候,另一个进程能够对该内存执行写操作。所以,我们要通过信号量来达到对共享内存的同步和互斥

2017-06-11 21:31:36 315

原创 Linux 消息队列、共享内存、信号量(一)消息队列

消息队列、共享内存、信号量这三个放到一起说是因为这三种机制统称为“系统V进程间的通信机制”,系统为V IPC提供了一个统一的系统调用ipc(),内核的实现是sys_ipc()。 int sys_ipc(unsigned int call, int first,int second,int third,void*ptr,int forth);其中call为操作码,操作码对应着这三种机制共

2017-06-04 21:05:16 829

原创 Linux 从GDB谈进程跟踪

进程跟踪的系统调用是ptrace(),通过ptrace,一个进程可以动态的读写另一个进程的内存和寄存器,包括数据段、代码段、堆栈以及所有的寄存器。从概念上来说,着似乎也是进程间通信的一种方法。但实际上,这种通信是单方面的,被跟踪的进程并不知道自己是在收到控制和监视的条件下进行。从这个角度来说,这又不属于进程间通信。 ptrace格式:Int ptrace(int request,//具

2017-06-04 21:01:26 855

原创 Linux 管道浅谈

管道分为有名管道和无名管道。我们先从无名管道开始。 无名管道用于父子进程、兄弟进程之间的通信。管道的主体是pipe,pipe所建立的管道只在一个进程里,所以我们要通过fork来实现进程间通信。 我们使用管道就可以看出,对管道的读写,实际上就是read和write。那是不是说,管道实际上就是一个文件呢? 是的,在具体的实现上,管道是作为匿名文件存在的,fd[2]里的两个元素实

2017-06-03 22:47:59 327

原创 Linux 信号浅谈

信号机制是在软件层次上对中断机制的一种模拟,从概念上来说,一个进程接受到一个信号与一个处理器接收到的中断请求是一样的。实际上,信号是一种软中断。 既然是中断,那么就得有一个处理中断方法的中断向量表。在task_struct里,有一个指针sig,指向一个sig_struct结构。这个结构我们可以成为“信号向量表”。 struct signal_struct{atomic_t

2017-06-03 22:45:41 355

原创 Linux fork(),vfork(),clone()底层浅谈

Linux  fork(),vfork(),clone()底层浅谈 我们平常进程会用到fork,但是fork只是创建了一个与父进程一模一样的子进程,并且复制了父进程所有的资源,包括打开的文件,父进程的数据结构、映射的物理页面,以及各种堆栈等等。如果我们不需要这么多资源,那我们该怎么操作呢? vfork会共享父进程的堆栈,同时也会先于父进程运行(将父进程挂起),只有在子进程结束后父进

2017-05-30 20:56:08 263

原创 Linux 从PCB的角度谈用户空间

进程控制块PCB,实际上指的是一个结构体task_struct。下面说说这个task_struct Task_struct有一个指向mm_struct的指针,mm_struct结构体是该进程整个用户空间的抽象。包含着装入的可执行映像信息以及进程的页目录指针。Mm_struct结构体非常有意思,在一个进程控制块里,只含有一个指向mm_struct的指针,但是一个mm_struct能够被若干个

2017-05-21 00:06:10 1087

原创 Linux 物理页面的周转

在前几篇博文我们频繁提到了物理页面,swap交换分区。那么,在这一篇博文,我们将详细探索物理页面。 物理页面的周转 物理页面的周转有两层意思,一层是盘区交换。第二层是页面的换入换出。 下面来谈谈盘区交换首先,不是所有的物理页面都能被交换的,比如系统空间的页面就不会被交换掉(交换掉了就没人干活了)。页面的交换比较复杂,我们一共能想到这几种思路。1、最简单的很明显,不够

2017-05-21 00:04:21 621

原创 Linux下的虚拟地址映射详解(二)线性地址到物理地址的映射

现在有这么一个函数 void main(){int a = 2;cout while(a){;}cout}     函数运行起来会是这个样子:先打印出a的地址,假设是0x12345678,接着会进入死循环。现在如果要求你寻找某个办法,来跳出循环打印”fun end”,然后结束整个函数。(函数正在运行,不允许修改代码,也不能ctrl+c)你

2017-05-14 15:17:18 1959

原创 Linux下的虚拟地址映射详解(一)逻辑地址到线性地址的映射

现在假设有这么一段代码: void main(){int a = 100;cout} 如果编译执行,先打印地址,假设是0x12345678。那么,这个地址,是逻辑地址呢,还是线性地址,亦或是物理地址呢?     首先我们需要引入一些别的东西。在英特尔的X86体系下,从他的发展可以看出他是从实模式向保护模式发展的,内存管理是从分段是管理往分页式管理的。既然是一

2017-05-14 15:05:24 3101

原创 内存管理(四)tcmalloc2 内存释放及源码剖析

在上一篇博文里提到了可以从未分配完的span里继续分配内存。那么,释放的时候怎么找到对应的内存呢。Page heap一共保存着两个map,pagemap_记录着某一内存页对应着哪一个span,pagemap_cache记录着某一内存页对应哪一个sizeclass。Pagemap_的底层是radix-tree.  现在来谈谈内存释放。具体分为小块内存释放和大块内存释放。  内

2017-05-07 15:30:43 1073

原创 内存管理(三)tcmalloc1 内存分配及源码剖析

本来打算花一天时间看看tcmalloc就算结束了。但是在网上找博客的时候发现,100个人有101钟不同的解释,完全没有公论。一怒之下,剖源码!         tcmalloc是对ptmalloc的升级版。和ptmalloc相比,tcmalloc对于小块内存的速度要比ptmalloc快得多,并且相对于每一个内存块分配都需要8B,tcmalloc对于细节的优化ptmalloc做得好。tcma

2017-05-07 15:24:18 847

原创 内存管理(二)ptmalloc的分配回收…

1. 本文将讨论:2. ptmalloc的分配和释放在系统里的操作3. ptmalloc的初始化4. 子线程的malloc和free5. ptmalloc的内存暴增以及解决思路6. 内存池的优缺点     ptmalloc的分配和释放在系统里的操作 本文以32系统为例。 Glibc分配算法如下:l 小于等于 64 字节:用 pool 算

2017-05-06 18:57:22 636

原创 内存管理(一) ptmalloc基础知识

本文讨论了:1.ptmalloc的简单概念2.各种chunk3.bin数组以及brk和mmap   1.ptmalloc的简单概念    glibc在开始的时候malloc是不支持多线程的,但是在glibc_2.3x中集成了ptmalloc2,也就是平常使用的malloc。这就实现了对多线程编程的支持。本文将讨论ptmalloc的整个malloc(),free

2017-05-06 18:57:19 1908

原创 海量数据处理(四) simhash

如果有一天,你向优酷传了一个记录着你和我当天一起去长城玩的小视频(假设其大小为1G)。在你传完以后,我也传了一个和你一模一样的视频。但是我一点击上传,几秒钟就现设上传成功。这是为什么呢。这就是这这会要讨论的simhash算法。 simhash过程一共有5个步骤,分词,hash,加权,合并,降维。 第一步分词。假设现在给一个句子:我今天有课。再给一个句子:我明天有课。很明显这两个句子

2017-05-06 18:57:16 347

原创 海量数据处理(三) T树

T树是一种树形结构,典型应用是统计,排序,查找大量数据。核心是空间换时间。 结合闫蔚敏的书,我对它的理解是这样的T树" TITLE="海量数据处理(三) T树" /> 举个例子,比如现在有个含有若干QQ号的文件,现在给你一个QQ号,要你在这个文件里找出文件里是否有给你的QQ号,如果有,输出位置。如果没有,输出-1。(假设内存能够容纳下这个文件) QQ号可能存在的位数是6

2017-05-06 18:57:13 349

原创 海量数据处理(二) 位图

位图就是用一个bit为来标记某个元素对应的value,key是元素,构成键值对。由于使用了bit这个最小单位,所以能够极大的节省内存。    很简单的一个例子,比如现在要对从含有1~100的无序不重复数组排序,那么我们可以申请一个大小为2^7个bit的数组(也就是128个bit,合16个字节,有一些内存浪费),将其所有置为0。遍历这个无序数组,bit[ arr[i] ] = 1。最后遍历

2017-05-06 18:57:10 240

原创 海量数据处理(一)哈希分治

海量数据处理有很多种方法,如哈希分治、simhash、外排序、多层划分等。本文将讨论哈希分治哈希分治的核心是hash_map,hash_map和map类似,不过hash_map能够创造出对象而map不能。对内存中查找数据,hash_map比较适合在内存中查找。当然,这不是重点。一个很典型的题:如果有两个500G的文件,里面放着若干IP地址,要求查找出出现频率

2017-05-04 22:17:33 796

空空如也

空空如也

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

TA关注的人

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