2017CVTE笔试题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017CVTE笔试题相关的知识,希望对你有一定的参考价值。
下面是凭记忆整理的2017CVTE校招笔试题,基本上全都是我不会或很模糊的题,为了更好突出重点我以问答题的形式来描述题目。
1. 中序遍历是属于层次遍历、广度优先遍历、深度优先遍历中的哪一种?
答:层次遍历是指一层一层的遍历树中的节点,广度优先遍历是指遍历完它所有的兄弟节点后再开始遍历其孩子节点,因此层次遍历也属于广度优先遍历。深度优先遍历就是顺着节点的孩子节点一直往下搜索,直到没有孩子节点时才开始搜索叶子节点,常见的前序遍历、中序遍历、后序遍历就是属于深度优先遍历。
2. 产生死锁的4个条件,解决死锁的方法?
答:产生死锁的的4个必要条件,发生死锁时这4个条件必然成立,只要有一个不成立将不会产生死锁。
(1)互斥条件,一个资源一次只能被一个进程使用。
(2)请求与保持条件,一个进程在申请新的资源的同时保持对原资源的占有,部分分配,占有申请。
(3)不剥夺资源,也就是不可强占资源,资源只能由占有者自动释放。
(4)循环等待,进程之间相互等待。
对于死锁一般可从以下3个角度来处理:死锁检测与恢复、死锁预防、死锁避免。
3. UDP伪首部的作用、长度、有无端口号、传递方向?
答:UDP伪首部的核心作用是检查数据报是否正确的到达目的地,依据是IP和校验和,也就是说会检查2次验证。
UDP伪首部一共12个字节,8字节源、目的IP,一字节保留一字节协议,2字节的UDP长度。UDP首部为8字节,4字节源、目的端口号,2字节长度(总长度),2字节校验和。
从首部介绍可知道端口号并不存在于伪首部中,只存在于UDP首部中,TCP中也是12字节的伪首部。
题目是说UDP伪首部的传递方向是向下的,伪首部并不作为树据的一部分,所以这个选项我觉得是错误的。
4. 用于Linux内核配置的命令以下哪些是正确的:make config、make oldconfig、make menuconfig、make xconfig?
答:以上4种都是。config是最为传统的一种配置方式,不推荐使用。oldconfig是在旧的.config的基础上生成新的.config文件,如果需要在原有文件上做一些小修改使用它很方便。menuconfig则是基于字符终端配置模式,xconfig则是基于图形窗体配置模式,适用于Xwindow。
5. 在编译内核时可对驱动模块进行剪裁吗?驱动程序只能运行在内核态吗?
答:关于Linux我没有深入学习过,请教了身边一位学Linux的同学,他也不懂很本质的内容,但是知道在编译内核时是可以对驱动模块进行裁剪的。用户程序运行在用户态,系统代码运行在内核态,但有时候用户程序需要一些特权指令,比如访问硬件,此时就需要驱动程序了,我百度的结果是驱动程序运行在内核态。
6. Linux中bootloader是什么?
答:bootloader是一个引导加载程序,当系统通电后运行的第一段程序就是它。接下来它会完成系统的初始化任务并在完成后装载内核到ram中,最后跳转到内核的第一条指令继续执行,这样就启动了Linux内核。
7. 预处理阶段会对宏定义值进行计算吗?#define SQUARS(x) ((x)*(x))宏展开时都是求x的平方?
答:预处理阶段仅仅只是简单的字符替换,不会进行计算。第二个问题是错的,因为存在x++和++x的情况,此时就不再是x的平方了。下面是非常经典的gcc的编译过程图。
8. 什么是大端模式和小端模式?原题大概是:一个数0x1234567,存放在0x2001~0x2004,32位主机且在大端模式下0x2002存放的数是多少?
答:大端模式是指将数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中。
小端模式是指将数据的低字节,保存在内存的低地址中,而数据的高字节,保存在内存的高地址中。
大端模式下0x2002存放的数为0x23。
9. 有一个数组a[4][3],下面哪些可表示a[1][1]:*(a[1]+1), *(&a[0][0]+4), *(&a[1]+1), *(*(a+1)+1)?
答:我做这个题最大的盲点就是对于本身还是数组元素的指针,比如a[1], 它加1是指得到a[1][1]呢,还是得到a[2]。这里我还是请教的那个搞Linux c的同学,他的意思是如果此时指针本身还是指向了一个数组,那么当进行加1操作时系统会进行一个判断,此时加1将是加一行数据,也就是a[1]+1将得到a[2]。如果此时指针直接指向了普通的数组元素,那么a[1][1]+1将得到a[1][2]。到这里你应该知道答案了。
10. 下面哪些声明方式中ptr指向的值不能改变:int const *ptr, int* const ptr, const int* ptr?(这个题目本质是关于指针常量和常量指针的理解)
答:指针常量,它是常量,只是指针本身就是常量。这样指针本身不可改变,但是它指向的地址表示的值是可以改变的。指针常量在定义的时候必须赋初值。
常量指针,它是指针,只是指针指向的是常量。这样指针本身是可以改变的,可以将指针重新指向新的值,但是指针指向的地址所代表的值不能改变。
const在*前就是常量指针,const在*后就是指针常量,还有一个小技巧,const后是什么那什么就不能改变,如const* a中*a不能改变,*const a中a不能改变。
使用指针常量有2个优点:可靠性,指针不可修改且不能赋为NULL;不再需要判断指针是否为空的情况,因为指针将在定义时初始化且不可修改。
void main() { int a=6; const int m=5; int* n; //定义指针常量,指针常量在定义时必须赋初值,因为在其它地方将无法修改b,所以只能在定义时就初始化 int* const b=&a; //定义常量指针 int const* c; *b=8; //此时可对指针指向的值作修改 printf("%d",*b); //输出8 //b=NULL; //不能修改b,即使是将b指向NULL c=&a; //*c=3; //会报错,不能使用指针修改它所指向的地址里的值 //n=&m; //还有一点要注意,这里n=&m将会报错,因为n消除了m的const属性。也就是说不能将常量的地址暴露出去。 //当程序跑起来之后这种常量会被分配到一个只读的内存页当中,若检测到有数据回写到这个内存会引发操作系统异常处理的 }
11. MMU(内存管理单元)的作用?
答:对这方面我没深入过,下面是百度的很抽象的作用。MMU主要作用是将虚拟地址映射为物理地址,并设置内存访问权限。没有启动MMU时cpu、catch和外设等所有部件使用的都是物理地址,当启用MMU后此时cpu将发出虚拟地址,然后根据虚拟地址与物理地址的映射关系来将虚拟地址转换为物理地址。
12. Linux中grep、sed指令是什么意思?
答:题目中是考了一个Linux下的正则表达式,大概是grep "^[0-9].*CVTE" test.txt | sed s/CVTE/cvte,表达式的意思是找出以0~9开头并以CVTE结尾的字符串,最后将大写的CVTE替换为cvte。关于grep和sed指令有一篇文章写得很好blog.csdn.net/y990041769/article/details/47167109
上面是我自己百度总结的,如有错误请指出。
以上是关于2017CVTE笔试题的主要内容,如果未能解决你的问题,请参考以下文章