自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SGI STL sort()源码分析

首先将stl sort完整源码列如下所示:template inline void sort(_RandomAccessIter __first, _RandomAccessIter __last) { __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator); __STL_REQUIRES(typename i

2017-07-09 22:45:27 763

原创 Elo评分算法原理与实现

《社交网络》里的Mark Zackburg被女朋友甩后,在舍友的启发下,充分发挥了技术宅男自娱自乐的恶搞天分,做出了Facemash网站,对学校女生的相貌进行排名打分,结果网站访问流量过大,直接把学校网络搞瘫痪了。Facemask大受欢迎的关键就在于Zackburg基友Eduardo写在窗户上的排名公式,看电影之时就对这个排名公式非常感兴趣,上网了解下,才发现这条公式就是大名鼎鼎的ELO等级分制度。ELO的应用非常广泛,大部分棋类比赛,现在流行的MODB游戏,像11平台的DOTA天梯系统,都是采用ELO等级

2017-04-19 15:38:55 24824 3

原创 使用KNN算法识别数字

KNN算法作为一种重要的分类算法,这里一步步地构造使用k近邻分类器的手写识别系统。为了简单起见,这里构造的系统只能识别数字0到9,参见下图。需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小 :宽高是32像素x32像素的黑白图像。尽管采用文本格式存储图像不能有效地利用内存空间,但是为了方便理解,我们还是将图像转换为文本格式。digits 目录下有两个文件

2017-04-18 22:42:57 1407

转载 Javascript闭包——懂不懂由你,反正我是懂了

摘要:“如果你不能向一个六岁的孩子解释清楚,那么其实你自己根本就没弄懂。”好吧,我试着向一个27岁的朋友就是JS闭包(JavaScript closure)却彻底失败了。  越来越觉得国内没有教书育人的氛围,为了弄懂JS的闭包,我使出了我英语四级吃奶的劲去google上搜寻着有关闭包的解释,当我看到stackoverflow上这一篇解答,我脑中就出现了一句话:就是这货没跑了!

2017-01-04 22:15:47 575

原创 Ruby on Rails安装

环境:ubuntu首先安装rubysudo apt install ruby查看ruby版本ruby -v安装rails配置gem源由于默认的gem源使用的是国外的源,在国内速度慢而且时常无法访问,所以先配置gem源,之前淘宝负责的源已经有ruby中国负责gem sources #显示现在的gem源有哪些gem sources -r https://rubygems.org/ #之前淘宝的ge

2016-12-29 14:43:29 2055 2

原创 使用automake工具自动构建工程

需要使用到的命令autoscan命令aclocal命令autoconf命令automake -a命令安装autoconf、automake使用yum安装安装成功之后进入工程目录,执行autoscan,出现两个文件autoscan.log和configure.scan手动修改configure.scan为configure.ac或者configur

2016-12-06 10:54:43 732

原创 搜索引擎核心技术笔记

搜索引擎发展史1 分类目录:hao123 人工整理2 文本检索:使用布尔模型、向量空间模型或者概率模型计算查询词和网页文本内容的相关程度未考虑网页之间的链接关系3 链接分析:google pagerank技术 未考虑用户的个性化需求4 用户中心的一代:利用用户查询的时间、地点,过去发出的查询及点击记录来理解用户真正的需求3个目标:更全 更快 更准3个核心

2016-11-02 22:20:08 2936

原创 今天是最幸福的一天

同时受到百度和腾讯的offer,开心只要努力就会有收获,加油

2016-09-27 22:35:19 564

原创 map中的元素按照key,value值排序

C++ STL中Map的按Key排序其实,为了实现快速查找,map内部本身就是按序存储的(比如红黑树)。在我们插入键值对时,就会按照key的大小顺序进行存储。这也是作为key的类型必须能够进行#include #include #include using namespace std; typedef pair PAIR; ostream& operat

2016-09-17 17:10:47 1464

原创 分布式系统基本概念(一致性、数据分布、复制策略、分布式协议)

分布式系统基本概念异常类型1 服务器down机(随时发生、内存数据丢失(因此需要考虑数据持久化)、down机重启之后要恢复内存信息)2 网络异常(消息丢失、消息乱序(UDP)或者网络包数据错误、区域内可通信区域间不可通信)3 磁盘故障(磁盘损坏(备份)、磁盘数据错误(校验和解决))超时?不能简单的当做失败(分布式存储的3态成功、失败、超时)一致性副本是分

2016-09-03 22:00:25 6273

原创 Linux 互斥锁、原子操作实现原理

在Linux下,信号量和线程互斥锁的实现都是通过futex系统调用。futex(快速用户区互斥的简称)是一个在Linux上实现锁定和构建高级抽象锁如信号量和POSIX互斥的基本工具。它们第一次出现在内核开发的2.5.7版;其语义在2.5.40固定下来,然后在2.6.x系列稳定版内核中出现。Futex 是fast userspace mutex的缩写,意思是快速用户空间互斥体。Lin

2016-08-24 22:13:37 10015

原创 fork与vfork的区别

1.fork函数介绍#include sys/types.h>#include unistd.h>pid_t fork (void );正确返回:父进程中返回子进程的进程号;子进程中返回0;(单调用双返回函数)错误返回:-1;子进程是父进程的一个拷贝。具体说,子进程从父进程那得到了数据段和堆栈段,但不是与父进程共享而是单独分配内存。fork函数返回后,子进程和父进程都是从f

2016-08-24 21:37:32 1477

原创 TIME_WAIT状态与解决方法

执行主动关闭的那端经历了这个状态,并停留MSL(最长分节生命期)的2倍,即2MSL。TIME_WAIT存在的两个理由:1 可靠的实现TCP全双工连接的终止2 允许老的重复的分节在网络上的消逝第一个:如果客户端不维持TIME_WAIT状态,那么将响应给服务端一个RST,该分节被服务器解释成一个错误。如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流,那么必须正确的处

2016-08-21 16:24:25 11663

原创 C/C++语言字符串操作总结大全(超详细)

字符串操作strcpy(p, p1) 复制字符串strncpy(p, p1, n) 复制指定长度字符串strcat(p, p1) 附加字符串strncat(p, p1, n) 附加指定长度字符串strlen(p) 取字符串长度strcmp(p, p1) 比较字符串strcasecmp忽略大小写比较字符串strncmp(p, p1, n) 比较指定长度字符

2016-08-13 11:32:24 822

原创 vector<bool>效率问题的原因和替代方法

今天在刷一道题目的时候遇到这样一个效率问题,c数组效率 > vector效率 > vector效率,查找资料发现:vector不是容器,至少,不是标准意义上的容器。vector的名称有点让人误解,因为其内部元素实际上并不是标准的bool值,标准的bool值至少与char拥有一样的大小,从而可以被“正常”使用。然而C++标准对于vector值有其特殊的实现方法。目的是为了减小空间

2016-08-10 15:52:45 1407

原创 MPI非阻塞通信使用、性能分析与实现原理

非阻塞通信:异步通信通常是使MPI应用程序实现高性能计算的关键,使用异步通信具有如下优势:1)函数是非阻塞的,这使得进程在与另一个进程通信的同时继续参与计算;2)如果应用适当,可以绕过MPI的内部buffers,极大地提高程序的通信带宽;最常见的基本的非阻塞调用就是MPI_Isend和MPI_IrecvMPI_Isend的使用与同步版本的MPI_Send不同,MPI

