面试现场

开篇

请您自我介绍一下你自己?

回答提示:一般人回答这个问题过于平常,只说姓名、年龄、爱好、工作经验,这些在简历上都有。其实,企业最希望知道的是求职者能否胜任工作, 包括:最强的技能、最深入研究的知识领域、个性中最积极的部分、做过的最成功的事,主要的成就等,这些都可以和学习无关,也可以和学习有关, 但要突出积极的个性和做事的能力,说得合情合理企业才会相信。企业很重视一个人的礼貌,求职者要尊重考官,在回答每个问题之后都说一句“谢谢”, 企业喜欢有礼貌的求职者。

您平时主要用什么语言? 主要时用户态还是内核态?

技术

用户态

#include 与#include “file.h”的区别?

答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。

堆栈溢出一般是由什么原因导致的?

答: 1. 没有回收垃圾资源 2. 层次太深的递归调用

程序的内存分配

答:一个由c/C++编译的程序占用的内存分为以下几个部分

  1. 栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  2. 堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
  3. 全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
  4. 文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。
  5. 程序代码区—存放函数体的二进制代码

请说出const与#define 相比,有何优点?

答:Const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

  1. const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
  2. 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。

论述含参数的宏与函数的优缺点

答: 带参宏 函数

处理时间 编译时 程序运行时

参数类型 没有参数类型问题 定义实参、形参类型

处理过程 不分配内存 分配内存

程序长度 变长 不变

运行速度 不占运行时间 调用和返回占用时间

什么是平衡二叉树?

答:左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。

嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?

答:这个问题用几个解决方案。我首选的方案是:

while(1) { }

一些程序员更喜欢如下方案:

for(;;) { }

这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的 基本原理。如果他们的基本答案是:“我被教着这样做,但从没有想到过为什么。”这会给我留下一个坏印象。

第三个方案是用 goto

Loop: … goto Loop;

应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。

位操作(Bit manipulation)

答:嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。 对这个问题有三种基本的反应

  1. 不知道如何下手。该被面者从没做过任何嵌入式系统的工作。
  2. 用bit fields。Bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。

我最近不幸看到 Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。 1. 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:

#define BIT3 (0x1 << 3)
static int a;

void set_bit3(void) 
{
    a |= BIT3;
}
void clear_bit3(void) 
{
    a &= ~BIT3;
}

一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。

用户进程间通信主要哪几种方式

答:

  • 管道
  • 命名管道
  • 信号
  • 消息(Message)队
  • 共享内存
  • 信号量
  • 套接字

线程同步方法

答:

  • 互斥锁
  • 条件变量
  • 信号量

父子进程哪些是共享的哪些时独立的?

用户态调试

答: printf -> ldd -> gdb -> strace ->coredump;

内核态

内核与用户态的通信方式?

答:

  • 内核启动参数
  • 模块参数与sysfs
  • Sysctl
  • 系统调用
  • Netlink
  • /proc
  • Seq_file
  • Debugfs
  • Relayfs
  • brk()
  • 信号
  • 内存映射机制

怎么加载内核模块? insmod与modprobe有什么区别? 怎么查看模块信息?

答: insmod/modprobe, modprobe自动找出依赖关系, modinfo查看模块信息, demesg查看输出信息.

内核同步方法

  • 每CPU变量
  • 原子操作
  • 优化和内存屏蔽
  • 自旋锁
  • 读写自旋锁
  • 顺序锁
  • RCU
  • 内核信号量
  • 读写信号量

死锁原因与避免

答:

  • 两次请求同一个锁
  • ABBA锁

中断下半部有哪几种实现方式? 与应用场景?

答: 软中断, tasklet, 工作队列

说说你认为内核中最关键的几个数据结构?

答: net_device, sk_buff, socket, sock, file;

硬中断和软中断的区别

软中断是执行中断指令产生的,而硬中断是由外设引发的。

硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。

硬中断是可屏蔽的,软中断不可屏蔽。

硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。

软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。

