大厂面试知识点总结

文章目录

  • 大厂面试知识点总结
  • 操作系统&计算机组成原理
    • 操作系统的一般功能
    • 操作系统结构
    • 并发与并行 concurrency和parallelism
    • 进程,线程和协程
    • 进程之间通信的方式(8种)
    • 阻塞与非阻塞, 同步与异步
    • I/O操作分类(软件访问硬件)
    • 分页,分段,虚拟地址
  • 计算机网络
    • 浏览器输入一个URL(域名),到显示界面的过程
    • TCP和UDP
    • TCP
    • UDP
    • HTTP和HTTPS
      • HTTP
      • HTTPS
      • **HTTP不同版本(1.0,1.1,2.0)**
    • SSL和TLS
  • C/C++
    • 语法相关
      • const
      • #define
      • static
      • this指针
      • inline 内联函数
    • **预编译,编译,汇编,链接**
    • 虚函数,纯虚函数
    • 多态性
      • **C++多态类型**:
      • 动态多态:基于**继承机制和虚函数**来实现的。
      • 静态多态:编译时实现
        • 由**模板**具现完成,也就是实例化模板,赋实参时实现。
        • 函数多态:基于函数重载。
        • 宏多态:基于带变量的宏实现。
    • C++ 11中的几种锁
      • 1. 互斥”锁 “ mutex
      • 2. 条件锁(condition variable)
      • 3.自旋锁(不推荐使用)
      • 4.递归锁
    • C++ 11的新特性
      • 新模板
      • 新语法
  • Python
    • 参数传递(值传递,引用传递)
    • 拷贝(直接赋值,深拷贝,浅拷贝)
  • JAVA
    • 基础概念:
  • 数据库
    • 数据不一致性
    • 事务隔离级别
  • 数据结构与算法
    • 二叉树
      • 完全二叉树:
    • AVL树
    • 红黑树
    • 堆排序
      • 代码实现
    • 最大堆和最小堆
      • 典型面试题型:TopK算法
    • 七大排序

操作系统&计算机组成原理

操作系统的一般功能

  • 进程管理:进程管理的主要作用就是任务调度,在单核处理器下,操作系统会为每个进程分配一个任务,进程管理的工作十分简单;而在多核处理器下,操作系统除了要为进程分配任务外,还要解决处理器的调度、分配和回收等问题
  • 内存管理:内存管理主要是操作系统负责管理内存的分配、回收,在进程需要时分配内存以及在进程完成时回收内存,协调内存资源,通过合理的页面置换算法进行页面的换入换出
  • 设备管理:根据确定的设备分配原则对设备进行分配,使设备与主机能够并行工作,为用户提供良好的设备使用界面。
  • 文件管理:有效地管理文件的存储空间,合理地组织和管理文件系统,为文件访问和文件保护提供更有效的方法及手段。
  • 提供用户接口(I/O):操作系统提供了访问应用程序和硬件的接口,使用户能够通过应用程序发起系统调用从而操纵硬件,实现想要的功能

操作系统结构

  • 单体系统

    整个系统在内核态以单一程序的方式运行,主程序+服务程序+实用程序

  • 分层系统

    用层来分隔不同的功能单元,每一层只与该层的上层和下层通信

  • 微内核

    客户-服务器模式,将进程分成两类:

    • 服务器:用于提供服务
    • 客户端:使用这些服务

并发与并行 concurrency和parallelism

并发: 几个程序在同一个CPU上“同时”运行,但在任意一个时间点上,只有一个程序在CPU上运行;单核CPU不可能真正意义上同时运行不同程序

并行:当操作系统有多个CPU时,不同CPU分别运行不同程序

进程,线程和协程

进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;

线程进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发

协程是异步机制,而线程和进程都是同步机制,协程是一种用户态的轻量级线程(也称微线程), 一个线程/进程可以拥有多个协程

进程之间通信的方式(8种)

  • 匿名管道通信

    管道是一种半双工的通信方式,数据只能单向流动

  • 高级管道通信

    将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程

  • 有名管道通信(named pipe)

    有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

  • 消息队列通信

    一种异步的服务间通信方式

  • 信号量通信

    不同进程/线程之间的同步手段,多用于进程间的同步和互斥

  • 信号

    用于通知进程某个事件已经发生

  • 共享内存通信

    映射一段多个进程都可以访问的内存(即共享)

  • 套接字通信

    可以用于不同机器之间的进程通信

阻塞与非阻塞, 同步与异步

