面经进行时(一)

来源:互联网 发布:c语言文件加密 编辑:程序博客网 时间:2024/06/05 06:28

转载请说明出处~~~^_^

     由于老东家然关门大吉,so,工作了快3年的我再一次步入了找工作大军中。废话不多,直接上面经

某展览公司(外资,欧美):

   先诚心地说一下,这家公司的作品真的是赞翻了~

   1)首先,上机写代码,一共三题。一道opengl的画图题,一道opencv的找轮廓题,一道排序算法题(题目中只需要你排出序即可,不强求用什么样的排序算法,我直接用了快速排序)。题目都不难,主要都是考你对opengl,opencv,以及数据结构的熟悉程度。

   2)然后面试工作经验。问了有项目经验,是否有接触过敏捷开发,是否有着比较好的工作主动性,是否能比较好地理解C++和C的区别。

500强日企):

   1)首先,2小时的笔试,一份50道技术选择题的卷子和一份36道英语选择题的卷子。英语是找出句中有错地方和小短文阅读理解。技术包含有javac/c++,数据库,网络以及一道逻辑题。其中,java,网络,c/c++的比重比较大问的都很基础,纯看基本功,以及,实际工作中是否有接触了

   22小时结束后,收卷子,进行面试。来了两个一看就是大牛式的人物。首先自我介绍。接着:

   c/c++大牛:

    a)先给了张写了几行代码的纸,让我根据代码给出输出结果这里有一个结果我说的不对,大牛让我给出理由(其实是变相的提醒啦),经过更正,给出正确答案

   b)然后,又给了一张写了几行代码的纸,乃如下

int a[] = {1, 2, 3, 4, 5};int* b = a;printf("%d, %d\n", sizeof(a), sizeof(b)); 

问输出结果。主要是想考察sizeof(b)返回的是指针本身所占内存大小(32位机4)的知识点,并且还细问到,b,*b,&b的概念区别

    c)大牛问:“如果在一个头文件a.h中定义一个数组 int a[] = {12, 23, 34 ,56 ,78},然后,b.cpp,c.cpp均用到该数组,那么,编译是否能通过。"我回答能,因为之前有这么干过,只是当a数组过大时,编译速度慢地人神共愤,但大牛却不满意,让我说一下c代码编译的过程。。。回来以后,上网查了一下才幡然醒悟,大牛的意思原来是想让我说出“编译时出现重复定义的问题”,而我在写头文件时都会加入预编译控制

#ifndef ***#define ***……#endif
所以,才木有觉得有什么编译问题。。。快哭了好吧,理解大牛的问话意图也是一种能力。顺便回顾一下我没有答出来的代码编译过程:

C源程序-->预编译处理(.c)-->编译、优化程序(.s、.asm)-->汇编程序(.obj、.o、.a、.ko)-->链接程序(.exe、.elf、.axf等)。

android大牛:

    由于几乎木有java的经验,所以,android大牛就问了我为什么当初我们要用c/c++来写opengl es,而不是直接在java层写,是出于一个怎样的考量?

心得:由于之前的笔试自我感觉不是很好,所以,在面试的时候,超级木有气场的,外加真心没见过两牛人来共同面我的大场面,很紧张有木有,发挥完全失常有木有。。。罢了罢了,胖子说:“失之我命,得之我幸,平常心平常心,当是刷经验了。”共勉之~