几种分配函数的比较

  分配原理最大内存其他

  __get_free_pages直接对页框进行操作4MB适用于分配较大量的连续物理内存

  kmem_cache_alloc基于slab机制实现128KB适合需要频繁申请释放相同大小内存块时使用

  kmalloc基于kmem_cache_alloc实现128KB最常见的分配方式,需要小于页框大小的内存时可以使用

  vmalloc建立非连续物理内存到虚拟地址的映射物理不连续,适合需要大内存,但是对地址连续性没有要求的场合

  dma_alloc_coherent基于__alloc_pages实现4MB适用于DMA操 作

  ioremap实现已知物理地址到虚拟地址的映射适用于物理地址已知的场合,如设备驱动

  alloc_bootmem在启动kernel时,预留一段内存,内核看不见小于物理内存大小,内存管理要求较高

怎么实现CPU与网卡多通道中断绑定?

数据包各层头主要包含哪些关键字段?

简述netfilter框架

说说你自己理解的linux内核TCP/IP协议栈?(最好用关键函数表示)

说说TCP拥塞控制

答: 慢启动, 拥塞避免, 快速恢复,快速重传

说说网卡驱动框架

内核态调试

  • BUG()与BUG_ON()
  • dump_stack()
  • printk()
  • OOPS
  • kdump
  • kgdb
  • kprobe

协议

三次握手及四次挥手

答:

三次握手: SYN -> SYN/ACK -> ACK;

四次挥手: FIN -> ACK -> FIN -> ACK;

TCP状态变迁及对应函数调用

答: 11种(LISTEN, SYN_SENT, SYN_RCVD, ESTABLISHED, FIN_WAIT_1, CLOSE_WAIT, FIN_WAIT_2, TIME_WAIT, LAST_ACK, CLOSING, CLOSED);

DNS协议是TCP/UDP协议? 端口是多少?

听说过edns-client-subnet?

DNS资源记录

  • A ipv4地址
  • AAAA ipv6地址
  • NS 授权DNS地址
  • MX 邮件服务器地址
  • CNAME 别名记录
  • PTR 反向解析记录

DNS查询过程

http工作流程

一次HTTP操作称为一个事务,其工作过程可分为四步:

1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。 2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。 3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。 4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。 如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

http 状态码描述

1XX-信息类(Information),表示收到Web浏览器请求,正在进一步的处理中 2XX-成功类(Successful),表示用户请求被正确接收,理解和处理例如:200 OK 3XX-重定向类(Redirection),表示请求没有成功,客户必须采取进一步的动作。 4XX-客户端错误(Client Error),表示客户端提交的请求有错误 例如:404 NOT Found,意味着请求中所引用的文档不存在。 5XX-服务器错误(Server Error)表示服务器不能完成对请求的处理:如 500

原有项目介绍

项目管理

学过项目管理认证方面的课程吗?

综合

你对于我们公司有过了解吗?

回答提示:在去公司面试前上网查一下该公司主营业务。如回答:贵公司有意改变策略,加强与国外大厂的OEM合作,自有品牌的部分则透过海外经销商。

你最擅长的技术方向是什么?

回答提示:说和你要应聘的职位相关的课程,表现一下自己的热诚没有什么坏处。

你的业余爱好是什么?

回答提示:找一些富于团体合作精神的,这里有一个真实的故事:有人被否决掉,因为他的爱好是深海潜水。主考官说:因为这是一项单人活动,我不敢肯定他能否适应团体工作。

你欣赏哪种性格的人?

回答提示:诚实、不死板而且容易相处的人、有“实际行动”的人。

你做过的哪件事最令自己感到骄傲?

回答提示:这是考官给你的一个机会,让你展示自己把握命运的能力。这会体现你潜在的领导能力以及你被提升的可能性。 假如你应聘于一个服务性质的单位,你很可能会被邀请去午餐。记住:你的前途取决于你的知识、你的社交能力和综合表现。

你觉得你个性上最大的优点是什么?

