代码改变世界

谈谈linux上的并发(网络资源总结)

2011-08-26 01:10  Aga.J  阅读(1296)  评论(0编辑  收藏  举报

“并发”一词可能会误导很多人,实际上在单核的机器上并发是通过分时运行来模拟的,称为Concurrency,而在多核的机器上才可实现真正的并发,称为Parallelism。

下面逐步介绍Linux上的IO模型,从而解析并发策略:

(一) 阻塞I/O模型:

clip_image001

分析:使用recvfrom,执行系统调用函数,陷入到内核中,内核等待数据报到来,这个时候用户进程被阻塞,直到内核拿到数据报后,拷贝到用户空间的缓冲区上,并通知用户空间进程数据报拷贝完成,这种阻塞I/O模式不适合多用户请求的环境。

(二) 非阻塞I/O模型:

clip_image002

分析:和“阻塞IO模型”不一样,非阻塞IO模型会收到内核的无数据报消息,防止进程一直阻塞在上面,接收其他进程的请求。

(三) I/O复用模型:

clip_image003

分析:每个recvfrom不需要像阻塞IO一样,从“内核无数据报—内核数据报准备好—内核拷贝数据报到用户空间—内核拷贝完成”这个过程,它将这个过程分为两个阶段(体现IO复用的原则),阶段一是数据报的准备,阶段二是数据报的拷贝,这样分离的好处时,在阶段二进行时,阶段一可能再发生,这样就可以使得IO得到复用。

(四) 信号驱动I/O模型:

clip_image004

分析:使用信号的方式和前面的IO复用方式有同工异曲之妙,前面select的模式虽然第一阶段会阻塞,但是其信号通知方式是用位设置来完成,这里的信号比较重型。

(五) 异步I/O模型:

clip_image005

分析:这种情况下,用户进程连等待拷贝的过程也放弃,由内核处理完成后再通知用户进程。

接下来是Linux上服务器的4种处理模型,并重点介绍并发类型的:

服务器类型根据不同的应用场景来配置,大体上可以分为以下四种:

循环服务器

无连接

循环服务器

面向连接

并发服务器

无连接

并发服务器

面向连接

(1) 循环服务器,无连接:

这是一种最简单的服务器类型,服务器在特定的端口上等待客户消息报的到来,完成接收处理后,继续等待新消息,同时不需要和客户端建立连接。

while(1)

{

recvfrom(serverfd,msg,MAX_MSG_SIZE,0,(struct sockaddr*)&clientaddr,&addrlen);

//handle;

}

(2) 循环服务器器,面向连接:

这种类型的服务器适用情况较少,不做讨论

(3) 并发服务器:

并发服务器为了最大限度地争取处理大量的外部请求,所以使用了上面介绍的相关并发策略,如IO复用等,当然也可以引入了多线程来模拟并发,减少不必要的阻塞。

但是多线程的引入势必导致系统对数据一致性有很大要求,最方便的处理方式是最共享块进行加锁,避免数据不一致,但最好情况下是让线程进行处理自己的事,各线程之间互不干涉,如果一定要涉及到多线程访问共享数据的内容,还可以考虑各种无锁编程的方式,这里就不详细说明无锁编程,待续!

(未完,待续)