230 likes | 463 Views
进程间通讯 2 -- 架构平台部. 讲师: delexxie 日期: 2009 年 08 月 12 日. 自我简介. Delexxie 谢建东 架构平台部 接入平台中心 业务开发组 Storage 、 FTN 、 CDN. 课程简介. 进程间通讯: 消息队列、信号灯、共享内存,只能在单一机器上实现。 跨机器进程通讯: Socket 介绍基于 TCP/IP 网络的 Socket 跨机器进程通讯 介绍基于单机进程通讯的 UNIX Domain Socket 介绍同步、异步的概念. 目录. Socket 、 Domain Socket 概要介绍
E N D
进程间通讯2--架构平台部 讲师:delexxie 日期:2009年08月12日
自我简介 Delexxie 谢建东 架构平台部\接入平台中心\业务开发组 Storage、FTN、CDN
课程简介 • 进程间通讯:消息队列、信号灯、共享内存,只能在单一机器上实现。 • 跨机器进程通讯:Socket • 介绍基于TCP/IP 网络的Socket 跨机器进程通讯 • 介绍基于单机进程通讯的 UNIX Domain Socket • 介绍同步、异步的概念
目录 • Socket、Domain Socket 概要介绍 • Socket 关键API • Socket 一些系统设置 • Socket 使用流程 • Socket 简单应用 • UNIX Domain Socket 介绍 • UNIX Domain Socket 使用流程 • UNIX Domain Socket 简单应用 • 高级篇:“同步”、“异步”概念 • 作业 • 提问
Socket、Domain Socket 概要介绍 • Socket 接口是网络接口的API,用来实现网络通讯,支持协议:TCP/IP、UDP/IP、IPX等 • 互联网的几乎所有的服务器,都是用Socket 开发的服务器,提供的服务: 如 apache • 在Socket的框架上发展出一种IPC机制,就是UNIX Domain Socket, 可以实现高效的单机进程间通讯,why?
Socket 关键API int socket(int domain, int type, int protocol); int bind(int sockfd, struct sockaddr *sa, int addrlen); int connect(int sockfd, struct sockaddr *servaddr, int addrlen); int listen(int sockfd, int queue_length); int accept(int sockfd,struct sockaddr *addr,int *addrlen); int close(int sockfd); int shutdown(int sockfd, int how); int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout); int send(int s, const void *buf, int len, int flags); int recv(int s, void *buf, int len, int flags); int sendto(int s, const void *buf, int len, int flags, const struct sockaddr *to, int tolen); int recvfrom(int s,void *buf, int len, int flags, struct sockaddr *from, int *fromlen);
Socket 一些系统设置 int setrlimit(int resource, const struct rlimit *rlim); ulimit /proc/sys/kernel/sem 建议设置:250 32000 100 128第一列,表示每个信号集中的最大信号量数目。第二列,表示系统范围内的最大信号量总数目。第三列,表示每个信号发生时的最大系统操作数目。第四列,表示系统范围内的最大信号集总数目。所以,(第一列)*(第四列)=(第二列) /proc/sys/kernel/shmall 表示在任何给定时刻,系统上可以使用的共享内存的总量(bytes)。 /proc/sys/kernel/shmmax 表示内核所允许的最大共享内存段的大小(bytes)。 /proc/sys/kernel/shmmni 表示用于整个系统的共享内存段的最大数目(个)。 /proc/sys/kernel/threads-max 表示内核所能使用的线程的最大数目。 /proc/sys/kernel/msgmax 表示从一个进程发送到另一个进程的消息的最大长度(bytes)。 /proc/sys/kernel/msgmnb 表示一个消息队列的最大长度(bytes) /proc/sys/kernel/msgmni 表示消息队列标识的最大数目,即系统范围内最大多少个消息队列。 /proc/sys/fs/file-max 表示可以分配的文件句柄的最大数目。 /proc/sys/net/core/rmem_default 表示接收套接字缓冲区大小的缺省值(以字节为单位)。 /proc/sys/net/core/rmem_max 表示接收套接字缓冲区大小的最大值(以字节为单位)。 /proc/sys/net/core/wmem_default 表示发送套接字缓冲区大小的缺省值(以字节为单位)。 /proc/sys/net/core/wmem_max 表示发送套接字缓冲区大小的最大值(以字节为单位)。 也可改动 /etc/sysctl.conf 这个文件,加入以下的语句:kernel.shmmax = 536870912kernel.shmmni = 4096kernel.shmall = 2097152kernel.sem = 250 32000 100 128fs.file-max = 65536
Socket 使用流程 Server-TCP Client-TCP Server-UDP Client-UDP socket socket socket socket bind ip port bind bind ip port bind listen accept connect recvfrom sendto sendto recvfrom recv/send send/recv
UNIX Domain Socket 介绍 • socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。 • 虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率。 • 不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。 • 这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。 参考:http://learn.akae.cn/media/ch37s04.html
UNIX Domain Socket 介绍 • UNIX Domain Socket是全双工的,API接口语义丰富,相比其它IPC机制有明显的优越性,目前已成为使用最广泛的IPC机制,比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的。 • 高级功能:可以用来进行进程间传递 fd (自学)
UNIX Domain Socket 使用流程 Server Client socket socket bind file bind file listen accept connect recv/send send/recv
高级篇:“同步”、“异步”通讯概念 • “同步通信”的意思是,当A发送完消息之后,开始等待B的回应,在B没有回应之前,A不能继续执行。 • “异步通信”的意思是,当A发送完消息之后,不等待B的回应,继续执行之后的程序,在将来的某个时刻,A再来检查是否收到B的回应。 • 能否举一些现实生活的例子?
Socket 的同步、异步通讯 • 同步Socket 服务器:Socket 阻塞send、recv • 异步Socket 服务器:Socket 非阻塞send、recv,怎么使用呢? • 1万个连接,同时下载 1M 的数据包,如何提高性能,会碰到什么问题?
Socket 的异步通讯 • Socket 设置非阻塞模式: intflags=fcntl(socket,F_GETFL,0); fcntl(socket,F_SETFL,flags|O_NONBLOCK); • send 1M 数据,会立即返回, 告诉你已经发送完了64k数据 • recv 1M 数据, 会立即返回,告诉你什么也没有收到,下次再收,收到 120 字节 ……
Socket 的异步通讯 • 在单进程里,使用select、epoll 来管理和触发上万个连接。 • 所有事情,都在一个大循环里做。
课后作业 • 作业内容: • 1、实现一个Domain Socket 异步模式的 Echo 服务器 • 2、实现一个基于 IPC 的 Echo 服务器 • 3、用1k、10K、1M 的请求包,对比测试上面两个服务器性能:每秒处理能力、平均响应时间。 • 作业要求: • 1、作业1、2、3 每人独立完成。提交各自服务器代码、测试程序、测试报告。 • 2、每组内通过作业3,组内选出最强的服务器。 • 作业交付时间:2009年8月20日17点前。 • 作业邮件标题“【进程间通讯2】【第X组】”
推荐书目: 1、《UNIX环境高级编程》 作者:W.Richard Stevens,译者:尤晋元等,机械工业出版社。 2、《UNIX网络编程第二卷:进程间通信》 作者:W.Richard Stevens,译者:杨继张 清华大学出版社。 3、《UNIX网络编程(第3版)—第1卷 套接口API 》 作者:[美]W. Richard Stevens/ Bill Fenner/ Andrew M. Rudoff/ 译者: 杨继张 清华大学出版社 4、http://learn.akae.cn/media/index.html 《 Linux C编程一站式学习》