socket的拉屎模型
来源:互联网 发布:linux svn服务端下载 编辑:程序博客网 时间:2024/06/09 18:58
太空中有很多宇航员,要大便。
第一种方案:
一个一个排队大便。一天大便一次,轮到谁,谁必须大便完成之后,才能给第二个人大便。【大便管理者很方便】,但是如果前面的【大便者】一直大便不出,直接把后面的【大便者给憋死】。正所谓【占着茅坑不拉屎】。
这就是阻塞同步模型。
第二种方案:
为了防止【占着茅坑不拉屎】, 不排队大便了,拿着便桶按照顺序一个一个轮询,告诉他做好准备,没准备好的,就直接放弃,并轮询下一个。有大便的就马上开始。
这就是【大便者】来说,是一步完成大便。但是不阻塞【大便管理员】。大便管理员一直很忙碌,叫做【同步非阻塞】。
厕所终于能容纳更多的【大便者】了。
这就是【同步非阻塞】模型
第三种方案
大便管理者太累啦,就出了个更歪的注意。买了个大喇叭。也不排队了,觉得这种方法在这里不合适。便池没有人的时候,就直接拿大喇叭一吼,有要大便的告诉我!!!!!
这下【大便管理者】就没有那么忙碌,有时候还可以歇一会。(wait函数)。守着厕所等就是拉。就相当于把【大便管理者给阻塞】了。也不忙了。
但是对于【大便者】来说又多了一份工作,那就是有大便还必须给【大便管理者】通知,然后获得准许,才可以大便。
这就是【阻塞非同步模型】。
第四种方案:
尽管如此,大便管理者还是觉得太累了。每天还必须拿着大喇叭来吼,还必须蹲在厕所旁边闻臭味。并且【大便管理者】觉得跟【大便者】之间的交互简直是累透了。能不能直接让【大便者】想大便就大便。自己也不用整天忙了。于是给【大便者】每一个人发了一个大便袋子。【大便者】每天的工作更简单了,就是直接大便到袋子里。并且由机器人去搜集袋子。
对于【大便者】来说,第一步,搞到一个袋子。第二步,拉屎。两步。叫做异步。
对于【大便管理者】来说,也不用守着厕所wait啦,该忙别的忙别的。叫做非阻塞,非同步。
可以看出对于应用程序【大便管理者】来说,第四种方案明显优越于前三种,下面就给出了一个简单的例子:
//============================================================================// Name : StudyNetWorkLinux.cpp// Author : // Version :// Copyright : Your copyright notice// Description : Hello World in C++, Ansi-style//============================================================================#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>#include<aio.h>using namespace std;#define BUFSIZE 1023#define EINPROGRESS 1int main() { int fd, ret; struct aiocb my_aiocb; fd = open( "file.txt", O_RDONLY ); if (fd < 0) perror("open"); /* Zero out the aiocb structure (recommended) */ memset( (void *)&my_aiocb, 0, sizeof(my_aiocb)); /* Allocate a data buffer for the aiocb request */ my_aiocb.aio_buf = malloc(BUFSIZE+1); if (!my_aiocb.aio_buf) perror("malloc"); /* Initialize the necessary fields in the aiocb */ my_aiocb.aio_fildes = fd; my_aiocb.aio_nbytes = BUFSIZE; my_aiocb.aio_offset = 0; ret = aio_read( &my_aiocb ); if (ret < 0) perror("aio_read"); while ( aio_error( &my_aiocb ) == EINPROGRESS ); if ((ret = aio_return( &my_aiocb )) > 0) { /* got ret bytes on the read */ } else { /* read failed, consult errno */ } cout << "!!!Hello World!!!" <<(char*)(my_aiocb.aio_buf) <<endl; // prints !!!Hello World!!! return 0;}
- socket的拉屎模型
- Socket拉屎模型之epoll
- Socket拉屎模型之二--实践篇
- 河里拉屎的骆驼
- socket的IO模型
- javascript写的会拉屎的贪吃蛇游戏
- 使用坐便器坐着拉屎--一种无奈的悲哀
- socket的I/O模型
- 基于socket的服务器模型
- socket 的几种模型
- TCP Socket的编程模型
- socket 各种模型的性能
- linux下的socket模型
- socket编程的select模型
- socket编程的select模型
- socket编程的select模型
- socket编程的select模型
- socket编程的select模型
- 专业程序员成长之路之基础基础!
- 关于select函数
- 小题大作—技术的重要性
- 关于SQL中函数与存储过程的区别
- AtCoder Beginner Contest 069
- socket的拉屎模型
- [leetcode]107. Binary Tree Level Order Traversal II@Java解题报告
- webservice本地部署是好的,生产环境下AXIS error: There is no SOAP service at this location
- Ubuntu下获取git&&Makefile日志记录&&linux重定向&&android启动过程
- HDU 6034 Balala Power!(贪心)
- sql语句
- ACM题集以及各种总结大全!
- ARM汇编学习
- Uboot入口