求职的第一面Harman

公司介绍:

Harman 是支撑包括 Harman Kardon®、JBL®、Mark Levinson® 和 Infinity® 。   在内的
a 系列著名品牌的母公司。我们是一家领先的高级音响和信息娱乐解决方案全球提供商,赢得了家用、汽车和移动等众多领域的客户。

公司网址:http://www.harman.com/

经过两个多星期的投递简历,终于换来一个个笔试的通知,居然没有想到的是,我的第一面献给了大公司——哈曼公司,这次面试真的很值,为我后面的进外企做了铺垫,希望后面再接再厉!

     9月20号去参加了哈曼公司的笔试,参加笔试的人如此之多,而且多半都是研究生,不过我抱着一个心态,反正我是来攒笔经的,随便做的好不好,对于我都是有益而无一害,笔试回寝室刚一给手机充电就收到短信,通知我通过了笔试,请与明天去面试!当时激动不已,在众多的高手当中我居然能够赢得面试机会,当时我就问一下与我一同去笔试的同学,他们都没有收到面试通知,这下好有压力,毕竟这是个这么大的公司,又是外企,听说哈曼音响是为大品牌汽车做音响、导航的,忙了一天又要准备面试,确实好有压力。这天晚上我一直睡不着,总是想明天怎样面试,一直准备这么长时间的面试理论,一定要在现场发挥出来。

     9月21号,这天我起得很早就去面试现场了,因为校车发车早的缘故。来到新校区的图书馆看看Linux内核方面的知识,又准备了英文自我介绍,,实在是没有心情看书,心里挺紧张的,于是我干脆去面试现场打探消息。果然一去有好几个人站在门外等候,我扫了一遍,看到教室里就是2对1的面试,我离面试还有2个小时,我就到楼下去走走,背背面试的自我介绍,遇到一个西南科技大学的同学,聊了半天,他是研究生,压力大啊。后来我在楼下准备自我介绍半个小时,就直接上去面试去了,等了将近40分钟才到我,之前还填写了一张申请表。在等候的过程中,我也与其他同学聊了一阵,得知,只有我一个本科生,听说面试不用做自我介绍,但是不能保证面试的时候用的是英文,面试官问的问题多半是理论上的东西,心想也不是很难的面试嘛,而且是一面定Offer,这个挺好的,不用面试几次浪费时间和精力了。

      12:10分的时候,到我面试了,刚走进去,看到两个面试官挺和谐的,不是那种很严肃的,一上来就说让我做一个英文自我介绍,靠,不是说不自我介绍吗?这下我只有现场发挥了,做了基本的介绍,但是不知怎么结尾,于是就想起早上背的,从头到尾就只有30秒的自我介绍,我知道,我的第一印象肯定没了,他们肯定已经断定:这个人英语很差。下面我就写下我面试过程:
1. 英文自我介绍

2. 介绍一下自己做的比较深的项目

3. 说一下什么是中断,在写中断函数我们需要注意些什么

*************************************

CPU在执行一个程序时,对系统发生的某个事件(程序自身或外界的原因)作出的一种反应:CPU暂停正在执行的程序,保留现场后自动转去处理相应的事件,处理完该事件后,到适当的时候返回断点,继续完成被打断的程序。(如有必要,被中断的程序可以在后来某时间恢复,继续执行。)事件:如读盘,盘有问题,无法读,产生中断,解决后,程序恢复,软件错误也会中断。特点:1) 中断随机的 2) 中断是可恢复的 3) 中断是自动进行处理的 2、中断系统的有关概念

中断步骤:

1) 对异常向量的响应:

将下一条指令的地址存入相应的连接寄存器LR——将CPSR复制到相应的SPSR————根据异常向量,强制设置CPSR的运行模式——强制PC从相应的异常向量地址取下一条指令执行,从而跳转相应的异常处理程序处。

2) 从异常返回:

将连接寄存器LR的值减去相应的偏移量后送到PC中——将SPSR复制到CPSR中——若存在异常处理时设置中断禁止位,要在此清除。

**************************************

4. 说一下内存,外存,缓存的概念及特点

**************************************

内存:主存就是咱们说的内存,用来存放程序运行时的数据。内存储器 速度快 价格贵,容量小,断电 后内存内数据会丢失;