阻塞是指调用线程或者进程被操作系统挂起

非阻塞是指调用线程或者进程不会被操作系统挂起。

同步是阻塞模式,进程需要等待请求的反馈才能继续(被挂起)

异步是非阻塞模式,进程不用等待反馈就继续,不用管其他进程状态

I/O操作分类(软件访问硬件)

软件方式:

  • 直接访问
  • 中断访问

硬件方式:

  • DMA(直接内存访问):不需要CPU介入,独立读写系统内存
  • 通道控制方式:对DMA的发展,使CPU参与数据传输的控制减少

分页,分段,虚拟地址

分段是为了使程序和数据可以被划分为逻辑上独立的地址空间,并且有助于共享和保护;对程序员不透明(汇编语言内要分段,代码段,数据段,堆栈段…)

​ 逻辑地址,划分为段首地址+段内偏移量,需要替换成物理地址

分页是为了提高内存利用率,实现虚拟地址,获得更大的地址空间,对程序员透明;

​ 虚拟地址,划分为页目录表首地址+页表首地址+页内偏移量,需要替换成逻辑地址——>再换成物理地址

计算机网络

浏览器输入一个URL(域名),到显示界面的过程

1.查找域名对应的IP地址(DNS解析)

  • 在本地查找域名的 IP 地址 host文件等
  • 发到本地DNS服务器查找
  • 根DNS服务器查找

2.建立TCP连接

​ 三次握手过程

3.发送HTTP请求,服务器返回HTTP响应文档

​ 服务器返回HTTP报文。HTTP面向事务,不建立连接(无连接)

4.浏览器解析渲染页面

​ 收到HTML响应后渲染,绘制网页

5.断开TCP连接

​ 四次挥手

TCP和UDP

是否面向连接 可靠性 传输形式 传输效率 消耗资源 应用场景 首部字节
TCP 面向连接 可靠 字节流 文件/邮件传输 20~60
UDP 无连接 不可靠 数据报文段 视频/语音传输 8

TCP

TCP是面向连接(传输数据前先建立连接/信道),一对一的可靠传输协议

首部:20个字节是固定的,可以根据需要增加更多字节,最短为20Byte

包含源端口,目的端口,序号(每一个字节流都按顺序编号),确认号(期望收到对方下一个字节流的序号),数据偏移(报文首部的实际长度),6个控制位,窗口(自己的接收窗口),校验和,紧急指针

正常传输的时候:每一个报文的序号seq=上一个收到的报文确认号ack;每一个报文的确认号ack=上一个收到的报文序号seq+1

建立连接:三次握手

A发起连接请求,B回复ack,A再确认B的ack

原因/为什么多一次握手:

  • 确认双方的接受能力,发送能力是否正常
  • 指定自己的初始化序列号,为后面的可靠传送做准备
  • 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误
  • 防止服务器端资源浪费,第三次握手不成功时服务器端及时释放资源

释放连接:四次挥手

A发连接释放报文段(FIN=1),B收到后发完剩下数据+确认,A再次确认并等待一段时间(2MSL)

原因/为什么TIME WAIT:

  • 预防第四次握手(A的ack确认)报文丢失,以备重传
  • 确保本次连接相关的所有报文从网络中消失

有效传输,拥塞控制

拥塞控制原理:

  • 慢启动阈值 + 拥塞避免

    指数级慢慢翻倍窗口大小 ,达到阈值后改为累加(拥塞避免)

  • 快速重传

  • 快速恢复

UDP

UDP无连接,不保证可靠传输,可以一对一,一对多,多对多

首部:8个字节,源端口,目的端口,(数据报)长度,校验和

HTTP和HTTPS

HTTP

HTTP 是应用层的超文本数据传输协议,在TCP连接建立后传输数据(面向事务),无连接,无状态(服务器不记得客户)

HTTP状态码:

  • 1xx:表示目前是协议的中间状态,还需要后续请求
  • 2xx:表示请求成功
  • 3xx:表示重定向状态,需要重新请求
  • 4xx:表示请求报文错误
  • 5xx:服务器端错误

常用状态码…(抄)

常用方法:GET, HEAD, POST, PUT, DELETE…

HTTPS

因为HTTP不安全,传输时有可能被截获,修改或伪造发送者。

原理: HTTP + SSL(TLS) = HTTPS

三个关键指标:加密(Encryption),数据一致性(Data integrity),身份认证(Authentication)

