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多路复用技术(如 select
、poll
、epoll
)管理套接字。