【37】C++岗位求职面试八股文第三十七篇(操作系统)

系列文章目录

第一篇:语言基础

第二篇:设计模式

第三篇:数据库

第四篇:计算机网络

第五篇:操作系统

第六篇:LInux

第七篇:数据结构

第八篇:智力题

[121]简述socket中select,epoll的使用场景和区别,epoll水平触发与边缘触发的区别?select,epoll的使用场景:都是IO多路复用的机制,应用于高并发的网络编程的场景。I/O多路复用就是通过一种机制,可以监视多个文件描述符,一旦某个文件描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。

select,epoll的区别:拷贝、轮询、fd个数(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大;而epoll保证了每个fd在整个过程中只会拷贝一次。(2)每次调用select都需要在内核遍历传递进来的所有fd;而epoll只需要轮询一次fd集合,同时查看就绪链表中有没有就绪的fd就可以了。(3)select支持的文件描述符数量太小了,默认是1024;而epoll没有这个限制,它所支持的fd上限是最大可以打开文件的数目,这个数字一般远大于2048。

epoll水平触发与边缘触发的区别:LT模式(水平触发):,只要这个fd(缓冲区)还有数据可读, epoll_wait就会被调用(他是系统调用,少用为好)而在ET(边缘触发)模式中epoll_wait就会被调用一次,直到下次再有数据流入之前都不会再提示了,无论fd中是否还有数据可读。所以需要设置循环读+非阻塞

[122]说说Reactor、Proactor模式 高效的事件处理模式在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,(两种事件处理模式)其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作。

Reactor模式:Reactor模式应用于同步I/O的场景。Reactor中读操作的具体步骤如下:读取操作:(1)应用程序注册读就需事件和相关联的事件处理器(2)事件分离器等待事件的发生(3)当发生读就需事件的时候,事件分离器调用第一步注册的事件处理器(4)事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理

主线程只负责监听文件描述符上是否有事件发生,有的话立即将该事件放入任务队列,通知工作线程。工作线程负责读写数据,接受连接,处理请求。

Proactor模式:Proactor模式应用于异步I/O的场景。Proactor中读操作的具体步骤如下:

(1)应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件,这是区别于Reactor的关键。(2)事件分离器等待读取操作完成事件(3)在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作,并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区。(4)事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。

区别:从上面可以看出,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要用户再自己接收数据,直接使用就可以了,操作系统会将数据从内核拷贝到用户区。

Reactor:(感知的是就绪可读可写事件)主线程向epoll内核注册读事件,主线程调用eopll_wait监听变化的fd,将fd放入请求对列;子线程唤醒,读(写)fd数据,处理请求;读完之后向内核注册写事件,之后一致。。。。Proactor:(感知的是已完成的可读可写事件)主线程调用aio_read()向epoll内核注册读事件,主线程调用eopll_wait监听变化的fd,主线程继续处理其他任务,当fd被读入到用户缓冲区后,内核向应用程序发送信号,通知数据已读完,子线程处理请求;读完之后向内核注册写事件,之后一致。。。。

[123]IO模型的类型

前四种模型--阻塞IO、非阻塞IO、多路复用IO和信号驱动IO都属于同步模式,因为其中真正的IO操作(函数)都将会阻塞进程,只有异步IO模型真正实现了IO操作的异步性1阻塞IO:调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的检查这个函数有没有返回,必须等这个函数返回后才能进行下一步动作。

2非阻塞IO:非阻塞等待,每隔一段时间就去检查IO事件是否就绪。没有就绪就可以做其他事情。

3信号驱动IO:Linux用套接口进行信号驱动IO,安装一个信号处理函数,进程继续运行并不阻塞,当IO事件就绪,进程收到SIGIO信号,然后处理IO事件。

4IO多路复用:Linux用select/poll函数实现IO复用模型,这两个函数也会使进程阻塞,但是和阻塞IO所不同的是这两个函数可以同时阻塞多个IO操作。而且可以同时对多个读操作、写操作的IO函数进行检查。知道有数据可读或可写时,才真正调用IO操作函数。

5异步IO:Linux中,可以调用aio_read函数告诉内核描述字缓冲区指针和缓冲区的大小、文件偏移及通知的方式,然后立即返回,当内核将数据拷贝到缓冲区后,再通知应用程序。用户可以直接去使用数据。

[124]同步与异步的区别,阻塞与非阻塞的区别?同步与异步的区别:

同步:是所有的操作都做完,才返回给用户结果。即写完数据库之后,再响应用户,用户体验不好。异步:不用等所有操作都做完,就响应用户请求。即先响应用户请求,然后慢慢去写数据库,用户体验较好。

阻塞与非阻塞的区别:阻塞:调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的检查这个函数有没有返回,必须等这个函数返回后才能进行下一步动作。非阻塞:非阻塞等待,每隔一段时间就去检查IO事件是否就绪。没有就绪就可以做其他事情。

[125]BIO、NIO有什么区别?

BIO(Blocking I/O):阻塞IO。调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的检查这个函数有没有返回,必须等这个函数返回后才能进行下一步动作。NIO(New I/O):同时支持阻塞与非阻塞模式,NIO的做法是叫一个线程不断的轮询每个IO的状态,看看是否有IO的状态发生了改变,从而进行下一步的操作。

[126]socket网络编程中客户端和服务端用到哪些函数?

服务器端函数:(1)socket创建一个套接字(2)bind绑定ip和port(3)listen使套接字变为可以被动链接(4)accept等待客户端的链接(5)write/read接收发送数据(6)close关闭连接

客户端函数:(1)创建一个socket,用函数socket()(2)连接服务器,用函数connect()(3)收发数据,用函数send()和recv(),或read()和write()(4)close关闭连接、

[127]网络七层参考模型,每一层的作用?

[128]程序动态加载的过程

1内核加载:定义全局描述符后(GDT)后,将内核代码从硬盘读到内存中2. 在内核中执行加载和执行用户程序

[129]链接过程

• 链接是指将目标文件最终链接为可执行程序• 根据链接方式的不同,链接过程可以分为o 静态链接:目标文件直接链接进入可执行程序o 动态链接:在程序启动后才动态加载目标文件

[130]os内存分配算法:伙伴算法

伙伴算法

[131]Linux内核

Linux内核的主要模块(或组件)分以下几个部分:具备五大模块化功能,其中包括:进程管理、内存管理、文件系统管理、设备控制和网络管理

[132]Linux架构

Shell是一种特殊的应用程序(图形化界面),它提供接口来运行其他的应用程序

[133]乐观锁和悲观锁区别

都是用于解决并发场景下的数据竞争问题

乐观锁:在访问共享资源时,不⽤先加锁,修改完共享资源后,再验证这段时间内有没有发⽣冲突,如果没有其他线程在修改资源,那么操作完成,如果发现有其他线程已经修改过这个资源,就放弃本次操作

乐观锁适用于多读的应用类型,这样可以提高吞吐量,乐观锁的实现⽅式主要有两种:CAS机制和版本号机制悲观锁:悲观的认为每次去拿数据的时候,别人会修改。所以每次在拿数据的时候都会上锁。如行锁,表锁等,读锁,写锁等。多写的场景下用悲观锁就比较合适

[134]调度

[135]缺页中断和一般中断

[136]软链接和硬链接

起别名方式

硬链接就是一个文件的一个或多个文件名。因此我们可以用多个文件名与同一个文件进行链接,这些文件名可以在同一目录或不同目录。

[137]阻塞,非阻塞,多路复用、异步驱动IO图解

阻塞IO:上下都阻塞

非阻塞IO:下阻塞

多路复用IO:下阻塞 (IO多路复用同步)本身阻塞,阻塞时间看参数

异步IO:上下都不阻塞

上面是阻塞非阻塞(系统调用),下面是同步异步(数据从内核态拷贝到用户态)

[138]Linux网络协议栈

接收流程

单进程打开的文件描述符个数最大是 1024每个进程都有一个文件描述符表,表示这个进程打开的所有文件。里面的每一条项目都对应一个打开的文件。

对于一个进程而言,每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也可以指向同一个文件。相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开

[139]TCP最大连接数

服务器IP、监听·端口一般固定,所以看客户端端口和IP

[140]Select、poll、Epoll

IO多路复用:多个请求复用了一个线程,只使⽤⼀个线程来维护多个 Socket (为每个请求分配⼀个进程/线程的⽅式不合适,)

Epoll

epoll_wait 返回时,是将数据从内核共享内存映射到⽤户空 间。

[141]高性能网络模式 Reactor 和 Proactor

Reactor是⾮阻塞同步⽹络模式常⻅的开源软件很多都采⽤了这个⽅案,⽐如 Redis、 Nginx、Netty 等等

单 Reactor 单线程 / 单进程

单 Reactor 多线程 / 多进程

多 Reactor 多进程 / 线程

两个开源软件 Netty 和 Memcache 都采⽤了「多 Reactor 多线程」的⽅案。采⽤了「多 Reactor 多进程」⽅案的开源软件是 Nginx

第⼀种⽅案单 Reactor 单进程 / 线程,不⽤考虑进程间通信以及数据同步的问题,因此实现起来⽐较简 单,这种⽅案的缺陷在于⽆法充分利⽤多核 CPU,⽽且处理业务逻辑的时间不能太⻓,否则会延迟响应, 所以不适⽤于计算机密集型的场景,适⽤于业务处理快速的场景,⽐如 Redis 采⽤的是单 Reactor 单进程 的⽅案。

第⼆种⽅案单 Reactor 多线程,通过多线程的⽅式解决了⽅案⼀的缺陷,但它离⾼并发还差⼀点距离,差 在只有⼀个 Reactor 对象来承担所有事件的监听和响应,⽽且只在主线程中运⾏,在⾯对瞬间⾼并发的场 景时,容易成为性能的瓶颈的地⽅。

第三种⽅案多 Reactor 多进程 / 线程,通过多个 Reactor 来解决了⽅案⼆的缺陷,主 Reactor 只负责监听 事件,响应事件的⼯作交给了从 Reactor,Netty 和 Memcache 都采⽤了「多 Reactor 多线程」的⽅案, Nginx 则采⽤了类似于 「多 Reactor 多进程」的⽅案。

Redis:单reactor单线程 Nginx:多reactor多进程

Proactor异步⽹络模式

[142]Linux性能指标

以 4 个指标来衡量⽹络的性能,分别是带宽、延时、吞吐率、包转发

[续]C++岗位求职面试八股文第三十八篇(综合+智力题)

更多关于算法题解、软件开发面经、机器学习算法面经、各企业面试问题记录,关注Fintech砖,持续更新中。https://www.nowcoder.com/users/873777317

企业面试记录专栏https://www.nowcoder.com/creation/manager/columnDetail/0YBWnm

机器学习面经专栏https://www.nowcoder.com/creation/manager/columnDetail/j8nNy0

软件开发面经专栏https://www.nowcoder.com/creation/manager/columnDetail/0aXKaM

更多校园招聘常见面试问题(开发、算法、编程题目)参见CSDN博客:http://t.csdn.cn/V4qbH

欢迎关注、收藏、点赞后进行问题咨询及秋招建议

#晒一晒我的offer##牛客在线求职答疑中心##牛客解忧铺##我的求职思考##软件开发薪资爆料#
软件开发八股面经 文章被收录于专栏

包含C++、操作系统、数据库、计算机组成、计算机网络、设计模式、操作系统、牛客网服务器项目、综合智力题等

全部评论

相关推荐

09-29 17:44
已编辑
蔚来_测(准入职员工)
//鲨鱼辣椒:见不了了我实习了四个月上周再投筛选了一天就给我挂了
点赞 评论 收藏
分享
09-25 10:34
东北大学 Java
多面手的小八想要自然醒:所以读这么多年到头来成为时代车轮底下的一粒尘
点赞 评论 收藏
分享
7 33 评论
分享
牛客网
牛客企业服务