摘要:
Libevent记录下学习日期和学习的东西Memcached发现一个日本人写的pdf,由浅到深,很好的入门资料。http://tech.idv2.com/2008/08/17/memcached-pdf/一个下午把memcached的源码的执行流程和memcached基本实现方法读懂了,memcached是个不错的东西,但是代码结构比较乱!接下来就是从源码中抽取出精华,充分理解而不是只知道memcached的思想,不可只知道大概怎么实现。2011-10-30 已经很熟悉memcached的代码,并且整理出线程那块的代码。 阅读全文
随笔分类 - Linux
Linux IPC系列
2011-10-13 15:48 by Aga.J, 642 阅读, 收藏,
摘要:
Mark Down! When I am spare, I will review it.1 管道半双工,可以有关系或无关系的进程间使用,FIFO(特殊文件),使用时管道的读写规则如读写打开,读写过程,阻塞读写,有较多地方需要注意!2 信号 异步方式,可靠和不可靠,kill,raise(向自身发送信号),sigqueue(支持信号带参数,之前可以配置信号处理函数),alarm(只有SIGALRM信号),settimer(更加强大的定时器),abort(SIGABORT信号) 信号安装靠signal和sigaction(与sigqueue配合)3 消息队列消息队列与管道以及有名管道相比,具有更大 阅读全文
Linux synchronous系列
2011-09-29 15:42 by Aga.J, 378 阅读, 收藏,
摘要:
Mark Down! When I am spare, I will review it. 原子操作用在位操作或者某个简单计数器(整型)可以使用原子增减等操作。自旋锁在加锁时间短的情况下可以使用,免去了传统的睡眠唤醒带来的开销读写锁读者多写者少的环境下使用,但是写者可能被饿死信号量信号不会丢失,在读者写者的环境下使用得多条件变量最常用的线程间同步等待某个条件发生,然后通知所有人seqlock解决了读者多,写者少时写者饿死的情况互斥量互斥访问某个临界区,资源保护,只能由一个进程或线程持有,并只有由它自己释放记录上锁上锁粒度可以缩小到文本中的字节范围文件作为锁.. 阅读全文
Linux TCP server系列(8)-cgi server
2011-09-18 21:36 by Aga.J, 1290 阅读, 收藏,
摘要:
目标:单进程cgi服务器CGI介绍: CGI使在网络服务器下运行外部分应用程序(或网关)成为可能。CGI-BIN目录是存放CGI脚本的地方。这些脚本使WWW服务器和浏览器能运行外部程序,而无需启动另一个原因程序。 CGI是在HTTP服务器下运行外部程序(或网关)的一个接口,它能让网络用户访问远程系统上的使用类型程序,就好像他们在实际使用那些远程计算机一样。 尽管CGI易于使用,但是当大批人同时使用一个CGI应用程序是会反应较慢,网络服务器 速度也会受到很大 影响。CGI应用程序的优点是可以独立运行。 CGI应用程序可以由大多数的编程语言编写,如Perl(Practical Extracti.. 阅读全文
Linux TCP server系列(7)-select模式下的prefork server
2011-09-18 21:11 by Aga.J, 1674 阅读, 收藏,
摘要:
目标: 多进程服务器的性能提升。 前面介绍过一种server模式为每个客户端连接都创建一个子进程,这种方式对server的压力较大,首先创建进程会消耗时间,其次,进程没有办法得到重复利用也会浪费了进程的创建,最后,进程间切换会带来性能上的影响。 本程序使用prefork思想,预先为server派生多个子进程,方便在需要时可以马上使用,而不需要等待进程创建,同时,进程还可以重复使用。思路: 程序预先fork多个子进程,用来处理每个客户端socket的信息交互或者请求(决定预先fork多少个子进程是个问题!)一开始每个子进程都阻塞在和父进程的通信通道上,等待父进程的消息通知(处理某个客户请求),然 阅读全文
Linux TCP server系列(6)-select模式下的多线程server
2011-09-18 20:00 by Aga.J, 5331 阅读, 收藏,
摘要:
目标: 修改上一篇的select模式下的server,让它使用多线程来处理客户端请求(多进程的模式已经在上篇中加了注释)。思路: (1)服务器 我们已经在之前的客户端模型多个并发用户的过程中使用过多线程的技术了(其中还涉及到多线程利用条件变量进行线程同步),在这里我们可以很轻松的在上篇文章代码中加入线程部分代码。//for thread int *lptr; pthread_t pid; //for thread for(i=0;i<=maxi;i++) { if((sockfd=client[i]) <0) continue; if(FD_ISSET(sockfd,&rs 阅读全文
Linux TCP server系列(5)-select模式下的单进程server
2011-09-18 19:25 by Aga.J, 3396 阅读, 收藏,
摘要:
目标:让服务器退化为单进程模式,但是利用select来提升性能思路: (1)服务器 传统的单进程服务器一旦accept了客户端的TCP连接后,就转入客户请求的处理,处理完成后才能再一次的调用accept来接受下一个客户端的TCP连接和请求。 为了更加提高单进程server的性能,本程序使用select这种IO复用的模式,同时监听已经连接的socket端口和正在监听的服务器listening端口,这样一来,就可以大大提升sever处理并发请求的能力。 select的使用方式如下: a)定义fd_set fd_set allset; select允许我们监听来自标准输入,标准输出,标准错误输出的I 阅读全文
Linux TCP server系列(4)-浅谈listen与大并发TCP连接
2011-09-18 18:43 by Aga.J, 4276 阅读, 收藏,
摘要:
背景: 服务器在调用listen和accept后,就会阻塞在accept函数上,accpet函数返回后循环调用accept函数等待客户的TCP连接。如果这时候又大量的用户并发发起connect连接,那么在listen有队列上限(最大可接受TCP的连接数)的情况下,有多少个connect会成功了。试验证明,当连接数远远高于listen的可连接数上限时,客户端的大部分TCP请求会被抛弃,只有当listen监听队列空闲或者放弃某个连接时,才可以接收新的连接,那么我们应该如何来避免这种情况出现?分析:(一)客户端客户端运行初期完成所设定的一定量的socket创建和相应的处理线程的创建,然后使用条件变量 阅读全文
Linux TCP server系列(3)-fork注意事项
2011-09-15 17:17 by Aga.J, 4821 阅读, 收藏,
摘要:
前两篇文章都是使用fork子进程来处理客户端请求,所以我们需要在这里了解一下fork的具体信息。 当server从accept返回时,它获得socket连接另一端的client socket 文件描述符和socket地址信息,然后使用fork创建子进程来执行对应client socket上的操作。 使用fork应该注意以下几点: (1)子进程可以关闭不必要的文件描述符或者释放其他资源,因为使用fork后,如果子进程不调用exec以使用新的进程空间的话,子进程会复制父进程的进程空间内容,包括数据段等(代码段是共享的,数据段等采用一种写时复制的策略来提高性能)。所以不必要的资源可以尽快释放。 (2 阅读全文
Linux TCP server系列(2)-简单优化服务器和客户端程序
2011-09-15 16:48 by Aga.J, 2343 阅读, 收藏,
摘要:
目标:在上个server中考虑更多细节问题,完善server。思路:(1)服务器父进程使用fork派生子进程后,如果子进程运行结束,那么该进程不会立刻被销毁,而会进入“僵尸状态”,仍然维护着自身的信息,这时候如果服务器父进程不加以处理,那么很快就会消耗完系统的内存空间,所以父进程需要监听子进程SIGCHLD信号,并做出处理以销毁残留信息,这里可以使用wait或者waitpid来实现。我们在父进程调用listen之后,注册监听信号和信号处理函数signal(SIGCHLD, sig_child);信号处理函数实现如下:void sig_child(int signo) //父进程对子进程结束的信 阅读全文
Linux TCP server系列(1)-简单TCP服务器+多进程处理客户请求
2011-09-15 09:53 by Aga.J, 8783 阅读, 收藏,
摘要:
目标: 完成一个精简TCP服务器,可接收来自多个用户的请求,并返回结果。思路: (1)服务器 C++ TCP服务器的实现主要由以下几个函数来完成: a)socket 创建服务器监听套接字b)bind 绑定服务器监听信息到套接字上c)listen 开始监听,接收客户端的TCP连接d)accept 从listen所维护的队列中取出一条已连接的TCP,返回该连接的socket描述字 e)服务器客户端在连接socket描述字上进行消息通信f) close 关闭打开着的套接字 为了更好的服务多个发起请求的客户端,在e步骤上,我们使用fork以派生子进程来独立处理每个客户端的请求。 if( (childp 阅读全文
《Unix网络编程》学习笔记 第一,第二章
2011-08-26 01:13 by Aga.J, 1512 阅读, 收藏,
摘要:
第一章 简介第一章对Unix下的网络编程做了概要的介绍,使用了获取时间的实例来讲解网络编程中所需要使用到的函数和注意内容,并详细的解析了每个函数的功能及其使用。由于之前已经谈过简单TCP通信的实现,这里便不再赘述。TCP下的日期/时间 客户端TCP下的日期/时间 服务器第二章传输层:TCP和UDP一 协议介绍UDP不可靠,数据报,TCP可靠,字节流,面向连接,全双工,支持ACK、超时重传,需要保证消息独立性ICMP网际控制消息协议,处理路由器和主机间的错误和控制信息IGMP网络组管理协议ARP地址解析协议,将IPv4地址映射到硬件地址RARP逆地址解析BPFBSD分组过滤器,为进城提供访问数据 阅读全文
《深入理解Linux内核》学习笔记-第一章
2011-08-26 01:11 by Aga.J, 707 阅读, 收藏,
摘要:
第一章 绪论(1) 类Unix操作系统采用“进程/内核”的模式,每个进程都自以为它是系统中唯一的进程,可独占操作系统所提供的服务,只要进程发出系统调用,硬件就会把特权模式由用户态转变为内核态,然后进程开始执行一个内核过程,这个过程的执行被局限于一个非常小的内核范围内,一旦请求被满足,内核过程迫使返回用户态,进程执行下一条指令(2) Unix文件是以一列字节组成的信息载体,内核不解释文件内容(3) unix的每个进程都有一个当前的工作目录,它属于进程执行上下文,标志出进程所用的当前目录(4) Unix文件类型包括:普通文件,目录,符号链接,块设备文件,字符设备文件,管道,命名管道,套接字(5) 阅读全文
谈谈linux上的并发(网络资源总结)
2011-08-26 01:10 by Aga.J, 1414 阅读, 收藏,
摘要:
“并发”一词可能会误导很多人,实际上在单核的机器上并发是通过分时运行来模拟的,称为Concurrency,而在多核的机器上才可实现真正的并发,称为Parallelism。下面逐步介绍Linux上的IO模型,从而解析并发策略:(一) 阻塞I/O模型:分析:使用recvfrom,执行系统调用函数,陷入到内核中,内核等待数据报到来,这个时候用户进程被阻塞,直到内核拿到数据报后,拷贝到用户空间的缓冲区上,并通知用户空间进程数据报拷贝完成,这种阻塞I/O模式不适合多用户请求的环境。(二) 非阻塞I/O模型:分析:和“阻塞IO模型”不一样,非阻塞IO模型会收到内核的无数据报消息,防止进程一直阻塞在上面,接 阅读全文
select,epoll,poll比较(网络资源总结)
2011-08-26 01:09 by Aga.J, 2456 阅读, 收藏,
摘要:
select,poll,epoll简介selectselect本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是:1 单个进程可监视的fd数量被限制2 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大3 对socket进行扫描时是线性扫描pollpoll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了 阅读全文
lighttpd高性能Web服务器源码分析?坑爹啊,原来是light httpd!-0 -
2011-08-10 16:40 by Aga.J, 20048 阅读, 收藏,
摘要:
最近刚打算学unix网络编程,所以做了点入门的准备后,就找了个轻量级的web服务器的源码来看,听网上介绍说lighttpd不错,所以我找了一下,把所谓的源码下了下来,研究了一下,最后发现哥玩的是light httpd(http://lhttpd.sourceforge.net/docs.html)不是lighttpd(http://www.lighttpd.net/),坑爹啊!!!尼玛怎么长那么像啊!! 所以下面说的全是light httpd的源码分析,要看lighttpd的同学就等我有空再贴文章吧。 (1)先看热闹 上 light httpd官方网址(http://lhttpd.sourc. 阅读全文
老大让我学Linux之练笔作业:过时文件删除脚本,日志监控程序
2011-07-29 16:29 by Aga.J, 776 阅读, 收藏,
摘要:
练笔作业1: 要求使用脚本将某个目录下前两天的文件删除实现: #!/bin/bash threshold=$(date --date='2 days ago' +%Y-%m-%d) directory=testDir cd /$directory ls -l | awk '{v0="rm -r"; v1=$8; if ($6!="" && $6<"'"$threshold"'") {print "delete ",$8;system( 阅读全文
老大让我学Linux之echo指令,awk,grep,sed指令及shell上的socket程序实例
2011-07-22 10:42 by Aga.J, 5417 阅读, 收藏,
摘要:
下文摘自网络文章Linux echo命令功能说明:显示文字。语 法:echo [-ne][字符串] 或 echo [--help][--version]补充说明:echo默认会将结果字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号。参 数:-n 不要在最后自动换行-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:\a 发出警告声;\b 删除前一个字符;\c 最后不加上换行符号;\f 换行但光标仍旧停留在原来的位置;\n 换行且光标移至行首;\r 光标移至行首,但不换行;\t 插入tab;\v 与\f相同;\\ 插入\字符;\nnn 插入nnn(八进 阅读全文
老大让我学Linux之shell变量替换,cat指令,head和tail指令
2011-07-22 10:31 by Aga.J, 6603 阅读, 收藏,
摘要:
Shell变量替换条件变量替换:Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换条件放在{}中.(0) ${parameter} 和$parameter相同,表示变量parameter的值(1) ${value:-word} 当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值. 有点类似 a?a:b(2) ${value:=word}与前者类似,只是若变量未定义或者值为空时,在返回word的值的同时将word赋值给value(3) ${value:?message}若变量以赋值的话,正常替换.否则将消息message送到标准错误输出(若此替换出现 阅读全文
老大让我学Linux之管道
2011-07-22 09:55 by Aga.J, 3077 阅读, 收藏,
摘要:
什么是管道?管道,很形象的一个词,描述的是linux系统中进程间是如何通信的。可以将一个程序的输出直接连接到另一个程序的输入,常说的管道多为无名管道,无名管道只能用于具有亲缘关系的进程之间。那么非亲缘间的进程怎么通信呢,这就通过named pipe(命名管道)来完成了。不管是半双工的匿名管道还是命名管道,它们都是利用FIFO排队模型来指挥进程间的通信。 例如我们使用ls –l来列出当前文件夹下有什么文件的信息,我们可以使用管道,将这些结果传递到另一个地方去(这里ls –l估计默认的隐含的管道是指向bash shell,所以我们使用ls –l时总可以看到shell上显示文件信息),我们试试 l. 阅读全文