自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C# virtual和override

在函数的声明中,当有“virtual”修饰的时候,和没有virtual有什么区别呢?最重要的一点就是调用实例的函数是在编译的时候确定还是在运行的时候确定,virtual函数是在运行的时候来确定具体调用哪个类。这个特性是和父子类继承息息相关的。   这儿有个例子,在网上很多地方被转载,我稍微扩展了一下:   using System; namespace Smz.Test { ...

2012-08-27 15:46:23 875

原创 C# Reflection 反射

Reflection反射有四种表现方式: 1.查看元数据metadata(通过attributes特性表示的),用于显示等 2.类型的发现(类型、类型中定义的属性、方法、事件等) 3.推迟绑定对象,可以动态实例化对象并调用方法 4.动态创建新的类型   类型发现的实例:   //读取库 Assembly a = Assembly.Load("Mscorlib.dll"); //...

2012-08-25 16:48:34 135

原创 Inversion of Control(IoC)控制反转

先概括一下Inversion of Control控制反转:是一种设计模式,在依赖关系上进行倒转。具体的体现有“应用程序不应依赖于容器,而是容器服务于应用程序”。   根据Martin Fowler的理解,IoC其实就是框架(framework)和库(library)的区别。库实际意义上就是一系列可用的方法函数,而框架则定义了一些设计模式,比如有如下的ruby代码 #ruby ...

2012-08-25 14:25:50 193

原创 Dependency Injection 依赖注入

先概括Dependency Injection也就是依赖注入:一种设计模式,当类设计中使用到某种其它的类或插件类时,是通过对象引用而不是直接创建对象来实现的,在声明的时候,只需确定接口或者基类就可以了。   引用概念提出者martin fowler的原图,在一种设计模式下,一个类可以在类的定义里面去创建和使用另一个类,例如: 这里MovieLister类创建了MovieFinderImp...

2012-08-25 14:05:56 140

原创 C#的windows services

  1. 新建windows  services模板,自动生成代码 2. 加入自己的代码,一般在OnStart()函数创建一个线程,OnStart()函数会在服务启动的时候执行一次。注意,不要在这个函数里面写循环,会导致启动卡死,代码应写在线程里面 3. 添加安装程序,转到设计界面,在右边的属性栏下面应该有一个“命令栏”,如果没有的话可以右键点击属性页(灰色)勾选出命令栏 4. 编译代码,...

2012-06-22 15:01:12 80

原创 Ruby类的public, protected和private访问控制

Ruby类下对访问控制的限制也是用public,protected和private来做的。虽然用的是和C++和Java相同的名字,但是Ruby下的protected和private定义还是有所不同的。   class ClassSuper attr_accessor :attr1 def initialize @attr1 = "attr1" e...

2012-04-27 16:11:05 182

Ruby类方法的定义

Ruby定义类方法(即static method)有几种,简单的例子 class Foo def Foo.dummy1 puts "dummy1" @name = "dummy1" @@var = "dummy1" puts @name end def Foo::dummy2 ...

2012-04-25 10:45:16 146

原创 C/C++诡异的core

在编写c/c++程序的时候有时候会出一些诡异的core,无法定位到具体的代码或者定位到了一些貌似不可能出错的地方。这很可能是由于栈溢出、数组越界、打印类型不符(比如常见的%s输成了string变量而不是用c_str()方法)导致的。这要求在编写代码的时候要注意,一个好的习惯是在编译的时候发现的warning全部去掉。...

2012-04-10 11:51:10 128

CppUnit学习

  CppUnit定义了几个基础类以及几个继承它们的子类。 基础类主要是定义了一些virtual函数,规定一些行为;用户主要继承使用如TestCase这样的类来完成测试用例。   TestFixture 定义了setUp()和tearDown()两个virtual函数,用来给测试中用到的对象实例做初始化和清理。   Test/TestLeaf(单个test)/TestComposit...

2012-01-13 11:22:41 114

原创 MySQL C API的内存泄露问题

程序使用MySQL的C API比较频繁,在检查程序内存泄露的时候,想到了API里面会不会有内存泄露的问题。网上说mysql api在使用的时候会出现泄露,有人用了valgrind来测试,找到了可能出现泄露的地方,官方的api文档里面也说到,如果使用完api之后,最好调用mysql_library_end()函数来释放内存。   mysql api的官方建议,如果是多线程的时候,最好是在创建线程...

2012-01-10 21:18:08 240

使用fastcgi c api时注意的问题

最近用fastcgi的c语言api写服务,发现一个问题。我用nginx来接收请求,并通过fastcgi_pass传递到c程序。在用curl测试请求的时候,发现c程序是有被调用的,但是nginx返回的响应一直是502 "upstream closed prematurely FastCGI stdout while reading response header from upstream"。在网上...

2012-01-07 13:06:37 225

原创 C++ Standard Library--Chapter 2 & Chapter 3

Chapter 2 Introduction to C++ and the standardy library   这章主要是概括地讲一些关于C++的历史和特性。 C++的标准化过程从1989年就开始了,直到1997年才结束(制定标准的过程很漫长,伴随着多方的努力和协商)。不过按照作者的意思,标准化还是没有达到完美的程度,但是产生了一些基本的库和组件(如string,IO,数据结构和算法等)...

2011-12-03 17:01:55 156

原创 HTTP的Last-Modified和Etag(zz)

1) 什么是”Last-Modified”?   在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样: Last-Modified: Fri, 12 May 2006 18:53:33 GMT 客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传...

