百度2019校招计算与存储系统研发工程师笔试题(第一批)

1一个典型双路Intel Xeon CPU服务器系统,每个CPU有24个核心,6个DDR4-2666内存通道,每个通道接2条DDR4-2400 RDIMM内存条,请问系统内存带宽是多少?

正确答案: A
A、230.4GB/s
B、511.872GB/s
C、255.936GB/s
D、460.8GB/s

2下列关于构造函数的描述中,错误的是()

正确答案: D
A、构造函数可以设置默认的参数
B、构造函数在定义类对象时自动执行
C、构造函数可以是内联函数
D、构造函数不可以重载

[解析]

构造函数是类的一个特殊成员函数,它与类同名,并且没有返回值。C++在创建一个对象时,会自动调用类的构造函数,在构造函数中可以执行初始化成员变量的操作。构造函数可以是内联函数,也可以重载。

3.在常用的C编译环境中,已知struct {int a; double b; char c;} A; sizeof(A)的返回值是

正确答案: D
A、4
B、16
C、13
D、24

[解析]

结构体变量所占内存长度是各成员所占内存长度之和,以最长元素作为边界对齐要求。
联合体变量所占内存长度是最长成员的长度。

char :1个字节 
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器) 
short int : 2个字节 
int: 4个字节 
unsigned int : 4个字节 
float: 4个字节 
double: 8个字节 
long: 4个字节 
long long: 8个字节 
unsigned long: 4个字节

所以这一题答案结构体中最长元素double——8.8*3=24.

4若有宏定义:#define MOD(x,y) x%y

则执行以下语句后的输出结果是 int a=13,b=94; printf(″%d\n″,MOD(b,a+4));

正确答案: B
A、5
B、7
C、9
D、11

[解析]

首先计算b%a=94%13=3
在计算4+3=7;

5以下处理器哪些是基于RISC指令集的?

正确答案: A B C E F G
A、Alpha
B、IBM POWER
C、IBM OpenPOWER

D、Intel Xeon
E、Oracle Sparc
F、RISC-V
G、龙芯3A

H、申威26010

[解析]

精简指令集计算机(RISC:Reduced Instruction Set Computing RISC)是一种执行较少类型计算机指令的微处理器,起源于80年代的MIPS主机(即RISC机)

6下列哪些因素不会限制Linux服务器的并发连接数

正确答案: B C
A、系统内存大小
B、系统网卡数量
C、硬盘大小

D、系统最大文件句柄数量

[解析]

影响linux服务器的并发连接数的因素:
第一个,就是ip地址数,系统ip数越多,建立连接数越多。

第二个,内存。从配置文件角度说吧 用vim打开配置文件:#vim /etc/sysctl.conf net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力。 net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段。 net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket。 上述内存单位是页,而不是字节。内存大小影响网络

第三个。其他,句柄最大数影响network 在vfs操作的上限

7运行时的C程序,下列哪些变量在内存中的stack区域的有()

int a = 0;
char *p1;
int main(void)
{
int b;
char s[] = “abc”;
char *p2;
char *p3 = “123456”;
static int c =0;
p1 = (char *)malloc(10);
free(p1);
return 0;
}

A、a
B、b
C、c
D、s
E、p1

[解析]

C语言中的全局变量和局部变量在内存中是有区别的。C语言中的全局变量包括外部变量和静态变量,均是保存在全局存储区中,占用永久性的存储单元;局部变量,即自动变量,保存在栈中,只有在所在函数被调用时才由系统动态在栈中分配临时性的存储单元。

8下列说法正确的有

正确答案: C D
A、ext4文件系统是带有日志功能的文件系统,关闭日志可以使掉电重启消耗的时间缩短
B、内存的堆栈中,栈是有系统自动分配的,先入后出;堆是由程序分配的,先入先出。
C、创建symbol link会产生新的inode,hard link 不会。
D、在C语言中,i++操作不是原子操作。

E、以上全都不正确

