2023秋招大厂经典面试题及答案整理归纳301-320校招必看

目录

301. 系统调用与函数调用的区别?

302. 当接受方的返回的接受窗口为0时,发送方会进行什么操作?

303. 虚函数表是在什么时候确定的?那虚表指针呢?

304. 创建进程的步骤?

305. 进程切换发生的原因?处理进程切换的步骤?

306. DNS协议如何实现将域名解析为IP地址的?

307. 停止等待协议的缺点?为什么?

308. 拥塞控制的方式?具体怎么做的?快重传的时机是什么?

309. 浮点数为什么会有误差?

310. 将”引用”作为函数返回值类型的格式、好处和需要遵守的规则

311. linux信号有哪些?

312. 缓冲溢出报警及解决?

313. 如何判断两个结构体是否相等?

314. 云盘中秒传功能是什么原理,说说其中一个算法.

315. 栈上分配内存和堆上分配内存有什么区别?

316. 如何将一棵树转化成二叉树?

317. 请解释分段与分页机制.

318. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?

319. struct 和 class 的区别

320. 如何判断浮点数是否为0,或判读两个浮点数是否相等。


301. 系统调用与函数调用的区别?


(1) —个在用户地址空间执行;一个在内核空间执行
(2) —个是过程调用,开销小;一个需要切换用户空间和内核上下文,开销大
(3) —般相同;不同系统不同



302. 当接受方的返回的接受窗口为0时,发送方会进行什么操作?


幵启计时器,发送零窗口探测报文



303. 虚函数表是在什么时候确定的?那虚表指针呢?


编译时确定虚函数表,虚表指针则是运行时



304. 创建进程的步骤?


(1) 申请空的PCB
(2) 为新进程分配资源
(3) 初始化PCB
(4) 将新进程插入就绪队列中



305. 进程切换发生的原因?处理进程切换的步骤?


原因:中断发生;更高优先级进程唤醇;进程消耗完了时间片;资源阻塞;

步骤:

(1) 保存处理器的上下文

(2) 用新状态和其它相关信息更新壬在运行进程的PCB

(3) 将原来的进程移到合适的队列中【就绪,阻塞】

(4) 选择另外一个执行的进程,更新被选中进程的PCB,将它加载进CPU


306. DNS协议如何实现将域名解析为IP地址的?

(1) 客户机的应用程序调用解析程序将域名已UDP数据报的形式发给本地DNS服务器

(2) 本地DNS服务器找到对应IP以UDP形式放松回来

(3) 弱本地DNS服务器找不到,则需要将域名发送到根域名服务器,根域名服务器返 回下一个要访问的域名服务器,则访问下一个域名服务器。


307. 停止等待协议的缺点?为什么?

信道利用率太低,每次都需要等上一次ACK包接收到了才能再次发送


308. 拥塞控制的方式?具体怎么做的?快重传的时机是什么?

(1) 慢开始

(2) 拥塞避免

(3) 快重传【收到3个失序分组确认】

(4) 快恢复


309. 浮点数为什么会有误差?

因为二进制无法精准的表示十进制小数,0-3和。.2都无法完整的用二进制表示。


310. 将”引用”作为函数返回值类型的格式、好处和需要遵守的规则

格式:类型标识符&困数名(形参列表及类型说明){〃函数体}

格式:在内存中不产生被返回值的副本:(注意:正是因为这点原因,所以返回一个局 部变量的引用是不可职的。因为随着该扇8变量生存期的结束,相应的引用也会失效。) 注意事项:

不能返回局部变量的引用。主要原因是扇8变量会在函数返回时被销毁,因此被返回的 引用就成为了”无所指的”引用,程序会进入未知状态。

不能返回函数内部new分配的内存的引用。虽然不存在局部变量的被动销毁问题,可 对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬的局面。如,被 函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个 引用所指向的空间(由new分配)就无法释放。

可以返回类成员的引用,但最好是consto主要原因是当对象的属性是与某种业务规则 相关联时,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封 装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么 对该属性的单纯赋值就会破坏业务规则的完整性。


311. linux信号有哪些?

常用信号 信号 值SIGHUP 1SIGINT 2SIGQUIT 3SIGILL 4SIGABRT 6SIGFPE 8SIGKILL 9SIGSEGV 11SIGPIPE 13SIGALRM 14SIGTERM 15SIGUSR 130,10,16SIGUSR 231,12,17SIGCHLD 20,17,18SIGCONT 19,18,25SIGSTOP 17,19,23SIGTSTP 18,20,24SIGTTIN 21,21,26SIGTTOU 22,22,27 动作解释终端线路挂断Term键盘输入的中断命令,从终端输入Ctrl-C时发生Core键盘输入的退出命令Core错误指令Coreabopt(3)发出的中止信号Core浮点数异常TermKILL 信号Core非法内存访问TermW道断开Termalarm(2)发出的中止信号Term强制中止信号Term用户自定义信号1Term用户目定义信号2Ign子进程中止信号Cont继续执行一个停止的进程Stop非终端来的停止信号Stop终端来的停止信号Stop后台进程读终端Stop后台进程写终端