HTTP不同版本(1.0,1.1,2.0)

  • HTTP/1.0 每次请求都需要建立一个TCP连接,服务器处理完请求就断开TCP连接
  • HTTP/1.1 TCP连接默认不关闭,可以被多个请求复用
  • HTTP/2.0 多路复用,同一个连接里,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一对应

SSL和TLS

SSL/TLS是于在互联网两台计算机之间用于身份验证加密的安全协议,公钥加密,私钥解密;介乎于TCP和HTTP之间,替代了HTTP通信接口。

TLS是SSL的升级版。

C/C++

语法相关

const

作用:

  • 修饰变量,指针,成员函数(表示该函数不能修改成员变量),不能修饰引用
  • 指针分为指向常量的指针(pointer to const)和自身是常量的指针(const pointer)

#define

和const区分:

宏定义 #define const 常量
宏定义,相当于字符替换 常量声明
预处理阶段处理 编译阶段处理
无类型安全检查 有类型安全检查
不分配内存 要分配内存
存储在代码段 存储在数据段
可通过 #undef 取消 不可取消

static

  1. 修饰普通变量,修改变量的存储区域和生命周期(被定义的整个文件内有效),使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。
  2. 修饰普通函数,表明函数的作用范围,该函数仅在被定义的文件内才能使用。在多人开发项目时,为了防止与他人命名空间里的函数重名,可以将函数定位为 static。
  3. 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。
  4. 修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数内不能访问非静态成员

this指针

  • 指向调用该成员函数的那个对象,相当于Python里的self。当对一个对象调用成员函数时,编译程序先将对象的地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用 this 指针。

  • 在以下场景中,经常需要显式引用this指针:

    • 为实现对象的链式引用,比如用return *this返回当前对象本身
    • 为避免对同一对象进行赋值操作,用this进行区分
    • 在实现一些数据结构时,如 list

inline 内联函数

相当于把内联函数体直接写在调用内联函数的地方,内联函数同宏函数一样将在被调用处进行代码展开,省去了参数压栈、栈帧开辟与回收,结果返回等,从而提高程序运行速度。

预编译,编译,汇编,链接

从代码.cpp生成可执行文件.exe的过程:

  • 预编译:展开宏定义,头文件,去除注释等,得到纯净的.c文件
  • 编译:对.c进行语法和语义检查,得到汇编文件
  • 汇编:生成二进制文件
  • 链接:把所有目标文件链接成一个可执行文件.exe

虚函数,纯虚函数

虚函数的作用是允许在子类中重新定义与父类同名的函数,并且可以只通过父类指针或引用来访问父类和子类的同名函数(后者即虚函数),即统一了同名函数的调用方式,带来便利。

代码:函数声明前加virtual,一般在基类声明时加上(子类的同名函数也会自动变虚函数)

每个含有虚函数的类都有一个虚函数表(v-table),虚函数表可以继承

纯虚函数:在**基类**中声明的虚函数,在基类中没有定义,但要求任何派生类都要定义自己的实现方法;包含纯虚函数的类称为抽象类,不能实例化

作用:为了更方便地使用多态性,而且也更贴合实际(比如“动物”不应该有具体实例,派生类“虎”“兔”才有)

代码:virtual,参数加“=0”

多态性

定义:同一种事物所表现出的多种形态,“一个接口多种实现”, 比如不同动物叫声不同(但都是"动物"类的子类对象)

类型(两种):

  • 静态的,编译时的多态性,重载来实现
  • 动态的,运行时的多态性,虚成员来实现

C++多态类型

动态多态:基于继承机制和虚函数来实现的。

静态多态:编译时实现

C++ 11中的几种锁

1. 互斥”锁 “ mutex

多线程编程中的互斥锁,即mutex(互斥量)

用于提供访问保护,保护变量被读写时不被其他线程修改,当前线程读写完成后一定要释放锁,否则会导致死锁

2. 条件锁(condition variable)

就是所谓的条件变量,在相应条件为满足时令线程处于阻塞状态;条件满足时则唤醒该线程

3.自旋锁(不推荐使用)

自旋锁是一种基础的同步原语,用于保障对共享数据的互斥访问

与互斥锁的对比:在获取锁失败的时候不会使得线程阻塞而是一直自旋尝试获取锁,当线程等待自旋锁的时候,CPU不能做其他事情,而是一直处于轮询等待的状态。互斥锁是sleep-waiting,自旋锁是busy-waiting

自旋锁主要适用于被持有时间短,线程不希望再重新调度上花费过多时间的情况。

