1.请介绍一下自己
2.你做过哪些项目?为啥要做这个项目?能详细介绍一下吗?
问你做这个多长时间
你为啥要做这个
还有问了一个问题,就是注释转换中,如果有
#if 0
//liusenlin1
/*liusenlin2*/
#endif
像这种你的开发工具能进行转换吗,本来是注释,你也要转换吗?
我就说:注释中的嵌套,像这种都是可以转化成统一的C或C++注释,
他说:这最好不要转化,保持原样,我说并不影响代码编译,
我一想,我是应聘的,不应该提出质疑,就说,我会在状态机下,增加一个状态,进行再优化下 ,谢老师指点
总共问了两个项目。
第二个项目问了网络知识,也相对基础知识
3.你这个项目核心是什么?用到什么算法
4.因为在介绍项目的时候,我提到了多线程,就直接问了进程与线程 的区别?
因为当时睡午觉,大概3点多,就打电话了,真的有点蒙,所以当时就回答了3 点,现总结如下:
1.进程是系统进行资源(io、内存空间、磁盘等)分配基本单位. 线程是进程的一个实体,
是CPU调度和分派的基本单位
2. 进程有独立的虚拟地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉
,所以多进程的程序要比多线程的程序健壮
3. 但在进程切换时,耗费资源较大,效率要差一些,线程执行开销小,但不利于资源的管理和保护
补充:
4. 一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程
5. 线程的划分尺度小于进程,使得多线程程序的并发性高,系统的吞吐量 更大。
6.逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配
5.因为当时回答提到虚拟内存空间和调度算法,他就问虚拟内存是什么?swap算法是什么?堆内存是如何分配的?
虚拟内存其实是现代操作系统而言的,解决了以前直接直接使用物理内存不足的问题,当一个进程创建完成后,他就会在内存中分配一段虚拟内存空间,从高地址到低地址依次是:栈,堆、静态区、文本常量区、代码区
栈:局部变量
堆:动态内存分配,C语言用malloc() C++ 中用new
静态区里有:全局的变量 ,包括初始化和未初始化的,还有static的全局,局部变量
.data段 (初始化数据段,在磁盘上) .bss段(未初始化数据段,由exec函数加载程序是清零,它未在磁
盘上)
文本常量区:只读状态,不许更改 ,如字符串常量 ,const 定义的常量
代码段:就是预处理、编译、汇编、链接完成后的可执行二进制代码
swap算法:
其实当时没想到。关键他说swap没听懂,后来在知道是,页面替换算法,就是物理内存和虚拟内存是映射关
系,当虚拟内存使用不够,或一个程序不属于常驻内存,就应暂时将他置换出去,
1. 最佳置换算法OPT:它将不再使用的页面换出
2.FIFO置换算法:按照页面装进内存的时间进行置换,越老的页面最先被换出,不管该页面是否经常使用,这样就有可能导致缺页率增加,导致
页面置换次数增加。
3.最少使用页面置换算法:按照上次使用时间进行排序,将离上次使用时间最长的页面换出,可以采用栈的数据结构,每次页面被访问将该页面
号放在栈顶
4.最近未使用页面置换算法:设置引用位R,每次调用将R=1,系统每个一段时间将R=0,当进行置换式检查哪个页面为零说明近期不会再使
用,可以将其换出。
5.时钟页面置换算法:采用应用为R,当R=1说明被引用过,这种方法是FIFO的改进,根据装入内存时间和是否被引用过作为标准,首先从时间
最长项检查,若R=0则置换出,若为1则检查下一项并将R=0。若全部R=1,则按照FIFO方法进行置换
堆内存的分配:堆是向高地址增长的,由程序员进行申请释放,C 中是malloc()函数申请free()释放,C++是new申请,delete释放。
6.由于上次回答问题提到.bss .data 段 ,所以他问全局变量定义初始化和不初始化有什么不同,为什么将他们分开设计,而不直接都在.data段中?
解答:
1.未初始化的全局变量在.bss段,初始化的全局变量在.data段。由于.bss段是在程序加载到内存,编译器进行清0,所以在编译、汇编阶段是不存在数据的,即就是不在
磁盘上,不占空间,这样可执行的二进制代码体积就小好多, .data是占磁盘空间的。
2.可执行代码的体积小,加载内存所需时间更短。
当我说完,他问还有吗?
我当时是在想不到了,整的尴尬,电话一直等我,知道现在我还找不到其他原因
下面这几个问题我回答最菜
7.你最擅长的领域是啥?你认为自己的优势在哪?
8.你平时学习转态是咋样的?
9.你申请的是阿里妈妈,为什么要选它?你的期望是啥?
10.你还有什么问题没有?