312. 缓冲溢出报警及解决?

缓冲区溢出的目的在于扰乱具有某些特权运行程序的功能,这样就可以让攻击者取得程 序的控制权,从而进行緩冲区溢出攻击行为。假如该程序具有足够的权限,那么整个主 机甚至服务器就被控制了。

1 .在被攻击程序地址空问里安排攻击代码的方法

1) .植人:去

攻击者向被攻击的程序输人一个字符串,程序会把这个字符串放到緩冲区里。这个字 符串所包含的数据是可以在这个被攻击的硬件平台运行的指令流。在这里攻击者用被攻 击

程序的緩冲区来存放攻击代码,具体方式有以下两方面差别:

.攻击者不必为达到此目的而溢出任何緩冲区,;叮以找到足够的空间来放置攻击代码;

.緩冲区可设在任何地方:堆栈(存放白动变量)、堆(动态分配区)和静态数据区初始化 或未初始化的资料.

2) .利用已经存在的代码

很多时候攻击者所要的代码已经存在于被攻击的程序中了,攻击者所要做的只是对代码 传逢一些参数,然后使程序跳转到想要扱行的代码那里。比方说,攻击代码要求执行 “ex-ec( "/bin/sh") ",而在 libc 庠中的代码执行 “exec( arg) ",其中 arg是 —个指向字符串的指针参数,那么攻击者只要把传人的参数指针改为指向"/bin/sh", 然后跳转到libc库中相应的指令序列即可。

2 .控制程序转移到攻击代码的方法

上面讲到的方法都是在试图改变程序的执行流程,使之跳转到攻击代码。其基本特点就 是给没有边界检查或有其他弱点的程序送出一个超长的緩冲区,以达到扰乱程序正常执 行顺序的目的。通过溢出一个緩冲区,攻击者可以用近乎暴力的方法(穷尽法)改写相 邻的程序空问而直接跳过系统的检查。

这里的分类基准是攻击者所寻求的緩冲区溢出的程序空问类型。原则上可以是任意的空 问。比如起初的HomsWorm(穆尔斯蠕虫)就是使用了 fingerd程序的緩冲区溢出,扰 乱fingerd要执行的文件的名字。其实许多緩冲的区溢出是用暴力的方法来寻求改变 程序指针的。这类程序不同的地方就是程序空间的突破和内存空间的定位不同。通常情 况下,控制程序转移到攻击代码的方法有下面几种:

1) .函数返回地址

在一个函数调用发生时,调用者会在堆栈中留下函数返回地址,它包含了函数结束时返 回的地址。攻击者通过溢出这些自动变量,使这个返回地址指向攻击代码,这样当函数 调用结束时,程序跳转到攻击者设定的地址,而不是原先的地址。这种緩冲区溢出被称 为“stacksmashing attack",是目前常用的緩冲区溢出攻击方式。

2) .函数指针

“void( * foo)()”中声明了一个返回值为void函数指针的变量千。。°函数指针定 位任何地址空间,所以攻击者只要在任何空间内的函数指针附近找到一个能够溢出的緩 冲区,然后溢出来改变A数指针,当程序通过函数指针调用函数时,程序的流程就会发 生改变而实现攻击者的目的。

3) .长跳转緩冲区

在C语言中包含了一个简单的检燈/,恢复系统,称为"setjmp/longjmp",意思是在检 捡点设定"setjmp ( buffer) ",用<4longjmp( buffer)”来恢复检验点。可是, 假如攻击时能够进人緩冲区的空间,那么“longjmp( bu仟er)〃实际_1:是跳转到攻 击者的代码。像函数指针一样,longjmp緩冲区能够指向任何地方,所以攻击者所要 做的就是找到一个可供溢出的緩冲区。一个典型的例子就是Perl 5.003,攻击者首先 进人用来恢复緩冲区溢出的longjmp緩冲区,然后诱导进人恢复模式,这样就使 Perl的解释器跳转到攻击代码L 了。

3.综合代码植人和流程控制技术

最常见和最简单的緩冲区溢出攻击类型就是在一个字符串里综合了代码植人和启动记 录。攻击者定位一个可供溢出的自动变Q,接着向程序传逢一个很大的字符串,在引发 缓冲区溢出改变启动记录的同时植人了代码(C语言程序员习惯上只为用户和参数开辟 很小的緩冲区)。

代码植人和緩冲区溢出不一定要在一次动作内完成,攻击者可以在一个緩冲区内放置代 码(这时并不能溢出緩冲区),接着攻击者通过溢出另一个緩冲区来转移程序的指针。 这样的方法通常用来解决可供溢出的緩冲区不够大(不能放下全部的代码)。如果攻击 者试图使用已经常驻的代码而不是从外部植入代码,他们通常必须把代码作为参数。举 例说明,在Hbc(几乎所有的C程序都用它来连接)中的一部分代码段会执行 "exec( something) ",其中的something就是参数,攻击者使用緩冲区溢出改变 程序的参数,然后利用另一个緩冲区溢出攻击,使程序指针指向Hhc中的特定的代码 段。