外存:外部存储器(辅助存储器),指除计算机内存及CPU缓存以外的储存器,此类储存器一般断电后仍然能保存数据。常见的外储存器有硬盘软盘光盘、U盘等容量超大,但是速度最慢;

缓存:缓存就是CPU cache,速度非常快,用来存放最经常用的数据,但是非常小,因为贵

这样的层次结构使得计算机的成本大幅下降,使得PC可以走入寻常百姓家。Cache虽然速度快,但是成本极其昂贵,因此大容量Cache的成本是难以想象的,于是乎,成本更低的内存便有了市场,但是大容量RAM的成本依旧是难以承受的。而对非易失性大容量存储的需求,又催生了诸如硬盘等外存,它兼具高容量、低成本、非易失的特点,实现了低成本的大容量存储,降低数据存储成本,使得层次结构的PC进入了家庭。而层次结构带来的问题便是性能上的损失。虽然硬盘的数据成本低廉,但是,相较于内存,读写速度不够迅速,因此,当CPU访问的数据在硬盘上时,数据速度就是硬盘的龟速——高速组件都在等待低速组件,导致性能瓶颈。这样的情况也会出现在RAM和Cache之间。可以说,层次结构就是用来平衡性能与成本的解决方案。

**************************************

5. 给你一个数组,如何判断一个循环链表是否为空

6. 说一下计算机从上电后的启动流程

**************************************

第一步: 当我们按下电源开关时,电源就开始向主板和其它设备供电,此时电压还不太稳定,主板上的控制芯片组会向CPU发出并保持一个RESET(重置)信号,让CPU内部自动恢复到初始状态,但CPU在此刻不会马上执行指令。当芯片组检测到电源已经开始稳定供电了(当然从不稳定到稳定的过程只是一瞬间的事情),它便撤去RESET信号(如果是手工按下计算机面板上的Reset按钮来重启机器,那么松开该按钮时芯片组就会撤去RESET信号),CPU马上就从地址FFFF0H处开始执行指令,跳到系统BIOS中真正的启动代码处。

第二步: 系统BIOS的启动代码首先要做的事情就是进行POST(Power-On Self Test,加电后自检),POST的主要任务是检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备。由于POST是最早进行的检测过程,此时显卡还没有初始化,如果系统BIOS在进行POST的过程中发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),那么系统BIOS就会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型。在正常情况下,POST过程进行得非常快,我们几乎无法感觉到它的存在,POST结束之后就会调用其它代码来进行更完整的硬件检测。

第三步: 接下来系统BIOS将查找显卡的BIOS,前面说过,存放显卡BIOS的ROM芯片的起始地址通常设在C0000H处,系统BIOS在这个地方找到显卡BIOS之后就调用它的初始化代码,由显卡BIOS来初始化显卡,此时多数显卡都会在屏幕上显示出一些初始化信息,介绍生产厂商、图形芯片类型等内容,不过这个画面几乎是一闪而过。系统BIOS接着会查找其它设备的BIOS程序,找到之后同样要调用这些BIOS内部的初始化代码来初始化相关的设备。

第四步: 查找完所有其它设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其中包括有系统BIOS的类型、序列号和版本号等内容。

第五步: 接着系统BIOS将检测和显示CPU的类型和工作频率,然后开始测试所有的RAM,并同时在屏幕上显示内存测试的进度,我们可以在CMOS设置中自行决定使用简单耗时少或者详细耗时多的测试方式。

第六步: 内存测试通过之后,系统BIOS将开始检测系统中安装的一些标准硬件设备,包括硬盘、CD-ROM、串口、并口、软驱等设备,另外绝大多数较新版本的系统BIOS在这一过程中还要自动检测和设置内存的定时参数、硬盘参数和访问模式等。

第七步: 标准设备检测完毕后,系统BIOS内部的支持即插即用的代码将开始检测和配置系统中安装的即插即用设备,每找到一个设备之后,系统BIOS都会在屏幕上显示出设备的名称和型号等信息,同时为该设备分配中断、DMA通道和I/O端口等资源。

第八步: 到这一步为止,所有硬件都已经检测配置完毕了,多数系统BIOS会重新清屏并在屏幕上方显示出一个表格,其中概略地列出了系统中安装的各种标准硬件设备,以及它们使用的资源和一些相关工作参数。

