KalosAner Blog

「山穷水复疑无路,柳暗花明又一村。」

Windows 下的重叠 IO

一、引言 同一个线程内部向多个目标发送(或者从多个目标接收)数据引起的 IO 重叠现象称为“重叠 IO”。为了完成这项任务,调用的 IO 函数应立即返回,只有这样才能发送后续数据。 该功能可以实现类似于 Linux 下的分散读写。 二、重叠 IO 使用 创建重叠 IO 套接字 使用重叠 IO 需要创建适用于重叠 IO 的套接字,通过如下函数完成: 1 2 3 #include...

Windows 下的异步通知 IO

一、异步通知 IO 同步 IO 就是调用 IO 函数会阻塞直到数据完成发送或者完成接收,IO 函数才返回结果。 异步 IO 就是调用 IO 函数的同时立马返回,此时数据可能还在缓冲区进行发送或者接收。也就是说在进行 IO 的同时,CPU可以执行其他任务。 通知 IO 是“通知输入缓冲收到数据并需要读取数据,以及输出缓冲为空故可以发送数据”。典型的通知 IO 模型是 select 方式。...

Windows 线程的创建和销毁

一、引言 要想掌握 Windows 平台下的线程,应首先理解“内核对象”(Kernel Objects)的概念。 操作系统创建的资源(Resource)有很多种,如进程、线程、文件和即将介绍的信号量、互斥量等。其中大部分都是通过程序员的请求创建的,虽然文请求方式不同(请求中使用的函数)各不相同,但是它们都是由 Windows 操作系统创建并管理的资源。操作系统为了记录相关信息的方式以管理...

Windows 线程同步

一、引言 线程同步类似线程锁,主要用来安全地访问临界资源。Windows 下有两种线程同步的方式,一种是用户模式下的线程同步,一种是内核模式下的线程同步。 二、用户模式 用户模式下的线程同步由于不需要切换内核模式所以性能相对较高,但是功能没有内核模式强大。 用户模式下的线程同步主要使用 CRITICAL_SECTION 对象。 函数原型: 1 2 3 4 5 6 7 #inclu...

Linux 线程使用方法

一、引言 多进程在使用时有很多不方便,比如: 创建进程开销较大 进程间数据交换需要特殊的 IPC 技术 进程切换需要 CPU 频繁的“上下文切换”,造成极大的开销 因此衍生出了线程技术,线程和进程一样都有一个唯一标识符。 在 Linux 上使用线程,在编译链接时需要对线程库进行链接:g++ demo.cpp -o demo -lpthread。 线程是系统调度的最小...

Linux 信号量使用方法

一、引言 在多线程编程中,经常会使用信号量来控制访问临界资源。 二、线程级信号量 初始化信号量 1 2 #include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); sem:信号量对象指针 pshared:共享标志(0 表示线程间共享,非 0 表示进程间共享) v...

Linux 上常用的标准 IO 函数

一、引言 write 和 read 是通用的系统调用;recv 和 send 是专为网络通信设计的扩展接口,数据系统调用,但是用户可以对其进行封装;fread 和 fwrite 是标准 IO 库函数。 二、系统调用 系统调用在调用时会通过内核缓冲区对数据进行缓冲。 延迟写入 当程序调用 write 函数时,数据并不会直接写入磁盘,而是暂存内核缓冲区,批量地写入磁盘。这样多次小文件写...

IO 复用之 epoll

一、引言 IO复用之 select 介绍了基于 select 的 IO 复用方法,但是 select 函数每次需要向操作系统传递监视对象信息导致性能太低,并且每次都需要对所有的文件描述符进行遍历查看是否有事件到来。select 适用于服务器端访问量小需求可移植性的程序。 有一种方式只需要向操作系统传递一次监视对象,当监视范围或者内容发送变化时,函数只返回发生变化的部分。在 Linux 上...

多播与广播

一、引言 多播和广播都是向多个主机传递数据的方式,主要区别在于多播可以向多播组中的所有主机传递数据,广播可以向整个子网的所有主机传递数据。 二、多播 多播(Multicast)方式基于 UDP 传输数据。多播通信需要先建立多播组,加入该组的主机即可接收发往该多播组的数据。发送端只需要向多播组发送一次数据。每个多播组都有一个多播组 IP,多播组的 IP 属于 D 类 IP 地质(224....

send 和 recv 函数

一、引言 send 和 recv 函数是网络编程中基础的 I/O 函数,虽然在 Linux 上 write 和 read 函数也可以用来通信,但是 write 和 read 本质上是文件操作函数。send 和 recv 函数在 Linux 和 Windows 上很相似,兼容性更强。 二、Linux 中的 send 和 recv 函数原型: 1 2 3 4 5 #include <...