- 博客(12)
- 资源 (7)
- 收藏
- 关注
原创 GDB 调试技巧(不断更新中......)
一、break到不同类的同名函数 方法: 在函数前面加类名以及作用域运算符 eg : break A::func //break 到类A的func函数程序如下://gdb_test.cpp#include<iostream>class A {public: void func() { std::cout << "A::func() is cal
2017-03-29 18:44:18 1823 1
原创 Redis网络库源码分析(3)之ae.c
一、aeCreateEventLoop & aeCreateFileEvent上一篇文章中,我们已经将服务器启动,只是其中有些细节我们跳过了,比如aeCreateEventLoop函数到底做了什么? 接下来我们要分析ae.c文件,它是整个Redis网络事件框架,其中定义了各个管理事件的函数,比如aeCreateFileEvent,aeDeleteFileEvent分别是注册新的事件和删除事件。其实
2017-03-23 23:53:15 1776 1
原创 Redis网络库源码分析(2)之启动服务器
一、从main开始main函数定义在server.c中,它的内容如下://server.cint main(){ signal(SIGPIPE, SIG_IGN); //忽略SIGPIPE信号,防止给一个已经关闭socket的客户端连续两次发送数据导致SIGPIPE信号 //的产生,它的默认做法是终止进程。 server_t server;
2017-03-23 17:42:03 1011 1
原创 Redis网络库源码分析(1)之介绍篇
一、前言Redis网络库是一个单线程EPOLL模型的网络库,和Memcached使用的libevent相比,它没有那么庞大,代码一共2000多行,因此比较容易分析。其实网上已经有非常多有关这个网络库的分析了,但是我觉得它们的不足在于只是分析了各个文件中各个函数的单独含义,而没有将其统一起来,不能给读者一种宏观的把握。比如我如果想把这个网络库直接拿出来为我所用该怎么办,但是 @浅墨 学长已经完成了这个
2017-03-23 15:30:03 3832 1
原创 TCP vs UDP
本文翻译自 : http://www.diffen.com/difference/TCP_vs_UDP这个网站叫diffen:在它上面,你可以比较两个东西的异同。 比较项 TCP UDP 全称 Transmission Control Protocol(传输控制协议) User Datagram Protocol(用户数据报协议) 连接 面向连接 无连接 功能
2017-03-23 02:10:23 679
原创 多进程同时写一个文件会怎样?(待修订)
一、问题还原在多进程的环境下,父子进程同时去写一个文件,例如父进程每次写入aaaaa,子进程每次写入bbbbb,问题是会不会出现写操作被打断的现象,比如出现aabbbaaabb这样交替的情况?二、结论 1:使用write系统调用的情况下,不会出现内容交叉的情况。 2:使用fwriteANSIC标准C语言函数,会出现内容交叉的情况。三、实验过程实验环境:操作系统: RedHat Linu
2017-03-18 01:46:10 38059 9
原创 为什么Hashtab的大小通常取远离2^n 的素数
举个栗子在Hashtab中我们通常 Hash(key) % M 来确定 key 所需要存放的位置M就是Hashtab的大小,假设下面的两个场景Hash(key1) = 108 Hash(key2) = 500 如果 M 恰好是 2^n,我们在这里假设M为2^3=8则 Hash(key1) % M = 108 % 8 = 4Hash(key2) % M = 500% 8 = 4此时最后的结果
2017-03-11 10:27:25 711
原创 Kioskcached(2) 之 使用tcmalloc 替换 ptmalloc
前言我在 Kioskcached(1)之 Memcached & Redis & Kioskcached 性能测试对比 中找到的一个问题是 malloc,对于一个内存型数据库,很容易理解,当数据量不断增大的过程中,我们势必需要大量的malloc内存,但是如果malloc不给力,性能就会受到影响。glibc中使用ptmalloc作为默认的内存分配器,但是还有一些性能更好的第三方工具,例如 TCMa
2017-03-10 12:51:06 1209 1
原创 Kioskcached(1)之 Memcached & Redis & Kioskcached 性能测试对比
前言:本文仅仅是作者自己在学习过程中的一次实验而已,或许因为各种因素会导致实验结果与你之前的认知不太一样,因此请你带着批判的眼光看待本文(本文不具有实际环境的参考性)。一:测试目的在了解了一些NoSQL的知识之后,我发现Memcached是一个多线程的模型,对于一个NoSQL数据库,如果不考虑数据持久化功能(读写磁盘),剩余的内存操作应该是非常快的。但是多线程就意味着需要互斥和同步,锁是必须的,因此
2017-03-09 01:00:45 717
原创 Socket `accept queue is full ` 但是一个连接需要从SYN->ACCEPT
由于标题长度有限制,我把想要描述的问题再次描述下:内核通常会为每一个LISTEN状态的Socket维护两个队列:1 accept队列: listen()函数第二个参数BACKLOG指定,表示已完成连接的队列,等待被accept函数取走。 2 SYN队列:由/proc/sys/net/ipv4/tcp_max_syn_backlog指定,表示处于SYN_RECV状态的队列。如果没有概念,参考:
2017-03-05 23:31:16 3824 9
原创 深入探索 Linux listen() 函数 backlog 的含义
1:listen()回顾以及问题引入 2:正确的解释 3:实验验证1:listen()回顾以及问题引入listen()函数是网络编程中用来使服务器端开始监听端口的系统调用,首先来回顾下listen()函数的定义: 有关于第二个参数含义的问题网上有好几种说法,我总结了下主要有这么3种:Kernel会为LISTEN状态的socket维护一个队列,其中存放SYN RECEIVED和EST
2017-03-05 11:39:50 22645 13
原创 C++11 多线程同步 互斥锁 条件变量
在多线程程序中,线程同步(多个线程访问一个资源保证顺序)是一个非常重要的问题,Linux下常见的线程同步的方法有下面几种:互斥锁条件变量信号量这篇博客只介绍互斥量和条件变量的使用。互斥锁和条件变量通常情况下,互斥锁和条件变量是配合使用的,互斥锁用于短期锁定,主要保证线程对临界区的进入;条件变量用于线程长期等待,在wait的时候会释放锁。操作的API如下所示(介绍最常用的): std::m
2017-03-04 21:21:26 8876 6
ncurses_programs代码示例
2017-12-28
mysql-connector-c++-1.1.7-linux-glibc2.5-x86-64bit.rpm
2017-01-07
dosbox-0.74 无bug修复版(内含.EXE文件)
2016-10-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人