转:Nginx源码剖析之内存池,与内存管理(1)

作者:July、dreamice、阿波、yixiao。
出处:http://blog.csdn.net/v_JULY_v/

引言    


    Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。  


    其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx,以及诸多暂不曾得知的玩意儿。

    读者可以到此处下载Nginx最新版本的源码:http://nginx.org/en/download.html。同时,本文本不想给源码太多注释,因为这不像讲解算法,算法讲解的越通俗易懂越好,而源码剖析则不同,缘由在于不同的读者对同一份源码有着不同的理解,或深或浅,所以,更多的是靠读者自己去思考与领悟。

    ok,本文之中有任何疏漏或不正之处,恳请批评指正。谢谢。


Nginx源码剖析之内存池


1、内存池结构


    内存相关的操作主要在文件 os/unix/ngx_alloc.{h,c} 和 core/ngx_palloc.{h,c} 中实现,ok,咱们先来看内存管理中几个主要的数据结构:
typedef struct {    //内存池的数据结构模块
    u_char               *last;    //当前内存分配结束位置,即下一段可分配内存的起始位置
    u_char               *end;     //内存池的结束位置
    ngx_pool_t           *next;    //链接到下一个内存池,内存池的很多块内存就是通过该指针连成链表的
    ngx_uint_t            failed;  //记录内存分配不能满足需求的失败次数
} ngx_pool_data_t;   //结构用来维护内存池的数据块,供用户分配之用。

struct ngx_pool_s {  //内存池的管理分配模块
    ngx_pool_data_t       d;         //内存池的数据块(上面已有描述),设为d
    size_t                max;       //数据块大小,小块内存的最大值
    ngx_pool_t           *current;   //指向当前或本内存池
    ngx_chain_t          *chain;     //该指针挂接一个ngx_chain_t结构
    ngx_pool_large_t     *large;     //指向大块内存分配,nginx中,大块内存分配直接采用标准系统接口malloc
    ngx_pool_cleanup_t   *cleanup;   //析构函数,挂载内存释放时需要清理资源的一些必要操作
    ngx_log_t            *log;       //内存分配相关的日志记录
};

再来看看大块数据分配的结构体:
struct ngx_pool_large_s {
    ngx_pool_large_t     *next;
    void                 *alloc;
};

#define NGX_MAX_ALLOC_FROM_POOL (ngx_pagesize - 1)  //在x86体系结构下,该值一般为4096B,即4K

上述这些数据结构的逻辑结构图如下:

阅读剩余部分...

转:2011年10月百度,阿里巴巴,迅雷搜狗最新面试七十题(1)

引言


   当即早已进入10月份,十一过后,招聘,笔试,面试,求职渐趋火热。而在这一系列过程背后浮出的各大IT公司的笔试/面试题则蕴含着诸多思想与设计,细细把玩,思考一番亦能有不少收获。

    上个月,本博客着重整理,此次重点整理百度,阿里巴巴,迅雷和搜索等公司最新的面试题。同上篇一样,答案望诸君共同讨论之,个人亦在慢慢思考解答。多谢。

    本人正在一步一步整理本文中50多道题的答案,希望诸君各位与我一起做这些题。已经做出来的题目我会把答案即时更新到文章中。诸君,一起努力吧。谢谢。July、2011.10.14更新。



1.十月百度:一个数组保存了N个结构,每个结构保存了一个坐标,结构间的坐标都不相同,请问如何找到指定坐标的结构(除了遍历整个数组,是否有更好的办法)?(要么预先排序,二分查找。要么哈希。hash的话,坐标(x,y)你可以当做一个2位数,写一个哈希函数,把(x,y)直接转成“(x,y)”作为key,默认用string比较。或如Edward Lee所说,将坐标(x, y)作为 Hash 中的 key。例如(m, n),通过 (m,n) 和 (n, m) 两次查找看是否在 HashMap 中。也可以在保存时就规定 (x, y) , x < y ,在插入之前做个判断。)

2.百度最新面试题:现在有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来。(编程珠玑上有此类似的一题,如果有足够的内存的话可以用位图法,即开一个1亿位的bitset,内存为100m/8== 12.5m, 然后如果一个数有出现,对应的bitset上标记为1,最后统计bitset上为0的即可。)

3.Alibaba笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法
String extractSummary(String description,String[] key words)
目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语言)20分。(扫描过程始终保持一个[left,right]的range,初始化确保[left,right]的range里包含所有关键字则停止。然后每次迭代:
1,试图右移动left,停止条件为再移动将导致无法包含所有关键字。
2,比较当前range's length和best length,更新最优值。
3,右移right,停止条件为使任意一个关键字的计数+1。
4,重复迭代。
编程之美有最短摘要生成的问题,与此问题类似,读者可作参考。)