第九步: 接下来系统BIOS将更新ESCD(Extended System Configuration Data,扩展系统配置数据)。ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS(一小块特殊的RAM,由主板上的电池来供电)之中。通常ESCD数据只在系统硬件配置发生改变后才会更新,所以不是每次启动机器时我们都能够看到“Update ESCD… Success”这样的信息,不过,某些主板的系统BIOS在保存ESCD数据时使用了与Windows 9x不相同的数据格式,于是Windows 9x在它自己的启动过程中会把ESCD数据修改成自己的格式,但在下一次启动机器时,即使硬件配置没有发生改变,系统BIOS也会把ESCD的数据格式改回来,如此循环,将会导致在每次启动机器时,系统BIOS都要更新一遍ESCD,这就是为什么有些机器在每次启动时都会显示出相关信息的原因。

第十步: ESCD更新完毕后,系统BIOS的启动代码将进行它的最后一项工作,即根据用户指定的启动顺序从软盘、硬盘或光驱启动。以从C盘启动为例,系统BIOS将读取并执行硬盘上的主引导记录,主引导记录接着从分区表中找到第一个活动分区,然后读取并执行这个活动分区的分区引导记录,而分区引导记录将负责读取并执行IO.SYS,这是DOS和Windows 9x最基本的系统文件。Windows 9x的IO.SYS首先要初始化一些重要的系统数据,然后就显示出我们熟悉的蓝天白云,在这幅画面之下,Windows将继续进行DOS部分和GUI(图形用户界面)部分的引导和初始化工作。

如果系统之中安装有引导多种操作系统的工具软件,通常主引导记录将被替换成该软件的引导代码,这些代码将允许用户选择一种操作系统,然后读取并执行该操作系统的基本引导代码(DOS和Windows的基本引导代码就是分区引导记录)。

**************************************

7. UBoot的启动流程是怎么样的

这个搞嵌入式的必须的,看Uboot源码有注释。

8. 说一下PC的实模式和保护模式

**************************************

http://yangping-account.iteye.com/blog/901301

一。x86实模式介绍

x86体系的处理器刚开始时只有20根地址线,寻址寄存器是16位。我们知道16位的寄存器可以访问64K的地址空间,如果程序要想访问大于64K的内存,就需要把内存分段,每段64K,用段地址+偏移量的方式来访问,这样使20根地址线全用上,最大的寻址空间就可以到1M字节,这在当时已经是非常大的内存空间了。

二。实模式的问题与保护模式的出现

事实上,实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序并没有区别对待,而且每一个指针都是指向实际的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并修改了内容,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。再者,随着软件的发展,1M的寻址空间已经远远不能满足实际的需求了。最后,对处理器多任务支持需求也日益紧迫,所有这些都促使新技术的出现。

为了克服实模式下的内存非法访问问题,并满足飞速发展的内存寻址和多任务需求,处理器厂商开发出保护模式。在保护模式中,除了内存寻址空间大大提高;提供了硬件对多任务的支持;物理内存地址也不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。至此,进程(程序的运行态)有了严格的边界,任何其他进程根本没有办法访问不属于自己的物理内存区域,甚至在自己的虚拟地址范围内也不是可以任意访问的,因为有一些虚拟区域已经被放进一些公共系统运行库。这些区域也不能随便修改,若修改就会有出现linux中的段错误,或Windows中的非法内存访问对话框。

三。386以上处理器的特点

386处理器有三种工作方式:实模式、保护模式和虚拟8086模式。

在保护方式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间;扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能够快速地进行任务切换和保护任务环境;4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离;支持虚拟8086方式,便于执行8086程序。

四。保护模式下的地址转换

通过采用段地址加偏移量的方式,80386支持的虚拟地址空间可达64T字节。但由于实际物理内存的大小可能会远小于虚拟地址空间,所以实际上虚拟地址中只有部分才可以真正映射到物理存储器。同时由于每一个任务有一个虚拟地址空间。为了避免多个并行任务的多个虚拟地址空间直接映射到同一个物理地址空间,还需要使用线性地址空间来隔离虚拟地址空间和物理地址空间。线性地址空间由一维的线性地址构成,线性地址空间和物理地址空间是对等。线性地址也是32位长,寻址空间为4G字节。

