408复试
- 0x01 数据库
- 0x02 计算机网络
- 0x03 操作系统
- 0x04 计算机组成原理
- 0x05 数据结构
- 0x06 面向对象程序设计
- 0x07 软件开发
- 0x08 拓展知识
⭐️大部分来源原博客按照实际需求压缩和修正了一些
也是用不太到了,就是对本科学习做个简简单单的复习吧.
0x01 数据库
- 事务
数据库事务是数据库运行的逻辑工作单位.
其四大特性ACID:
①原子性A
要么都执行,要么都不执行.
②一致性C
在一个事务执行之前和执行之后数据库都必须处于一致性状态.
③分离性I
并发的事务是相互隔离的,即一个事务的操作及正在操作的数据必须封锁起来,不被其他企图进行修改的事务看到.
④持久性D
意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失.
-
范式
①第一范式:
确保每一列的原子性
②第二范式:
非键字段必须依赖于键字段
③第三范式:
在第二范式的基础上,不存在传递依赖 -
视图
一种虚拟的表,具有和物理表相同的功能,对视图的修改不会影响基本表.
优点:
简化操作,把经常使用的数据定义为视图;
安全性,视图随着基表的变化而更新,但不会通过视图修改基本表的数据;
可以合并分离的数据,创建分区视图,更好的实现数据的对比.
缺点:
性能,SqlServer必须把视图的查询转化成对基本表的查询,如果视图是由一个复杂的多表查询所定义,那么即使是一个简单查询SQLServer也会把它变成一个复杂的结合体.
修改限制,当用户修改视图的某行时,SqlServer必须把它转换成基本表某行的修改,对于复杂视图来说可能是不能修改的.
总之,视图的特性导致的安全性这一优点,同样也造成了复杂视图的操作困难,影响性能.
-
游标
是对查询出来的结果集作为一个单元来有效的处理,可以定在特定行,所以逐条处理数据时好用. -
锁机制
事务获得锁后,即取得了对数据的控制权,在事务释放它的锁之前,其他事务不能更新此数据.
作用:为了保证数据库事务的一致性,
防止出现脏读、不可重复读、幻读等并发事件,导致可能会发生死锁. -
drop | truncate | delete
直接删除表 | 删除表中数据,再插入时自增长又从1开始 | 删除表中数据,可以加where字句
0x02 计算机网络
-
TCP/IP协议
-
TCP的三次握手四次再见
1、客户端向服务端发送序号请求建立连接
2、服务端收到序号包,发送确认号,同时也发送一个序号
3、客户端对请求的序号包作出确认回应
TCP连接是全双工的,两端都可以先挥手
其中一端完成数据发送任务后,发送一个FIN包来终止,另一端针对这个FIN包回复确认包,
直到另一端也发送请求终止数据包FIN,另一端作出确认应答,并且还要发送一个ACK=1表示确认号有效,如果没有收到这个就可以进行重传.
- TCP和UDP的区别
TCP | UDP |
---|---|
面向连接 | 无连接 |
可靠 | 尽最大努力 |
实时性,工作效率高 | |
点到点 | 一对一;一对多;多对一;多对多的交互通信 |
对系统资源要求多 | 少 |
- 拥塞控制和流量控制
拥塞控制是A与B之间的网络发生堵塞导致传输过慢或者丢包,来不及传输
是一个全局性的过程,涉及到所有主机、路由器以及与降低网络性能有关的所有因素.
流量控制是端到端的控制,原理是通过滑动窗口的大小改变来实现.
- 访问一个网页的过程
- 解析域名对应的IP地址
- 使用ARP地址解析协议获得默认网关的MAC地址
- 组织数据发送给默认网关
- 默认网关具有转发数据的能力,转发给路由器
- 路由器根据自己的协议,选择一个合适的较快的路径转发数据给目的网关
- 目的网关把数据转发给DNS服务器
- DNS服务器查询解析对应的IP地址,并将此IP地址按原路返回给请求这个域名IP的客户端
- 得到对应的IP地址后,客户端三次握手进行连接
- 连接后,使用HTTP协议发送请求数据包给WEB服务器
- WEB服务器收到请求后,通过查询自己的服务器到对应的结果,并将结果按照原路返回给浏览器
- 浏览器收到数据之后,通过浏览器的渲染结果来显示网页
- 浏览器四次再见,断开TCP连接
0x03 操作系统
-
OS特点
①共享 资源可以被多个并发执行的进程使用
②并发 可以在同一时间间隔处理多个进程,需要硬件支持
③虚拟 将物理实体映射成为多个虚拟设备
④异步 进程执行走走停停,每次进程执行速度可能不同,但OS需保证进程每次执行结果相同 -
操作系统的主要功能
-
处理机管理
进程控制、进程同步、进程通信、调度 -
存储器管理
内存分配、内存包含、地址映射、内存扩充 -
设备管理
缓冲管理、设备分配、设备处理- 相关缓冲技术:
①通道技术(使数据传输独立于CPU)
②DMA技术(数据在主存和I/O设备间直接成块传送)
③缓冲技术(硬件缓冲、软件缓冲)
④Spooling技术(使独占设备虚拟为多台设备)
- 相关缓冲技术:
-
文件管理
文件存储空间管理、目录管理、文件读/写保护
-
发展过程
无操作系统(人工操作方式):用户独占、CPU等待人工
单道批处理:内存只保存一道作业
多道批处理:运行多个程序同时存在主存中
分时:及时接收、及时处理,交互性
实时:实时控制、实时信息处理 -
进程和线程
进程是资源分配的最小单位,线程是程序执行的最小单位;
进程有独立的内存空间,不同进程之间不能直接共享其他进程资源,同一进程内的线程是共享进程内存空间;
线程被称为轻量级进程,在进程中包含线程,线程切换对系统开销更小一些,能够提高并发执行的程度,资源利用率和系统吞吐量.
进程三组成:程序段、数据段、PCB
进程切换:
保持处理机上下文->更新PCB->把PCB移入相应队列(就绪、阻塞)->选择另一个进程并更新其PCB->更新内存管理的数据结构->恢复处理机上下文
- 进程通信方式
- 低级通信方式
PV操作P申请资源 | V释放资源
- 高级通信方式
以较高效率传输大量数据的通信方式- 共享存储
使用同步互斥工具共享空间 - 消息传递
进程间以格式化的消息进行数据交换,有中间实体,分为直接和间接两种,底层通过发送消息和接收消息两个原语实现 - 管道通信
两个进程中间存在一个特殊的管道文件,进程的输入输出都通过管道,半双工通信(双向交替通信)
- 共享存储
-
进程的五种状态
①创建
②就绪
③阻塞
④执行
⑤终止 -
管程
由一组数据及这组数据操作的定义组成的软件模块
进程同步互斥工具
封装了同步操作,对进程隐藏了同步细节,简化同步功能的调用 -
线程间的同步与通信类型
- 互斥锁mutex
- 条件变量
- 信号量机制
- 线程的实现方式
- 内核支持线程(核内切换快,开销小,模式间切换慢)
- 用户级线程(节省模式间切换的开销)
- 混合
- 产生死锁的原因
- 互斥资源分配不当
- 进程推进顺序不当
- 处理产生死锁的办法
- 预防死锁
破坏死锁产生的必要条件
①互斥条件
②请求与保持条件
③非剥夺条件
④循环等待条件 - 避免死锁
每当申请一个资源的时候,系统都根据一定算法(e.g.,banker算法)判断是否认可这次申请 - 检测死锁
- 解除死锁
- 饥饿
也是资源分配问题,但是饥饿申请的资源是会被释放的,就是分不到自己而已🐶
饥饿进程可以只有一个,可能处于就绪状态,但是死锁一定是处于阻塞状态(它申请的资源不会被释放=在机场等一艘船)
- FCB包含什么
文件控制块
- 文件指针
上次读写位置 - 文件打开数
多少个进程打开了此文件 - 文件磁盘位置
- 文件的访问权限
创建、只读、读写等
-
页面置换算法
OPT最佳置换算法
先进先出FIFO
最近最久未使用LRU
时钟算法
改进型时钟 -
批处理作业调度算法
先来先服务FCFS
最短作业优先SJF
最高响应比优先HRN -
进程调度算法
先进先出
时间片轮转
最高优先级
多级队列反馈 -
磁盘调度算法
先来先服务
最短寻道时间优先
扫描算法
循环-扫描 -
FAT
分配给文件的所有盘块号都放在FAT中,记录了文件的物理位置 -
中断 | 异常 | 系统调用
中断为了支持CPU和设备之间的并行操作,CPU指令以外的事件发生(强迫中断)
异常表示CPU执行指令本身出现的问题,不能被屏蔽
系统调用是由应用程序请求操作系统提供服务产生,有意的、主动的,要从用户态通过中断进入内核态,应用程序在用户态执行时请求系统调用.
- 处理机调度
- 高级调度
后备作业->内存 - 中级调度
进程->外存 - 低级调度
进程/线程调度
- I/O控制方式
- 程序控制I/O方式,CPU和I/O设备只能串行
- 中断驱动方式
- DMA,仅在开始和结束才需要CPU干预
-
存储器的层次结构
外存
内存
快速缓存
寄存器 -
存储管理方案
分区存储
分页存储
分段存储
段页式存储
虚拟存储
0x04 计算机组成原理
-
冯诺伊曼结构
输入输出,计算单元,控制单元,存储单元 -
高速缓存的作用
连接CPU和内存 -
cache和寄存器区别
cache用来做高速的CPU和低速的主存之间的加速带;
寄存器是暂时存储的CPU组成部分. -
指令系统
CISC复杂指令集
RISC精简指令集 -
流水线
将重复性的过程分成若干个子过程来完成 -
总线和I/O
总线是指数据通信的连接线,有地址、数据、控制指令
I/O方式有程序性、中断性、通道、DMA
0x05 数据结构
- 二叉树
从前序与中序遍历序列构造二叉树:
class Solution {
private:unordered_map<int, int> index;public:TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>& inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {if (preorder_left > preorder_right) {return nullptr;}// 前序遍历中的第一个节点就是根节点int preorder_root = preorder_left;// 在中序遍历中定位根节点int inorder_root = index[preorder[preorder_root]];// 先把根节点建立出来TreeNode* root = new TreeNode(preorder[preorder_root]);// 得到左子树中的节点数目int size_left_subtree = inorder_root - inorder_left;// 递归地构造左子树,并连接到根节点// 先序遍历中「从 左边界+1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素root->left = myBuildTree(preorder, inorder, preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1);// 递归地构造右子树,并连接到根节点// 先序遍历中「从 左边界+1+左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位+1 到 右边界」的元素root->right = myBuildTree(preorder, inorder, preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int n = preorder.size();// 构造哈希映射,帮助我们快速定位根节点for (int i = 0; i < n; ++i) {index[inorder[i]] = i;}return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);}
};作者:LeetCode-Solution
链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/solution/cong-qian-xu-yu-zhong-xu-bian-li-xu-lie-gou-zao-9/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
-
红黑树详解
自平衡二叉查找树
O(log n) -
数据结构——图解AVL树(平衡二叉树)
-
快速排序算法-图文详解
-
C语言——冒泡排序
-
最短路径问题—Dijkstra 算法最详解
0x06 面向对象程序设计
- C++ | Java | Csharp区别
- 都是面向对象语言
- java和c#只支持单继承,c++支持多继承
- java没有指针的概念,但是支持跨平台
- c#像个java的翻版
- 指针和引用的区别
- 指针是一个存储地址的变量,引用是原变量的一个别名
- 指针可以为空,但是引用不能为空
- 指针可以有多级,但是引用只能有一级
- 指针可以重新赋值,而引用只能初始化一次
-
将引用作为函数返回值的好处
在内存中不会产生被返回值的副本 -
三种传参方式
- 值传递
传递的是一个实参的拷贝,修改形参不会改变实参值 - 地址传递
传递的是数组的首地址或指针的值,而形参接收到的是实参的地址,即形参和实参是相同的 - 引用传递
传递的是实参的一个别名,修改形参会改变实参
- const | #define
被const修饰的的变量不能被修改
可以进行调试,因为是在编译运行的时候才起作用.
#define在预处理阶段起作用
只是简单的字符串替换,没有类型检查
有多少地方使用就替换多少次,它定义的宏常量在内存由若干个备份
-
static
修饰的变量在整个文件中都是可见的 -
面向对象的三个要素(基本特征)
-
封装
将客观事物封装成类,隐藏实现细节,模块化代码 -
多态
实现方式-覆盖和重载
覆盖:子类重新定义父类的虚函数 -
继承
子类继承父类功能,对父类功能进行扩展
- 结构体和联合的区别
结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中成员,而结构的所有成员都存在
对结构中成员的赋值是互不影响的.
-
c++是不是类型安全的语言?
不是,因为不同类型间指针可以强制转换 -
基类的析构函数为什么是虚函数
为了防止派生类析构函数未执行,造成资源泄露 -
#include尖括号和双引号区别
<>是标准头文件,“”是非系统头文件 -
为什么有了指针,还要使用引用?
为了支持运算符的重载,更加方便 -
如何避免野指针
声明指针记得初始化,暂时不用就指向NULL;
使用malloc分配内存,必须经过显示释放(free),避免内存泄露.
0x07 软件开发
- 类之间的关系有哪些
- 继承
- 实现 接口
- 依赖 A类的某个方法使用到了B类
- 关联 强依赖关系
- 聚合 一种特别的关联,公司与个人的关系
- 组合 强聚合关系,整体和部分的关系更紧密
-
软件工程标准步骤
问题定义
可行性研究
需求分析
总体设计
详细设计
编码和单元测试
综合测试
软件维护 -
软件测试分类
- 黑盒测试 不考虑软件的内部原理,以用户角度
- 白盒测试 确定每个分支能按照预定正常工作
- 灰盒测试 集合白盒黑盒
- 冒烟测试 测试软件基本功能,快速
- 系统 黑盒类测试
- 性能 负载测试和压力测试
- 安全 假扮黑客侵入系统
- 兼容性 不同平台不同环境
-
自顶向下 | 自底向上测试方法
从程序入口
从最底层模块 -
软件工程三要素
方法, 工具, 过程 -
死代码
永远不会被执行到的代码 -
内聚 | 耦合
内聚:一个好的内聚模块内应当尽量只做一件事,描述的模块内的联系
耦合:各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度
- 软件工程主要模型
- 瀑布模型
- 快速原型
- 增量模型
- 螺旋模型
- 喷泉模型
0x08 拓展知识
也不用多看,对导师方向有些了解就行了
-
什么是数据挖掘
通过算法从大量数据中搜索隐藏其中的信息,
通过分析每个数据,从大量数据中寻找其中规律,主要有数据准备、规律寻找和规律表示三个步骤. -
什么是人工智能
研究开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统.
构造具有智能的人工系统,研究如何应用计算机的软硬件来模拟人类某些智能行为的基本理论方法技术. -
什么是机器学习
对计算机一部分数据进行学习,然后对另一些数据进行预测与判断,
核心是使用算法解析数据,从中学习,然后对新数据做出决定或预测,就像人获取一定的经验,可以对新问题进行预测. -
什么是深度学习
深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字、图像、声音等数据的解释有很大的帮助.使机器模仿视听和思考等人类活动,通过多层处理,逐渐将初始的“底层”特征表示转化为“高层”特征表示后,用“简单模型”即可完成复杂的分类等学习任务. -
什么是计算机视觉
用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像.