新版博客SEO优化基本完成,新老博客内容正在整合中,保证每篇文章高质量。 SiteMap RSS Github
操作系统面试题---长期更新
嘉美伯爵   2019年3月20日 11:49   面试   Centos OS   212  

Linux的I/O复用机制

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

  • IO多路复用适用如下场合:

(1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。

(2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。

(3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。

(4)如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。

(5)如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。

select

解释
  • maxfdp1:maxfdp1指定待测试的描述字个数,它的值是待测试的最大描述字加1
  • fd_set:即readset、writeset和exceptset是要让内核测试读、写和异常条件的描述字
void FD_ZERO(fd_set *fdset);           //清空集合
void FD_SET(int fd, fd_set *fdset);   //将一个给定的文件描述符加入集合之中
void FD_CLR(int fd, fd_set *fdset);   //将一个给定的文件描述符从集合中删除
int FD_ISSET(int fd, fd_set *fdset);   // 检查集合中指定的文件描述符是否可以读写 
  • timeout:指定描述字中的任何一个就绪可花多少时间
函数原型
#include <sys/select.h>
#include <sys/time.h>

返回值:就绪描述符的数目,超时返回0,出错返回-1
int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)
原理图

poll

不同于select函数poll采用一个pollfd指针向内核传递需要关心的描述符及其相关事件

epoll

epoll函数是多路复用IO接口select和poll函数的增强版本。显著减少程序在大量并发连接中只有少量活跃的情况下CPU利用率,他不会复用文件描述符集合来传递结果,而迫使开发者每次等待事件之前都必须重新设置要等待的文件描述符集合,另外就是获取事件时无需遍历整个文件描述符集合,只需要遍历被内核异步唤醒加入ready队列的描述符集合就行了

Linux如何编译c

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
printf("Hello,Linux.\n");
exit(0);
}
将源文件保存为hello.c,开始进行编译
$gcc -o hello hello.c
编译成功完成后,在当前路径下,生成一个名为hello的文件,然后执行
$./hello
在屏幕上,你将会看到打印结果:Hello,Linux.