313. 如何判断两个结构体是否相等?

判断两个结构体是否相等:重载操作符”==”

不能用函数memcpy来判断两个结构体是否相等:memcmp函数是逐个字节进行比较的, 而struct存在字节对齐,字节对齐时补的字节内容是随机的,会产生垃圾值,所以无 法比较。

#include<iostream>
using namespace std;
struct s
{
int a;
int b;
bool operator == (const s &rhs);
};
bool s::operator == (const s &rhs)
return ((a == rhs.a) && (b == rhs.b));
int main()
{
struct s si, s2;
si.a = 1;
sl.b = 2;
s2.a = 1;
s2.b = 2;
if (si == s2)
cout ”两个结构体相等""endl;
else
cout << "两个结构体不相等"endl;
return 0;

314. 云盘中秒传功能是什么原理,说说其中一个算法.

秒传原理:

上传大文件时,会对文件进行比对操作,这里的对比操作其实就是将我们下载的插件对 要上传的文件进行”哈希值”的计算,跟百度的“哈希值”数据库中的文件进行匹配操作. 如果发现两者的”哈希值“相同,那么,将已存在于百度数据库里面的文件对应的文件链 接到我们对应的帐号里,做一个关联就可以,其实并没有对本地文件进行上传,所以我 们也就看到了秒传的效果.

1、 因为在上传文件之前,如果你是第一次使用百度网盘,那么会提示你安装一个极速 控件.

2、 该极速控件的下载是为了更方便的来检测我们将要上传文件的哈希值.也就是文件 的唯一识别码.

哈希算法


315. 栈上分配内存和堆上分配内存有什么区别?

栈上:分配简单,只需要移动栈顶指针,不需要其他的处理。

堆上:分配复杂,需要进行一定程度清理工作,同时是调用函数处理的。


316. 如何将一棵树转化成二叉树?

将节点的孩子放在左子树; 将节点的兄弟放在右子树。


317. 请解释分段与分页机制.

1 .分段机制

1) 什么是分段机制

分段机制就是把虚拟地址空间中的虚拟内存组织成一些长度可变的称为段的内存 块单元。

2) 什么是段

每个段由三个参数定义:段基地址••段限长和段属性。

段的基地址、段限长以及段的保护属性存储在一个称为段描述符的结构项中。

3) 段的作用

段可以用来存放程序的代码、数据詛堆栈,或者用来存放系统数据结构。

4) 段的存储地址

系统中所有使用的段都包含在处理器线性地址空间中。

5) 段选择符

逻辑地址包括一个段选择符或一个徧移量,段选择符是一个段的唯一标识,提供了 段描述符表,段描述符表指明短的大小、访问权限和段的特权级、段类型以及 段的第一个字节在线性地址空间中的位置(称为段的基地址)。逻辑地址的偏 移量部分到段的基地址上就可以定位段中某个字节的位置。因此基地址加上偏 移量就形成了处理器线性地址空间中的地址

6 )逻辑地址到线性地址的变换过程

如果没有开启分页,那么处理器直搠巴线性地址映射到物理地址,即线性地址被送 到处理器地址总线上:如果对线性地址空间进行了分页处理,那么就会使用二级地 址转换把线性地址转换成物理地址。

7 )虚拟地址到物理地址的变换过程

2 .分页机制

1) 什么是分页机制

分页机制在段机制之后进行的它进一步将线性地址转换为物理地址。

2) 分页机制的存储

分页机制支持虚拟存储技术,在使用虚拟存储的环境中,大容量的线性地址空间 需要使用小块的物理内存(RAM或ROM)以及某些外部存储空间来模拟。当使用 分页时,每个段被划分成页面(通常每页为4K大小),页面会被存储于物理内存 中或硬盘中。操作系统通过维护一个页目录和一些页表来留意这些页面。当程序

(或任务)试图访问线性地址空间中的一个地址位置时,处理器就会使用页目录和 页表把线性地址转换成一个物理地址,然后在该内存位置上执行所要求的操作。

3 )线性地址和物理地址之间的变换过程

3. 分段机制和分页机制的区别

1) 分页机制会使用大小固定的内存块,而分段管理则使用了大小可变的块来管理 内存。

2) 分页使用固定大小的块更为适合管理物理内存,分段机制使用大小可变的块更 适合处理复杂系统的逻辑分区。

3 )段表存储在线性地址空间,而页表则保存在物理地址空间。


318. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?

常考的题目。

1. 从定义上来说:

重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
重写:是指子类重新定义父类虚函数的方法。

2. 从实现原理上来说:

重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译 器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的 调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!
重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。


319. struct 和 class 的区别

答案:struct 的成员默认是公有的,而类的成员默认是私有的。struct 和 class 在其他方面是功能相当的。


320. 如何判断浮点数是否为0,或判读两个浮点数是否相等。

答案:对于浮点数x,若判断其是否等于0.5,不可直接用 “==” 号, 正确的做法应该是:


秋招大厂经典面试题及答案整理不断更新中,感兴趣且正在学习的同学可以点个关注;狮会不断更新文章连载,有问题或者见解可以评论区讨论。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340