1、 阻塞I/O
(eg:钓鱼者(王一)只钓鱼,不和任何人说话,也不干任何其他的事)
2、非阻塞I/O
(eg:钓鱼者(王二)一边钓鱼,一边问王一到底钓了多少鱼,但是王一并没有回答他,但他还是会一边钓他的鱼一边重复的问王一)
3、 信号驱动I/O(SIGIO)
(eg:钓鱼者(王三)他在自己的鱼竿上绑了一个铃铛(相当于一个信号),然后去旁边看手机去了,当铃铛响后,它会把鱼钓上来)
4、 I/O复用(select poll和e poll)
(eg:钓鱼者(王四)他拉了一车鱼竿来钓鱼,同时看着这么多鱼竿)(多路转接)
5、异步I/O(Posix.1的aio_系列函数(aio_read))
(eg:钓鱼者(王五),让自己的司机去钓鱼,然后自己去做别的事情了,并让司机把鱼钓好之后给他放到指定位置并给他打电话然后他把鱼领走)
1、在大部分场景下,若出现性能问题首先考虑是否出现I/O异常
2、在网络当中进行I/O读写时,I/O的读写条件不一定就绪(读写成功依赖于读写条件)
3、站在用户的角度,I/O分两步完成(a、等事件就绪 b、真正的处理数据I/O)
4、I/O性能的瓶颈主要是在等待上花费了太多时间,
5、为了能提高I/O性能,应该改善等的比重(尽可能缩短等的时间)
pipe用来创建管道,但是单个管道只能单向通信,一端用于读,而另一端用于写。如果要实现进程双向通信,必须创建一对管道。而socketpair 则可以用来创建双向通信的管道。
Makefile文件:
1 sockpair : sockpair.c
2 gcc -o $@ $^
3 .PHONY:clean
4 clean:
5 rm -f sockpair
1 #include
2 #include
3 #include
4 #include
5 #include
6 int main()
7 {
8 int sv[2];
9 int sockpair = socketpair(AF_UNIX , SOCK_STREAM , 0 , sv);
10 if(sockpair < 0)
11 {
12 perror("socketpair");
13 return 1;
14 }
15 pid_t id = fork();
16 if(id < 0)
17 {
18 perror("fork");
19 return 3;
20 }
21 else if( id == 0)
22 {
23 //child
24 char buf[1024];
25 close(sv[0]);
26 while(1)
27 {
28 memset(buf , 0 , sizeof(buf));
29 strcpy(buf , "I am your child!\n");
30 write(sv[1] , buf , strlen(buf));
31 printf("chlid#");
32 read(sv[1] , buf , sizeof(buf)-1);
33 sleep(1);
34 printf("%s",buf);
35 }
36
37 }
38 else
39 {
40 //father
41 close(sv[1]);
42 char buf[1024];
43 while(1)
44 {
45 memset(buf , 0 , sizeof(buf));
46 printf("father#");
47 read(sv[0] , buf , sizeof(buf)-1);
48 printf("%s",buf);
49 strcpy(buf , "I am you father!\n");
50 write(sv[0] , buf , strlen(buf));
51 }
52 }
53 return 0;
54 }