2023年2月24日面试题总结

  1. select和epoll的区别?

说法:

(1)select和epoll都属于IO多路复用,其目的是为了减小系统的开销。select所支持的文件描述符太少,默认为1024。每次调用时需要把fd集合从用户态拷贝到内核态,且内核需要遍历所有的fd,这在fd很多的时候会造成大的开销。epoll相比较与select来说,是其增强版,没有描述符的限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的事件表中,使得用户空间与内核空间的拷贝只需要一次。

(2)select和epoll都属于IO多路复用,但是select在每次调用时需要把fd集合从用户态拷贝到内核态,且内核需要遍历所有的fd,这里会造成很大的开销,且select所支持的文件描述符太少,默认是1024.poll则和select相似,但是唯一不同的是poll没有最大文件描述符数量限制。而epoll则相当于select和poll的增强版,它不是只有一个函数,而是由三个函数组成,epoll_create用来创建epoll句柄,epoll_ctrl用来注册要监听的事件,epoll_wait是等待时间的发生。epoll在每次调用epoll_ctrl的时候都会将current挂一遍,以确保fd在整个过程中制备拷贝一次,同时它会为每个fd分配一个回调函数,每次通过回调函数调用fd,回调的fd一般会挂在红黑树上,epoll_wait则是在这里寻找没有就绪的链表,当由数据到达时,内核IO事件被唤醒,返回fd.最后epoll没有最大文件描述符数量限制。

(3)Select与epoll都属于IO复用,两者存在的区别在于: 1,Select相较于epoll来说,占用更多系统资源,原因是每次select被调用时,都会从用户空间向内核空间复制所有的fd,增大了系统开销。而epoll只会在调用ctr函数时拷贝一次fd。 2,由于只知道有IO事件发生,并不知道发生了什么事件,select采用遍历的方式扫描fd集合,fd越多,性能越差。而epoll则会直接查找到该事件。 3,Select支持的最大文件描述符为1024,而epoll没有这个限制,可以高于1024。

(4)1.select随着连接数增加,性能急剧下降,处理成千上万并发连接数时,性能很差;epoll随着连接数增加,性能基本上没有下降,处理成千上万并发连接时,性能很好。 2.select连接数有限制,epoll连接数无限制。 3.select线性轮询,epoll回调。 4.select开发复杂性低,epoll开发复杂性中。

(5)Select会将所有的socket放在一个文件描述符集合中,然后将该文件描述符拷贝到内核中,内核遍历整个文件检查是否有网络事件才产生,有网络事件产生后,再将整个文件描述符集合拷贝回用户态,然后用户态再次遍历找到发生网络事件的socket。 Poll跟select类似,只是将文件描述符集合用动态数组表示突破了select的大小限制(select默认为1024个文件描述符) Epoll 的底层数据结构发生了改变,采用了红黑树,上述两种都为线性结构。Epoll将所有的socket通过epoll_ctl加入内核的红黑树中,这个红黑树中保存了待检测的socket,所以只需要传入一个待检测的socket,不需要整个文件描述符集合的拷贝。除了红黑树保存了待检测的socket,内核中还有一个就绪事件链表。当某个socket发生改变时,调用epoll_wait函数,就会返回发生改变的socket,而不是返回整个文件描述符集合。

  1. 异步IO和同步IO的区别?

说法:

(1)所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。而异步就是过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。所以异步IO和同步IO区别就是数据拷贝的时候进程是否阻塞。

(2)同步,可以理解为在执行完一个函数或方法之后,一直等待系统返回值或消息,这时程序是出于阻塞的,只有接收到返回的值或消息后才往下执行其他的命令。(同步如打电话,通信双方不能断(我们是同时进行,同步),你一句我一句,这样的好处是,对方想表达的信息我马上能收到,但是,我在打着电话,我无法做别的事情。) 异步,执行完函数或方法后,不必阻塞性地等待返回值或消息,只需要向系统委托一个异步过程,那么当系统接收到返回值或消息时,系统会自动触发委托的异步过程,从而完成一个完整的流程。(异步如收发收短信,对比打电话,打电话我一定要在电话的旁边听着,保证双方都在线,而收发短信,对方不用保证此刻我一定在手机旁,同时,我也不用时刻留意手机有没有来短信。这样的话,我看着视频,然后来了短信,我就处理短信(也可以不处理),接着再看视频

(3)同步io在功能调用时,没有收到结果时该调用不会返回,而是一直阻塞等待结果收到才会返回调用,继续做下一个功能调用 异步io在功能调用时,不会立刻收到结果,而且不会阻塞等待结果,而是直接返回,调用完成后,通过状态通知或者回调通知调用者结果。 阻塞io当调用结果返回之前,该线程会被一直挂起,直到得到结果之后才会返回 非阻塞io不能立刻的结果时该函数不会阻塞该线程,而是会立刻返回。

(4)同步IO和异步IO的1区别是同步IO在执行时会一直等待结果,即阻塞等待,而异步IO不会等待,会立即返回

(5)同步就是在发出调用功能时,如果其在被其他的程序调用,则会一直在阻塞等待仿问,会对系统资源造成大量的浪费,直到访问成功直接返回。如果没有被其他程序访问,会在访问成功后直接返回。而异步在去调用访问的时候是非阻塞访问,在调用完成之后才会返回,不用一直占用系统资源。

  1. linux的进程状态有哪些?

说法:

(1)Linux系统下进程通常存在6种不同的状态,分为:就绪态、运行态、僵尸态、可中断睡眠状态(浅度睡眠)、不可中断睡眠状态(深度睡眠)以及暂停态。

(2)(1)R运行状态(runing):并不意味着进程一定在运行中,也可以在运行队列里; (2)S睡眠状态(sleeping):进程在等待事件完成;(浅度睡眠,可以被唤醒) (3)D磁盘睡眠状态(Disk sleep):不可中断睡眠(深度睡眠,不可以被唤醒,通常在磁盘写入时发生) (4)T停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止进程,可以发送SIGCONT信号让进程继续运行 (5)X死亡状态(dead):该状态是返回状态,在任务列表中看不到; (6)Z僵尸状态(zombie):子进程退出,父进程还在运行,但是父进程没有读到子进程的退出状态,子进程进入僵尸状态; (7)t追踪停止状态(trancing stop)

(3)创建态、就绪态、运行态、阻塞态、终止态。创建态就是创建一个进程,而就绪态就是会的了除处理机以外的所有系统资源,一旦获得处理机就会进入运行态;运行态时进程被调度后在处理及上的运行,当时间片用完又会返回就绪态;阻塞态,又称等待态,是在等待某一事件而暂停运行,如某种资源或IO完成。终止态:进程结束或被释放。

(4)linux系统六态:就绪,运行,停止,终止,可中断睡眠,不可中断睡眠。 1、就绪,程序挂在就绪队列,等待时间片到来。 2、运行,进程获得处理机使用权。 3、停止,进程收到内核SIGSTOP信号,有运行态进入停止态,进程收到信号SIGCONT,由停止态恢复运行态。用于程序调试。 4、终止态,进程由于某种原因终止运行,处理机回收进程占用的资源。(也称为僵尸进程) 5、可中断睡眠,进程等待所申请的资源,一旦资源有效或者有外部唤醒信号,则结束,进入就绪状态。 6、不可中断睡眠,进程仅在获得所有申请的资源后才能被唤醒。

(5)就绪态,运行态,僵尸态,浅睡眠,深睡眠,暂停态

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值