Upload
tuvya
View
139
Download
2
Embed Size (px)
DESCRIPTION
进程间通讯 2 -- 架构平台部. 讲师: delexxie 日期: 2009 年 08 月 12 日. 自我简介. Delexxie 谢建东 架构平台部 \ 接入平台中心 \ 业务开发组 Storage 、 FTN 、 CDN. 课程简介. 进程间通讯: 消息队列、信号灯、共享内存,只能在单一机器上实现。 跨机器进程通讯: Socket 介绍基于 TCP/IP 网络的 Socket 跨机器进程通讯 介绍基于单机进程通讯的 UNIX Domain Socket 介绍同步、异步的概念. 目录. Socket 、 Domain Socket 概要介绍 - PowerPoint PPT Presentation
Citation preview
进程间通讯 2-- 架构平台部
讲师: delexxie日期: 2009 年 08 月 12 日
自我简介
Delexxie 谢建东架构平台部 \ 接入平台中心 \ 业务开发组
Storage 、 FTN 、 CDN
课程简介
进程间通讯:消息队列、信号灯、共享内存,只能在单一机器上实现。跨机器进程通讯: Socket
介绍基于 TCP/IP 网络的 Socket 跨机器进程通讯介绍基于单机进程通讯的 UNIX Domain Socket
介绍同步、异步的概念
目录
Socket 、 Domain Socket 概要介绍Socket 关键 APISocket 一些系统设置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 关键 APIint 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 使用流程
socket
bind ip port
listen
accept
recv/send
socket
connect
send/recv
Server-TCP Client-TCP
socket
recvfromsendto
socket
Server-UDP Client-UDP
sendtorecvfrom
bind bindbind ip port
Socket 简单应用 -Echo Server
Socket 简单应用 -Client
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 使用流程
socket
bind file
listen
accept
recv/send
socket
connect
send/recv
Server Client
bind file
UNIX Domain Socket 简单应用 -Echo Server
UNIX Domain Socket 简单应用 -Client
高级篇:“同步”、“异步”通讯概念
“ 同步通信”的意思是,当 A 发送完消息之后,开始等待 B 的回应,在 B没有回应之前, A 不能继续执行。
“ 异步通信”的意思是,当 A 发送完消息之后,不等待 B 的回应,继续执行之后的程序,在将来的某个时刻, A再来检查是否收到 B 的回应。
能否举一些现实生活的例子?
Socket 的同步、异步通讯
同步 Socket 服务器: Socket 阻塞 send 、 recv
异步 Socket 服务器: Socket 非阻塞 send 、 recv ,怎么使用呢?
1万个连接,同时下载 1M 的数据包,如何提高性能,会碰到什么问题?
Socket 的异步通讯
Socket 设置非阻塞模式:int flags = 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. Rudo
ff/ 译者: 杨继张 清华大学出版社 4 、 http://learn.akae.cn/media/index.html 《 Linux C 编程一站式学习》
Q&A