西安元时空屏显助理工程师二面
属于技术面,之前一面HR面时也提问了一些技术问题,二面说是Oppo方面的工程师来进行的第二次技术面试。
- 自我介绍。
- 参加的各种算法竞赛具体的比赛内容是什么?(介绍了蓝桥杯,ICPC,CCCC。)
- 对于电路原理图是否能看懂?(看不懂。)
- 在C语言中Typedef的意义是什么?(给类型定义别名,实际上两个名字指代同一个类型。)
- 简单描述一下什么是中断,你对中断的理解是什么?(答了中断的两种分类,软中断和硬中断,举了程序执行过程中的异常比如除0,或解引用0地址引起的中断,外部设备需要通过中断来跟操作系统交互,然后虚拟内存机制需要缺页中断来配合实现。)
- 在软中断产生之后,对这个中断的处理流程是什么?(RISC-V架构处理器有一个寄存器用来保存在中断产生时,要跳转执行的地址,这个处理器是在操作系统初始化的时候设置的,当中断产生的时候,处理器会负责保存一些基本信息比如pc寄存器和产生中断时的状态是内核态或用户态,然后跳转的中断向量寄存器保存的地址继续执行指令,这些指令完成的任务就是保存当前进程产生中断时的寄存器现场,切换页表指针和栈指针到内核页表和内核栈,之后调用中断处理函数判断产生中断的原因并调用对应的处理函数处理中断,处理完中断返回之前将之前保存的信息全部恢复,这样就实现了程序执行流的中断和恢复。)
- 之前使用过互斥锁么,讲讲互斥锁是什么?(在多个线程并发执行的过程中,可能需要访问共享的资源,为了使得线程对共享资源的访问不会互相干扰,就需要使他们对共享资源的操作不会重叠执行,也就是一个线程对共享资源的操作过程中不能有另一个线程同时也在进行操作,也就是互斥,此时就需要互斥锁来保护这个共享资源。)
- 讲讲你对指针的理解。(指针就是一个变量,只不过这个变量中保存的值被解释为地址空间中的某个地址。)
- 什么是野指针和空指针?(当你申请资源的时候,获得了一个指向某个资源的指针,然后在函数调用的过程中传递了这个指针,但是这个被调用的函数在没有通知调用者的情况下就将这个指向资源的指针释放掉了,此时调用者在不知情的情况下继续使用原来的指针,就会造成错误,这是野指针;而当你申请资源的时候,获得了一个指向某个资源的指针,但是你并没有检查这个资源是否被成功分配,就通过指针来使用这个资源,就有可能产生解引用一个脏地址或零地址的情况,这就是空指针。)
- 什么是内存泄漏,有什么方法能减少内存泄漏?(某个程序一直在运行,因为没有结束,操作系统不会回收进程的内存,而这个程序内部又存在一些bug,导致其申请的资源未被释放,同时又一直申请资源,而程序自身也并没意识到之前申请的资源未被释放,当进程申请完所有可用资源之后,操作系统可能会选择结束进程,导致了进程的异常终止;解决的办法答了引入一个操作系统级别的程序,当某个进程占用资源过大的时候,检查该进程持有的所有页面,如果发现某些页面很长时间未被访问过,那就强制释放掉这些页面。)
- 讲讲你对C++中map这个数据结构的理解?(答了map是用来保存键值对的数据结构,能够保存键和值之间的映射关系,然后map是不允许存在相同的键的,并且也要求键之间必须能判断小于关系,因为map底层实现就是一颗平衡二叉排序树-红黑树,可以在O(logN)的时间复杂度内根据给定的键找到对应的值。)
- 讲讲C++中继承这个概念和它的作用?(答了继承可以实现代码复用,在已经实现的功能的基础上,通过继承已有的功能,在其基础上开发新的功能;还可以通过继承抽象类,实现接口和实现的分离,对统一的接口提供不同的实现。)
- 问了些私有继承、公有继承和保护继承情况下的访问控制的问题。
- 对Linux操作系统有了解么,Linux操作系统上的进程和线程区别?(答了在Linux上可调度执行的单位就是一个Task,然后在创建新的可执行单位的时候,通过给clone函数传入不同的参数,来实现在任务之间共享地址空间从而实现线程的概念,或在任务之间隔离地址空间从而实现进程的概念。)
- 问了为什么选择跨专业就业的原因。
- 反问环节。
后面面试完后,也是有了第一个offer吧,实现了零的突破,但是还是综合考虑了岗位发展方向、公司规模背景、薪资待遇等原因,就拒了,想继续尝试面试再看看。