[解析]

A、EXT4是第四代扩展文件系统(英语:Fourth extended filesystem,缩写为 ext4)是Linux系统下的日志文件系统,是ext3文件系统的后继版本。

B、在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。

堆,优先队列(priority queue);普通的队列是一种先进先出的数据结构(FIFO—First-In/First-Out),元素在队列尾追加,而从队列头删除,(例如:乘车排队,先来的排在前面先上车,后来的就要排的后面后上车; 哎,哎,你怎么插队呢,学没学过队列);在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先取出。优先队列具有最高级先出 (largest-in,first-out)的行为特征。

栈,先进后出(FILO—First-In/Last-Out)(例如:超市排队结账,大一点的超市收银台都是一段狭长的过道,本来下一个是你了,突然这个收银台说不结了,OK,栈形成了,排在前面的要后出去了)。

stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数

C、硬链接实际上是一个指针,指向源文件的inode,系统并不为它重新分配inode。

D、原子操作是指 一句汇编指令。但是 i++是指 i 先被使用虽然咱们这里并没有使用,但实际上会被 临时存储下来。然后i=i+1。i++这个操作并不是原子的,如果这是原子操作的话,具有不可分特性,

mov eax,【xxxxxxxx】
inc eax

已经分割了!

9、DDR3和DDR4的VDD/VTT电压分别是1、2

参考答案
(1) 1.5V/0.75V
(2) 1.2V/0.6V

10字符串str1=”1234567890”,strlen(str1)的返回值是___,内存中占用___个字节。

参考答案
(1) 10
(2) 11

[解析]

strlen函数工作机理:函数从第一个字符开始计算字符串中字符数,直到遇到空字符,然后返回空字符前字符总个数。但不包括结束字符(即 null 字符)

11列举2个常见的分布式一致性算法__、__。

参考答案
(1) raft
(2) paxos

12CPU的Cache包括哪几类?

参考答案
(1) L1指令cache
(2) L1数据cache
(3) L2cache
(4) L3cache

13简述下NVMe SSD硬件系统设计拓扑?

14描述CPU SMT的概念、实现原理、表现形式、与物理core的区别等

解答:

CPU:
中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。
工作过程:
CPU从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码。它把指令分解成一系列的微操作,然后发出各种控制命令,执行微操作系列,从而完成一条指令的执行。指令是计算机规定执行操作的类型和操作数的基本命令。指令是由一个字节或者多个字节组成,其中包括操作码字段、一个或多个有关操作数地址的字段以及一些表征机器状态的状态字以及特征码。有的指令中也直接包含操作数本身。

SMT:
同时多线程Simultaneous multithreading,简称SMT。SMT可通过复制处理器上的结构状态,让同一个处理器上的多个线程同步执行并共享处理器的执行资源,可最大限度地实现宽发射、乱序的超标量处理,提高处理器运算部件的利用率,缓和由于数据相关或Cache未命中带来的访问内存延时。当没有多个线程可用时,SMT处理器几乎和传统的宽发射超标量处理器一样。SMT最具吸引力的是只需小规模改变处理器核心的设计,几乎不用增加额外的成本就可以显著地提升效能。多线程技术则可以为高速的运算核心准备更多的待处理数据,减少运算核心的闲置时间。这对于桌面低端系统来说无疑十分具有吸引力。Intel从3.06GHz Pentium 4开始,所有处理器都将支持SMT技术。 Intel的hyper-threading其实就是 two-threadSMT.

15Copy-on-Write在存储系统中存在哪些应用,解决哪些问题?有什么缺陷?

Copy-on-write 在对数据进行修改的时候,不会直接在原来的数据位置上进行操作,而是重新找个位置修改,这样的好处是一旦系统突然断电,重启之后不需要做Fsck.
COW 在某些情况下可以提升性能,比如说如果对元数据的更新是随机的,因为不在原来的位置就行write, 随机的block 重新分配到了一段连续的元数据空间,这样在事务进行刷新写的时候,一堆顺序的block 可能会被批量写到磁盘上去,这点对性能的提升和Ext4 日志文件系统中日志都是顺序写有点像。

