每个进程都有自己独立的虚拟地址空间,一个进程不能直接访问另一个进程的内存。但在很多应用场景中,多个进程需要协同工作,交换数据。IPC 机制就是操作系统提供的一套让不同进程能够互相通信、同步操作的机制。
进程间通信方式主要有:
匿名管道
命名管道
消息队列
共享内存
信号量
套接字
...
阅读更多
C++14
std::make_unique
// 旧方式 (不安全)
// std::unique_ptr<Foo> p(new Foo());
// C++14 方式 (安全、简洁)
auto p = std::make_unique<Foo>();
...
阅读更多
重传超时定时器
建立连接、传输数据,在发送SYN或FIN时,会启动一个定时器, 如果在定时器超时前没有收到ACK,就会重新发送。
SYN发送的次数也有限制:cat /proc/sys/net/ipv4/tcp_syn_retries
传输数据过程中,当发送方发送一个...
阅读更多
TCP使用滑动窗口机制来进行流量控制。
窗口
滑动窗口机制机制的核心在于发送方和接收方都维护一个可变窗口,这个窗口的大小代表了当前可以发送或接收的数据量。
发送窗口:
已发送并已确认的数据: 这部分数据已经安全到达,将被移出窗口。
已发送但未确认的数据: 这部分数据已经发出,但还没有收到接收方的确认...
阅读更多
产生原因
网络中数据传输需要超过了网络能够处理的最大容量:
数据管道容量
网络设备缓冲区
产生控制拥塞后,数据包累积导致延迟,超过缓冲限制则大量丢失,影响传输效率和吞吐。
算法分类
拥塞控制大类
具体算法
特点
...
阅读更多
I/O多路复用实现单个线程同时监控多个socket的状态,当任何一个socket文件描述符就绪(可读、可写)时,内核会通知应用程序,从而避免了阻塞和轮询的低效。
Linux中提供了select、poll和epoll三种IO多路复用机制。
select
select 函数原型:
int select(int...
阅读更多
Linux中的五种I/O模型有:
阻塞I/O
非阻塞I/O
I/O多路复用
信号驱动I/O
异步I/O
通常有同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式。
阻塞I/O
这是最简单也是最常用的模型。当应用程序发起一个 I/O 操作...
阅读更多
fcntl(file control) 用于对已打开的文件描述符进行各种操作。
/*
* fd: 文件描述符
* cmd: 执行的操作
* arg: 类型和意义取决于cmd
*/
int fcntl(int fd, int cmd, ... /* arg */ );
获取/设置socket文件描述符...
阅读更多