在操作系统中,应用程序使用虚拟地址(也即逻辑地址)访问内存,操作系统将虚拟地址转换为线性地址,然后由处理器将线性地址转换为物理地址,但是在交由处理器转换前,操作系统必须设置处理器所需要的相关描述符表和描述符信息。其实在Linux系统中,这在系统启动时就设置好了,而且是设置后就不会再改动了。

在80386中,通过使用分段管理和分页管理实现虚拟地址到物理地址的转换,其中分页管理是可选的。

**************************************

9. 怎样查看Linux正在运行哪些进程,怎样查看进程所占用的CPU及内存

**************************************

ps –ef 和 top

**************************************

10. 数据库

11. 有没有用过C++做个项目

12. C++的多态的认识

**************************************

多态的绑定可以分为运行是多态和编译时多态

● 编译时的多态性

编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。

● 运行时的多态性

运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。

编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。

今天才正式弄清楚原来虚函数是可以实现运行时多态的,以前只知道虚函数可以使得基类对象的的方法调用派生类的方法。

http://blog.csdn.net/hackbuteer1/article/details/7475622

**************************************

13. 内核模块中驱动模型有哪几种,说一下各自特点

14. 编译内核驱动模块到内核中需要哪些步骤

**************************************

1. 将编写的源代码复制到Linux内核源代码的相应目录;

2. 在目录的Kconfig文件中增加新源代码对应项目的编译配置选项;

3. 在目录的Makefile文件中增加对新源代码的编译条目。

**************************************

15. 系统的进程调度算法有哪些,各自的优缺点是什么?Linux内核中进程的调度算法有哪几种

**************************************

一、先来先服务和短作业(进程)优先调度算法

1. 先来先服务调度算法。先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度, 也可用于进程调度。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。由此可知,本算法适合于CPU繁忙型作业, 而不利于I/O繁忙型的作业(进程)。
2. 短作业(进程)优先调度算法。短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度, 也可用于进程调度。但其对长作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。

二、高优先权优先调度算法

1. 优先权调度算法的类型。为了照顾紧迫性作业,使之进入系统后便获得优先处理,引入了最高优先权优先(FPF)调度算法。 此算法常被用在批处理系统中,作为作业调度算法,也作为多种操作系统中的进程调度,还可以用于实时系统中。当其用于作业调度, 将后备队列中若干个优先权最高的作业装入内存。当其用于进程调度时,把处理机分配给就绪队列中优先权最高的进程,此时, 又可以进一步把该算法分成以下两种:
1)非抢占式优先权算法
2)抢占式优先权调度算法(高性能计算机操作系统)
2. 优先权类型 。对于最高优先权优先调度算法,其核心在于:它是使用静态优先权还是动态优先权, 以及如何确定进程的优先权。
3. 高响应比优先调度算法
为了弥补短作业优先算法的不足,我们引入动态优先权,使作业的优先等级随着等待时间的增加而以速率a提高。 该优先权变化规律可描述为:优先权=(等待时间+要求服务时间)/要求服务时间;即 =(响应时间)/要求服务时间

三、基于时间片的轮转调度算法

1. 时间片轮转法。时间片轮转法一般用于进程调度,每次调度,把CPU分配队首进程,并令其执行一个时间片。 当执行的时间片用完时,由一个记时器发出一个时钟中断请求,该进程被停止,并被送往就绪队列末尾;依次循环。 2. 多级反馈队列调度算法 多级反馈队列调度算法多级反馈队列调度算法,不必事先知道各种进程所需要执行的时间,它是目前被公认的一种较好的进程调度算法。 其实施过程如下:
1) 设置多个就绪队列,并为各个队列赋予不同的优先级。在优先权越高的队列中, 为每个进程所规定的执行时间片就越小。
2) 当一个新进程进入内存后,首先放入第一队列的末尾,按FCFS原则排队等候调度。 如果他能在一个时间片中完成,便可撤离;如果未完成,就转入第二队列的末尾,在同样等待调度…… 如此下去,当一个长作业(进程)从第一队列依次将到第n队列(最后队列)后,便按第n队列时间片轮转运行。
3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1到第(i-1)队列空时, 才会调度第i队列中的进程运行,并执行相应的时间片轮转。
4) 如果处理机正在处理第i队列中某进程,又有新进程进入优先权较高的队列, 则此新队列抢占正在运行的处理机,并把正在运行的进程放在第i队列的队尾。

