摘要: 总结: 不仅tcp协议能对数据段进行分割,ip协议也具备这个功能,之所以会这样是两者都受到底层MTU的限制(虽说tcp是根据MSS限制来分割数据包,由于MTU=tcp包头+ip包头+MSS,所以其实也算是受MTU的制约。)。但是尽量别让ip协议来负责数据包的分包工作,因为虽然ip协议会对数据包进行分... 阅读全文
posted @ 2014-10-19 13:16 白帆mvp 阅读(312) 评论(0) 推荐(0) 编辑
摘要: BM25算法是一种常见用来做相关度打分的公式,思路比较简单,主要就是计算一个query里面所有词和文档的相关度,然后在把分数做累加操作,而每个词的相关度分数主要还是受到tf/idf的影响。公式如下:R(qi,d)是每个词和文档的相关度值,其中qi代表每个词,d代表相关的文档,Wi是这个词的权重,然后... 阅读全文
posted @ 2014-10-19 13:12 白帆mvp 阅读(18524) 评论(0) 推荐(4) 编辑
摘要: listen函数是用来设置监听连接的句柄和队列当listen函数执行完成以后,服务端就已经可以接受客户端来的新连接了,新连接完成以后listen会把客户端的ip,port和连接句柄放在监听队列里面,等待accept函数来取,如果监听队列满了,listen会拒绝新来的连接。accept仅仅是从监听队列... 阅读全文
posted @ 2014-10-19 12:23 白帆mvp 阅读(1313) 评论(0) 推荐(0) 编辑
摘要: close函数首先是将传入的socket句柄引用数减1(因为fork进程时会导致socket句柄被多个进程引用),待到引用数等于0的时候,close才会真正关闭连接。shutdown函数是立刻关闭连接(忽视句柄引用数值),关闭有三种方式SHUT_RD 关闭调用进程的读通道,调用进程立刻不能读网络数据... 阅读全文
posted @ 2014-10-19 12:21 白帆mvp 阅读(498) 评论(0) 推荐(0) 编辑
摘要: 网络程序异常退出无core文件产生这种情况发生在一边连接端已经关闭,但是另外一边还在对连接句柄做send操作,这样做send操作的进程会收到SIGPIPE信号,默认行为是直接退出且不会产生core。为了避免退出,一般在启动的时候加上 signal(SIGPIPE, SIG_IGN) 来忽略这种错误。... 阅读全文
posted @ 2014-10-19 12:20 白帆mvp 阅读(633) 评论(0) 推荐(0) 编辑
摘要: DocFieldProcessor类的任务1 按顺序存储所有的field和对应的fieldinfo2 为当前这篇doc的field按照fieldname来建立hash索引3 调用InvertedDocConsumer类(抽象),对field的内容分词和建立内存索引DocFieldProcessor类... 阅读全文
posted @ 2014-10-19 11:25 白帆mvp 阅读(312) 评论(0) 推荐(0) 编辑
摘要: 1 一个资源同时可以有多个读写,但是只能有一个写锁2 用flag代表锁的状态,#define un_lock 0#define r_lock1 //上一把读锁加一个r_lock#define w_lock -1伪代码1 LOCK_Rpthread_lock(resource.mutex)while(... 阅读全文
posted @ 2014-10-19 11:18 白帆mvp 阅读(661) 评论(0) 推荐(0) 编辑
摘要: 两种锁的加锁原理互斥锁:线程会从sleep(加锁)——>running(解锁),过程中有上下文的切换,cpu的抢占,信号的发送等开销。自旋锁:线程一直是running(加锁——>解锁),死循环检测锁的标志位,机制不复杂。两种锁的区别互斥锁的起始原始开销要高于自旋锁,但是基本是一劳永逸,临界区持锁时间... 阅读全文
posted @ 2014-05-08 14:43 白帆mvp 阅读(8825) 评论(0) 推荐(1) 编辑
摘要: C语言的指针跳转访问是一个灵活高效的机制,但是再高效也是要花费额外时间的,下面这个程序如果在gcc -O0不优化的情况,就可以看出指针跳转比直接访问要多消耗10%左右的时间#include #include int main(){ int m = 0; int *p = &m; ... 阅读全文
posted @ 2014-05-08 10:30 白帆mvp 阅读(405) 评论(0) 推荐(0) 编辑
摘要: 下面这个代码用两个双层循环遍历了一个二维数组里所有的元素,以我自己机器的测试 上面那个循环耗时基本为下面的一半,两个循环的时间复杂度相同,为什么会有这么大的差别?首先要明白的是不管是几维数组,他们都是用一块地址连续的内存来存储所有的元素,而内存布局的顺序是一整行接着下一个整行排列,第一个循环是一行一... 阅读全文
posted @ 2014-05-08 10:24 白帆mvp 阅读(3714) 评论(0) 推荐(0) 编辑