2016-08-03 16:40:16 7860

原创 mmap与直接IO(read、write)的效率比较

不能简单的说哪个效率高,要看具体实现与具体应用。无论是通过mmap方式或read/write方式访问文件在内核中都必须经过两个缓存:一个是用address_space来组织的以页为基础的缓存;一个是以buffer来组织的缓存,但实际上这两个缓存只是同一个缓冲池里内容的不同组织方式。当需要从文件读写内容时,都经过 address_space_operation中提供的函数也就是说路径是一致的。如

2016-08-03 16:03:51 11103

转载 vim命令大全

进入vi的命令vi filename :打开或新建文件,并将光标置于第一行首vi +n filename :打开文件,并将光标置于第n行首vi + filename :打开文件,并将光标置于最后一行首vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filena

2016-08-01 14:52:53 342

原创 linux brk、sbrk、mmap和munmap系统调用

sbrk/brk重新指定数据段的结束位置。sbrk(增量),增量可正可负,也可以是0,,都返回原来的数据段结束地址,失败返回-1,。brk(地址),返回0或者-1。头文件。sbrk(0)可以取得当前结束地址。没有使用的虚拟内存地址,操作系统就没有映射到物理内存,如果试图访问会差生段错误。指定新的结束位置后如果有整个内存页被空闲出来,这一页就立即被解除映射。#include #

2016-08-01 10:46:52 3083

原创 linux系统端口占用和close-on-exec机制

