当前位置: 首页 > news >正文

C++专业面试题

1.请你说说动态库静态库的区别

静态库 在Linux下为libxxx.a 以lib为前缀,.a为后缀,在window下为libxxx.lib 以lib为前缀,.lib为后缀,在编译时整个函数库都整合进了目标代码

动态库在linux下位libxxx.so 以lib为前缀,so为后缀,在windows下位libxxx.dll 以lib为前缀,dll为后缀,运行时执行到哪个函数就链接到哪个动态库

2.说一说常见的进程调度算法

先来先服务

短作业优先

优先级调度算法

时间片轮转

多级反馈队列调度算法

3.说说什么叫做大端存储,小端存储,如何进行判断

大端存储指的是数据的高字节为存于低地址

小端存储为数据的低字节存低地址

判断方法1:字符指针判断:将int强转为char,然后观察其地址

判断方法2:连续存放联合体判断

4.什么是孤儿进程,什么是僵尸进程,如何解决僵尸进程

孤儿进程:父进程释放,子进程未释放

僵尸进程:子进程释放,父进程未进行回收,(正确应该父进程接收SIGCHLD信号,然后调用处理函数)

解决僵尸进程:可以直接杀死父进程,将子进程托付给1号进程

5.说说进程间通信的方法

1.管道:匿名管道只能用于两个有亲属关系的进程,命名管道用于任何两个进程

2.消息队列

3.socket

4.共享内存

5.信号

6.说一说进程有多少种状态

创建、就绪、执行、阻塞、终止

6.信号量:解决进程的同步问题

7. 请你说说进程和线程的区别 

1.进程是操作系统进行资源调度和分配的基本单位,线程是操作系统可执行的最小调度和分配单位
2.一个线程属于一个进程,一个进程可以有多个线程
3.一个进程崩溃不影响其他进程,但是一个线程崩溃会让进程崩溃
4.进程在执行过程中有独立的存储单元,而线程之间共享进程的内存
5.进程之间切换系统开销大,而线程之间切换开销比进程小

8.请你介绍一下死锁,产生的必要条件,产生的原因,怎么预防死锁

互斥、不可抢占、请求与保持、循环等待

原因各进程推进顺序不当

预防死锁:破环上面四个条件

        互斥资源改为共享资源(SPOOLing技术)

        不可抢占(改为可抢占)

        请求和保持(初始分配所有资源)

        循环等待(为资源编写序号,只有拥有小资源才能申请大资源)

9.说一说 select 的原理以及缺点

select原理: select是一种IO多路(多个TCP连接)复用技术,具体实现原理是—— 1.select会维护一个文件描述符列表fd_set,用来存放需要监听的文件描述符fd,其本质是一个1024bit的bitmap数组,1代表需要检测的fd,0代表不需要检测的fd,初始时bitmap的元素全为1; 2.调用select开始对fd_set进行轮询,轮询操作需要将fd集合从用户态拷贝到内核态,因为检测一个fd是否有IO事件发生是由内核完成的。同时select会阻塞其他进程,直到检测到有事件发生才会返回事件个数,并修改fd_set对应的值,0表示无事件发生。由于select返回的只是事件发生的个数,所以要知道具体是哪一个fd有IO事件,还需要再次对fd_set进行轮询一遍。

10.说一说 epoll 的原理

1. 调用 epoll_create() 会在内核中创建一个 eventpoll 结构体数据,称之为 epoll 对象,在这个结构体中有 2 个比较重要的数据成员,一个是需要检测的文件描述符的信息 struct_root rbr(红黑树),还有一个是就绪列表struct list_head rdlist,存放检测到数据发送改变的文件描述符信息(双向链表);

 2. 调用 epoll_ctrl() 可以向 epoll 对象中添加、删除、修改要监听的文件描述符及事件; 

3. 调用 epoll_wt() 可以让内核去检测就绪的事件,并将就绪的事件放到就绪列表中并返回,通过返回的事件数组做进一步的事件处理。

11.说一说epoll的两种工作模式

 1. LT 模式(水平触发) LT(Level - Triggered)是缺省的工作方式,并且同时支持 Blocking Socket 和 Nonblock Socket。在这种做法中,内核检测到一个文件描述符就绪了,然后可以对这个就绪的 fd 进行 IO 操作,如果不作任何操作,内核还是会继续通知。 

简单叙述:当文件描述符(如套接字)处于就绪状态(例如可读或可写)时,​​只要状态未被完全处理,epoll 会持续通知应用程序​​。

2. ET 模式(边沿触发) ET(Edge - Triggered)是高速工作方式,只支持 Nonblock socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过 epoll 检测到。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了。但是请注意,如果一直不对这个 fd 进行 IO 操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once)。 ET 模式在很大程度上减少了 epoll 事件被重复触发的次数,因此效率要比 LT 模式高。epoll 工作在 ET 模式的时候,必须使用非阻塞套接口,以避免由于一个文件描述符的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。

简单叙述:仅当文件描述符的状态发生​​变化时(如从不可读变为可读)​​,epoll 会通知一次。之后若仍处于就绪状态(如数据未完全读取),​​不再通知​​,直到下一次状态变化(如新数据到达)。

12.说说什么是Blocking Socket和Nonblock Socket

Blocking Socket :当调用一个网络操作(如 recv()send()accept() 等)时,​​程序会一直等待,直到操作完成​​。在此期间,程序无法执行其他任务。

Nonblock Socket:调用网络操作时,​​无论操作是否完成,函数都会立即返回​​。程序需要自行检查操作状态,并通过循环(轮询)或I/O多路复用技术(如 selectpollepoll)管理套接字。

相关文章:

  • comfyui错误记录:Text_Translation :No module named ‘translators‘
  • Linux文件权限管理:chmod修改权限 与 chown修改所有者
  • LeetCode 热题 100 48. 旋转图像
  • shell编程补充内容(Linux课程实验3)
  • 胶合目录解释
  • 如何提升个人情商?
  • TF-IDF算法详解
  • 【Godot】使用 Shader 实现可配置圆角效果
  • 缓存与数据库的高效读写流程解析
  • C++动态内存分配:从基础到最佳实践
  • 【数据结构】线性表--链表
  • 【Linux系统】互斥量mutex
  • Spring AI 实战:第八章、Spring AI Tool Calling之与时俱进
  • Android基于绑定的控件用法
  • SpringBoot的启动流程
  • NoSQL入门实战:MongoDB与Redis核心应用全解析
  • 从 Java 开发到 AI 工程师:全面学习指南
  • 【漫话机器学习系列】238.训练误差与测试误差(Training Error And Test Error)
  • Spring AI 实战:第十一章、Spring AI Agent之知行合一
  • 56认知干货:智能化产业
  • 贵州黔西游船发生侧翻事故,游客:事发时能见度只有一米,所乘船只停靠礁石避险
  • 魔都眼|上海环球马术冠军赛收官,英国骑手夺冠
  • 乘客被困停滞车厢超4小时,哈尔滨铁路局客服:列车晚点,表示歉意
  • 铁路12306回应“五一前大量放票”传闻:个别方向和区段出现新增票额,均即时进入系统重新发售
  • 空间站第八批科学实验样品返抵地球并交付科学家
  • 【社论】法治是对民营经济最好的促进