4.递归锁

recursive_mutex 是同步原语,能够保护共享数据免受多个线程同时访问

C++ 11的新特性

新模板

lambda匿名函数, tuple, array, forward_list

新语法

for的新写法,auto关键字

Python

参数传递(值传递,引用传递)

不可变对象:地址和值都不可变,包括数字,字符串,元组

可变对象:地址不可变,值可变,包括列表,字典,集合

不可变对象的传递都属于值传递

可变对象的传递属于引用传递

拷贝(直接赋值,深拷贝,浅拷贝)

直接赋值:就是对象的引用,父对象和子对象都一样

浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

深拷贝(deepcopy): copy 模块的deepcopy 方法,完全拷贝了父对象及其子对象。

JAVA

基础概念:

JVM: Java Virtual Machine Java虚拟机

JRE: Java Runtime Environment Java运行环境

JDK: Java Development Kit Java开发工具包

Java语言特点:

  • 简单易学(Java语言的语法与C语言和C++语言很接近
  • 面向对象(封装,继承,多态)
  • 平台无关性(Java虚拟机实现平台无关性,不受计算机端本身约束)
  • 支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的)
  • 支持多线程(多线程机制使应用程序在同一时间并行执行多项任)
  • 健壮性(Java语言的强类型机制、异常处理、垃圾的自动收集等)
  • 安全性

数据库

数据不一致性

  • 数据冗余造成

  • 并发操作造成数据不一致

    • 丢失修改
    • 不可重复读
    • 读“脏数据”
  • 由于各种故障,错误造成

事务隔离级别

排序由高到低,来避免数据不一致性,分别为:

  • Serializable(序列化)
  • Repeatable read(可重复读)
  • Read Committed(已提交读)
  • Read Uncommitted(未提交读) 会有“脏读”的问题

数据结构与算法

二叉树

完全二叉树:

  • 若设二叉树的深度为h,除第h层外,其它各层(1~h-1) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树
  • 节点数目相关公式:2h−1−1<N≤2h−12^{h-1}-1<N\leq2^{h-1}2h−1−1<N≤2h−1, 其中NNN为完全二叉树节点数

AVL树

左右子树的高度差绝对值不超过1

平衡因子BF=左子树高度−-−右子树高度

是高度平衡的,频繁插入和删除会引起频繁调整导致效率下降

红黑树

特征:

  • 每个节点不是红色就是黑色
  • 根节点为黑色
  • 没有连续的红色节点
  • 每个节点到叶子节点的路径上黑色节点数目相同
  • NULL节点是黑色

结论:任意一个节点到叶子节点,红黑树保证最长路径不超过最短路径的二倍,因而近似平衡

红黑树不是高度平衡的。 插入,删除,和查找很高效。

堆排序

代码实现

两个子函数:堆调整(adjust)和swap

排序过程:先建堆,再进入循环:swap堆顶和数组末尾

void heapSort(int arr[], int size)
{for(int i=size/2 - 1; i >= 0; i--)  // 对每一个非叶结点进行堆调整(从最后一个非叶结点开始){adjust(arr, size, i);}for(int i = size - 1; i >= 1; i--){swap(arr[0], arr[i]);           // 将当前最大的放置到数组末尾adjust(arr, i, 0);              // 将未完成排序的部分继续进行堆排序}
}

最大堆和最小堆

最大堆:每个结点的值都大于或等于其左右孩子结点的值

最小堆:每个结点的值都小于或等于其左右孩子结点的值

典型面试题型:TopK算法

大量数据中找出Top K(前K个)元素,适合用堆解决

维护一个大小为K的大顶堆:按顺序遍历N个元素并插入堆中,直到堆满。

然后堆顶和下一个元素比较,

​ if 堆顶>=下一个元素 忽略

​ if 堆顶<下一个元素 将堆顶抛弃,然后下一个元素插入堆中

如此反复,遍历完所有数据,堆里的就是Top K个元素

空间复杂度:O(K)(内存中只需维护一个很小的堆)

时间复杂度:O(Nlog(K))(内存中只需维护一个很小的堆)

七大排序

稳定排序:冒泡排序,简单选择排序,直接插入排序,归并排序

不稳定排序:希尔排序,堆排序,快速排序