一直以来,在处理linux服务器的过程中,经常会遇到一个问题,有时候kill掉进程之后,端口被占用,新的进程一直起不来,等待很久也不能启动新进程,总是提示端口被占用,只有重启机器才能恢复正常,这个简直是个灾难,查了一些资料,了解了如何查看端口占用情况和处理方法。1、使用netstat命令查看端口占用情况。  2、我们还需要知道是什么程序占用,加上-p参数

2016-07-30 12:00:04 1574

原创 C/C++中数组名退化为指针的情况

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解。想必这种误解的根源在于国内某著

2016-07-22 15:49:10 2904 4

转载 HTTPS和HTTP的区别

什么是 HTTPS?HTTPS (基于安全套接字层的超文本传输协议 或者是 HTTP over SSL) 是一个 Netscape 开发的 Web 协议。你也可以说:HTTPS = HTTP + SSLHTTPS 在 HTTP 应用层的基础上使用安全套接字层作为子层。为什么需要 HTTPS ?超文本传输协议 (HTTP) 是一个用来通过互联网传输和接收信息的

2016-07-22 11:28:00 320

原创 C++volatile详解

1. 为什么用volatile?    C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。这是 BS 在 "The C++ Programming Language" 对 volatile 修饰词的说明:A volatile specifier is a hint to a compiler that a

2016-07-08 10:44:46 1403

转载 C++traits技术的理解

