admin 管理员组文章数量: 887021
吊打是不可能的了哈哈,卑微的小菜鸡简单总结几个面试问题。
文章目录
- 1.数据挖掘的3个算法
- 2.研究方向
- 3.大数据与数据挖掘的区别,生活中的应用
- 4.linux常用命令
- 5.如何做海量数据查询
- 6.对人工智能什么看法
- 7.有了解啥CS期刊
- 8.为啥3次握手4次挥手
- 9.跨考
- 10.不加入第3个变量,交换a和b值
- 11.运筹学的线性规划的定义
- 12.解释软工的能力成熟度
- 13.什么是事务?锁?
- 14.C和C++的区别?
- 15.指针和引用的区别?
- 16.struct和class区别
- 17.私有协议网盘项目
- 18.DBSCAN聚类
- 19.WWW服务
- 20.epoll和select的区别
- 1.问题的引出
- 2.解决方案
- 区别(epoll相对select优点):
- 21、epoll中et和lt的区别与实现原理:
- LT(level triggered)
- ET (edge-triggered)
- 22.对套接字编程的理解,协议如何
- 23.对网络/信息安全的理解
- 24.ARP协议的过程
- (1)ARP/DHCP/ICMP
- (2)RIP/OSPF/BGP——三种路由协议
- 25.哈希函数设计
- 26.××与初始序列无关
- 27.B/B+树
- 28.访存过程
- 29.动态分区分配算法
- 30.进程的死锁
- 31.并发&并行
- 32.时间&空间
- 33.三个时间/周期
- 拓展:
- 34.define声明一个常量
- 35.SQL的特点:
- 36.SQL语句完成核心功能的9个动词
- 37.WAN和LAN的区别
- 38.描述Dijstra算法思想
- 算法思想:
- 39.TCP/IP四层模型
- 40.特征值和特征向量的几何意义
- 41.C有没有出现过段溢出?how处理段溢出?
- 解决方法
- 42.前中后序遍历的应用
- 43.孤儿进程&守护进程
- 1.孤儿进程
- 2.守护进程
- 44.内存泄漏是啥
- 45.链表的应用场景
- 46.全局变量的缺点
- 缺点
- 47.快排
- 48.SYN攻击
- 49.文件描述符
- 小结:Linux中一切皆文件
- 50.遇到无法重现的bug怎么办
- 51.你有啥问题要问我吗
- 52.常用的设计模式
- 1) 单例模式。
- 2) 工厂模式。
- 3) 策略模式。
- 4) 观察者模式。
- 5) 迭代器模式。
- 6) 模板方法模式。
- 53.阻塞&非阻塞
- 54.了解CUDA吗
- 54.负载均衡
- 1.异步非阻塞 I/O
- 2.面试
- 55.非关系型数据库
- 1.优点
- 2.NoSQL数据库类型
- 56.https和http区别
- 57.对redis了解吗
- 58.讲讲token值,过程
- 程序员修炼之道-摘抄
- reference
1.数据挖掘的3个算法
数据挖掘:利用数据库管理海量数据,并利用机器学习and统计分析进行数据分析。
(1)SVM即suppor vector machines即支持向量机,可用于分类,如异常检测、图像识别等;
(2)DBSCAN聚类,图像分割或群体划分;
(3)PageRank算法,是google佩奇大佬评估网页权重,进行搜索后网页排名的算法。
数据挖掘十大算法。
顺便提下下图为机器学习的算法:
2.研究方向
计算机视觉CV或者自然语言处理NLP。
3.大数据与数据挖掘的区别,生活中的应用
(1)大数据是对海量数据进行分布式数据挖掘。麦肯锡研究所给出的大数据定义:一种规模大到在获取、存储、管理、分析方面远远超出传统数据库软件能力范围的数据集合,四大特征:海量的数据规模、快速的数据流转、多样的数据模型和价值密度低。
4.linux常用命令
1.cd
进入对应目录
2.ls
列出当前文件夹内的内容
3.pwd
显示目前当前工作目录的完整路径
4.tar
用于压缩解压
5.mkdir
创建目录
6.ifconfig
查看自己IP、网络设备状态
7.grep
用于查找文件里面符合条件的字符串
——linux中三大文本处理工具:awk、sed、grep。
5.如何做海量数据查询
在leetcode有几题求top K可以用堆排序,海量数据处理方法:
(1)堆排序
(2)外部排序:内存当做输入缓冲区。
——要点:归并方法,置换选择败者树,最优归并树。
(3)分而治之+哈希:
——将IP地址:hash(ip)%1024,将海量IP分别存储到1024个小文件,然后分别查找出每个文件的频数最大的IP,最后找出所有文件1024个IP中频数最大的IP。
其他方法:十道海量数据处理面试题。
6.对人工智能什么看法
(1)人工智能的学科有哪些,了解到的最新成果
2020年人工智能十大进展和2021年十大技术趋势
1)AI极大改变我们的生活,如前段时间MIT就实现仅用19个类脑神经元来控制自动驾驶,而常规的深度神经网络需要数百万的神经元,再如很多人用的抖音就是用的智能推荐算法,这些给我们的未来带来无限可能。
2)但如计算机视觉CV中的人脸识别等技术仍旧不够成熟,之前就有清华团队做实验发现带着面具(眼睛)通过其他人的人脸检测,所以AI的落地和现实伦理的结合有待提升。
3)AI是门交叉学科艺术,如AI和区块链紧密关系:AI基于数据,而像区块链的“去中心化”实现数据的共享,AI就如同基于大数据上的智能应用。读研期间不能只会调包sklearn调包调参,要深入理解算法原理和交叉领域内的应用。
7.有了解啥CS期刊
(1)清华发布新版计算机学科推荐学术会议和期刊列表
(2)中文期刊的有:
软件学报 http://www.jos
计算机学报 http://cjc.ict.ac/
计算机研究与发展 http://crad.ict.ac/
8.为啥3次握手4次挥手
(1)为什么是三次握手,关闭是四次?
答:四次是因为客户端发送FIN请求释放后,服务器端还可能继续发送数据,所以第一个是先回复客户端的FIN,等发送完所有数据服务器端再发送FIN。
而三次握手是因为客户端发送连接请求后,客户端可以直接发送SYN+ACK报文,而四次挥手是只是先发送ACK报文回应客户端的FIN报文已被接收。
(2)为啥四次挥手要等待2MSL?
答:防止客户端最后一次发送给服务器的确认ACK在网络中丢失,以至于客户端关闭了而服务端未关闭(如果服务端没有收到ACK则会不断发送FIN报文,即客户端不能立马关闭)。
2MSL即一个发送和一个回复的最大时间。
(3)为啥不用两次握手?四次握手?
答:TCP是可靠传输的,面向字节即对每个字节的数据分配一个序号。
1)因为如果两次握手,只有服务器对客户端的起始序列号做出确认,但客户端却没有对服务器的起始序列号做确认,不能保证TCP运输可靠性;
2)而四次握手没必要(第二三步可以合并,提高连接的速度和效率)。
9.跨考
(1)怎样补全CS课程
答:如能录取,我将在开学前恶补计算机本科核心课程,在入学后不占用实验室研究正常工作之余恶补计算机课程。
(2)为啥跨考(英语也要会说)
因为在我粗浅的认知里,我认为交叉学科的应用能推动社会的发展,而仅学习金融专业并不能让我富有激情。计算机科学是建立在数学和编程等学科和它非常让我着迷。我有一个理想是30岁时创立一家科技公司。
英语:
Because in my shallow understanding, I believe that the application of intercross subjects can promote the development of society, while only learning finance can not make me full of passion.
Computer science is based on mathematics and programming and other subjects and it fascinates me very much.
My dream is to start a technology company by the time I’m 30 years old.
(3)为啥考我们学校
Because this university has a good academic atmosphere and excellent classmates and teachers, more importantly, it can provide me with an opportunity to further my study and development.
10.不加入第3个变量,交换a和b值
考察编程变通能力,多想几种方法:
(1)简单数学运算:
int a=5,b=3;
a=a+b;//两数之和,a=5+3=8
b=a-b;//b=8-3=5
a=a-b;//a=8-5=3
(2)位运算:异或运算
相同为0,不同为1:
int a=5,b=3;
a=a^b;
b=a^b;
a=a^b;
11.运筹学的线性规划的定义
运筹学包括线性规划、整数规划、非线性规划、动态规划、运输问题等解决最优化的问题。
线性规划:在线性约束调剂下求线性目标函数的极值问题,其中三要素为目标,约束和变量。
方法:单纯形法、对偶单纯形法、图解法。
12.解释软工的能力成熟度
Capability Maturity Model即CMM用于评价承包能力并帮助其改善软件质量的方法,侧重于软件开发过程的管理及工程能力的提高与评估。
CMM将成熟度分为5个等级:(层层递进)
(1)初始级:工作无序,管理无章;
(2)可重复级:管理制度化;
(3)已定义级:技术和管理工作实现标准化、文档化;
(4)已管理级:项目产品和过程的可控;
(5)优化级:可用新技术优化。
13.什么是事务?锁?
通俗理解:要么执行成功,要么撤销&不执行。事务控制即控制数据的安全访问,如肥仔1要转200块给肥仔2的银行账户内,首先肥仔1的账户减去200块,但如果因为一些网络问题使得肥仔2的账户增加200块操作失败了——即代表整个业务失败,将肥仔1的账户转账业务撤销。
事务四大基本要素ACID:原子性(即第一行)、一致性(数据库的完整性约束没被破坏)、隔离性(通常用锁实现每个读写事务的对象和其他事务的操作对象相互分离)、持久性(已提交的数据在事务执行失败时,数据的状态都应该正确)。
锁
在所有的数据管理系统DBMS中,用锁实现事务,保证事务的完整性和并发型。
14.C和C++的区别?
C:面向过程,结构化语言;
程序由【过程】和【过程调用】组成,其中函数是最常用的过程。
C++:面向对象,根据具体问题建立对象模型,封装、继承、多态,C++同时支持面向对象和面向过程——一个面向对象的c++程序一般由类的声明和类的使用两大部分组成。
程序=对象+消息。
面向对象程序的主要结构特点是:
第一,程序一般由类的定义和类的两部分组成;
第二,程序中的一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关方法完成相应的操作。
第三,代码的重用性、复杂性、可维护性。
——————————————————————
C用malloc和free动态管理内存,不支持函数重载,没有引用;
C++用new和delete动态管理内存,支持函数重载,有引用的概念。
float *array=new float[100];//用new创建单精度数组array,其长度为100
delete[] array;
封装隐藏了实现细节,使代码模块化;
派生类继承父类的方法和数据,扩展原有的模块,实现了代码的复用;
多态性是“一个接口,多个方法”,通过派生类重写父类的虚函数,实现接口的复用。
15.指针和引用的区别?
(1)指针:存储额某个变量的地址的变量。如下面的指针p。
int a,b,*p,&r=a;
int &rr;//错误:引用必须初始化
p=&a;//p指针指向a
*p=100;//改变指针p所指的存储空间的内容,存入100
p=&b;//改变指针p所指的东东,p指向变量b的空间
(2)引用:是变量的别名(它和原本的变量拥有相同的地址,对引用的操作即是对该变量的操作——直接访问),定义一个引用时引用必须同时初始化,即引用和该初始值绑定在一起,而非拷贝初始值,而引用一经声明就不可以再和其他对象绑定在一起。
PS:指针若作为函数参数时,由于值传递所以指针的值不能改变,需要通过引用对原指针变量操作——引用在做函数参数时,内部传递的实际是变量的地址。
16.struct和class区别
C++中的class类“相当于”能够调用自身的sturct结构体,如下面struct Number{ }
和class Number{public: / **/ }
作用相同。但是默认两者的读写权限不同,struct是public,而class是private。
//默认成员公有
struct Number{
private;
float val;
public:
float pubVal;
Number(float inVal);
};
//默认成员为私有
class Number{
float val;//外部无法直接访问
public:
float pubVal;
Number(float inVal);
};
类的成员:属性和方法是这个对象的成员。
私有成员:外部函数不可访问的成员。
void printPublic(Number num){
cout<<num.pubVal<<endl;
}
void printPrivate(Number num){
cout<<num.val<<endl; //报错,无法访问私有类型
}
17.私有协议网盘项目
(1)相比现在的开源FTP有啥优势?
开源的ftp服务器一般是用进程池完成高并发,没有线程池那么高效地进行上下文的切换。
1)用epoll而不用select或poll,blabla
2)如果文件大于100M,就进行mmap该文件后再传输
3)随机salt值与用于密码加密再发送到服务器,安全性
(2)C的线程池你是怎么管理的?你倒是秀一波代码啊
1)首先在服务器端创建epoll对象,通过一个监视的列表查看的socket,客户端和服务器端通过文件描述符进行通信。
线程池采 用epoll的边缘触发模式同时监听多个文件描述符,主线程负责监听客户端是否发起请求。
2)当客户端发起请求时,主线程接收请求报文,然后将任务插入请求队列,由工作线程通过竞争从请求队列中获取任务。
3)根据请求报文对客户端进行响应,然后由主线程给客户端发送响应相应文件。
(3)你的TCP/IP是怎么实现的?
首先FTP是文件传输服务协议,通过21端口进行控制,20端口进行数据连接;然后利用线程池也就像一个等待迎接客户的小作坊,每次查询socket通过文件描述符若有客人来了,就利用其中线程进行处理,处理包括我在客户端的一些下载文件、改变目录等操作。
另外FTP是应用层的协议,在TCP/IP传输层中也是用三次握手四次挥手,网络数据包的传输是自顶向下,再下到顶以实现应用层的端到端通信。
PS:具体还要复习socket网络编程(select & epoll)。
(4)你的mysql里搞得啥?
1)日志表(记录客户端和服务器操作信息)
2)用户信息表(ID,用户名,salt,登录密码)
3)虚拟文件系统的表(文件名,文件类型,所属用户,md5value),当时加入md5加密让用户在客户端注册是的密码先转成密文,再发给服务器。
(5)一句话概括GCC的编译过程
预处理.c源程序,编译&汇编成.o目标文件,将.o文件和库函数进行链接,得到exe可执行文件。
gcc –E hello.c –o hello.i //-o 预处理:表示输出为指定文件类型 -E 将源文件(*.c)转换为(*.i)
gcc –S hello.i –o hello.s //-S 编译:将已预处理的 C 原始程序(*.i)转换为(*.s)
gcc –o hello.exe hello.s //链接:最后将汇编语言原始程序(*.s)和一些库函数链接(整合)成(*.exe)可执行文件
18.DBSCAN聚类
DBSCAN的原理及其通俗解释
(1)用了什么框架?
python中机器学习库sklearn,确定合适的Eps、MinPts和距离参数。
(2)如何解决DBSCAN中Eps和MinPts是如何自适应调整的
首先,我查阅资料,在国外一个DBSCAN可视化网站(https://www.naftaliharris)进行DBSCAN调参,先感性认知DBSCAN的两个参数选择特点:如对于网站给定的笑脸数据集DBSCAN聚类,这种聚类是基于密度的,而如果是kmeans则需要初始需要设置聚类个数,且可能聚类成均等分的“切蛋糕”。也可以得出:在Eps不变的情况下,MinPts值越大,核心点个数就越少;而如果MinPts的值越小,则核心点的个数越多。
接着我通过尝试DBSCAN聚类和对根据上网时间和时长的数据特点,将Eps确定0.001到1范围之间,而Minpts在2到20之间;
然后,用python编程循环不断迭代和对比廊阔系数Sihouette(越接近1则效果越好),并且根据以下2个选取原则:
(1)如果Eps相同,为了排除噪声点数据的干扰,我选取异常值outliners更少,样本聚类分布较平均的一组参数。
(2)如果连续的Eps候选项使得聚类的类别个数相同,则选择Eps数值相对较大的一项作为最终值。
选择的聚类参数为Eps为0.151,MinPts为4、5、6中的任意一个均可得到较优结果,并且利用python可视化如上图进行分析(纵坐标为上网时长,横坐标为上网时间)。
(3)如果是处理超大量数据,有什么改进方法?
所以也是需要多次运行聚类算法并寻找一对效果较好的参数,所以这种方法也是费时费力,特别是处理超大数据量,多次运行的代价很大。
解决方案:——。
19.WWW服务
WWW服务的第一步操作是浏览器对服务器的( )
A.请求地址解析 B.传输连接建立 C.请求域名解析 D.会话连接建立 【答案:C】
【解析】(A)请求地址解析是指通过ARP协议将IP地址转换为对应的MAC地址;
比如上百度要先在浏览器上打上百度的地址,而建立浏览器与服务器之间的连接需要知道服务器的IP地址和端口号(80端口号是熟知端口号),而访问站点时浏览器从用户得到的是WWW站点的域名(比如百度网址),所以浏览器必须先向DNS请求域名解析,获得服务器的IP地址后,才能请求建立TCP连接——即先(C)再(B)。
接下来的过程:
(2)WWW服务器将通过TCP协议与服务器建立一条TCP连接;
(3)WWW浏览器向WWW服务器发送获取其主页的HTTP请求;
(4)WWW服务器将所请求的web页面必需各种信息通过Internet传送给客户端的浏览器;
(5)WWW浏览器解析收到的信息,显示在用户屏幕。
PS:访问页面,服务器会产生Cookie——存储在用户主机的文本文件。
【复习协议】
20.epoll和select的区别
1.问题的引出
当需要读两个以上的I/O的时候,如果使用阻塞式的I/O,那么可能长时间的阻塞在一个描述符上面,另外的描述符虽然有数据但是不能读出来,
2.解决方案
1.使用多进程或者多线程
但是这种方法会造成程序的复杂,而且对与进程与线程的创建维护也需要很多的开销。(Apache服务器是用的子进程的方式,优点可以隔离用户)
2.轮询
用一个进程,但是使用非阻塞的I/O读取数据,当一个I/O不可读的时候立刻返回,检查下一个是否可读,这种形式的循环为轮询(polling),这种方法比较浪费CPU时间,因为大多数时间是不可读,但是仍花费时间不断反复执行read系统调用。
3.异步I/O(asynchronous I/O)
当一个描述符准备好的时候用一个信号告诉进程,但是由于信号个数有限,多个描述符时不适用。
4.I/O多路转接(I/O multiplexing)(多路复用)
先构造一张有关描述符的列表(epoll中为队列),然后调用一个函数,直到这些描述符中的一个准备好时才返回,返回时告诉进程哪些I/O就绪。select和epoll这两个机制都是多路I/O机制的解决方案,select为POSIX标准中的,而epoll为Linux所特有的。
区别(epoll相对select优点):
(1)select的句柄数目有限,而epoll没有监听文件描述符的最大数量限制;
(2)epoll不会随着文件描述符FD的数目增大而降低效率,因为epoll将维护等待队列和阻塞进程分离开,epoll只会对"活跃"的socket进行操作;select相当于轮询且阻塞式地监视socket。
——epoll实现了一 个"伪"AIO。但是如果绝大部分的I/O都是“活跃的”,每个I/O端口使用率很高的话,epoll效率不一定比select高(可能是要维护队列复杂)。
(3)epoll用红黑树监视兴趣列表(装文件描述符),搜索速度极大提升。
(4)使用mmap加速内核与用户空间的消息传递。
无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。
21、epoll中et和lt的区别与实现原理:
epoll有2种工作方式:LT和ET。
LT(level triggered)
缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。
如果你不作任何操作,内核还是会继续通知你 的,所以这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表.
ET (edge-triggered)
高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述 符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了(比如,你在发送,接收或者接收请求,或者发送接收的数据少于一定量时导致 了一个EWOULDBLOCK 错误)。
但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once),不过在TCP协议中,ET模式的加速效用仍需要更多的benchmark确认。
epoll只有epoll_create,epoll_ctl,epoll_wait 3个系统调用。
22.对套接字编程的理解,协议如何
1)socket通常称为“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通过套接字向网络发出请求或应答网络请求。
服务器和客户端通过socket进行交互。服务器需要绑定在本机的某个端口号上,客户端需要声明自己连接哪个地址的哪个端口,这样服务器和客户端就能连接了。
2)根据连接启动的方式以及本地套接字要连接的目标,
套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
3)socket是对TCP/IP协议的封装和应用。
在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接。
第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认。
第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
服务器socket与客户端socket建立连接的部分其实就是“三次握手”。
23.对网络/信息安全的理解
(1)网络安全和信息安全与我们息息相关,每天我们的个人通讯账号、网上登录密码等都涉及相关的个人隐私问题,所以很多zf也发布相关网络安全和信息安全蓝皮书等进行战略规划,可见gj对这方面也是非常的重视。
(2)信息安全的本质就是保护数据被合法地使用。
机密性(未授权,不访问)、完整性(数据、对象未修改)、可用性(授权,能访问)。
2001年的911摧毁了数家金融机构在世贸中心的办公室,可是多数银行在事件发生后的很短的时间内就能够恢复正常运行。这些应归功于它们的备份,修复,灾难后的恢复工作做得好。
24.ARP协议的过程
ARP地址解析协议是解决同一局域网的主机或路由器的IP地址和MAC地址的映射问题。
工作原理:通过广播发送包含目标IP地址的ARP请求分组,ARP响应分组通过单播发回,从而确定目标IP的物理MAC地址。
——局域网A的主机1想和局域网B的主机2通信不能只发送ARP报文解决,因为不在同一局域网,剩下的工作由下一跳的路由器完成。
(1)ARP/DHCP/ICMP
ARP地址解析协议;DHCP动态主机配置协议。
(2)RIP/OSPF/BGP——三种路由协议
(1)ARP是地址解析协议,而RIP是距离向量算法(https://blog.csdn/qq_35812205/article/details/107732439),别搞混了。
(2)OSPF协议对自治系统中区域划分好处:利用洪泛法交换链路状态链路信息局限在区域内——交换信息种类增多,也使得更复杂。———RIP,每个路由器都定期与所有相邻的路由器交换整个路由表,并以此更新自己的路由表项。
25.哈希函数设计
用线性探测再散列解决冲突,如何设计哈希函数:H(key)=key%P;
如其中P取不大于散列表长但最接近10的质数7.
26.××与初始序列无关
(1)总排序趟数和初始状态无关的有:除了快排(递归深度)和优化的冒泡,其他都是。
(2)算法的时间复杂度和初始序列无关的是:一堆乌龟选基友——堆排序、归并排序、选择排序、基数排序
(3)元素的移动次数和初始序列无关的是:基数排序、归并排序;
(4)元素的比较次数与初始序列无关的是:基数排序、选择排序O(n方)
27.B/B+树
(1)为啥B+树作OS的文件索引和数据库索引:B+树磁盘读写代价更低,查找效率更稳定。
由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。
(2)给你一组关键字,你能否创建出一棵3阶B树
28.访存过程
29.动态分区分配算法
(各分区大小,分区总数可变~即分区大小=进程大小),连续&分页&分段分配回顾(https://blog.csdn/qq_35812205/article/details/105422628)
(1)最佳适应算法产生最多【外部碎片】(说内存碎片也对)——因为总是匹配和当前大小要求最接近的空闲分区(但大多数不可能完全相等),即会产生很小的难以利用的内存块;
【内部碎片】固定分区分配&页式存储管理&段页式。
【请求页式】和页式唯一区别是不用将程序所有页面调入,可能存在【抖动(频繁换入换出)】;页式和请求页式存储都不是连续的,故需利用【动态重定位】。
30.进程的死锁
下列关于死锁的论述中哪个是不正确的____(北京邮电大学2011)答案:B
A. 可以采用一次性请求所有资源来预防死锁
B. 可以采用强占其它进程已占资源的方法来预防死锁
C. 可以通过提高进程优先级的方法解除死锁
D. 可以采用资源分配拒绝策略(如银行家算法)避免死锁
解析:B选项:抢占其他进程资源是一种解除死锁的策略,而不是预防死锁。
A选项:死锁的预防是指破坏产生死锁的四个必要条件中(互斥条件、不剥夺条件、请求并保持条件、循环等待条件)的一个或多个;一次性请求所有资源即破坏请求并保持条件。
C选项:死锁的解除主要方法有:资源剥夺法、撤销进程法、进程回退法。
其中撤销的原则可以按进程优先级和撤销进程代价的高低进行。
(死锁的检测和解除中,在系统为进程分配资源时不采取任何措施——只提供死锁的检测和解除手段)
D选项:死锁的避免并不是事先采取某种限制措施,而是在资源动态分配过程中,防止系统进入【不安全状态】(不能用于判断系统是否处于死锁),常用银行家算法。
31.并发&并行
并发是同一时间间隔,而并行是同一时刻进行。
单CPU系统不能实现进程与进程的并行,但可以实现以下并行:
(1)设备,如打印机和显示屏;(2)处理机和设备,如CPU和显示屏;(3)处理机和通道,因通道是独立于CPU的控制I/O设备——通道执行通道程序时,CPU与通道并行,当通道完成通道程序的执行(即数据传输结束),便产生I/O中断向CPU报告。
32.时间&空间
时间换空间则是【时间】增加,而空间换时间则是【空间】增加。
时间换空间:虚拟存储、覆盖&交换技术;
——增加访问时间,但扩充主存的逻辑容量,使得大于主存容量的程序也能执行。
空间换时间:SPOOLing、缓存技术
——如SPOOLing需高速、大容量、可随机存取的外存支持,通过【预输入】和【缓输出】减少CPU等待慢速设备的时间。
另外:金钱换时间——Cache贼贵,缓和CPU和主存速度不匹配。
33.三个时间/周期
存储周期:连续启动两次读或写操作所需最小的间隔时间。
存取时间:指的是CPU读或写内存内数据的过程时间。
存储时间:属于存取时间的存操作数据的过程时间。(注意和存取时间的区分)
拓展:
(1)指令字长=存储字长的前提下,取指周期=机器周期(=间址周期=执行周期=中断周期),一个机器周期=k个时钟周期。
错误选项举例:指令字长=机器(错在机器字长)字长的前提下,取指周期=机器周期。
这里注意【机器字长】是计算机一次整数运算能处理的机器位数,即运算器ALU位数和通用寄存器宽度;
通常把一次总线事务访问主存或I/O的时间定为一个【机器周期】——【存储字长】和【指令字长】均和机器字长没有必然的联系。
(2)存储字长是指存储体中一个存储单位中的位数,MDR位数(数据字长)可与存储字长不同(k倍关系即可)。
如MDR中的一个16位的二进制数就需要占用两个存储单位的空间。
(3)如果指令字长=2 × 存储字长,则需要2次访存,取指周期=机器周期×2;
指令字长取决于操作码的长度、操作数地址的长度和操作数地址的个数,但是为了硬件设计方便,指令字长一般取字节或存储字长的整数倍。
34.define声明一个常量
#define即宏定义——方便程序的修改。
# define NUM 5
35.SQL的特点:
(1)SQL具有十分灵活和强大的查询功能,其SELECT语句能够完成相当复杂的查询操作,包括各种关系代数、统计、排序等操作;
(2)SQL不是一个应用开发语言,它只提供对数据库的操作功能,不能完成屏幕控制、菜单管理、报表生成等功能。但SQL既可作为交互式语言独立使用,也可作为子语言嵌入在主语言中使用,称为应用开发语言的一部分。
(3)SQL是国际标准语言,有利于各种数据库之间交换数据,有利于程序的移植,有利于实现高度的数据独立性,有利于实现标准化
(4)SQL的词汇不多,完成核心功能只用了9个英语动词(见下个),它的语法结构接近英语,因此容易学习和使用。
36.SQL语句完成核心功能的9个动词
数据查询:SELECT (查询出数据,也可用于变量赋值)
数据定义(表/视图/查询/存储过程/自定义函数/索引/触发器等):CREATE (创建)、DROP(删除)、ALTER(修改)
数据操作:INSERT(插入)、UPDATE(更新)、DELETE(删除)
数据控制:Grant(授权)、revoke(回收权限)
37.WAN和LAN的区别
路由器上的WAN口(有的写Internet口)和LAN口(有的写1、2、3)。
WAN口(输入口)
是用来连接外网(公网),即连接宽带运营商的设备的,
——如电话线上网时WAN口是用来连接Moden(猫),光纤上网时,WAN口连接光猫;
网线入户上网时,WAN口用来连接入户网线。
LAN口(输出口)
是用来连接内网(局域网)中的设备的,
——主要是连接电脑、交换机、打印机等设备的。
38.描述Dijstra算法思想
作用:求单源最短路径,及起点到其余各个点的最短距离。
算法思想:
dis数组初始值为起点到各个顶点的距离值。
现只是对dis数组找下一个点时用到排序,
找dis数组中所有可见点中,元素值最小(距离最近)的一个作为下一个点【贪心思想】,然后对该点所有的出边进行松弛
最后更新dis数组。(可以再多说点)
英文描述(有道翻译哈哈哈)
The dis array starts with the distance from the starting point to each vertex.
Now I’m just using sort to find the next point in the dis array,
Find all remaining points in the dis array with the smallest (nearest) element value as the next point,
and relax all outgoing edges of this point.
Finally, update the dis array.
39.TCP/IP四层模型
40.特征值和特征向量的几何意义
矩阵乘法就是线性变换,若以其中一个向量A为中心,则B的作用是使A发生如下变化:
(1)伸缩(2)切变(3)旋转
矩阵特征值:
对特征向量进行伸缩和旋转程度的度量,实数是只进行伸缩,虚数是只进行旋转,复数就是有伸缩有旋转。
特征向量:
从它的定义可以看出来,特征向量是在矩阵变换下只进行“规则”变换的向量,这个“规则”就是特征值。
PS:详细可以见3Blue1Brown的线性代数视频。
41.C有没有出现过段溢出?how处理段溢出?
1、空指针
2、野指针
所谓野指针就是该指针指向的内存已经被释放了,但还去访问该指针指向的内存,就会导致内存访问违例。
还有一种情形是同一段堆内存被delete或free了两次。
3、内存拷贝时越界
4、GDI对象接近或达到1万个后导致的崩溃
5、线程栈溢出
6、系统内存耗尽Out of memory
7、switch中的case分支过多导致线程栈溢出
8、函数调用约定不一致,导致的栈不平衡
9、dll库之间版本不一致引起的崩溃
10、死循环
11、死锁
解决方法
gdb调试。
42.前中后序遍历的应用
(1)前序遍历:可以用来实现目录结构的显示。
输出文件名称的过程如下:
如果是文件夹,先输出文件夹名,然后再依次输出该文件夹下的所有文件(包括子文件夹),如果有子文件夹,则再进入该子文件夹,输出该子文件夹下的所有文件名。这是一个典型的先序遍历过程。
(2)中序遍历:可以用来做表达式树,在编译器底层实现的时候用户可以实现基本的加减乘除,比如a*b+c。
(3)后序遍历:可以用来实现计算目录内的文件占用的数据大小。
统计文件夹的大小过程如下:
若要知道某文件夹的大小,必须先知道该文件夹下所有文件的大小,如果有子文件夹,若要知道该子文件夹大小,必须先知道子文件夹所有文件的大小。这是一个典型的后序遍历过程。
43.孤儿进程&守护进程
1.孤儿进程
1.什么是 孤儿进程
如果一个子进程的父进程先于子进程 结束, 子进程就成为一个孤儿进程,它由 init 进程收养,成为init
进程的子进程。
2.那么如何让一个进程变为一个孤儿进程呢?
我们可以先创建一个进程,然后杀死其父进程,则其就变成了孤儿进程。
pid = fork();
if(pid > 0) {
exit(0);
}
2.守护进程
1 . 什么是守护进程呢?
( daemon) 是指在后台运行,没有控制终端与之相连的进程。它独立于控制终端,通常周期性地执行某种任务 。
2. 为什么要引入守护进程:
由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。
但是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时才退出。如果想让某个进程不因为用户或终端或其他地变化而受到影响,那么就必须把这个进程变成一个守护进程。
更多学习请参考。
44.内存泄漏是啥
内存泄漏也称作"存储渗漏",用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。
(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。
原因举例:
(1)调用new或者malloc申请内存后没有主动调用delete或者free。
(2)在使用多态特性时,基类的析构函数没有设置为虚函数,导致派生类的析构函数没有被调用。
45.链表的应用场景
(1)LRU缓存机制(可以用双向链表+哈希表)
(2)操作系统的文件系统中,隐式链接
46.全局变量的缺点
全局变量:定义在函数外部的变量,作用于为整个源程序。
全局变量的说明符为extern
,但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
缺点
(1)长期占用内存
(2)难以定位全局变量在哪里被修改,加大调试难度
(3)降低函数可读性,破坏函数的封装性能,增加程序之间的耦合性
47.快排
void Quiksort(ElemType A[],int low,int high){
if(low<high){
//Partition()是划分操作,将原表划分成2表
int pivot=Partition(A,low,high);//划分
QuickSort(A,low,pivot-1);
QuickSort(A,pivot,high);
}
}
int Partition(ElemType A[],int low,int high){
ElemType pivot=A[low];//将当前表中第一个元素设为枢轴,对表进行划分
while(low<high){ //循环跳出条件
while(low<high&&A[high]>=pivot) --high;
A[low]=A[high];//将比枢轴小的元素移动到左端
while(low<high&&A[low]<=pivot) ++low;
A[high]=A[low];//将比数轴大的元素移动到右端
}
A[low]=pivot;//枢轴元素存放到最终位置
return low;//返回存放枢轴的最终位置
}
48.SYN攻击
简单说: 在三次握手中,第二个包(服务器发给客户端)后,客户端不响应,当服务器的连接量满了后就无法正常响应请求。
服务端在收到SYN信号后会将ACK信号和新的SYN信号返回给客户端,并将该连接计入半连接队列数目中,当半连接数目大于系统设定的最大值(/proc/sys/net/ipv4/tcp_max_syn_backlog)时系统将不能再接收其他的连接,所以攻击者利用这个原理,在服务器向客户端发送SYN和ACK信号后不做任何回应,这样链接将一直不会被释放,直到累计到链接最大值而不能再创建新的链接,从而达到了让服务器无法响应正常请求的目的。
49.文件描述符
(1)文件描述符:
文件指针数组的索引;默认0是输入,1是输出,2是错误。
每个进程被创建时,files文件指针数组的前三位被填入默认值,分别指向标准输入流、标准输出流、标准错误流。
栗子:C语言的printf
函数是向命令行打印字符,但从进程的角度看,就是向files[1]写入数据,scanf
函数就是进程向file[0]这个文件中读取数据。
(2)一般计算机中,输入流是键盘,输出流是显示器,错误流也是显示器,即上图的进程、内核和键盘和显示器“连了”3根线——硬件由内核管理,进程通过系统调用让内核进程访问硬件资源。
Linux中一切都被抽象为文件,即设备也是文件(可进行读和写)。
(3)栗子:打开一个文件进行读写,通过系统调用,内核把文件打开后该文件被放到files
文件指针数组的文件描述符3位置,如下图:
(4)输入重定向
程序想读取数据时就去files[0]读取,所以只要把files[0]指向一个文件,那程序就能从这个文件中读取数据,此时的数据来源就不是一开始说的键盘了。——如上图
(5)输出重定向
把files[1]指向一个文件,程序的输出就不会写入到显示器,而是写入到该文件中。
小结:Linux中一切皆文件
不管是设备、另一个进程、socket 套接字还是真正的文件,全部都可以读写,统一装进一个简单的files数组,进程通过简单的文件描述符访问相应资源,具体细节交于操作系统,有效解耦
参考资料
50.遇到无法重现的bug怎么办
1.发现的bug应该同一版本进行重现,还原环境、数据、前置条件、操作步骤
2.考虑是否是接口数据处理的原因,通过查看log分析原因
3.再次确认用例设计的覆盖度及周密性,考虑是否有所遗漏
4.与开发人员配合复现bug
5.绞尽脑汁,它仍然不能复现时,只能保持关注
6.思考测试流程及测试规范,及时更正走过的弯路,制定提交bug的规范,便于开发及我们自己复现
51.你有啥问题要问我吗
一、借着这个机会,深入的了解你要面试岗位的一些具体要求
二、具体了解一下,面试岗位未来的发展状况是什么样的?
三、公司和部门的组织架构是怎么安排的?
四、进入公司以后,公司的培训体系将如何安排?
52.常用的设计模式
设计模式是对设计原则的具体化。即总结出来的一些固定套路,可以帮助有根基的程序员迅速打通任督二脉,从此做什么都特别快。常用的模式及其场景如下。
1) 单例模式。
单例模式是一种常用的软件设计模式。
在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
应用场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
2) 工厂模式。
工厂模式主要是为创建对象提供了接口。
应用场景如下:
a、 在编码时不能预见需要创建哪种类的实例。
b、 系统不应依赖于产品类实例如何被创建、组合和表达的细节。
3) 策略模式。
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化独立于使用算法的客户。
应用场景如下。
a、 一件事情,有很多方案可以实现。
b、我可以在任何时候,决定采用哪一种实现。
c.、未来可能增加更多的方案。
d、 策略模式让方案的变化不会影响到使用方案的客户。
举例业务场景如下。
系统的操作都要有日志记录,通常会把日志记录在数据库里面,方便后续的管理,但是在记录日志到数据库的时候,可能会发生错误,比如暂时连不上数据库了,那就先记录在文件里面。日志写到数据库与文件中是两种算法,但调用方不关心,只负责写就是。
4) 观察者模式。
观察者模式又被称作发布/订阅模式,定义了对象间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
应用场景如下:
a、对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
b、对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
5) 迭代器模式。
迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
应用场景如下:
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式。其实stl容器就是很好的迭代器模式的例子。
6) 模板方法模式。
模板方法模式定义一个操作中的算法的骨架,将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
应用场景如下:
对于一些功能,在不同的对象身上展示不同的作用,但是功能的框架是一样的。
53.阻塞&非阻塞
阻塞:程序在等某操作完成前,自身无法继续完成干别的事
非阻塞:程序在等某操作完成前,自身可以继续完成干别的事
54.了解CUDA吗
统一计算设备架构(Compute Unified Device Architecture, CUDA),是由NVIDIA推出的通用并行计算架构。解决的是用更加廉价的设备资源,实现更高效的并行计算。
问:std::thread它不香吗,为什么要用cuda?
答:cuda是英伟达(NVIDIA)推出的——是英伟达提出GPU的概念。和中央处理器(Central Processing Unit, CPU)相对,图形处理器(Graphics Processing Unit, GPU)是显卡的核心芯片。而cuda正是暴露了英伟达开发的GPU的编程接口。
几乎所有的编程语言,不使用特定框架,都只能实现CPU编程——std::thread也是将线程开在CPU中。而不同于每一位程序员都接触过的CPU编程,GPU编程可以使用更多的流处理器、更多的线程数。
具体参考:https://zhuanlan.zhihu/p/146431357
54.负载均衡
后端开发经常接触到 Nginx,比如美团的 Oceanus 框架,是一款 HTTP 服务治理框架,这个框架就是基于 Nginx和 ngx_lua 扩展的,主要提供服务注册与发现、动态负载均衡功能,日常的开发学习中,如果你想弄懂公司的 Oceanus ,Nginx 知识肯定是必不可少的,所以在面试中也会被问及 Nginx 相关知识。
(1)Nginx,使用最多最常见的,很多公司自己的负载均衡框架都是基于 Nginx 开发的。
(2)LVS(3)HAProxy(4)F5,硬件负载均衡,价格昂贵。
1.异步非阻塞 I/O
I/O 分两种,网络 I/O,读取 socket,另一种是磁盘 I/O,读取磁盘数据。我们知道计算机的 CPU 执行代码的速度极快,然而一旦遇到IO 操作,如读写文件、发送网络数据时,就需要等待IO操作完成。这样做CPU大部分都是在等待,等待蜗牛般速度的磁盘 IO 操作,这极大的浪费了 CPU 的性能,很显然,这种设计是不合理的,如果一个进程想要执行一个 read() 或 write() 同步调用,那么进程必须等到硬件完成 I/O 操作后才能进行下一步操作,这叫做同步调用。
Nginx 为了提供并发能力,避开了这种同步阻塞的设计,采用异步,非阻塞,使用 epoll 多路复用模型,这是 Nginx 支持高并发的灵魂所在
2.面试
无论使用哪种方案,目的都是要解决同样的问题,掌握其中一个框架的原理后,再看其它几个一定不会觉得吃力。在大公司,如果你是一名开发人员,你可能不会直接接触 Nginx 配置,会有专门的运维人员去做这件事,但是这不代表你可以不会,Nginx 的很多设计思想值得每个优秀的开发者学习,使用太广泛,如果做二次开发,Nginx 可以说架构师必须掌握的基础知识,面试经常会问 Nginx 如何实现高并发?你需要知道异步,非阻塞,epoll,需要知道 Master Worker 模型,Nginx常见的优化配置?为什么 Nginx 不使用多线程?
更多参考:https://blog.csdn/leilei107/article/details/106066799
55.非关系型数据库
NoSQL数据库(非关系型数据库)是用于存储和检索数据的非关系数据库系统。在当今世界,我们不应该只以没有预定义固定模式的表格式存储所有数据(固定没有列)。像用户生成的数据、地理位置数据、物联网生成的数据一样,社交图是真实世界数据呈指数级增长的例子。这些庞大的数据也需要大量的处理。这时NoSQL数据库就出现了。
1.优点
(1)可以存储和退休的文件,键值,图形为基础的数据容易和更快。
(2)可以很容易地避免复杂的SQL连接操作。
(3)易于使用NoSQL DBs对实际问题(web和企业业务应用程序)进行水平伸缩。
Carlo Strozzi是在1998年引入NoSQL术语的。使用NoSQL的动机——设计的简单性、对机器集群的水平扩展
2.NoSQL数据库类型
(1)文档数据库——这些数据库通常将每个键与称为文档的复杂数据结构配对。文档可以包含键数组对、键值对甚至嵌套文档。示例:MongoDB、Apache CouchDB、ArangoDB、Couchbase、Cosmos DB、IBM Domino、MarkLogic、OrientDB。
(2)键值存储——每个单独的项都存储为键值对。键值存储是所有NoSQL数据库中最简单的数据库。示例:Redis, Memcached, Apache Ignite, Riak。
(3)宽列存储——这些类型的数据库针对大型数据集上的查询进行了优化,它们将数据列存储在一起,而不是行。示例:Cassandra,Hbase,Scylla。
(4)图形存储——这些存储关于图形、网络的信息,例如社会关系、路线图、交通链接。示例:Neo4j,AllegroGraph。
更多参考:https://wwwblogs/jerryliuxin/p/12194613.html
56.https和http区别
57.对redis了解吗
58.讲讲token值,过程
——————更新ing,期待您的补充————————
如有错误,谢谢指出~
PS:考研复试面试可能会根据简历、成绩单、个人经历具体提问。
附:
程序员修炼之道-摘抄
(1)知识组合策略:
1)定期投资,定时为自己的知识组合投资
2)多样化,知道的越多,你的价值就越大。熟悉的技能越多,越能适应变化
3)风险管理,不要把所有的技术鸡蛋都放在一个篮子里
4)低买高卖,在一项新兴技术很流行时就开始学习
5)重新评估调整,目标更换
(2)获取知识的途径:
1)每月读一本技术书,也读非技术书(方法流、心流、管理经验等)
2)上课、了解他人(知乎博客)
3)与时俱进,了解不同技术,博客,技术新闻等,如unity的热更方式
(3)珍惜学习的机会,好奇心和专研精神;当你进入舒适区,说明你要前进了。
(4)修复bug的注意点:
1)赋值bug,直接用指令进行欂栌bug
2)报错信息,不仅要注意报错的地方,还要注意上下文
3)版本回退,回退前一周的代码,还没出问题前,看是否改动了什么
4)初步打印法
5)排除法,变量控制法,删除一部分改动,看是否能重现
(5)bug的思考
1)这个bug是直接结果吗?还是间接表现,或者说是局部问题
2)如果想和其他同事解释这个问题,要怎么解释
(6)人很容易陷入 不可能的心态
(7)全局化,静态实物很危险(耦合性)
继承,子类很危险(耦合性)
链式调用,中间变量很危险
(8)响应式应用,FSM,观察者模式,订阅发布
(9)继承税,继承好但是也很容易出错,因为继承就是耦合
替代继承的方式,接口和协议,委托,mixin和特征
(10)不要依赖巧合编程(尝试向别人解释代码)
(11)尽早重构,经常重构
(12)需求是反馈循环中学到的
(13)《人月神话》软件项目管理
(14)不要搁置烂代码,要不立马修复,要不标记需要修复,把整个代码结构当成房子,应该是非常精美的房子,而不是破破烂烂的房子,后来住的人不能打破窗户。这种层次就是抽象了整个项目代码,应该协调好所有的代码资源。
(15)ETC(easy to change)的价值标准去写代码,决定要不要做的行为最终考量的标准——是否做了之后容易改动。不管是解耦,命名,ui框架都是为了更好的去改变复用。
reference
(1)C++面向对象入门这一篇就够了
(2)gcc编译过程简述
版权声明:本文标题:【吊打面试官】计算机基础知识 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1729032804h1309363.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论