第十一章 进程间通信
-
什么是进程间通信?分别从概念和内存的角度进行说明
概括性地说,进程间通信是指两个进程之间交换数据。但是从内存的角度看,可以理解为两个进程共有内存。因为共享的内存区域存在,可以进行数据交换
-
进程间通信需要特殊的IPC机制,这是由操作系统提供的。进程间通信时为何需要操作系统的帮助?
要想实现IPC机制,需要共享的内存,但由于两个进程之间不共享内存,因此需要操作系统的帮助,也就是说,两进程共享的内存空间必须由操作系统来提供
-
“管道”是典型的IPC技术。关于管道,请回答如下问题。
-
管道是进程间交换数据的路径。如何创建该路径?由谁创建?
管道是由pip函数产生的,而实际产生管道的主体是操作系统
-
为了完成进程间通信,2个进程需同时连接管道。那2个进程如何连接到同一管道?
pipe函数通过输入参数返回管道的输入输出文件描述符。这个文件描述符在fork函数中复制到了其子进程,因此,父进程和子进程可以同时访问同一管道。
-
管道允许进行2个进程间的双向通信。双向通信中需要注意哪些内容?
管道并不管理进程间的数据通信。因此,如果数据流入管道,任何进程都可以读取数据。因此,要合理安排共享空间的输入和读取
-
-
编写示例复习IPC技术,使2个进程相互交换3次字符串…
#include <stdio.h> #include <string.h> #include <unistd.h> #define BUF_SIZE 30 int main(int argc, char *argv[]) { int fds1[2], fds2[2]; char str1[]="Do you like coffee?"; char str2[]="I like coffee"; char str3[]="I like bread"; char * str_arr[]={str1, str2, str3}; char buf[BUF_SIZE]; pid_t pid; int i; pipe(fds1), pipe(fds2); pid=fork(); if(pid==0) { for(i=0; i<3; i++) { write(fds1[1], str_arr[i], strlen(str_arr[i])+1); read(fds2[0], buf, BUF_SIZE); printf("Child proc output: %s \n", buf); } } else { for(i=0; i<3; i++) { read(fds1[0], buf, BUF_SIZE); printf("Parent proc output: %s \n", buf); write(fds2[1], str_arr[i], strlen(str_arr[i])+1); } } return 0; }
第十二章 I/O复用
-
请解释复用技术的通用含义,并说明何为I/O复用。
复用技术指为了提高物理设备的效率,用最少的物理要素传递最多数据时使用的技术。同样,I/O复用是指将需要I/O的套接字捆绑在一起,利用最少限度的资源来收发数据的技术
-
多进程并发服务器的缺点有哪些?如何在I/O复用服务器端中弥补?
多进程并发服务器的服务方式是,每当客户端提出连接要求时,就会追加生成进程。但构建进程是一项非常有负担的工作,因此,向众多客户端提供服务存在一定的局限性。而复用服务器则是将套接字的文件描述符捆绑在一起管理的方式,因此可以一个进程管理所有的I/O操作
-
bc
-
select函数的观察对象中应包含服务器端套接字(监听套接字),那么应将其包含到哪一类监听对象集合?请说明原因
服务器套接字的作用是监听有无连接请求,即判断接收的连接请求是否存在?应该将其包含到“读”类监听对象的集合中
-
select函数使用的fd_set结构体在Windows和Linux中具有不同的声明。请说明却别,同时解释存在区别的必然性
Linux的文件描述符从0开始递增,因此可以找出当前文件描述符数量和最后生成的文件描述符之间的关系。但Windows的套接字句柄并非从0开始,并且句柄的整数值之间并无规律可循,因此需要直接保存句柄的数组和记录句柄数的变量
第十三章 多种I/O函数
-
下面关于MSG_OOB可选项的说法错误的时?bc
-
利用readv&writev函数收发数据有何优点?分别从函数调用次数和I/O缓冲的角度给出说明
readv&writev函数可以将分散保存在多个缓冲中的数据一并接受和发送,是对数据进行整合传输及发送的函数,因此可以进行更有效的数据传输。而且,输入输出函数的调用次数也相应减少,也会产生相应的优势
-
通过recv函数见证输入缓冲是否存在数据时(确认后立即返回),如何设置recv函数最后一个参数中的可选项?分别说明各可选项的含义
同时设置MSG_PEEK选项和MSG_DONTWAIT选项,以验证输入缓冲是否存在可接收的数据。设置MSG_PEEK选项并调用recv函数时,即使读取了输入缓冲数据也不会删除。因此,该选项通常与MSG_DONTWAIT合作,用于调用以非阻塞方式验证待读数据存在与否的函数。
-
可在Linux平台通过注册时间处理函数接收MSG_OOB数据。那Windows中如何接受?请说明接收方法
MSG_OOB数据的接收,在select函数中属于异常数据,既在Windows中可以通过异常处理来接收Out-of-band数据
第十四章 多播与广播
-
TTL的含义是什么?请从路由器的角度说明较大的TTL值与较小的TTL值之间的区别及问题
TTL是Time to Live的缩写,是决定“信息传递距离”的主要因素。TTL表现为整数,没经过一个路由器就减1。如果该值为0,该数据报就会因无法再传递而消失。TTL设置大了会对网络流量造成不良影响,设置太小的话,就可能无法到达目的地
-
多播和广播的异同是什么?请从数据通信的角度进行说明
多播和广播的相同点是,两者都是以UDP形式传输数据。一次传输数据,可以向两个以上主机传送数据。但传送的范围是不同的:广播是对局域网的广播;而多播是对网络注册机器的多播
-
bc
-
多播也对网络流量有利,请比较TCP数据交换方式解释其原因。
多播数据在路由器进行复制。因此,即使主机数量很多,如果各主机存在的相同路径,也可以通过一次数据传输到多台主机上。但TCP无论路径如何,都要根据主机数量进行数据传输。
-
多播方式的数据通信需要MBone虚拟网络。换言之,MBone是用于多播的网络,但它是虚拟网络。请解释此处“虚拟网络”。
以物理网络为基础,通过软件方法实现的多播通信必备的虚拟网络