某外资上市公司:

    是电话面试,主要的问的是项目经验,由于我做的是基于NDK的安卓开发,所以,他问了关于一些我没答上来的原理方面的东西:

    android原理:

    Android系统架构乃采用了分层架构思想,共四层:应用程序层,应用程序框架层,系统库和安卓运行时层、以及linux内核层。

         Applications:

    是android系统直接面向用户的部分,该层本身也包含了一些应用程序如SMS短信、电话拨号、图片浏览器,Web浏览器、电子邮件、日历、地图、联系人管理等。这些应用都是用java写的,开发人员也可以用java来编写其他的应用来替换这些应用,或者与之共存

    Application Framework:

    该层是android应用开发的基础,很多核心应用程序也是通过该层来实现其核心功能的,开发人员也完全可以访问核心应用程序所使用的API框架,同时,也可以发布自身的功能模块供其他程序使用由于有着这样的重用机制,开发人员可以直接使用组件来开发,或者通过继承来进行个性化拓展,亦或者可替换组件。

     Libraries & Android Runtime:

   LibrariesApplication Framework的支撑,是连接Application Framework层与Linux Kernel层的重要纽带。

    Android应用程序是用java编写的,在Android Runtime中执行,Android Runtime包含了核心库(如android.os, android.net, android.media等)和Dalvik虚拟机。

   有关Dalvik虚拟机Tip:不同于J2me程序,每个android程序都有一个专有进程,并且,不是多个程序都运行于一个虚拟机中,而是每个程序都有一个Dalvik虚拟机的实例,并在该示例中执行。Dalvik虚拟机是一种基于寄存器的java虚拟机,并进行了内存资源使用的优化以及支持多个虚拟机的特点。需要注意的是,不同于J2me,android程序在虚拟机中执行的并非编译后的字节码,而是通过转换工具dx将java字节码转成dex格式的中间码。Dalvik虚拟机主要是完成对生命周期的管理、堆栈的管理、安全和异常的管理以及垃圾回收等重要功能。

    Linux Kernel:

      Android是基于Linux2.6内核,其核心系统服务如安全性、内存管理、进程管理、网络协议和驱动模型均依赖于Linux内核。LinuxKernel也是作为硬件与软件栈的抽象层。其包含了各种如图所示的驱动等。

     adb的原理

    adb,即Android Debug Bridge,是android系统中的一种命令工具,也可以认为是一个客户端-服务器端程序(其中,客户端是你用来操作的电脑,服务器端是android设备),通过它可以和android设备或模拟器通信,主要功能有:运行设备的shell(命令行)、管理模拟器或设备的端口映射、计算机和设备之间上传/下载文件,将本地的apk安装至模拟器或android设备。

    如上图所示,adb由三部分组成:

     1)adb server:

   运行于pc上的一个后台进程(任务管理器上有),实际上是一个庞大的多路传输循环,管理协调着adb client和adb deamon的数据交换(实际上是包交换)检测USB端口感知设备的连接和拔出,以及模拟器实例的启动或停止;维护一个已连接设备的列表,并为每一个连接设备分配一个状态值(OFFLINE、BOOTLOADER、RECOVERY、ONLINE)。

     2)adb deamon(adbd):

    adbd作为一个后台进程,在android设备或者模拟器系统中运行。它的作用是连接adb server(通过USB连接设备,通过TCP连接模拟器),并且为运行pc上的client提供一些服务。adb server成功地与一个设备上的adbd建立连接时,adb sercer认为此设备状态为“ONLINE”,否则,为“OFFLINE”(“OFFLINE”表示adb server侦测到一个新的设备或模拟器,但无法与该设备或模拟器上的adbd建立连接)。“BOOTLOADER”“RECOVERY”分别表示状态处于bootloader或recovery模式下。

     3)adb client:

    运行于pc上,命令行程序“adb”用于从shell或脚本中运行adb命令。首先,“adb”程序尝试定位pc上的adb server,若找不到,“adb”程序自动启动一个adb server然后,客户端向adb server发送服务请求。通常,一个单一的“adb”二进制程序文件包含了服务器和客户端的实现。这样,服务器的分发和启动都更加容易。

    一般,与客户端交互的服务有两种:主机服务【主机服务运行于adb server中,因此,他们根本不设备通讯。一个典型的例子乃“adb server”,它请求返回当前已知的设备及其状态列表。】和本地服务【本地服务运行于adbd中,或者被设备上的adbd启动。adb server被用于客户端与本地服务之间的多路传输数据流。在此情况下,本地服务的任务是初始化连接,然后为adb服务提供响应数据。

 ----------------------------------------------------------华丽丽的分割线---------------------------------------------------------------------------

有关adb的协议细节:

1. client<->server 交互协议(adb server监听在TCP:localhost:5037): 
         
client端用下列格式发送请求: 
                 A. 开头4个字节的十六进制字符串给出请求的长度; 
                 B. 后面紧跟请求内容。 
   
举例来说,为了获得ADB服务器的内部版本号,客户端将做下列工作: 
       A. 建立tcp:localhost:5037的socket连接; 
       B. 通过socket发送字符串“000Chost:version”。 
      前缀“host:”用来指示请求被定位到ADB服务器本身(稍后我们将讨论其他类型的请求)。为了便于调试排错,请求内容的长度按 ASCII编码计算。 
   
server端用下列格式回应客户端请求: 
    A. 成功:回应4个字节的“OKAY”字符串; 
    B. 失败:回应4个字节的“FAIL”字符串 + 4个字节的十六进制长度说明 + 指定长度的字符串说明失败原因; 
    C. “host:version”是一个例外,它的回应是4个字节的十六进制字符串,说明服务器的内部版本号。 
   
    注意:回应“OKAY”之后,连接仍然是活动的,这样,客户端可以通过这个连接发送其他的请求。但是在特定的情况下,“OKAY”回应会改变连接的状态。 
    举例来说,客户端发出“host:transport:<serialnumber>”请求,“<serialnumber>”被用来标识一个指定的设备或模拟器;在服务器回应“OKAY”之后,客户端再发起的请求会直接送达至对应的adbd守护进程。 
     
2. 传输协议   
    ADB传输协议对个设
ADB服务器与一备或模拟器之间的连接进行建模。当前有两种类型的传输协议:USB传输协议用于通过USB与物理设备的连接】和本地传输协议用于通过TCP连接到ADB服务器,运行在主机上的模拟器】。   

      虽然现在还没有实现,但是理论上存在这样的可能:写一个本地传输协议,让它代理ADB服务器与连接到另一台机器的设备之间的连接,以及 ADB服务器与运行在另一台机器上的模拟器之间的连接。 

   
      每次传输能够在客户端和它们所指向的设备或模拟器之间完成一个或多个多路复用数据流。ADB服务器必须正确处理意料之外的传输中断。(比如:设备被物理拔除)


 ----------------------------------------------------------华丽丽的分割线---------------------------------------------------------------------------

    jni的原理作用

   java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。可以把jni想象为本地代码和java代码的粘合剂:

         


    opengl在安卓中的位置:

    原本完全不清楚她的问题的点是什么,后来,了解了一下android的框架原理后,才知道,她可能是想问我,opengl在安卓框架的哪一层,则,如上面的框架图所示,在Libraries那一层。

心得:原理知识很欠缺有木有。。。


【未完待续。。。】

Reference:

http://www.cnblogs.com/royenhome/archive/2010/04/24/1719293.html

http://blog.csdn.net/wangloveall/article/details/8033725

http://www.cnblogs.com/carmanloneliness/archive/2013/04/16/3023299.html

http://my.oschina.net/tingzi/blog/78628