回答提示:沉着冷静、条理清楚、立场坚定、顽强向上、乐于助人和关心他人、适应能力和幽默感、乐观和友爱。 我在北大青鸟经过一到两年的培训及项目实战,加上实习工作,使我适合这份工作。

说说你最大的缺点?

回答提示:这个问题企业问的概率很大,通常不希望听到直接回答的缺点是什么等,如果求职者说自己小心眼、爱忌妒人、非常懒、脾气大、工作效率低, 企业肯定不会录用你。绝对不要自作聪明地回答“我最大的缺点是过于追求完美”,有的人以为这样回答会显得自己比较出色,但事实上,他已经岌岌可危了。 企业喜欢求职者从自己的优点说起,中间加一些小缺点,最后再把问题转回到优点上,突出优点的部分,企业喜欢聪明的求职者。

为什么要离职?

回答提示:①回答这个问题时一定要小心,就算在前一个工作受到再大的委屈,对公司有多少的怨言,都千万不要表现出来,尤其要避免对公司本身主管的批评, 避免面试官的负面情绪及印象。建议此时最好的回答方式是将问题归咎在自己身上,例如觉得工作没有学习发展的空间,自己想在面试工作的相关产业中多加学习, 或是前一份工作与自己的生涯规划不合等等,回答的答案最好是积极正面的。②我希望能获得一份更好的工作,如果机会来临,我会抓住。我觉得目前的工作,已经达到顶峰, 即沒有升迁机会。

您最近这两年看过的书有哪些?

说说你对行业、技术发展趋势的看法?

回答提示:企业对这个问题很感兴趣,只有有备而来的求职者能够过关。求职者可以直接在网上查找对你所申请的行业部门的信息,只有深入了解才能产生独特的见解。 企业认为最聪明的求职者是对所面试的公司预先了解很多,包括公司各个部门,发展情况,在面试回答问题的时候可以提到所了解的情况,企业欢迎进入企业的人是“知己”,而不是“盲人” 。

在五年的时间内,你的职业规划?

回答提示:这是每一个应聘者都不希望被问到的问题,但是几乎每个人都会被问到,比较多的答案是“管理者”。但是近几年来,许多公司都已经建立了专门的技术途径。 这些工作地位往往被称作“顾问”、“参议技师”或“高级软件工程师”等等。当然,说出其他一些你感兴趣的职位也是可以的,比如产品销售部经理,生产部经理等一些与 你的专业有相关背景的工作。要知道,考官总是喜欢有进取心的应聘者,此时如果说“不知道”,或许就会使你丧失一个好机会。最普通的回答应该是“我准备在技术领域有所 作为”或“我希望能按照公司的管理思路发展”。

你对薪资的要求?

回答提示:如果你对薪酬的要求太低,那显然贬低自己的能力;如果你对薪酬的要求太高,那又会显得你分量过重,公司受用不起。一些雇主通常都事先对求聘 的职位定下开支预算,因而他们第一次提出的价钱往往是他们所能给予的最高价钱,他们问你只不过想证实一下这笔钱是否足以引起你对该工作的兴趣。

回答样本一:我对工资没有硬性要求,我相信贵公司在处理我的问题上会友善合理。我注重的是找对工作机会,所以只要条件公平,我则不会计较太多。 回答样本二:我受过系统的软件编程的训练,不需要进行大量的培训,而且我本人也对编程特别感兴趣。因此,我希望公司能根据我的情况和市场标准的水平,给我合理的薪水。 回答样本三:如果你必须自己说出具体数目,请不要说一个宽泛的范围,那样你将只能得到最低限度的数字。最好给出一个具体的数字,这样表明你已经对当今的人才市场作了调查, 知道像自己这样学历的雇员有什么样的价值。

其他

您还有什么需要问我的吗?

微信扫一扫

作者:mospan
微信关注:墨斯潘園
本文出处:http://mospany.github.io/2017/03/01/personal-interview-questions/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。