排序方法 平均情况 最好情况 最坏情况 辅助空间 稳定性
冒泡排序 O(n^2) O(n) O(n^2) O(1) 稳定
简单选择排序 O(n^2) O(n^2) O(n^2) O(1) 稳定
直接插入排序 O(n^2) O(n) O(n^2) O(1) 稳定
希尔排序 O(nlogn)~O(n^2) O(n^1.3) O(n^2) O(1) 不稳定
堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不稳定
归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 稳定
快速排序 O(nlogn) O(nlogn) O(n^2) O(logn)~O(n) 不稳定

互联网面试知识点总结(算法,后端)相关推荐

  1. 互联网面试知识点总结(三)- 计算机网络篇

    互联网面试知识点总结(三)- 计算机网络篇 ******************************* 概 述 ******************************* 一. OSI七层模型 ...

  2. 后端面试知识点大串烧(蚂蚁美团头条腾讯面试经历)

    笔者在面过 猿辅导,去哪儿,旷视, 陌陌,头条, 阿里, 快手, 美团, 腾讯之后,除了收获一大堆面试问题,还思考到如何成为面试官眼中的"爱技术,爱思考,靠谱,有潜力候选人的"一些 ...

  3. 机器学习算法工程师面试知识点汇总

    机器学习算法工程师面试知识点汇总 机器学习 梯度下降 k-means 1 × 1卷积核 模型 SVM Bagging & Boosting 随机森林 激活函数 Sigmod tanh ReLU ...

  4. 深度学习算法工程师面试知识点总结(四)

    这是算法工程师面试知识点总结的第四篇,有兴趣的朋友可以看看前三篇的内容: 深度学习算法工程师面试知识点总结(一) 深度学习算法工程师面试知识点总结(二) 深度学习算法工程师面试知识点总结(三) 基于t ...

  5. Java 面试知识点解析(七)——Web篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  6. Redis面试知识点

    Redis面试知识点 1.Redis概述 在我们日常的Java Web开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉 ...

  7. java后端面试大全,java后端面试宝典

    文章目录 -2 flink -1 linux of view linux查看占用cup最高的10个进程的命令: 〇.分布式锁 & 分布式事务 0-1分布式锁--包含CAP理论模型 概述 分布式 ...

  8. Java面试知识点(全)- Java面试基础部分三

    Java面试知识点(全)https://nanxiang.blog.csdn.net/article/details/130640392 注:随时更新 文章目录 ThreadPoolExecutor ...

  9. 程序员如何快速准备面试中的算法 - 结构之法

    准备面试.学习算法,特别推荐最新出版的我的新书<编程之法:面试和算法心得>,已经上架京东等各大网店 前言 我决定写篇短文,即为此文.之所以要写这篇文章,缘于微博上常有朋友询问,要毕业找工作 ...

最新文章

  1. html表格中加入斜线,在HTML中显示带斜线的表格
  2. 皮一皮:有一种着急叫做妈妈想你快点脱单...
  3. 河南大学生带着捡来的妹妹求学12年
  4. 汇编语言的程序设计方法(循环结构和分支结构)
  5. HTML5边玩边学(9):俄罗斯方块就是这么简单 之 数据模型篇
  6. IDEA优雅整合Maven+SSM框架(详细思路+附带源码)
  7. deepin 安装cuda 编译 ffmpeg
  8. excel制作录入和查询系统_叮咚!您有一份Excel人员信息查询系统,请您查收~
  9. 如何在 Mac 上映射网络驱动器
  10. 在哪下拼多多上传助手?拼多多软件方法介绍
  11. 电脑开机加速,一下子就提升了20几秒
  12. Hack The Box——Academy
  13. 打印正六边形(C语言)
  14. 蓄电池内阻测试仪分析软件,福禄克 Fluke BT500系列蓄电池内阻测试仪
  15. excel数据处理_有没有可以完全替代并超越excel的表格和数据处理软件?
  16. html头像动画,用CSS3实现头像旋转效动画
  17. Photoshop照片一键转换手绘效果图动作
  18. 华为服务器安装nas系统,服务器 nas 配置
  19. HTML表单基本格式与代码
  20. css 多文件上传框美化

热门文章

  1. JavaScript性能优化8——防抖与节流
  2. 将Discuz快速回帖的表情提取出来
  3. Axure RP Extension for Chrome 修复损坏问题
  4. 360月影写给想成为前端工程师的同学
  5. Maple中的部分特殊函数及其定义
  6. Maple矩阵求导数
  7. vc2010更改项目名称
  8. 什么服务器稳定,什么云服务器稳定
  9. 海量电脑资料17CD
  10. 企业财务管理为何需要数字化转型?