Linux进程调度方法:

1. SCHED_OTHER 分时调度策略

2. SCHED_FIFO 实时调度策略,先来先服务

3. SCHED_RR 实时调度策略,时间片轮转

**************************************

16. 流水线的概念,说一下三级流水线

**************************************

对于一条具体的指令执行过程,通常可以分为五个部分:取指令,指令译码,取操作数,运算(ALU),写结果。其中前三步一般由指令控制器完成,后两步则由运算器完成。按照传统的方式,所有指令顺序执行,那么先是指令控制器工作,完成第一条指令的前三步,然后运算器工作,完成后两步,在指令控制器工作,完成第二条指令的前三步,在是运算器,完成第二条指令的后两部……很明显,当指令控制器工作时运算器基本上在休息,而当运算器在工作时指令控制器却在休息,造成了相当大的资源浪费。解决方法很容易想到,当指令控制器完成了第一条指令的前三步后,直接开始第二条指令的操作,运算单元也是。这样就形成了流水线系统,这是一条2级流水线。

ARM7处理器核使用了典型三级流水线的冯·诺伊曼结构,ARM9系列则采用了基于五级流水线的哈佛结构

(三级流水线)ARM7系列处理器中每条指令分取指、译码、执行三个阶段,分别在不同的功能部件上依次独立完成。取指部件完成从存储器装载一条指令,通过译码部件产生下一周期数据路径需要的控制信号,完成寄存器的解码,再送到执行单元完成寄存器的读取、ALU运算及运算结果的写回,需要访问存储器的指令完成存储器的访问。

**************************************

17. 数据的存储方式

18. 说一下快速排序的思想,冒泡排序的思想

**************************************

快速排序(Quicksort)是对冒泡排序的一种改进

基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

冒泡排序:泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数

**************************************

19. 说一下你对虚拟内存的认识,什么是虚拟地址

**************************************

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

CPU通过地址来访问内存中的单元,地址有虚拟地址和物理地址之分,如果CPU没有MMU(Memory Management Unit,内存管理单元),或者有MMU但没有启用,CPU核在取指令或访问内存时发出的地址将直接传到CPU芯片的外部地址引脚上,直接被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址

如果CPU启用了MMU,CPU核发出的地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址

**************************************

20. 链接错误是什么原因导致的

21. 在头文件中定义一个变量可以吗,编译通过吗

22. 解释C语言关键字extern

**************************************

1. extern告诉编译器这个变量或者函数已经在其他文件里定义了;

2. 当C和C++混合编程时如果C++调用的是C源文件定义的函数或者变量,那么要加extern来告诉编译器用C方式命名函数。

**************************************

23. 说一下你的缺点

24. 说一下你的优点

25. Q&A

在半个小时内就面试了这些问题,面试之后的感觉是自己的基础不是很好,得再回去看看书,看一看细节,面试官估计对我的感觉是:这位同学简历做的不错,知道的东西挺广,在本科生中算不错的,但是在某些细节不行,大体上是基础不太好,英文简直太差。

        经过这次面试,有几点需要认识到:

1. 英语自我介绍一定要准备,必须说的滚瓜乱熟

2. C语言的基础问题要好,虽然没用过数据库,但理论还是要懂点

3. 基本的算法一定要记牢,到时说错了很尴尬的

4. 说话一定要有一个思路,可以面试前理一下思路,照着简历来想

5. 自己做的项目要写一个详细的介绍,让听你说的人知道你在做什么

      以上就是我第一次面试的总结,希望以后的面试一次比一次更好,每次都有进步!

答案寻找处:

kiss0kill:http://blog.csdn.net/kiss0kill/article/details/2603098

wukaiyu:http://blog.csdn.net/wukaiyu/article/details/1766804

franksunny: http://www.cppblog.com/franksunny/archive/2008/05/19/50424.aspx

hackbuteer1: http://blog.csdn.net/hackbuteer1/article/details/7475622

ForA:

http://www.cnblogs.com/fora/archive/2011/04/05/2006049.html

http://3633188.blog.51cto.com/3623188/683609

http://storage.chinabyte.com/356/8909356.shtml

注明:只是为了查看方便,才复制某些内容,为后面的面试复习准备

原文地址:https://www.cnblogs.com/lixiaoming90/p/2698813.html