阅读剩余部分...

PHPStorm 3.0 发布,PHP 集成开发工具

    PhpStorm 是 JetBrains 公司开发的一款商业的 PHP 集成开发工具。此IDE是基于java的,但是占用内存和速度等方面都做得很好。JetBrains公司的软件都是精品,如开发java的IntelliJ IDEA,开发python的pycharm等。

PhpStorm 3.0 给我们带来了很多新功能和修复,一共有700改动让这个IDE变得更加易用,更加智能。


PHP UML


phpstorm uml

Profiler


New PHP formatting options


支持Zend,Pear和其他标准的PhpDoc格式化。


VCS News


Platform Improvements


支持MAC OS X LION

阅读剩余部分...

转:如何让程序屏蔽CTRL+C和CTRL+Z

一个程序在终端运行时,我们可以CTRL+C退出该程序或者CTRL+Z暂时停止该程序。那么有办法屏蔽这两个操作吗?

首先,得明白CTRL+C和CTRL+Z做了些什么。stty是Linux下的命令,输出和设置命令行控制参数。stty -a能输出所有命令行设置。如下是本博的命令行设置:
$stty -a
speed 38400 baud; rows 48; columns 159; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
可以看到CTRL+C就等于INTR,CTRL+Z就是SUSP,也就是说这两个分别会向程序发送SIGINT和SIGSTOP信号,这两个信号,一个用于终止进程,一个用于暂停进程,即挂起。

信号是Linux系统用于进程间通信的,内核也可以通过它们向程序发送消息。这些信号都很小,Sponge Liu写了篇文章《Linux内核信号处理机制介绍》,深入浅出的走了介绍。

接下来的问题就是,如何屏蔽两个信号。当然,你也可以通过设置stty的方式实现。可以在程序中屏蔽吗?如果可以,如何屏蔽?如果不可以,为啥?

很明显,肯定有些信号不能被屏蔽,比如中断,还应该有杀死进程的信号,要不然内核怎么做操作系统中的老大。实际上,SIGKILL和SIGSTOP信号是不能被屏蔽或阻止的,他们的默认动作总是会被执行的。

那就来个程序,直接屏蔽SIGINT信号吧.
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <stdbool.h>

bool keep_going = true;

void ignore_notice()
{
  keep_going=false;
  printf("recieved SIGINT,and ignore it.\n");
}

void do_something()
{
  int i=0;
  while(i < 1000000)
    {
      i++;
    }
}

int main ()
{
  if(signal(SIGINT, ignore_notice) == SIG_ERR)
  {
    printf("Fail\n");
    return 1;
  }

  while(keep_going)
    do_something();

  printf("program normally exit.\n");
  return 0;
}

下面语句设置针对SIGINT的动作,第二个参数可以传入函数指针,指定处理方式为函数内容,也可以为SIG_IGN,忽略这个信号,或者SIG_DFL,执行默认的动作。
signal(SIGINT, ignore_notice) == SIG_ERR

转自:http://www.lingcc.com/2010/10/12/11305/

P、NP、NP-Complete、NP-hard问题

算法书中,总会有部分讨论到这个问题。绕来绕去的概念,头大。
这篇文章就再来好好学学这几个概念
Table of Contents

    1 遇到难题怎么办?
    2 什么是P、NP、NP-Complete和NP-hard
    3 P = NP ????
    4 参考


遇到一个问题,通常我们思考的是如何解它。
于是就有了贪心、分治、动态规划等等算法;但也有一些问题,挠破了头也想不到高效的算法。
怎么办?

假如我们已经知道有那么几个问题,这个世界上所有的聪明人都没能找到高效的算法。
而且我们能把目前的问题通过等价转化的方式,变成这些已知问题的子问题。
这样就能证明我们不笨。

这个将一个问题,等价转换成另一个问题的子问题的方式,叫做 归约 (Reduction).
reduction-300x149.jpg
将问题A归约成问题B的子集

阅读剩余部分...

您已使用临时配置文件登录de解决办法

      昨天用魔方软件修改了管理员的默认用户文件夹,指向了一个新的目录,以前是c:\user\adminstrator.jjcc-105这样的,当初装机时不知道怎么弄的,变成了这个,还有一个正常的c:\user\adminstrator目录,但是用管理员账号登陆后,不会往c:\user\adminstrator里写配置,而是往c:\user\adminstrator.jjcc-105里面写,这样导致了一些问题。所以我改过来后,强制删除了c:\user\adminstrator.jjcc-105目录,结果WIN7蓝屏,自动重启后,所有配置丢失。再次重新配置,往桌面放文件夹,结果再次重启后,又丢失了,一切配置都归零,然后win7右下角提示:“您已使用临时配置文件登录。。。”表现就是上一次的所有操作都无效,都丢失了,桌面丢失,主题丢失。