traits是c++中的自动类型推断,可以用来获得一个类型的相关信息。比如我们有一个泛型的迭代器类,其中T为所指向的类型。template class myIterator{ ...};当我们使用myIterator时,怎样才能获知它所指向的元素的类型呢?我们可以为这个类加入一个内嵌类型,像这样:template class myIterator{ typedef

2016-07-07 22:17:27 3431 1

原创 C++内存模型

关于乱序说到内存模型,首先需要明确一个普遍存在,但却未必人人都注意到的事实:程序通常并不是总按着照源码中的顺序一一执行,此谓之乱序,乱序产生的原因可能有好几种:编译器出于优化的目的,在编译阶段将源码的顺序进行交换。程序执行期间,指令流水被 cpu 乱序执行。inherent cache 的分层及刷新策略使得有时候某些写读操作的从效果上看,顺序被重排。以上乱序现象虽然来源不同

2016-07-07 11:11:35 1074

原创 并行程序设计模型

并行程序设计模型并行程序设计模型(Parallel Program Model)是一种程序抽象的集合,是建立在硬件和内存体系结构层次之上的概念[26]。比较常用的模型有:数据并行模型、消息传递模型和共享存储模型。数据并行模型数据并行(Data-Parallel)模型主要任务是局部计算和数据选路操作,通常应用于细粒度问题的求解[27]。该模型在SIMD计算机与SPMD计算机上均可以实现,

2016-07-04 21:28:50 4220 1

转载 学习Javascript闭包(Closure)

作者: 阮一峰日期: 2009年8月30日闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。下面就是我的学习笔记,对于Javascript初学者应该是很有用的。一、变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域。变量的作用域无非就是两种:全局变量和局部变量。

2016-06-28 17:12:05 343

原创 IO模型(同步,异步,阻塞,非阻塞)

在文章中一共比较了五种IO Model: blocking IO 阻塞IO nonblocking IO 非阻塞IO IO multiplexing IO复用 signal driven IO 信号驱动式 asynchronous IO 异步IO由于信号驱动式在实际中并不常用,所以我这只提及剩下的四种IO Model。这个问题在不同的背景之下讨论的结果不一致,本文讨论的背景是Linux环境下的n

2016-06-20 21:11:32 476

原创 gdb调试时的问题Missing separate debuginfos, use: debuginfo-install glibc-XXX

在使用gdb的时候出现如下提示:Missing separate debuginfos, use: debuginfo-install libgcc-4.9.2-6.fc21.x86_64 libstdc++-4.9.2-6.fc21.x86_64但是在使用如上提示的命令的时候出现问题:Could not find debuginfo for main pkg: libgcc-4.

2016-06-20 09:40:57 3325

原创 几种并行计算模型的区别(BSP LogP PRAM)

并行计算模型通常指从并行算法的设计和分析出发,将各种并行计算机(至少某一类并行计算机)的基本特征抽象出来,形成一个抽象的计算模型。      PRAM模型PRAM(Parallel Random Access Machine,随机存取并行机器)模型,也称为共享存储的SIMD模型,是一种抽象的并行计算模型,它是从串行的RAM模型直接发展起来的。在这种模型中,假定存在一个容量无限大的共

2016-06-13 15:15:51 23139

原创 分布式系统基本概念-----副本一致性和分布式系统衡量指标

副本( replica/copy)指在分布式系统中为数据或服务提供的冗余。分为数据副本和服务副本,对于数据副本指在不同的节点上持久化同一份数据,当出现某一个节点的存储的数据丢失时,可以从副本上读到数据。数据副本是分布式系统解决数据丢失异常的唯一手段。另一类副本是服务副本,指数个节点提供某种相同的服务,这种服务一般并不依赖于节点的本地存储,其所需数据一般来自其他节点。副本的一致性:分布式

2016-06-12 17:01:55 1855

原创 条件变量的虚假唤醒

这个问题主要来源与我们在使用pthread条件变量wait函数的时候总是使用while去做判断而不是使用if,因为等待在条件变量上的线程被唤醒有可能不是因为条件满足而是由于虚假唤醒(Spurious wakeups)That's called spurious wakeup and is explicitly allowed by POSIX. Essentially, return fr

2016-06-10 17:38:05 1976

原创 正确使用POSIX条件变量

最近在写线程池的时候看到了对于pthread_cond_t条件变量这样的解释:pthread_cond_wait() blocks the calling thread until the specified condition is signalled. This routine should be called while mutex is locked, and it will

2016-06-10 16:43:53 1019

原创 使用RAII来管理对象资源

RAII(资源获取即初始化)基本技术原理很简单,如果希望保持对某个重要资源的跟踪,那么创建一个对象,并将资源的生命期和对象的生命期相关联。这样的话,就可以利用c++复杂老练的对象管理机制来管理资源。最简单的形式是,当你构造一个对象的时候,其构造对象会获得一份资源,而析构函数则释放这份资源。采用对象管理资源,即使碰到意外的return、异常(C++保证如果抛出了异常,局部对象就会被销毁)甚至是邪恶的

2016-06-09 22:41:23 1179

原创 配置linux DNS

ping 的时候出现如上问题,初步诊断是DNS的问题,通过 cat  /etc/resolv.conf查看DNS发现没有配置,添加DNS后显示正确,但是重启network服务发现DNS又消失了,如下:网上有人说这个/etc/resolv.conf文件其实只是一个link文件,实际修改DNS要修改如下文件才可以,发现结果是正确的,重启服务后DNS的地址

2016-06-03 22:56:16 867

原创 如何解决ssh总是掉线的问题

配置服务端:ClientAliveInterval  设置一个以秒记的时长,如果超过这么长时间没有收到客户端的任何数据,sshd 将通过安全通道向客户端发送一个”alive”消息,并等候应答。默认值 0 表示不发送”alive”消息。这个选项仅对SSH-2有效。ClientAliveInterval指定了服务器端向客户端请求消息的时间间隔, 默认是0, 不发送.而ClientAlive

2016-05-24 20:33:01 5968

原创 buffer overflow detected错误

最近在写并行程序的时候遇到这个问题,在上网查询之后发现好多是由于sprintf的缓冲区不够造成的,对比自己程序发现一个很低级的错误char *sc = new char(100);sprintf(sc, "%d", rank);string temp = sc;string str = "./read_time/read_time" + temp;ofstream fread_time

2016-05-24 13:22:45 9270

转载 notify()和notifyAll()的区别

当你Google”notify()和notifyAll()的区别”时,会有大片的结果弹出来,(这里先把jdk的javadoc文档那一段撇开不说),所有这些搜索结果归结为等待的线程被唤醒的数量:notify()是唤醒一个, 而notifyall()是唤醒全部.那他们的真正区别是什么呢?让我们来看看个生产者/消费者的案例(假设生产者/消费者这个类中有两个方法put和get),它是有问题的(因为

2016-05-14 11:09:09 878

原创 Tomasulo算法

Tomasulo算法:为IBM 360/91设计的,它采用的是寄存器重命名的方法来消除寄存器数据流之间的假相关,即用虚拟寄存器集代替真实的FPR,虚拟寄存器集在tomasulo算法中由每一功能单元所带的保留站(reservation station)、取数缓冲区(load buffers)和存数缓冲区(store buffers)组成。 Tomasulo算法的三段1.Issue―从

2016-05-11 22:37:50 19181 2

原创 C++中的placement new

什么是placement new?所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。placement new的好处:1)在已分配好的内存上进行对象的构建,构建速度快。2)已分配好的内存可以反复利用,有效的避免内存碎片问题。首先我们区分下几个容易混淆的关键词:new、opera

2016-05-06 22:05:16 745

空空如也

空空如也

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

TA关注的人

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