23
进进进进进 2 -- 进进进进进 进进delexxie 进进2009 进 08 进 12 进

进程间通讯 2 -- 架构平台部

  • 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

Page 1: 进程间通讯 2 -- 架构平台部

进程间通讯 2-- 架构平台部

讲师: delexxie日期: 2009 年 08 月 12 日

Page 2: 进程间通讯 2 -- 架构平台部

自我简介

Delexxie 谢建东架构平台部 \ 接入平台中心 \ 业务开发组

Storage 、 FTN 、 CDN

Page 3: 进程间通讯 2 -- 架构平台部

课程简介

进程间通讯:消息队列、信号灯、共享内存,只能在单一机器上实现。跨机器进程通讯: Socket

介绍基于 TCP/IP 网络的 Socket 跨机器进程通讯介绍基于单机进程通讯的 UNIX Domain Socket

介绍同步、异步的概念

Page 4: 进程间通讯 2 -- 架构平台部

目录

Socket 、 Domain Socket 概要介绍Socket 关键 APISocket 一些系统设置Socket 使用流程Socket 简单应用UNIX Domain Socket 介绍UNIX Domain Socket 使用流程UNIX Domain Socket 简单应用高级篇:“同步”、“异步”概念作业提问

Page 5: 进程间通讯 2 -- 架构平台部

Socket 、 Domain Socket 概要介绍

Socket 接口是网络接口的 API ,用来实现网络通讯,支持协议:TCP/IP 、 UDP/IP 、 IPX 等互联网的几乎所有的服务器,都是用 Socket 开发的服务器,提供的服务 : 如 apache

在 Socket 的框架上发展出一种 IPC 机制,就是 UNIX Domain Socket , 可以实现高效的单机进程间通讯, why ?

Page 6: 进程间通讯 2 -- 架构平台部

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);

Page 7: 进程间通讯 2 -- 架构平台部

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

Page 8: 进程间通讯 2 -- 架构平台部

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

Page 9: 进程间通讯 2 -- 架构平台部

Socket 简单应用 -Echo Server

Page 10: 进程间通讯 2 -- 架构平台部

Socket 简单应用 -Client

Page 11: 进程间通讯 2 -- 架构平台部

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

Page 12: 进程间通讯 2 -- 架构平台部

UNIX Domain Socket 介绍

UNIX Domain Socket 是全双工的, API 接口语义丰富,相比其它 IPC 机制有明显的优越性,目前已成为使用最广泛的 IPC 机制,比如 X Window 服务器和 GUI 程序之间就是通过 UNIX Domain Socket 通讯的。高级功能:可以用来进行进程间传递 fd (自学)

Page 13: 进程间通讯 2 -- 架构平台部

UNIX Domain Socket 使用流程

socket

bind file

listen

accept

recv/send

socket

connect

send/recv

Server Client

bind file

Page 14: 进程间通讯 2 -- 架构平台部

UNIX Domain Socket 简单应用 -Echo Server

Page 15: 进程间通讯 2 -- 架构平台部

UNIX Domain Socket 简单应用 -Client

Page 16: 进程间通讯 2 -- 架构平台部

高级篇:“同步”、“异步”通讯概念

“ 同步通信”的意思是,当 A 发送完消息之后,开始等待 B 的回应,在 B没有回应之前, A 不能继续执行。

“ 异步通信”的意思是,当 A 发送完消息之后,不等待 B 的回应,继续执行之后的程序,在将来的某个时刻, A再来检查是否收到 B 的回应。

能否举一些现实生活的例子?

Page 17: 进程间通讯 2 -- 架构平台部

Socket 的同步、异步通讯

同步 Socket 服务器: Socket 阻塞 send 、 recv

异步 Socket 服务器: Socket 非阻塞 send 、 recv ,怎么使用呢?

1万个连接,同时下载 1M 的数据包,如何提高性能,会碰到什么问题?

Page 18: 进程间通讯 2 -- 架构平台部

Socket 的异步通讯

Socket 设置非阻塞模式:int flags = fcntl(socket, F_GETFL, 0); fcntl(socket, F_SETFL, flags | O_NONBLOCK);

send 1M 数据,会立即返回, 告诉你已经发送完了 64k 数据recv 1M 数据, 会立即返回,告诉你什么也没有收到,下次再收,收到 120 字节 … …

Page 19: 进程间通讯 2 -- 架构平台部

Socket 的异步通讯

在单进程里,使用 select 、 epoll 来管理和触发上万个连接。所有事情,都在一个大循环里做。

Page 20: 进程间通讯 2 -- 架构平台部

课后作业

作业内容:1 、实现一个 Domain Socket 异步模式的 Echo 服务器2 、实现一个基于 IPC 的 Echo 服务器3 、用 1k 、 10K 、 1M 的请求包,对比测试上面两个服务器性能:每秒处理能力、平均响应时间。

作业要求:1 、作业 1 、 2 、 3 每人独立完成。提交各自服务器代码、测试程序、测试报告。2 、每组内通过作业 3 ,组内选出最强的服务器。作业交付时间: 2009 年 8 月 20 日 17点前。作业邮件标题“【进程间通讯 2】【第 X 组】”

Page 21: 进程间通讯 2 -- 架构平台部

推荐书目:

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 编程一站式学习》

Page 22: 进程间通讯 2 -- 架构平台部

Q&A

Page 23: 进程间通讯 2 -- 架构平台部