并发编程思考--多路复用技术

本文默认读者具有Csapp与Os的所有基础知识。

首先是并发编程的意义:

这是显而易见的,例如在服务器端利用并发编程技术,可以同时为多个客户端提供服务,主程序只需要接收客户端的请求并为其分配子进程(粗浅运用)。这里我们简单略过。

接下来我们讨论基于进程的并发编程:

就像我们上面举的例子一样,我们完全可以用主程序接收信号,并为每一个特定的事项分配一个子进程去专门处理。这里要注意的是需要包括一个SIGCHLD处理程序,并且处理程序中最好使用:while(waitpid(-1,0,WNOHANG)>0);的形式去回收多个僵死子进程。

我们要注意这里使用进程进行并发编程的特点。优点是进程之间,如父进程与子进程共享文件表,但并不共享用户地址空间。 因此进程之间不存在虚拟内存的覆盖问题,保证了进程服务的独立性。但这样同样出现一些问题,那就是进程间的状态信息共享变得困难,只能通过IPC机制,这样开销会很高。

因此下面我们将讨论基于I/O多路复用的并发编程技术。

这个技术具体细节很复杂,但实现思想很简洁,简洁到几句话可以概括。

首先我们创建这样一个集合,集合里面是所有我们可能收到的文件描述符,我们假设这样一个集合是一个位向量集合,即序号为K的文件描述符在此集合中的位置是Ik

然后我们以select函数为例。此处select函数将一直阻塞,直到上述集合中的某个文件描述符对应文件可以执行读写操作为止,随后调用相应命令执行。

就是那么简单。

但是要注意select函数的ready_Set问题,这里可以自行百度。

也可以基于I/O多路复用技术做并发事件驱动编程。 这里思路也很简洁,将逻辑流模型化为状态机,也就是将前面的集合扩展到了包括状态、输入事件和转移的一种机制。

如每个状态机sk包括状态(等待描述符准备好可读)、输入事件(描述符已准备好可读)与转移(从描述符读一个文本行)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值