2011-10-09 10:40:51 126

原创 accept的Invalid Argument错误

在编写socket程序的时候,遇到一个奇怪的问题,服务端用accept接收请求,客户端通过telnet连接上去。结果每次连上去以后连接又立即断开了,而server端accept以后并没有close连接。   代码如下: /*server*/ int main() { //... socklen_t cli_len; struct sockaddr_in clientad...

2011-09-07 18:54:24 482

一个高并发服务架构

在研究了Nginx以及开发了几个服务器端的软件之后,对于支持高并发的C程序架构总结一下。一般都是多进程或者多线程。对于多线程,因为是一个process space,好处是线程间共享内存,通信方式相对比较丰富,坏处是如果一个线程出了问题,整个进程就会受到影响。个人比较偏好多进程的结构,在这里,梳理一下主要的架构设计,对于所有需要高并发的服务来说都可以套用。   主进程:   int main...

2011-08-25 16:37:05 199

原创 查看编译器的默认include路径

在shell下运行: $ echo | gcc -v -x c++ -E - 或者 $ echo | g++ -v -x c++ -E -   可以看到类似如下的结果 Using built-in specs. Target: x86_64-redhat-linux Configured with: ../configure --prefix=/usr --mandir=/usr/...

2011-08-25 15:24:32 273

Internet地址结构及转换

Internet地址的基本数据结构如下:   #include <netinet/in.h> struct sockaddr_in { short sin_family; // e.g. AF_INET unsigned short sin_port; // e.g. htons(3490) struct i...

2011-07-05 21:47:34 103

C++环境下的expect远程命令执行

首先,必须安装几个开发包,在centos/fedora下,可以使用yum安装: $ yum -y install tcl-devel expect-devel   装完以后,就可以使用expect来写代码了,从网上拉下来一段代码,稍微修改了一下: #include <tcl.h> #include <expect.h> #include <stdio.h&...

2011-06-29 17:49:05 431

在Centos-5下安装Objective-C的编译环境

1. 安装gcc的objc编译功能: $ yum -y install gcc-objc   2. 从http://wwwmain.gnustep.org下载GNUstep Startup和GNUstep Base,并从源码进行安装。   3. 把gnustep tools目录加入到系统目录下(默认是/usr/GNUstep/System/Tools) $ export PATH=$P...

2011-06-23 21:53:54 129

diff和patch给源码做补丁

如果想要对两个目录下的所有文件做diff,可以使用以下命令:   $ diff -BurN [org-src-dir] [target-src-dir] > [patch-file]   其中-B可以忽略所有的空白行,-r对所有的子目录进行递归的操作。[org-src-dir]是未经修改前的源文件目录,[target-src-dir]是修改后的源文件目录。注意:最后生成的p...

2011-06-02 21:03:33 102

Web Polygraph (WebAxe-4) 测试反向代理缓存服务器

由于工作中时常遇到web server/cache的开发工作。一旦做出一些改动,或者添加一些功能,除了功能测试(比如设计一些测试用例)、查看debug信息之外,还需要对整个系统做全面的测试。反向代理服务器和缓存,往往承载着大量的并发请求,对于稳定性的要求很高。这就需要一款比较好的benchmark来进行测试。   Web Polygraph是几年前专门为缓存服务器、代理服务器等设计的测试工具。...

2011-03-21 20:12:14 209 1

Nginx upstream 长连接

Nginx upstream目前只有短连接,通过HTTP/1.0向后端发起连接,并把请求的"Connection" header设为"close"。Nginx与前端的连接默认为长连接,一个用户跟Nginx建立连接之后,通过这个长连接发送多个请求。如果Nginx只是作为reverse proxy的话,可能一个用户连接就需要多个向后端的短连接。如果后端的服务器(源站或是缓存服务器)处理并发连接能力不强...

2011-01-31 15:51:32 355

Nginx的upstream模块和反向代理(二)

上一篇把upstream的配置和初始化的代码稍微分析了一下。本篇主要用图来解释一下upstream反向代理在收到用户请求之后初始化和事件处理流程。   当Nginx收到downstream(用户或者是其他代理)的请求的时候,它会初始化upstream的请求(如图)。经过了下图所示的步骤之后,Nginx创建了向upstream服务器的请求,并向upstream服务器发起连接请求。    ...

2011-01-31 14:53:11 187

原创 Pthreads并行编程之spin lock与mutex性能对比分析[zz]

POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API。线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用就是用Pthreads提供的锁机制(lock)来对多个线程之间共 享的临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。 Pthreads提供了多种锁机制:...

2011-01-20 12:46:38 101

Nginx Proxy Cache分析

本文从几个部分来详细介绍Nginx的proxy cache功能。第一部分,主要介绍proxy cache的过期、空间管理等。第二部分,主要介绍在Nginx(作为反向代理服务器)收到请求之后,如何检查本地的缓存来确定是否要向后端服务器发起请求。第三部分,主要介绍Nginx向后端服务器发起请求并收到回复的情况下,如何把响应回复缓存到本地。 第一部分 在Nginx中,如果启用了proxy...

2011-01-19 15:26:00 141

Nginx Proxy Cache的slab page内存缓存机制

Nginx的内存缓存是通过slab pool来实现的,但是目前Nginx代码没有对http响应进行内存缓存。比如作为反向代理服务器时向后端获取的文件也只是缓存在磁盘里,而内存只是用来做索引。不过Nginx已经提供了内存缓存功能的函数,所以如果在其他地方有需要使用内存缓存的话,也可以通过修改代码来实现(当然,也可以用memory disk来实现内存缓存)。在Nginx的内存缓存机制中,最重要的结构就...

2011-01-15 11:39:42 123

Nginx spinlock互斥锁

在nginx里面,定义了一个spinlock,来同步父子进程间的共享内存操作     #define ngx_shmtx_lock(mtx) ngx_spinlock((mtx)->lock, ngx_pid, 1024)     void ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t sp...

2011-01-13 19:01:42 101

原创 mmap()介绍[zz]

mmap函数是unix/linux下的系统调用,来看《Unix Netword programming》卷二12.2节对mmap的介绍: The mmap function maps either a file or a Posix shared memory object into the address space of a process.We use this function for ...

2011-01-13 11:29:34 99

Squid mainInitialize()函数分析

  static void mainInitialize(void) { //... //do nothing ... comm_select_postinit(); //configure_once代表是否曾经调用过mainInitialize()函数 //1表示之前调用过 if (!configured_once) //do nothing .....

2011-01-12 15:22:45 71

原创 exec函数族的使用[zz]

启动一个新程序,替换原有的进程,因此这个新的被exec执行的进程的PID不会改变,和调用exec函数的进程一样。   #include <unistd.h> int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int e...

2011-01-11 08:29:53 89

原创 sigaction实例[zz]

  struct sigaction{ void (*sa_handler)(int); //在调用前加入信号屏蔽字,仅当信号捕捉函数返回时再将进程的信号屏蔽字复位为原先值*/ sigset_t sa_mask; //Signal options int flags; //结构中还有一个参数,不懂。 }     #include <stdio...

2011-01-11 08:20:42 127

原创 宏中"#"和"##"的用法

宏中"#"和"##"的用法   一、一般用法  我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.  用法: #include<cstdio> #include<climits> using namespace std; #define STR(s) #s #define CONS(a,b) int(a##e##b...

2011-01-10 10:39:53 91

原创 Nginx http端口监听

server {} block里面的"listen"指令调用了ngx_http_core_listen()函数   ngx_http_core_listen(...) { ngx_http_core_srv_conf_t *cscf = conf; ngx_http_listen_opt_t lsopt; /*根据配置的参数设置lsopt*/ //... ...

2011-01-04 22:41:36 212

原创 机械硬盘的延时

硬盘一次读写的时间由两个部分组成: time = latency + data_size / bandwidth   latency主要由平均硬盘寻道时间和平均硬盘转动延迟组成。硬盘有多个磁盘片组成,每个磁盘又由N个同心的track构成,每个track又分成M个sector。磁头移动到目标track,就是寻道的时间(seek time)。那硬盘转动延迟(rotational delay)取决...

2011-01-04 01:09:25 550

Nginx的upstream模块和反向代理(一)

Nginx因其出色的处理并发连接的能力,越来越多地作为一个反向代理服务器被使用。所谓反向代理,即把Nginx置于用户接入的最前端,监听用户发来的请求,并把它们转发给相应的后端服务器来处理具体的请求。后端服务器可以是缓存服务器(如Squid)或是处理动态/静态请求的服务器(如apache/Nginx/lighttpd),在这里不作深入讨论。本文对Nginx在upstream服务器的设置和"proxy...

2010-12-30 10:16:45 625

Nginx的HTTP请求处理

  Nginx在7层负载交换、反向代理服务领域使用比较广泛。Nginx的结构也比较简单,除了底层几个核心的模块(如ngx_core_module,ngx_event_core_module,ngx_errlog_module等)之外,其它的主要是基于上述核心模块的http和mail的模块组,负责处理相关服务。而这些模块也可以在编译的时候被enable/disable,取决于对实际功能的需求。在这...

2010-12-30 10:05:02 183

Nginx事件处理(epoll)

事件处理是Nginx处理请求的核心,每个子进程在ngx_worker_process_cycle()的循环里不断调用ngx_process_events_and_timers()函数来处理各种事件。下面,分析使用epoll机制下(Linux最常用支持大并发的事件触发机制)Nginx事件处理的过程,用源代码分析和debug信息追踪两种方法。 我们从ngx_worker_process_cyc...

2010-12-30 09:51:53 160

Nginx父子进程的创建及主体工作函数

根据Nginx(0.7.67版本)的代码,对Nginx基本的进程创建,进程主体以及事件处理进行了简要的分析。 基本上,父进程(即主进程)一开始会初始化及读取配置,并加载各模块的功能,然后fork()出N个子进程(即工作进程),具有相同的工作逻辑和功能。父进程负责监听信号(如HUP,QUIT等),通过socket pair把信号传递给子进程(子进程间一般不通信)。子进程通过事件来处理父进程传递...

2010-12-30 09:28:30 81

空空如也

空空如也

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

TA关注的人

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