现代操作系统提供了三种基本的构造并发程序的方法:

1. 基于进程的并发编程

一个构造并发服务器的自然方法就是,在父进程中接受客户端连接请求,然后创建一个新的子进程来为每个新客户端提供服务。

image.png

有几点重要内容需要说明:

**优点:**进程有一个非常清晰的模型:共享文件表,但是不共享用户地址空间。

缺点:IPC通信开销高

2 基于 I/O 多路复用的并发编程

基本的思 路就是使用 select 函数,要求内核挂起进程,只有在一个或多个 I/O 事件发生后,才将 控制返回给应用程序

image.png

具体实现:

while (1){
	ready.set = read_set;
	Select(listenfd+1, &ready_set, NULL, NULL, NULL);
	if (FD_ISSET(STDIN_FILENO, feready.set))
		command(); /* Read command line from stdin */
	if (FD_ISSET(listenfd, &ready_set)) -C
		clientlen = sizeof(struct sockaddr_storage);
		connfd = Accept(listenfd, (SA *)&clientaddr, feclientlen);
		echo(connfd); /* Echo client input until EOF */
		Close(connfd);
	}
}

**优点:**事件驱动常常比基于进程要高效得多,因为它们不需要进程上下文切换来调度新的流。

**缺点:**事件驱动设计一个明显的缺点就是编码复杂

3 基于线程的并发编程