06 2013 档案

摘要:Nginx源码分析&内存模块 今天总结了下C语言的内存分配问题,那么就看看Nginx的内存分配相关模型的具体实现。还有内存对齐的内容~~不懂的可以看看~~src/os/unix/Ngx_alloc.h&Ngx_alloc.c 先上源码:/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */#ifndef _NGX_ALLOC_H_INCLUDED_#define _NGX_ALLOC_H_INCLUDED_#include #include void *ngx_alloc(size_t size, ngx_lo 阅读全文
posted @ 2013-06-25 13:57 cococo点点 阅读(2847) 评论(0) 推荐(2) 编辑
摘要:C语言中的内存分配与释放 对C语言一直都是抱着学习的态度,很多都不懂,今天突然被问道C语言的内存分配问题,说了一些自己知道的,但感觉回答的并不完善,所以才有这篇笔记,总结一下C语言中内存分配的主要内容。相关问题 刚刚在一篇博文看到一个简单的问题://code1char* toStr() { ... 阅读全文
posted @ 2013-06-23 12:53 cococo点点 阅读(27349) 评论(9) 推荐(8) 编辑
摘要:源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem)。那就来看看这个文件吧!从简单的开始~~~src/os/unix/Ngx_socket.h&Ngx_socket.c 源码如下(可用Source Insight来看源码,不错的选择):/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */#ifndef _NGX_SOCKET_H_INCLUDED_#define _NGX_SOCKET_H_INCLUDED_#include #define NGX_WRITE_SHUTDOWN S 阅读全文
posted @ 2013-06-21 16:54 cococo点点 阅读(3893) 评论(0) 推荐(1) 编辑
摘要:Linux epoll epoll是Kernel 2.6后新加入的事件机制,在高并发条件下,远优于select。epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:#define __FD_SETSIZE 1024 //select最多同时监听1024个fd 当然,可以通过修改头文件再重编译内核来扩大这个数目,但这似乎并不治本。 所以在Nginx中采用了epoll来实现其高并发特性。工作方式 LT(level tr... 阅读全文
posted @ 2013-06-20 14:37 cococo点点 阅读(3280) 评论(3) 推荐(1) 编辑
摘要:Nginx基本数据结构 话说学习一种编程语言,例如C语言,我们首先学的也是数据结构,这是以后开发程序的关键。为了更好更方便的开发Nginx,Nginx自己实现了很多适合nginx的数据结构。Nginx中的数组 ngx_array_s是Nginx中的数组,原型为ngx_array_t。typedef struct { void *elts; //指向数据的指针 ngx_uint_t nelts; //数组中元素的个数 size_t size; //数组中每个元素的大小 ngx_uint_t... 阅读全文
posted @ 2013-06-19 22:27 cococo点点 阅读(3921) 评论(1) 推荐(0) 编辑
摘要:Nginx--connection&request 在Nginx中,主要包括了连接与处理两部分。connection 在src/core文件夹下包含有connection的源文件,Ngx_connection.h/Ngx_connection.c中可以找到SOCK_STREAM,也就是说Ngin... 阅读全文
posted @ 2013-06-19 07:51 cococo点点 阅读(20803) 评论(3) 推荐(12) 编辑
摘要:Nginx架构 Nginx全程是什么?Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP代理服务器。daemon守护线程 nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和... 阅读全文
posted @ 2013-06-18 09:00 cococo点点 阅读(18936) 评论(13) 推荐(13) 编辑
摘要:Linux并发模型 目前可以实现并发程序的方法有Apache模型(Process Per Connection,简称PPC),TPC(Thread PerConnection)模型,以及select模型和poll模型、Epoll模型。各种模型优缺点 Apache模型和TPC模型是最容易理解的,Apache模型在并发上是通过多进程实现的,而TPC模型是通过多线程实现的,但是这种方式在大量进程/线程切换时会造成大量的开销。 select模型是通过一种轮询机制来实现的。需要注意:Socket数量限制:该模式可操作的Socket数由FD_SETSIZE决定,内核默认32*32=1024.操作限制... 阅读全文
posted @ 2013-06-17 21:52 cococo点点 阅读(1703) 评论(1) 推荐(0) 编辑
摘要:Select server linux 的socket函数分为阻塞和非阻塞两种方式,比如accept函数,在阻塞模式下,它会一直等待有客户连接。而在非阻塞情况下,会立刻返回。我们一般都希望程序能够运行在非阻塞模式下。一种方法就是做一个死循环,不断去查询各个socket的状态,但是这样会浪费大量的cpu时间。解决这个问题的一个方法就是使用select函数。使用select函数可以以非阻塞的方式和多个socket通信。当有socket需要处理时,select函数立刻返回,期间并不会占用cpu时间。 select函数原型://Select 函数原型 int select(nfds, readfd.. 阅读全文
posted @ 2013-06-16 12:05 cococo点点 阅读(3378) 评论(2) 推荐(0) 编辑
摘要:多进程实现C/S 把上次的多进程简单的添加一个fork就可以实现一个简单的多进程服务器。具体进程创建和使用的函数,有时间得总结一下了~~~~if(fork()==0){ char buffer[1024]; strcpy(buffer, "this is server! welcome!\n"); send(sock_client, buffer, 1024, 0); bzero(buffer,sizeof(buffer)); flag = recv(sock_client, buffer, 1024, 0); ... 阅读全文
posted @ 2013-06-15 22:27 cococo点点 阅读(556) 评论(0) 推荐(0) 编辑
摘要:多线程实现服务器//线程需要调用的函数void pthread_work(struct argc *argc2){ int flag; struct argc argc1; argc1.sock_clt = argc2->sock_clt; argc1.sock_serv = argc2->sock_serv; printf("%d,%d\n",argc1.sock_clt,argc1.sock_serv); char buffer[1024]; strcpy(buffer, "this is server! welcome!\n"); // 阅读全文
posted @ 2013-06-11 17:14 cococo点点 阅读(604) 评论(0) 推荐(0) 编辑
摘要:简单的C/S//server.h#include "utl.h"class server{public: server(const short port); ~server(); int initServer(); void startListen(); //循环accept,可以通过继承来增加多线程private: struct sockaddr_in server_addr; int sock_serv;};//server.cc#include "server.h"#include "utl.h"server::server( 阅读全文
posted @ 2013-06-11 09:13 cococo点点 阅读(940) 评论(0) 推荐(0) 编辑
摘要:public继承 is-a的关系 public继承是一种is-a关系。也就是说适用于base classes(基类)身上的每一件事都一定适用于derived classes(继承类),每一个derived classes对象都是一个derived classes对象。class A{ void func(); ...}class B : public A{ ... }void func1(A a){ ...}B b;B.func(); // can call the func of Afunc1(B); // auto chuange to A 上面的例... 阅读全文
posted @ 2013-06-10 09:49 cococo点点 阅读(1410) 评论(0) 推荐(0) 编辑
摘要:inline内敛1.类似于C中的#define 在C++中,提供了inline函数来代替C中的宏定义。(通常可以使用const来代替单纯变量的宏定义,它可以提供类型检查。对于形似函数的宏,最好改用inline函数来替换宏定义。) 编译器最优化机制通常被设计用来浓缩那些“不含函数调用“的代码,所以当你inline某个函数时,或许编译器就因此有能力对它执行语境相关最优化。2.效率问题 inline函数同#define宏定义一样,都是以函数本体做替换,这样做可能增加你的目标码(object code),从而可能造成代码膨胀(代码膨胀会导致额外的换页行为,降低指令高速缓存装置的击中率,带来效率损... 阅读全文
posted @ 2013-06-07 09:54 cococo点点 阅读(1900) 评论(0) 推荐(0) 编辑
摘要:树 树形结构是一类非常重要的非线性结构,它可以很好地描述客观世界中广泛存在的具有分支关系或层次特性的对象,因此在计算机领域里有着广泛应用,如操作系统中的文件管理、编译程序中的语法结构和数据库系统信息组织形式等。树的相关定义节点的度:一个节点含有的子树的个数称为该节点的度;树的度:一棵树中,最大的节点的度称为树的度;叶节点或终端节点:度为零的节点;非终端节点或分支节点:度不为零的节点;双亲节点或父节点:若一个结点含有子节点,则这个节点称为其子节点的父节点;孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;兄弟节点:具有相同父节点的节点互称为兄弟节点;节点的层次:从根开始定义起,根. 阅读全文
posted @ 2013-06-05 08:58 cococo点点 阅读(3398) 评论(0) 推荐(1) 编辑
摘要:htons#include <arpa/inet.h>uint16_t htons(uint16_t hostshort);htons的功能:将一个无符号短整型数值转换为网络字节序,即大端模式(big-endian)参数u_short hostshort: 16位无符号整数返回值:TCP / IP网络字节顺序.inet_addr()功能:将一个点分十进制的IP转换成一个长整数型数(u_long类型)原型:in_addr_t inet_addr(const char *cp); 参数:字符串,一个点分十进制的IP地址返回值:如果正确执行将返回一个无符号长整数型数。如果传入的字符串不是 阅读全文
posted @ 2013-06-04 10:01 cococo点点 阅读(393) 评论(0) 推荐(0) 编辑
摘要:1.由名字查找某个熟知的端口struct servent{ char *s_name; /* official service name */ char **s_aliases; /* other aliases */ char s_port; /* prot ofr this service */ char *s_proto; /* protocol to use */};struct servent *sptr;sptr = getservbyname("smtp","tcp"));2.由名字查找协议struct pr... 阅读全文
posted @ 2013-06-03 10:38 cococo点点 阅读(393) 评论(0) 推荐(0) 编辑
摘要:1.对于Linux系统,System V提供了运行级别的概念 对于Linux系统上的服务,这些服务的System V脚本文件都是存放在 /etc/rc.d/init.d 这个目录下。 命令service可以调用指定服务的System V脚本,并执行指定的动作。service 服务名 [start... 阅读全文
posted @ 2013-06-02 09:11 cococo点点 阅读(197) 评论(0) 推荐(0) 编辑
摘要:内存管理1.页 物理页作为内存管理的基本单位。内存管理单元通常以页为单位进行处理。 通过结构体page来表示系统中的每个物理页。2.区 由于页位于内存中特定的物理地址上,所以不能将其用于一些特定的任务,故内核把页划分为不同的区。硬件在内存寻址方面的问题:一些硬件只能通过内存地址来执行直接内存... 阅读全文
posted @ 2013-06-01 11:10 cococo点点 阅读(1381) 评论(0) 推荐(0) 编辑