写下这篇文字,是为了记录自己面试后得到的一些教训,记录一些当时没有回答好的或者不懂的问题
昨天下午去了IBM面试,面的是 Z/VM 组
这个组是在内核的基础上用汇编开发虚拟操作系统的,所以主要感兴趣点在于操作系统、底层、编译原理等知识上面,对于算法、数据结构倒是关注的比较少
我平时最有准备的知识方面在于算法和数据结构,操作系统方面的就看了书上的一些基本知识,还有之前看过的一点linux内核方面的一点知识,开始硬着头皮进行一个多小时
的技术面试
由于我的项目是在.net平台下进行开发的,面试官刚开始就问了我对于.net平台的理解,微软为什么要做.net平台?
(刚开始并没有对这个问题进行较好的回答,现在回想起来,上网找了一些资料,进行稍微正统一点的回答)
.NET是微软的新一代技术平台,为现在的各种商务活动构建互联互通的应用系统,这些系统是有统一标准的和联通的,
一个.NET应用是一个使用.NET Framework类库来编写,并运行于公共语言运行时Common Language Runtime之上的应用程序
特别注意:如果一个应用程序跟.NET Framework无关,它就不能叫做.NET程序,比如,仅仅使用了XML并不就是.NET应用,仅仅使用SOAP SDK调用一个Web Service也不是.NET应用。
.NET是基于Windows操作系统运行的操作平台,应用于互联网的分布式。
这个问题之后,面试官开始问操作系统方面的知识,对于操作系统这门课,你学到了什么,对于进程你有怎样的理解,说了一些关于进程的知识,开始深入到了CPU如何运行的,CPU的组成,这个当时我只简单的回答了调度,现在查找一些资料,整理一下答案
CPU一般由逻辑运算单元、控制单元和存储单元组成。在逻辑运算和控制单元中包括一些寄存器,这些寄存器用于CPU在处理数据过程中数据的暂时保存。
对于 内存分配的一些问题,malloc函数怎样实现分配?如果malloc要求分配的内存为1g,那是分配物理内存还是分配虚拟内存,如果内存不够怎么办?
Malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。所以malloc返回分配的内存地址后,要强制进行类型转换
slab系统和buddy系统的关系,内存分配是先经过slab再经过buddy吗?
关于 这个问题 ,linux分配内存是返回内核空间的虚拟地址,用到的函数有kmalloc等函数
在函数实现中,如果申请的内存空间较大的话,会从buddy系统申请若干内存页面,如果申请的内存空间大小较小的话,会从slab系统中申请内存空间。
所以根据这句话来看,内存分配是先经过一个大小的判断,再来决定由slab还是buddy系统进行空间的分配
之后是英文的自我介绍(由于很久没有说英文了,实在是说的太水了,需要针对性的对英语口语进行提高了)和项目介绍,面试官让我说出对整个项目的理解,并且提出项目某方面的想法,看我们的项目有没有进行这方面的考虑,我都进行了一一的回答
由于对于算法是最在行的,很大一部分时间其实在讨论算法,对于算法导论整本书的理解,还说了一些时间复杂度的概念和对KMP算法的理解,这些知识还是比较在行的,所以一一进行了回答,没有太大的波澜
整体来说,由于之前对于底层的一些知识准备不够充分,现在要做的不仅是温故算法和数据结构,还要把以前的知识:操作系统,数据库,计算机组成原理,计算机网络,编译原理这些课好好的温习,加强
PS。惴惴不安等结果啊,求好运,求人品,低调求实习