desktop.gif

网上搜了很多方案,都是似是而非,甚至胡说八道的,最后还是微软最熟悉自己的系统,在微软官方解决了。
1.首先在命令行下执行whoami /user,找到当前用户的SID,确保是administrator这个超级管理员身份。

然后是微软的解决方案:
  1. 单击“开始”
  2. 在“开始搜索”(Windows Vista) 或“搜索程序和文件”(Windows 7) 区域,键入 regedit,然后按 Enter
  3. 如果出现 UAC 提示,请单击“继续”(Windows Vista) 或“是”(Windows 7)。
  4. 在“注册表编辑器”中,找到:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
  5. 在左窗格中,找到以“S-1-5”(SID 密钥)开头,后跟一长串数字的文件夹名称。然后单击每个文件夹,在右窗格中找到“ProfileImagePath”,双击验证其是否为出现错误的用户帐户配置文件。
    收起这个图片展开这个图片

    • 如果有两个文件夹以“S-1-5”开头,且后跟一长串数字,并且其中一个文件夹以“.bak”结尾。请将“.bak”文件夹更改为正常文件夹。为此,请执行以下步骤:
      1. 右键单击不含“.bak”的文件夹,选择“重命名”。然后在文件夹名称的末尾添加 .ba
        收起这个图片展开这个图片
      2. 右键单击含有“.bak”的文件夹,选择“重命名”。然后删除文件夹名称末尾的 .bak
        收起这个图片展开这个图片
      3. 右键单击含有“.ba”的文件夹,选择“重命名”。然后将文件夹名称末尾的 .ba 更改为 .bak
        收起这个图片展开这个图片
    • 如果您只有一个文件夹以“S-1-5”开头,且后跟一长串数字并以“.bak”结尾。请右键单击该文件夹,选择“重命名”。然后删除文件夹名称末尾的 .bak。
  6. 选择不含“.bak”的文件夹,在右窗格双击“RefCount”,键入 0,然后单击“确定”。
    收起这个图片展开这个图片
  7. 选择不含“.bak”的文件夹,在右窗格双击“状态”,键入 0,然后单击“确定”。
    收起这个图片展开这个图片
  8. 选择“注册表编辑器”。
  9. 重新启动计算机。
  10. 使用您的帐户再次登录。
         对注册表的后面两步操作是关键,这个网上的解决方案全都是胡扯,都没有提到这两步。详细的说明看这里:http://support.microsoft.com/kb/947215/zh-cn

教训:千万不要相信网上的野鸡教程,微软最熟悉自己的系统,遇到电脑问题,应该上微软官方去寻找答案,微软才是最权威的。

FTP传输之PORT、PASV模式辨析

FTP

FTP是File Transfer Protocol(文件传输协议)的缩写,用来在两台计算机之间互相传送文件。相比于HTTP,FTP协议要复杂得多。复杂的原因,是因为FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。

PORT & PASV

FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。

PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。

PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。

从上面可以看出,两种方式的命令链路连接方法是一样的,而数据链路的建立方法就完全不同。而FTP的复杂性就在于此。

阅读剩余部分...

转:用Vmware Server搭建多虚拟环境 便于浏览器兼容性测试

目前正在梳理整个前端开发的流程及环境,也看了d2大家分享的关于前端各种自动化的演讲,便开始动手了
第一项是希望解决大家兼容性测试的问题,之前已经用虚拟机替换掉了ietester
但本地的虚拟机还是会出现团队成员不一致的情况,并且占用本地资源比较严重
在 美团 潘魏增 老兄帮助下,了解到美团目前在用的vmserver是很好的解决方案,再次感谢

同时参考了很多大家分享的东西,把自己遇到的问题也放出来和大家分享

下一步打算做一些前端自动化方面的脚本,希望和大家多学习,共进步

vmserver是vmware旗下的一款虚拟机服务器,可以通过web管理和操作虚拟机,同时支持多平台 windows、linux、macos等,免费的 可以在官网申请到授权码

这次我们选择的是linux版的vmware server

服务器环境:centos 5.5

vmserver版本:VMware-server-2.0.2-203138.i386

安装过程不详细叙述了 参考下面这篇文章即可,我也复制到最后给大家参考了

安装后通过web可以访问,进入管理端,在里面安装虚拟机即可

阅读剩余部分...

    Page :
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. ...
  9. 38