今天早上9点接到了阿里巴巴的电话面试,本来以为完全没有希望的事情,突然来了个小惊喜,所以一不小心就激动了,人家问我是不是方便接电话的时候,我毅然决然的回答了方便,结果由于毫无准备,回答的一塌糊涂。虽然觉得自己是菜鸟,但是也不应该回答得这么差劲,终于了解到自己的知识有多么的不扎实了,以前学东西都是浮在表面的,以后一定要认认真真、踏踏实实的去学习任何一门知识。
这是我有生以来的第一次电话面试,也是有生以来的第一次的比较正式的工作面试(虽然前段时间参加过腾讯的面试,但是由于某些原因有面得很水),这次面试对我来说应该是有着非凡的意义吧!
首先,我很感谢今天的这位考官,他说话非常的温和,一直在鼓励我,在我不会的时候也是循循善诱。以至虽然我整体下来答得很不好,但是对这次面试却留下了非常好的印象,也对阿里巴巴留下了很好的印象。弄得我现在特别想去阿里巴巴工作,我想这里一定有非常好的企业文化吧!
说了这么多的废话了,接下来,说说今天的面试都面了些什么吧。(有很多都记不清了)
1、 刚开始他问我熟悉什么语言,熟不熟悉C++?
我回答的是:不熟悉;他说那也应该了解些吧,然后接着就问我new和malloc的区别?
(下面是从网上找的解释) a) malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 b) 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 c) 因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。 d) C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存
简而言之: new是一个操作符,可以重载 ,malloc是一个函数,可以覆盖; new初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数,malloc仅仅分配内存,free仅仅回收内存; 进一步详解见《new/delete 和malloc/free 的区别(综合转帖)》。 |
2、 接着问了我系统中堆和栈的区别(不是数据结构中的)
关键点: 栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 详细介绍见“堆与栈的区别【收藏】”。 |
3、 可执行程序在系统中是怎么执行的?就是.exe文件的执行过程
我们都知道 ExE文件是一个可执行文件,而且这也是Windows下最为常见的可执行文件,比如安装包。 EXE File 可执行程序 一种可在操作系统存储空间中浮动定位的可执行程序。MS-DOS和MS-WINDOWS下,此类文件扩展名为.exe WINDOWS操作系统中的二进制可执行文件,可执行文件分两种一种是后辍名为.COM另一种就是.EXE 了。.COM一般用于DOS,在WINDOWS系统中的执行文件一般都是.EXE文件 。 Exe文件的执行过程如下: 1) shell调用CreateProcess函数来激活.exe文件。 2) 系统禅城一个“进程核心对象”,并且其计数值为1,该值是系统删除进程核心对象的依据。 3) 系统为此进程建立一个4GB的地址空间 4) 加载器将必要的文件加载到上述的地址空间中,包括.exe的程序、数据、以及所需要的动态链接库 5) 系统创建一个线程,我们称之为主线程。 6) 系统调用startup code 7) startup code 调用.exe 程序的入口函数WinMain 8) exe文件开始执行 9) 用户关闭程序窗口,使winmain 中的消息循环结束,使得winmain函数结束。 10) 回到Startup code 11) 回到系统调用exitProcess 结束进程。 |
4、 线程的同步:临界区、互斥区、事件、信号量四种方式
5、 进程间通信:进程,信号,管道,消息队列,信号量,共享内存
让给出一个进程通信的数据结构:进程控制块(当时居然没有想起来,脑袋秀逗了吧!!!)
6、 函数的调用过程:
- 每一个进程在用户态对应一个调用栈结构(call stack)
- 程序中每一个未完成运行的函数对应一个栈帧(stack frame),栈帧中保存函数局部变量、传递给被调函数的参数等信息
- 栈底对应高地址,栈顶对应低地址,栈由内存高地址向低地址生长
- 更详细的解释还有待查找整理
7、 系统函数的调用:系统函数主要是在核心态,用中断即可,传递的是函数的系统调用编号,内核为每个系统调用分配了一个唯一编号。
8、 平衡二叉树用在哪些方面:(想不起来他当时说的是什么了)二分查找么?红黑树?
9、 有向图和无向图的区别:有方向,无方向;有向图用于哪些方面:优先级队列,偏序集
10、OSI七层模型(物理层,数据链路层,网络层,传输层,会话层,表示层,应用层);socket在哪层?(应用层)
后面还问了下我对Android,手机编程等什么的了解不,还有java,我都说不了解,然后就是问了下我干了些什么,是在学校是偏重于理论研究还是工程项目,以及项目规模和参与人数等等。
还有什么我就真的记不住了,最后还是非常感谢这位面试官认真细致的态度,我看出了他是想尽量的多了解我,希望能找到可以让我通过的点,但是,我让他失望了,没有一个回答得比较好的,真的是万分抱歉~~~但是我会再接再厉的,接下来的日子里一定努力学习专业知识,提高专业素养!
加油!Never give up!
PS:我笔试的时候报的职位是“系统工程师”
Dpfl
2013年6月4日星期二 21:12