但是COW也会导致文件数据分配到磁盘的各个位置,导致额外的seek 比较严重,比如COW的文件系统非常不适合KVM的image文件,一个文件的extent 可以达到上万个,对性能损失可想而言。

16文件系统、块设备的区别与联系;inode、dentry区别与联系。

17异步操作(网络或IO)是怎样实现的?异步操作跟同步操作相比有什么优势,同步操作有什么优势?二者应用场景?

18请设计一个典型16层主板的PCB Stack-Up示意方案

19请使用字符串来表达任意大小的长整数,使用你熟悉的编程语言编写程序来计算两个长整数之和。例如:sum(“123”,”456”) 返回的结果是”579”。

链接:https://www.nowcoder.com/questionTerminal/84d39c0f920547ae880dbd38cd76b00a?orderByHotValue=1&page=1&onlyReference=false
来源:牛客网

#include  
#include 
#include 
 
using namespace std;  
char num1[111], num2[111], num3[111];  
int L, M;  
int mark;  
 
void add(char a[], char b[], char c[]){  
    int len1 = strlen(a);  
    int len2 = strlen(b);  
    int i, j;  
    int l = 0;  
    L = 0;  
    int temp;  
    for(i = 0; i < len1/2; i++){  
        temp = a[i];  
        a[i] = a[len1-1-i];  
        a[len1-1-i] = temp;  
    }//把输入的两个大数都逆序排列,这个循环很常见,可以专门写一个函数。  
    for(i = 0; i < len2/2; i++){  
        temp = b[i];  
        b[i] = b[len2-1-i];  
        b[len2-1-i] = temp;  
    }  
    for(i = 0; i < len1 && i < len2; i++){  
        M = (a[i] - '0' + b[i] - '0' + L) % 10;  
        L = (a[i] - '0' + b[i] - '0' + L) / 10;  
        c[i] = M + '0';  
    }//M是代表这一位的数,L是代表这一位两数相加后的十位数,也就是进位数的大小  
    if(i < len1){  
        for( ; i < len1; i++){  
        M = (a[i] - '0' + L) % 10;  
        L = (a[i] - '0' + L) / 10;  
        c[i] = M + '0';  
        }  
    }  
    if(i < len2){  
        for( ; i < len2; i++){  
        M = (b[i] - '0' + L) % 10;  
        L = (b[i] - '0' + L) / 10;  
        c[i] = M + '0';  
        }  
    }  
    while(L){  
        c[i++] = L + '0';  
        L /= 10;  
    }//最后一位的进位不要忘记  
    mark = i-1;  
}//这个方法比较常见,最好要牢牢掌握  
  
int main(){   
 int i, j;    
 int len1, len2;   
  scanf("%s%s",num1,num2);   
   len1 = strlen(num1);    
   len2 = strlen(num2);    
   add(num1,num2,num3);  
     for(i = mark; i >= 0; i--)   
      printf("%c",num3[i]);   
       printf("\n");    

return 0;  
}

20求出用1,2,5这三个数不同个数组合的和为100的组合个数。如:100个1是一个组合,5个1加19个5是一个组合。请用C语言写出相应程序(写出主程序即可)。

#include
int main()
{

	int number=0;
	for (int x=0; x<=100; x++)
		for (int y=0; y<=50; y++)
			for (int z=0; z<=20; z++)
				if ((x+2*y+5*z)==100)
					number++;
	printf("%d\n",nymber);
}

#include
int main()
{
int number=0;
	for (int x=0; x<=100; x++)
		for (int y=0; y<=(100-x)/2; y++)
			for (int z=0; z<=(100-x-2*y)/2; z++)
				if ((x+2*y+5*z)==100)
					number++;
	printf("%d\n",nymber);
}

你可能感兴趣的:(面试题)