共享内存是一种高效的 IPC 机制,允许不同进程共享同一块内存区域。以下是共享内存相关知识点及函数的详细介绍和示例:
1. shmget()
-
功能: 创建一个新的共享内存段或获取一个现有的共享内存段的标识符。
-
语法:
int shmget(key_t key, size_t size, int shmflg);
-
参数:
key
: 共享内存段的键值,通常使用ftok()
函数生成。size
: 共享内存段的大小(以字节为单位)。shmflg
: 标志位,包含权限和创建标志。常见的标志包括IPC_CREAT
(创建新段)和0666
(读写权限)。
-
返回值: 成功时返回共享内存标识符,失败时返回 -1。
key_t key = ftok("shmfile",65); int shmid = shmget(key, 1024, 0666|IPC_CREAT); if (shmid == -1) { perror("shmget"); exit(EXIT_FAILURE); }
2.
shmat()
-
功能: 将共享内存段附加到调用进程的地址空间。
-
语法:
void* shmat(int shmid, const void* shmaddr, int shmflg);
-
参数:
shmid
: 共享内存标识符。shmaddr
: 内存地址。通常设置为NULL
,让系统自动选择地址。shmflg
: 附加标志。常见的标志包括SHM_RDONLY
(只读模式)。
-
返回值: 成功时返回共享内存段的地址,失败时返回
(void *) -1
。
char *str = (char*) shmat(shmid, NULL, 0);
if (str == (char*) -1) {
perror("shmat");
exit(EXIT_FAILURE);
}
3. shmdt()
-
功能: 将共享内存段从调用进程的地址空间分离。
-
语法:
int shmdt(const void* shmaddr);
-
参数:
shmaddr
: 共享内存段的地址,通常是由shmat()
返回的地址。
-
返回值: 成功时返回 0,失败时返回 -1。
if (shmdt(str) == -1) {
perror("shmdt");
exit(EXIT_FAILURE);
}
4. shmctl()
-
功能: 控制共享内存段的操作,如删除、获取状态等。
-
语法:
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
-
参数:
shmid
: 共享内存标识符。cmd
: 控制命令。常见的命令包括IPC_RMID
(删除共享内存段)和IPC_STAT
(获取状态)。buf
: 指向shmid_ds
结构体的指针,用于获取共享内存段的状态或设定状态。
-
返回值: 成功时返回 0,失败时返回 -1。
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl");
exit(EXIT_FAILURE);
}
网络模型,tcp/ip
1. OSI 模型(开放系统互联模型)
层次结构:
- 物理层(Physical Layer): 负责数据在物理媒介上的传输,如电缆、电磁波等。定义了硬件设备和信号传输标准。
- 数据链路层(Data Link Layer): 提供数据帧的传输,负责错误检测和纠正,确保在物理层上的数据传输的可靠性。包含 MAC(介质访问控制)地址。
- 网络层(Network Layer): 负责数据包的路由和转发。主要协议有 IP(互联网协议),负责逻辑地址和网络路径选择。
- 传输层(Transport Layer): 提供端到端的通信服务,主要协议有 TCP(传输控制协议)和 UDP(用户数据报协议),负责数据流控制和错误恢复。
- 会话层(Session Layer): 负责建立、管理和终止会话。处理会话恢复和同步。
- 表示层(Presentation Layer): 处理数据格式转换、加密和解密,确保数据能够被应用层理解。
- 应用层(Application Layer): 直接与用户交互,提供各种网络服务和应用,如 HTTP、FTP、SMTP 等。
2. TCP/IP 模型
层次结构:
- 网络接口层(Network Interface Layer): 对应 OSI 模型的物理层和数据链路层,处理数据在网络介质上的传输。
- 网络层(Internet Layer): 对应 OSI 的网络层,主要使用 IP 协议负责数据包的路由和传输。包括 IP 地址和路由选择。
- 传输层(Transport Layer): 对应 OSI 的传输层,主要使用 TCP 和 UDP 协议,负责数据传输的可靠性和顺序。
- 应用层(Application Layer): 对应 OSI 的应用层、表示层和会话层,处理网络应用的各种服务,如 HTTP、FTP、DNS、SMTP 等。
3. 客户端-服务器模型
概念:
- 客户端: 向服务器请求服务或资源的实体。通常是用户的计算机或设备。
- 服务器: 提供服务或资源的实体。通常是网络上运行的程序或服务。
工作流程:
- 客户端发送请求到服务器。
- 服务器处理请求,并返回相应的数据或服务。
- 客户端接收响应并进行处理或显示。
应用: 常见的应用包括 Web 浏览器(客户端)和 Web 服务器,邮件客户端和邮件服务器等。
4. 点对点模型(P2P)
概念:
- 点对点(P2P): 所有节点既可以是客户端也可以是服务器。每个节点可以同时提供和请求资源。
特点:
- 去中心化: 不需要中央服务器,每个节点直接连接到其他节点。
- 弹性: 系统更具弹性,节点的加入和离开不会影响整体系统的运行。
- 应用: 文件共享(如 BitTorrent)、区块链技术等。
5. 分布式系统
概念:
- 分布式系统: 多个计算机系统通过网络协作完成任务,提供统一的服务或资源。
特点:
- 透明性: 用户通常不会感知到系统是由多个计算机组成的。
- 容错性: 系统能够处理节点的故障。
- 可扩展性: 可以通过添加更多节点来提升系统的性能或容量。
应用: 分布式数据库(如 Cassandra)、分布式文件系统(如 Hadoop HDFS)、云计算平台等。
TCP(传输控制协议):
连接导向:在数据传输前,TCP建立一个连接(通过三次握手)。
可靠性:保证数据按顺序到达,重传丢失的数据包。
流量控制:通过窗口机制控制数据流量,避免拥堵。
拥塞控制:检测网络拥塞,并动态调整数据传输速率。
适用场景:需要可靠性和顺序保证的应用,如网页浏览、文件传输(HTTP、FTP)。
UDP(用户数据报协议):
无连接:不建立连接,数据直接发送。
不可靠:不保证数据的顺序、完整性和可靠性,数据包可能丢失或重复。
低开销:开销小,适合高效的数据传输。
适用场景:实时性要求高但对可靠性要求低的应用,如视频流、在线游戏(VoIP、DNS)。
-
TCP(传输控制协议):
- 连接导向:在数据传输前,TCP建立一个连接(通过三次握手)。
- 可靠性:保证数据按顺序到达,重传丢失的数据包。
- 流量控制:通过窗口机制控制数据流量,避免拥堵。
- 拥塞控制:检测网络拥塞,并动态调整数据传输速率。
- 适用场景:需要可靠性和顺序保证的应用,如网页浏览、文件传输(HTTP、FTP)。
-
UDP(用户数据报协议):
- 无连接:不建立连接,数据直接发送。
- 不可靠:不保证数据的顺序、完整性和可靠性,数据包可能丢失或重复。
- 低开销:开销小,适合高效的数据传输。
- 适用场景:实时性要求高但对可靠性要求低的应用,如视频流、在线游戏(VoIP、DNS)。
-
物理层 (Layer 1)
- 协议和标准:Ethernet(IEEE 802.3)、DSL、USB、RS-232
- 功能:定义了数据传输的物理特性,如电缆类型、电压水平、传输速率等。物理层负责将数据以电信号、光信号或无线信号的形式传输到网络介质中。
-
数据链路层 (Layer 2)
- 协议:Ethernet、PPP(点对点协议)、HDLC(高级数据链路控制)、VLAN(虚拟局域网)
- 功能:处理数据帧的传输、错误检测和纠正,确保数据在局域网内的可靠传输。它为网络层提供了物理地址的映射(如MAC地址)。
-
网络层 (Layer 3)
- 协议:IP(互联网协议,包括IPv4和IPv6)、ICMP(互联网控制消息协议)、IGMP(互联网组管理协议)
- 功能:负责数据包的路由选择和转发,将数据从源地址传输到目标地址。网络层提供逻辑地址(如IP地址)来实现网络间的通信。
-
传输层 (Layer 4)
- 协议:TCP(传输控制协议)、UDP(用户数据报协议)
- 功能:提供端到端的通信服务,包括数据流控制、错误检查和重传。TCP提供可靠的连接导向服务,而UDP提供无连接的、尽最大努力的传输服务。
-
会话层 (Layer 5)
- 协议:NetBIOS、RPC(远程过程调用)、PPTP(点对点隧道协议)
- 功能:管理和控制会话的建立、维护和终止,确保应用程序之间的数据交换能够协调和同步。
-
表示层 (Layer 6)
- 协议:SSL/TLS(安全套接字层/传输层安全性)、JPEG、MPEG、ASCII
- 功能:处理数据的表示、编码和转换,以确保不同系统之间的兼容性。它包括数据加密、解密和数据格式转换。
-
应用层 (Layer 7)
- 协议:HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)、DNS(域名系统)
- 功能:提供网络服务和应用程序的接口,处理用户应用程序的数据传输请求。应用层直接与用户交互,处理各种网络服务。
socket()
- 功能:创建一个新的套接字。
- 原型:
int socket(int domain, int type, int protocol);
- 参数:
domain
:协议族(通常为AF_INET
表示IPv4)。type
:套接字类型(SOCK_DGRAM
表示UDP)。protocol
:协议(通常为0)
sendto()
功能:向指定的目标地址发送数据。
原型:ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
参数:
sockfd:套接字描述符。
buf:要发送的数据缓冲区。
len:数据长度。
flags:通常为0。
dest_addr:指向目标地址的sockaddr结构。
addrlen:目标地址的长度。
- 功能:关闭套接字,释放资源。
- 原型:
int close(int fd);
- 参数:
fd
:套接字描述符。