下面是实习面试过程中的一些总结:
面经1
一面:
1.this指针调用成员函数时的压栈和相关寄存器使用?(从右往左调用,这个容易可以回答;在x86中,会将this指针放在寄存器ecx中,以便快速访问,对于寄存器方面,我完全没有了解)
2.虚表的调用,以及单继承,多继承,菱形继承中虚表在对象内存中位置?是一个虚表还是多个虚表?(虚表调用就是类的首地址,然后查表,单继承是单表,多继承是多表)
3.RTTI的使用?(运行时类型鉴定,适用于使用基类的指针或引用转换为派生类并调用非虚函数方法)
4.TCP的nagle算法以及延迟ACK?(Nagel算法将较小tcp包进行合并发送;适用于批量数据传输,减少ACK回应流量)
5.TCP拥塞控制的几种方式?(慢开始和拥塞避免、快开始与快恢复)
6.linux环境下互斥锁的使用以及互斥锁释放后,等待线程是随机唤醒还是唤醒第一个等待队列?(互斥锁实现互斥机制,保护多个线程更改一个共享资源)(优先级唤醒)(其实这跟锁并没有太多关系,而是系统的线程调度问题)
7.linux环境下条件变量的使用?(条件变量提供信号机制,所有等待该条件的线程同时阻塞,使用过程需要一互斥量配合使用。作用?使用场景?如何使用?)
8.pthread_cond_boardcase和pthread_cond_signal的区别?(前者广播唤醒等待该条件的所有线程,后者单播至少唤醒一个等待该条件的线程)
9.进程之间的通信方式?有没有实践过?讲讲其中你觉得用的最多的方式?(;;最多是共享内存和信号量,之前第二个项目是传输大块数据,实现循环缓冲区;最后一个小问实际上是需要结合实际的需求,不同的需求会有不同的方式选择)
10.select和epoll的区别以及他们的优劣?(是否重复拷贝、检测过程是否遍历所有)
11.问了一下大学干了些啥以及意向城市?(社团工作、创业公司、校企培养;深圳-IT行业繁荣)
二面:
1.写一下将一个整型的二进制后三位清零?(n &=~7)
2.__stdcall和__cdecl有什么区别?(一个是函数自己管堆栈参数清理;一个是调用者管堆栈参数清理,默认方式)
3.用一个父类的指针,怎么调用子类的虚函数的?他们的调用流程是什么?(就是虚函数机制,虚表的实现,说一遍即可)
4.为什么浮点有误差?二进制无法精确的表达十进制小数(计算机本质是二进制,通过浮点表示小数,都是模拟出来的)
5.printf("%s%d", s, d)的压栈情况?(突出说明要压入下一条指令执行的地址,保护现场;也就是函数调用的堆栈帧的映射图)
6.说一说大学做了什么项目?学过什么东西?(送分)
7.说说你这个项目中遇到的一些问题和对应的解决方案?你还能提出新的功能吗?还有没?这样做的原因是什么?(这一部分全靠想)(问题:网络传输不稳定,方案:流量控制;日志系统,方便查看执行过程中的错误)
8.有没有做过开源项目?基于开源框架进行开发?()
9.看过linux源码,说说epoll和select以及poll的底层代码实现?具体有哪些?select和epoll的优劣,从实现上说明?(没看过,但我还是知道一部分底层实现;是否重复拷贝、是否遍历所有)
10.求一堆字符串的最长公共前缀?指针后移就可以了
11.求给定一堆字符串中,其中几个的最长公共前缀?用字典树说明一下就可以了
12.64位x86操作系统和32位x86操作系统函数调用的差别?(64位前6个参数放寄存器,32位是直接压栈;这个我完全不会)
13.信号传递机制?(信号本质一个软件模拟的中断,或许是硬件中断Ctrl-C等操作,或许是软件kill函数等发送信号;进程注册信号,内核监控,进程切换至内核,检测是否发生信号,传递信号,进入进程的信号服务函数)
面经2
一面:
1.new和malloc的区别。(运算符与库函数;分配内存后是否创建对象)
2.浮点数怎么判断相等。(相减比较0.0000001)
3.一共四个人过桥,每个通过桥的时间为1,2,5,8分钟,他们只有一个手电筒,桥每次只能承受两个人的重量,问你怎么过桥最快?换成是一堆人该怎么办?(讲述思路即可,8=5+2+1;一堆人的话,就凑整)
4.手写代码,算出一个文件里的每个小写字母出现的次数。(哈希表直接撸,注意小写字母,在获取结果是数组索引采用’a~z’即可)
5.怎么比较两个结构体相等?(逐个成员比较)
6.A函数调用了B函数,这时候在B中添加成员函数,问A需不需要重新编译?(在C和C++ 中分别需不需要重新编译。)
7.指针传参和引用传参的区别。(是否拷贝,是否同一实体,是否绝对安全)
二面:
1.将一个整型的二进制最后三位清零。(x&=~7)
2.面试官自己手写的一个代码让你写输出结果。(这可以,最怕几个loop的代码)
3.求一堆字符串的最长公共前缀。还有就是找这一堆字符串中公共前缀最长的两个字符串。
4.printf("%s%d", s, d)的压栈情况,执行Printf函数时sp指针的变化。(被考无数次的题目?sp就是堆栈指针,直接移动即可,注意堆栈是从高到底,相加相减分清楚)
5.有一幢大楼(忘了他有没有说大楼有多高),然后你有两个玻璃球,玻璃球在你从大楼的第N层扔下的时候会碎,从小于N的楼层扔下不会碎,大于N的楼层扔下也会碎,让你用最快的方法找到N的具体值。(二分法,具体忘记怎么录了)
6.浮点数不能直接比较的原理。(计算机基础,不过也可以展开讲)
7.说下你的项目经历?
8.有没有看过什么开源项目。(FFmpeg)
面经3
深信服-星云计划 失败
1.聊项目
2.对于N个点的网络,求任意两点的最短路径?(专门的算法,贪心)
3.C语言局部变量与全局变量(内存位置、声明周期、作用域等方面描述)
4.对于大的数组,如何使用局部变量?(修改进程栈大小、)
5.不同文件中如何引用外部变量?(头文件包含)
6.递归时栈溢出怎么办?任何递归都可以用非递归实现么?(转为迭代实现,尾递归可以)
7.存储通讯录信息:姓名,手机,邮箱,简介,如何能实现快速查询以及部分查询?
8.Linux编程中的锁有哪些?(自旋锁、互斥锁、信号量)
9.自旋锁与互斥锁区别(是否投入睡眠)
10.进程IPC方式(管道、FIFO、消息队列、信号量、共享内存、socket)
11.socket与共享内存用于什么情况?(socket实现进程间传递打开文件描述
符,共享内存实现大数据块传输,最快IPC)
12.卫星网络中网络带宽足够,但丢包率高,导致网页打不开,通信质量差,什么原因?如何解决?(设备丢包、MTU设置不恰当、网络攻击)
13.Dijkstra单源最短路径(学习的时候弄懂了,现在又忘记了)
深信服这场也跪在了算法上,面试官说只要你回答上这个问题就给你过,但还是没想起来Dijkstra的具体内容。 无奈。
面经4
一面
1.你会什么(Linux和C)
2.多进程的创建与返回值的意义、僵尸进程(;父进程没有对子进程的退出进行wait,造成资源没有完全归还给系统,子进行依然保留在进程表里面但不运行)
3.多线程的互斥、通信机制、效率问题()
4.会几种查找算法(二分、图、树)、某算法的时间复杂度
5.你会几种排序?(快排、选择、希尔、哈希、归并、堆)、实现其中一个算法
6.几种错误信号,并讲述其中一个的意义(SIGSEVG段错误,内存越界、权限问题)
7.说说TCP协议的(可靠机制、流量控制、拥塞控制、连接管理)
二面
1,new malloc的实现区别(运算符和库函数、是否构造对象)
2,解释struct的字节对齐,估计是昨天的试卷这个错误比较严重,为什么要对齐,如何实现两个结构体的比较相等,可以用compare()按字节比较吗?(对齐的作用;逐个成员比较)
3,指针和引用的区别(是否拷贝,是否同一实体,是否绝对安全,引用只能初始化并且以后不能改变)
4,什么技术可以代替宏定义(这其实考的面非常广,看你软件开发的经验,看你对宏技术发展的理解;C++里面可以:const实现常量、inline内联替代宏函数、typedef替代类型定义、条件编译)
5,描述下快速排序的思想,时间复杂度是多少,什么情况下复杂度最大(根本在于分治法;O(log(n));已排序好)
6,写下二分查找
7,动态链接库的接口函数是什么(dlopen类,这是显示链接共享库,我从来没用过)
8,云上传是怎么实现秒传的(MD5)