自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL分组排序求Top N

表结构 按照grp分组,按照num排序,每组取Top 3,输出结果如下:  源代码:SELECT * FROM score AS t3 WHERE ( SELECT COUNT(*) FROM score AS t1 LEFT JOIN score AS t2 ON t1.grp = t2.grp AND t1.num < t2.num ...

2015-04-02 20:58:03 620

原创 screen的配置

# Set default encoding using utf8defutf8 on## 解决中文乱码,这个要按需配置defencoding utf8encoding utf8 utf8 #兼容shell 使得.bashrc .profile /etc/profile等里面的别名等设置生效shell -$SHELL#set the startup mes...

2014-08-05 21:08:14 210

Yaf源码阅读之请求的处理(二)

上一篇文章 我们分析了Yaf框架的启动,包括配置文件的初始化以及框架类的加载。本文将分析Yaf处理一次Web请求的详细过程,这是一个Web框架最核心的部分,理解了这点,就理解了Yaf的实现原理。 (一)框架类的实例化在上一篇文章提到了Yaf框架类的加载,类加载完成后,还要实例化,我们逐一分析Yaf各个框架类的构造函数。 不急于分析各种调用关系,我们先看下Applic...

2013-11-24 02:23:27 657

Yaf源码阅读之框架的启动(一)

(一)Yaf是什么Yaf,全称 Yet Another Framework,是一个C语言编写的、基于PHP扩展开发的PHP框架,相比于一般的PHP框架,它更快,快到被誉为最快的PHP开发框架。它提供了Bootstrap、路由、分发、视图、插件功能。 Yaf由惠新宸(传说中的鸟哥)开发,隆重介绍下,惠新宸,PHP开发组核心成员,PECL开发者, Zend公司外聘顾问, 曾...

2013-11-23 19:54:47 730

Java静态内部类

两种内部类Java的内部类有两种,一种是静态内部类,另一种是普通内部类,普通内部类可以获得外部对象的引用,所以在普通内部类能够访问外部对象的成员变量 ,也就能够使用外部类的资源,可以说普通内部类依赖于外部类,普通内部类与外部类是共生共死的,创建普通内部类的对象之前,必须先创建外部类的对象。创建普通内部类的代码如下:Outer o = new Outer();Outer.In...

2012-07-22 22:17:50 317

原创 Virtualbox下Windows和Linux实现文件互传

1 Windows安装好Linux虚拟机 2 在Linux下运行一个 Python 实现的http服务器,代码如下:  #!/usr/bin/env python"""Simple HTTP Server With Upload.This module builds on BaseHTTPServer by implementing the standard G...

2012-07-17 21:05:54 385

Paxos算法

分布式系统的核心问题是数据一致性,解决一致性有很多算法,而 Paxos 算法无疑是最著名的,Google 工程师曾说,所有一致性算法都可以归结为 Paxos 算法的一个特列。可见,很有必要学习 Paxos 算法。 Paxos 算法是由 Lamport 提出来的,他得论文 Paxos made simple 是最好的学习资料。我在阅读的过程中遇到很多困难,文中的一些逻辑推论隐藏得...

2012-04-18 10:59:10 100

原创 编程之美3.1 字符串移位包含的问题

题目给定两个字符串 s1 和 s2, 要求判定 s2 是否能够被通过 s1 作循环移位 ( rotate )得到的字符串包含. 例如, 给定 s1 = AABCD 和 s2 = CDAA, 返回 true; 给定s1 = ABCD 和 s2 = ACBD, 返回 false.  解法1直接模拟, 对 s1 进行循环移位, 在判断字符串 s2 是否在移位后的字符串中....

2012-03-12 23:26:14 156

Memcached源码分析之网络模型篇

memcached 采用多线程的工作方式, 主线程接收连接, 然后把连接平摊给工作线程, 工作线程处理业务逻辑, memcached 使用 libevent 处理网络事件, 主线程和工作线程都有一个 event base, 这是 libevent 的核心数据结构, event base 能够监听多个 socket 的网络事件, 概括起来, memcached 大体框架如 图1 所示...

2012-03-02 01:46:48 170

Memcached源码分析之内存管理篇

使用命令 set(key, value) 向 memcached 插入一条数据, memcached 内部是如何组织数据呢 一 把数据组装成 itemmemcached 接受到客户端的数据后, 把数据组装成 item, item 的格式如下:    图1 struct item 的结构 源码中这样定义 struct item: /** * Structure ...

2012-02-26 15:04:18 204

原创 多线程与volatile变量

 volatile 修饰的变量表示改变量的值是易变的,编译器不对其进行优化,访问该变量的时候不会从寄存器读取, 而是直接从内存读取变量。在多线程环境下,每个线程都有一个独立的寄存器,用于保存当前执行的指令。假设我们定义了一个全局变量,每个线程都会访问这个全局变量,这时候线程的寄存器可能会存储全量变量的当前值用于后续的访问。当某个线程修改了全局变量的值时,系统会立即更新该...

2012-02-25 17:07:41 356

原创 memcopy 和 memmove 的实现

一 memcopy 的实现 memcopy 不考虑源内存和目标内存之间的重叠, 逐字节地拷贝, 代码比较简单  void my_memcopy(void *src, void *dst, int size){ char *psrc, *pdst; psrc = (char *)src; pdst = (char *)dst; while (size-...

2012-02-18 14:25:55 212

cookie 实现验证码的原理

验证码技术用来解决网络中的恶意注册或者 DDOS 攻击,主要原理是,让用户输入图片中的文字,如果通过了验证,服务器就在客户端浏览器保存一个验证 cookie,比如叫做 <secure_session, 9HcxOGJMhn5j7UpmguyA4ABD>以后用户访问服务器其他页面的时候,服务器先获取这个 cookie, 如果存在,说明验证通过,不存...

2012-01-05 20:58:56 741

SkipList 跳表

为什么选择跳表目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。 想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗? 很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,还要参考网上的代码,相当麻烦。 用跳表吧,跳表是一种随机化的数据结构,目前开源软件 Redis 和 L...

2011-10-09 01:08:17 1194

原创 Erlang 学习笔记

函数的返回值函数不会显示地返回值,函数中最后一条语句的执行结果将作为函数的返回值。 main(_) -> {A, B} = test(), io:format("A = ~w, B = ~s~n", [A, B]).test() -> {2,"hello"}.  函数的分支同一个函数中,并列的逻辑分支之间,用分号 “;”...

2011-10-02 23:29:37 366

web聊天室

web 聊天室支持多人在线聊天,某个人发了一条消息,在线的所有人都能实时看到。 tornado 自带的 demo 演示了如何实现一个 web 聊天室, 通过源码,我总结一下它设计方案。服务器端维护一个消息缓存,用来保存所有人发的消息。维护一个等待队列,用来保存等待新消息的用户。如下图所示:(1) 添加消息服务器把用户发送的消息加入消息缓存,同时唤醒等待队列中...

2011-10-02 14:57:34 256

守护进程的实现

6个步骤 步骤1:创建子进程,杀死父进程,目的是为了步骤2中调用setsid可以成功。 步骤2:创建新会话,并自任组长。目的是脱离控制终端               会话组长调用 setsid 会失败,步骤1创建的子进程必然不是会话组长,               这就保证了 setsid 可以成功。 步骤3:修改工作目录为根目录。             ...

2011-09-30 01:43:15 115

非阻塞connect的实现

步骤1: 设置非阻塞,启动连接实现非阻塞 connect ,首先把 sockfd 设置成非阻塞的。这样调用 connect 可以立刻返回,根据返回值和 errno 处理三种情况:(1) 如果返回 0,表示 connect 成功。(2) 如果返回值小于 0, errno 为 EINPROGRESS,  表示连接      建立已经启动但是尚未完成。这是期望的结果,不是真正的错误。...

2011-09-30 01:12:20 309

Memcached内存管理机制

Slab 分配机制 Memcached 不是把所有大小的数据都放在一起的,而是预先分配一系列的 slab,每个slab 负责一定范围内的数据存储。初始时,Memcached 为每一个 slab 分配 一个Page(1M) 的内存, slab内再把page切分成一个一个 Chunk, 组成 Chunk数组,每个Chunk 的大小等于该 slab 的数据存储范围的最大值。...

2011-09-29 20:57:31 150

(转)一致性哈希算法及其在分布式系统中的应用

原文地址: http://www.cnblogs.com/leoo2sk/archive/2011/08/11/consistent-hashing-intro.html Consistent hashing算法非常简洁,如果你有一系列服务器,需要把很多 keys (objects)映射到这些服务器上。这时Constent hashing就派上用场了。典型的例子包括 memcached...

2011-09-29 19:02:59 126

算法导论习题 5.1 -2

描述random(a, b)过程的一种实现,它只调用random(0,1)。作为a和b的函数,你的程序期望运行时间是多少? 算法描述这个题目相当于在能随机生成0,1的前提下,要求生成[0, 1, ...,n-1]范围内的一个整数1 求出最小的 m,使2^m >= n-12 通过random(0,1),产生一个m比特的整数,这样能随机产生[0, 2^m-1]内的整数,若产生的整...

2011-09-29 09:23:22 131

关于大端法和小端法

 typedef union { int n; char p[sizeof(int)];} union_t;union_t ut;memset(&ut,0, sizeof(ut));ut.p[0] = 13;printf("%d\n", ut.n); 输出结果是什么?  一般来说,大部分用户的操作系统(如windows, FreeB...

2011-09-28 23:15:03 183

vim配置文件精简版

"Get out of VI's compatible mode..set nocompatible"Sets how many lines of history VIM har to rememberset history=400"Enable filetype pluginfiletype plugin onfiletype indent on"Set ...

2011-09-19 09:37:54 94

原创 (转) Linux 的僵尸(zombie)进程

 原文地址:  http://coolshell.cn/articles/656.html可能很少有人意识到,在一个进程调用了exit之后,该进程 并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构。在Linux进程的5种状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所 有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等...

2011-09-17 20:29:39 132

Linux信号详解

一 信号的种类可靠信号与不可靠信号, 实时信号与非实时信号可靠信号就是实时信号, 那些从UNIX系统继承过来的信号都是非可靠信号, 表现在信号不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值小于SIGRTMIN的都是非可靠信号.非可靠信号就是非实时信号, 后来, Linux改进了信号机制, 增加了32种新的信号, 这些信号都是可靠信号, 表...

2011-09-17 01:02:23 437

消息队列

 一 应用场景有很多业务, 客户端和内网都要进行数据传输和交换, 现有架构中, 客户端不能直接访问内网, 那么客户端只能: 先把数据保存到外网服务器, 然后内网服务器再拉回来处理. 这种方式可以保证数据都能被处理, 但实效性不够. 通常, 外网服务器只起到一个暂时保存数据的作用, 保存客户端报上来的数据, 然后等待内网来拉走,把客户端看做producer, 内网看做co...

2011-09-15 22:16:23 215

strlcpy实现

#include <stdio.h>/* * Copy src to string dst of size siz. At most siz-1 characters * will be copied. Always NUL terminates (unless siz == 0). * Returns strlen(src); if retval >= ...

2011-09-13 22:41:37 546

nginx源码阅读笔记

 最近做一个收集客户端数据的项目, 后台使用nginx, 通过实现nginx的模块来处理业务.  nginx的模块编写不难,但写完后对nginx的内部机制还是云里雾里, 趁周末好好阅读一下nginx的源代码.  下面记录一些阅读过程中遇到的数据结构. 关于nginx的内部实现, 等看懂了源码再写.模块四要素:1 模块实例, 2 模块上下文, 3 模块指令, 4 指令...

2011-09-10 00:16:43 110

vim + taglist + ctags + cscope 简单使用

ctags用来跳转, taglist用来列出当前文件的变量, 函数, 宏. cscope用来查找符号一 使用ctags1 在源码目录创建tag文件cd /home/kenby/project/nginx-1.0.0/srcctags -R2 打开一个文件gvim core/ngx_string.c把光标移到变量名或函数名上,然后按下"Ctrl-]"。用"...

2011-09-08 21:58:05 180

正确使用pthread_cond_wait

消费者的两种等待方式:方式1: if (empty(queue)) {    pthread_cond_wait(&queue_has_element, &mutex);}element = dequeue(queue);方式2:while (empty(queue)) {    pthread_cond_wait(&queue_h...

2011-09-08 00:22:26 102

Linux C线程池实现

三个文件 1 tpool.htypedef struct tpool_work { void (*routine)(void *); void *arg; struct tpool_work *next;} tpool_work_t;typedef struct tpool {...

2011-09-08 00:06:39 230

原创 Linux进程通信 之 管道

  管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 管道是Linux支持的最初Unix IPC形式之一,具有以下特点:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);单独构成一种独立的文件系统:管道对...

2011-09-05 21:19:24 82

如何 fork n 个进程(n > 2)

讲到fork, 一个经典的例子如下:if ((pid = fork()) == 0) {    printf("in child %d\n", getpid());} else if (pid > 0) {    printf("in parent\n");} else {    perror("fork");    exit(0);}现在, 我要...

2011-09-05 17:03:04 111

原创 Linux进程通信 之 信号灯(semphore)

 一. 信号灯简介信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志。除了用于访问控制外,还可用于进程同步。信号灯有以下两种类型:二值信号灯:最简单的信号灯形式,信号灯的值只能取0或1,类似于互斥锁。 注:二值信号灯能够实现互斥锁的功能,但两者的关注内容不...

2011-09-03 20:56:32 419

Linux进程通信 之 共享内存

一. 共享内存介绍系统V共享内存指的是把所有共享数据放在共享内存区域(IPC shared memory region),任何想要访问该数据的进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面。系统调用mmap()通过映射一个普通文件实现共享内存。系统V则是通过映射shm文件系统中的文件实现进程间的共享内存通信。也就是说,每个共享内存区域对应shm文件...

2011-09-03 15:18:19 78

mmap详解

 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式, 因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是...

2011-09-02 22:37:32 1109

Linux进程间通信 之 消息队列(转)

原文地址: http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点。作为早期unix通信机制之一的信号能够传送的信息量有限,后来虽然POSIX 1003.1b在信号的实时性方面作了拓广,使得信号在传递信息量方面有了相当程度的改进,但是信号这种通信方式更像"即时"的通信...

2011-09-01 22:05:31 102

epoll在LT和ET模式下的读写方式

在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK)从字面上看, 意思是:* EAGAIN: 再试一次* EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block* perror输出:  Resource temporarily unavailable总...

2011-08-31 23:40:17 347

使用python的logging模块

一、从一个使用场景开始 开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件 import logging# 创建一个loggerlogger = logging.getLogger('mylogger')logger.setLevel(logging.DEBUG)# 创建一个handler,用于写入日志文件fh = logging.FileH...

2011-08-31 18:47:36 159

学习使用epoll

epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。  一、epoll的优点支持一个进程打开大数目的socket描述符。IO效率不随FD数目增加而线性下降。 二、epoll的使用epoll有2种工作方式:LT和ET。   LT(level triggered,水...

2011-08-29 20:39:18 127

空空如也

空空如也

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

TA关注的人

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