计算机网络
TCP位于传输层,IP位于网络层,UPD应用:DNS,媒体流传输,游戏开发,网络管理
TCP/IP有几层?为什么没有物理层
应用层、传输层、网络层、链路层
TCP/IP模型是网络互联的模型,是已构建好的局域网的互联模型,而只有在局域网的构建中才需要考虑物理层
计算机网络中哪里存在流量控制
- 数据链路层、传输层、应用层中,通过停止等待、选择重传、滑动窗口机制实现流量控制
交换机、路由器和集线器三者的区别
集线器是物理层设备,用于将多个设备连接在一起形成局域网,其功能是将收到的信号广播给所有连接的设备。不能隔离广播域和冲突域。
交换机是数据链路层设备,他负责将网络层提供的数据包分割成帧,并对每一帧添加头部和尾部,以便在物理层进行传输。交换机的主要功能是根据目标MAC地址对数据帧进行转发。可以隔离冲突域,不能隔离广播域。
路由器是网络层设备,它通过查询路由表上的IP地址,将数据包转发到合适的接口。既可以隔离冲突域,又可以隔离广播域。
IP地址和MAC地址的区别
IP地址是一个32位或128位的二进制数,通常用点分十进制来表示。MAC地址是一个48位二进制数,通常用冒号分隔的十六进制数表示。
IP地址是用于在广域网上唯一标识一台设备,是逻辑地址,MAC地址用于在局域网上唯一标识一台设备,是物理地址。
在分组转发时,MAC地址进入新的网络会发生变化,IP地址基本不变。
什么是MAC地址,为什么要有MAC地址
MAC地址是用于标识网络设备的唯一地址。
MAC地址起到记录下一跳信息的作用。
在网络通信中,MAC地址被用于识别网络上的设备,以便将数据包正确地发送到目标设备。
网路层设备有哪些
路由器、网关、路由交换机、NAT设备、防火墙
TCP和UDP的区别
可靠性:TCP是面向连接的,是可靠的数据传输。UDP是无连接的,不保证数据可靠性。
流量控制:TCP通过滑动窗口协议实现流量控制,UDP没有流量控制机制。
拥塞控制:TCP通过拥塞窗口协议实现拥塞控制,UDP没有拥塞控制机制。
适用场景:TCP使用与对数据传输可靠性高的应用场景,如文件传输、电子邮件等。UDP适用于对传输速度和实时性要求较高的应用场景,如实时音频传输、在线游戏等。
TCP依靠什么实现可靠传输
确认和重传机制:TCP使用序列号和确认号来跟踪发送和接收的数据,接收方会发送一个确认消息来确认已经收到的数据,如果发送方没有收到确认信号会进行重传,直到收到为止。
流量控制:TCP使用窗口机制来限制对方发送数据的速率,接收方告诉发送方最大的窗口以免数据丢失。
拥塞控制:当网络拥塞时,TCP减少发送数据的速率。
数据校验和机制:TCP使用校验和机制保证数据的完整性和可靠性。
- 内部网关协议有哪些
RIP:小规模,基于距离向量的路由协议,收敛速度较慢,应用层协议,交换自己的路由表
OSPF:基于链路状态的路由协议,可实现快速收敛和负载平衡,网络层协议,交换与自己相连接的所有路由器的链路状态
- B/S和C/S模型
- B/S架构是一种基于浏览器和服务器的应用架构模式,其中浏览器作为客户端,用户通过浏览器发送请求给服务器,服务器接收请求并处理,然后返回客户端,这种架构通常使用Web技术。
- C/S架构是一种基于客户端和服务器的应用架构模式,其中客户端和服务器之间通过网络进行通信。客户端通常是一个独立的应用程序,需要在用户的计算机上安装,用户可以通过客户端程序与服务器进行通信,并在本地处理数据。
- 计算机网络中地址和对应的层
- 数据链路层:MAC地址
- 网络层:IP地址
- 传输层:端口号
- 应用层:URL
- 路由器的作用
- 网络互联:用于连接局域网和广域网,实现不同网络的通信。
- 数据处理:提供分组过滤、分组转发。
- 网络管理:提供路由配置器管理、性能管理、流量控制。
路由器的定义
路由器是一种网络层设备,用与将数据包从一个网络传输到另一个网路。
计算机网络的拓扑结构
- 网状
- 星型
- 环形
- 总线型
- 混合型
- 计算机网络按照覆盖可以划分为什么
- 局域网
- 城域网
- 广域网
网关是什么
网关又称为协议转换器。网关的功能是实现网络之间的相互连接。网关不仅可以让广域网之间相互连接,也可以让局域网之间相互连接。网关在计算机和设备之间起转换的作用,相当于一个翻译器,可以使不同的协议、语言、数据在不同的系统之间进行转换。
拥塞控制算法
- 慢开始:在连接建立之初,TCP会将发送窗口设置为一个较小的值,然后随着数据包的确认返回,逐渐增大发送窗口。
- 拥塞避免:一旦发送窗口达到阈值,TCP会切换到拥塞避免模式,发送窗口开始线性增大。
- 快重传:如果没有在规定的时间内收到对数据包的确认,TCP会立即重传。
- 快恢复:如果连续收到三个相同的确认帧,立即将阈值减半,并将发送窗口设为阈值,然后线性增大。
如何判断是否出现拥塞
丢包率高、延迟高、带宽利用率高
数据链路层三个基本问题
- 封装
- 数据传输
- 差错检验
如何解决这三个问题
- 在数据帧前后添加上头部和尾部
- 使用比特/字节填充
- 奇偶校验、CRC循环冗余检验
HTTPS和HTTP
- HTTP是超文本传输协议,信息明文传输,HTTPS具有安全性的SSL加密传输
- 连接方式不同,端口也不同,前者是80,后者是443
数据结构
Hash函数的特点,如何处理冲突
特点:
- 一致性
- 不可逆性
- 高效性
处理冲突:
- 开放地址法
- 链地址法
- 再哈希法
哈希表适合存储什么样的数据
- 表示的值太大
- 自然数不连续
- 不是自然数
影响哈希表平均查找长度的因素
- 哈希函数
- 装填因子
- 处理冲突的方法
最优和最差相同的排序算法
基数排序,归并排序,桶排序,选择排序
线索二叉树
在线索二叉树中,每个节点除了保存左右树指针之外,还保存了两个附加指针
前驱线索:(先序、中序、后序)中前一个遍历的节点
后继线索:(先序、中序、后序)中后一个遍历的节点
散列表的建立方法
直接定址法
关键码和地址之间存在某个线性函数关系
数字分析法
选取关键码的若干位组合作为散列地址
除留余数法
选择合适的模数,一般要求小于等于表长的最大质数
平方取中法
关键码平方后取中间几位作为地址
折叠法
将关键码分割成位数相等的几位,然后相加求和
随机数法
采用随机函数作为散列函数
二叉树和度为2的树的区别
- 度不同:度为2的要求至少存在一个度为2的节点,而二叉树的要求是度不能超过2
- 结构不同:度为2的树有两个分支,但左右分支没有明确的区分,二叉树的左右子树有明确的区分
- 遍历方式不同:二叉树的遍历方式有前、中、后序遍历,而度为2的树没有明确的中序遍历
DFS和BFS在工程上的实际应用
- 网络爬虫
- 社交网络
- 迷宫问题
- 图像处理
数据结构的存储结构和对应的存储模式
- 线性表:一对一
- 树:一对多
- 图:多对多
关键路径和关键活动
关键路径是指项目中的一系列活动,它们的完成时间直接影响整个项目的完成时间。如果关键路径上的任何一个活动(关键活动)延迟,那么整个项目的完成时间都会推移。
- 图的存储方式
- 邻接矩阵
- 邻接表
- 邻接多重表
- 十字链表
计算机组成原理
缓存调度算法
- 先进先出(FIFO)
- 最近最少使用(LRU)
- 随机替换
中断的过程
- 关中断、保存断点(PC,PSW,程序堆栈,环境信息)、引出中断服务程序
- 保存现场和屏蔽字
- 开中断
- 执行中断服务程序
- 关中断
- 恢复现场和屏蔽字
- 开中断、中断返回
中断向量
中断向量是中断处理程序的入口地址,存放在中断向量表中。
CPU和外设之间数据交换有哪些
- 程序控制方式:用户进程直接控制内存或CPU和外围设备之间的信息传送,这种方式控制者都是用户进程。
- 中断方式:当输入设备将数据准备好后,才向CPU发送中断请求。CPU响应中断请求后暂停当前执行的程序,转去执行中断服务程序。
- DMA方式:通过在IO设备和内存之间开辟一条可以直接传输数据的通路,采用DMA控制器来控制一个数据块的传输。在传输结束后需要CPU的介入。
- 通道方式:和DMA方式类似,CPU介入更少。
南北桥芯片
位于计算机主板上的两个芯片组。
南桥(低速IO)控制着主板上所有的外围设备,如硬盘、USB、网卡等。
北桥(高速IO)负责高速缓存、内存控制器,是连接CPU和内存等高速组件的关键部分。
南北桥架构设计可以实现高效的数据传输和处理,使计算机系统更加稳定和可靠。现代计算机系统中,南桥和北桥芯片组已经融合在一起,成为了一个单一的芯片组。
cache和主存的映射方式
- 直接映射:主存中的地址与cache中的地址一一对应。实现简单,查找快,容易出现冲突。
- 全相连映射:主存中的每一块都能映射到cache中的任意一块。命中率高,查找效率低。
- 组相连映射:主存中的每一块都能映射到cache某一组中的任意一块。结合了前两者的优点,减少了冲突,利用分块查找加快了查找效率。
并行通信和串行通信
- 发送数据数量不同:串行通信是指在单条物理线路上逐位传输数据,并行通信在同一时刻发送多位数据。
- 串行通信的优点是传输距离远,占用资源少,缺点是发送速度慢。
- 并行通信的优点是发送速度快,缺点是传输距离短,资源占用多。
CISC和RISC
Cache是什么,为什么要采用Cache,原理是什么
Cache是一种高速缓存,用于存储最近被访问过的数据,以便快速访问。
解决主存与CPU在速度上的矛盾。
Cache的原理是通过存储器层次结构实现,高速缓存位于最顶部,容量小但速度快,通常由SRAM实现。
下一级是主存,容量较大,速度相对较慢,通常由DRAM实现。
操作系统
简述处理机管理
- 进程控制:通过原语实现,包括进程创建、进程终止、进程阻塞、进程唤醒、进程切换
- 进程同步:通过信号量使得多个进程可以先后有序访问临界资源
- 进程通信:共享存储、消息传递、管道通信
- 死锁处理:资源剥夺法、撤销进程法、进程回退法
- 处理机调度:先来先服务、时间片轮转、短进程优先、优先级调度、高响应比优先
分时操作系统和实时操作系统
- 分时操作系统是指在多道程序环境下,采用时间片轮转技术,多个用户通过终端或网络等方式与计算机交互。常见的分时操作系统有windows,Linux
- 实时操作系统是指在实时环境下进行任务调度和管理的操作系统。实时操作系统要满足对任务响应时间的严格要求,以保证任务的实时性和可靠性。广泛应用于航空航天领域。
进程和程序
- 进程是动态的,程序是静止的。程序是代码的集合,进程是程序的执行。
- 进程是暂时的,程序是永久的。
- 进程包含程序、数据、进程控制块。
- 一个程序可以对应多个进程。
进程和线程
- 调度:线程是调度的基本单位,进程是资源分配的基本单位。
- 资源:线程不拥有资源,进程是拥有资源的基本单位。
- 系统开销:操作系统为进程付出的开销远大于创建线程的开销
编译原理
- C语言编译过程
- 预编译:预处理器将预处理指令(#)处理掉,生成一个新的文本文件,其中包含宏替换、条件编译等信息。
- 编译:编译器将预处理后的源码翻译成汇编语言。
- 汇编:汇编器将汇编语言翻译成机器语言。
- 链接:连接器将目标文件和库文件等链接起来,生成可执行文件。
- 编译过程包括哪些阶段
- 词法分析
- 语法分析
- 语义分析
- 中间代码生成
- 代码优化
- 目标代码生成
- java、c++、c、python的区别
- 编译上:c++和c是编译型语言,python是解释型语言,java既包含编译型语言的特征,又包含解释型语言的特征。
- 应用上:java适合于开发大型复杂的企业级应用程序;c++适合于系统级编程,游戏开发和高性能计算;c语言广泛应用于操作系统、编译器等领域;python适合于数据分析,人工智能领域。
- java是面向对象的,c是面向过程的,c++和python既可以面向对象也可以面向过程。
- 面向对象最大的优势是什么
- 抽象:将实体抽象成对象。
- 封装:将数据和行为打包到一个单独的对象中,提高安全性和可维护性,暴露对外接口。
- 继承:允许程序员从已有的类中派生出新的类,可以重用已有的代码,减少工作量。
- 多态:同一个方法可以被不同的对象调用,产生不同的行为。
图像处理
图形和图像的区别
图形是由几何曲线组成,矢量对象,不会失真
图像是由像素点组成,每个像素包含颜色信息,当图片被放大时容易出现失真的现象
图像正交变换
采用二维矩阵的初等变换找到同形矩阵,使得变换后的结果在不同频率或是时间上是相互正交的。这种正交性使得信号处理更加简单,实现信号的去噪,特征提取,压缩等操作。
数据库
什么是事务
事务是数据库执行的一系列操作序列。在事务中,一组相关的数据库操作必须为一个原子操作执行,也就是说,要么所有操作都成功执行并将更改持久保存到数据库中,要么如果有任何一个操作失败,所有操作都会回滚,撤销之前的修改。
在数据库中,事务是确保数据完整性和一致性的重要机制。
SQL Sever中事务有哪三种语句
- BEGIN TRANSACTION:开始一个事务,并且把事务状态设置为进行中
- COMMIT TRANSANCTION:提交一个事务,如果事务内的所有操作都完成,将事务永久保存到数据库中
- ROLLBACK TRANSANCTION:回滚一个事务,如果事务内的任何一个操作失败,则回滚所有操作并且撤销对数据库的任何修改
数据库并发机制是怎么实现的
- 锁。锁是一种并发控制机制,用于限制对共享资源的访问。数据库中的锁包括共享锁和排他锁,共享锁允许多个用户同时读取数据,但不能修改 ,排他锁不允许其他用户访问数据。
- 事务。保证数据的一致性和完整性
- 死锁检测。
- 多版本并发控制(MVCC)。基于时间戳的并发控制机制,为每个数据库操作分配一个时间戳,可以保证不同操作之间不会互相干扰,从而实现高并发的数据库访问。
数据库索引
- 含义:索引是数据库中一种特殊的数据结构,用于快速查询和访问数据库表中的数据。常见的索引算法:二分查找、分块查找、B树、哈希散列法。
- 优点
- 大大加快索引速度
- 创建唯一性索引,保证数据库表中每一行数据的唯一性
- 加速表与表之间的连接
- 缺点
- 索引需要占用数据表以外的物理存储空间
- 创建索引和维护索引要花费一定的时间
- 对表进行更新的时候,索引也需要相应的更新,降低了数据维护的速度
- 类型
- 唯一索引:每个索引值只对应唯一的数据记录
- 主键索引:一种特殊的唯一索引
- 聚集索引:决定了表中数据的物理存储顺序
主键和外键
主键用来唯一标识一组字段,主键字段必须具有唯一性且不能为空。
外键是与另一张表建立关联的字段,外键字段存储的是另一张表的主键值。外键的值必须存在于对应的主键中。
超键和候选键
- 超键:在关系中能唯一标识元组的组合属性称为关系模式的超键。
- 候选键:是最小的超键。
锁
从数据库系统角度
- 共享锁:又称读锁,允许多个事务同时读取同一个资源,但不允许对该资源进行写操作,防止数据被并发修改。如Select操作。
- 排他锁:又称写锁,只允许一个事务独占一个资源进行写操作,防止其他事务同时读取和写入该资源。如Insert,Update,Delete操作。
- 更新锁:又称“非阻塞排他锁”,既允许读取操作,也允许更新操作,但不允许其他事务获取排他锁,防止多个事务同时进行更新操作导致数据不一致。
从程序员角度
- 悲观锁:在整个数据修改中上锁,其他需要该资源的线程被挂起,直到前面的线程执行完释放资源。
- 乐观锁:假设并不会发生冲突,只在提交的时候检查是否违反数据完整性。
redis和couchbase的区别
- 数据结构:redis支持字符串、列表、哈希表、集合等数据类型,而couchbase只支持json格式。
- 性能:redis只使用单核,而couchbase支持多核。因此在小数据方面redis有优势,在大数量级数据时,couchbase效率更高。
- 一致性:redis提供了事务功能,可以保证一串命令的原子性,而couchbase没有。
- 存储:redis中的数据全部保存在内存中,couchbase中的数据先被保存在内存中,然后再异步保存到硬盘中。
delete和drop、truncate的区别
- delete、truncate用于删除数据表中的数据,truncate删所有数据,delete删部分行。
- drop用于删除表的结构,如删掉一列或整张表。
ACID特征
- 原子性:事务被视为不可分割的最小原子,事务的所有操作要么都成功,要么全部失败回滚。
- 一致性:数据库在事务执行前后都保持一致性状态。所有事务对数据的读取都是一致的。
- 隔离性:一个事务所做的修改在提交之前,对其他事务都是不可见的。
- 持久性:一旦事务提交,所做的修改会永久保存到数据库中。
数据库范式
- 第一范式:一个表中的属性如果不能拆分成多个就说明这个表符合第一范式。
- 第二范式:在第一范式的基础上,每个非主属性完全依赖于任何一个候选码。
- 第三范式:不存在非主属性对候选码存在部分函数依赖或传递函数依赖。
关系模型完整性约束
- 实体完整性:每个表必须有一个主键,且主键值不能为空。
- 参照完整性:外键必须参照另一个表的主键。
- 用户定义完整性:根据用户需要定义一些约束条件。
数据库隔离等级
- 读未提交:允许一个事务读取另一个未提交的数据。
- 读提交:一个事务要等另一个事务提交后才能读取数据。
- 重复读:开始读数据时,可以并发读取,但不能修改。
- 串行化:串行化执行。
存储过程
是大型数据库系统中,一组为了完成特定功能的SQL语句集。是一些预编译的SQL语句,执行效率比较高。
游标
系统为用户开设的一个数据缓冲区,存放SQL执行语句的结果。
ER图
- 1:1
- n:1
- n:m
软件工程
内组件、外组件
- 内组件:在软件内部运行并提供服务的组件,包括库、模块、类、函数。
- 外组件:与软件外部系统或用户进行交互的组件,例如用户界面、Web服务或外部数据源等。外组件通常提供一些接口或API,允许外部系统或用户与它们进行交互并使用其功能。
模块是什么
是一个独立的代码单元,可以包含变量、函数、类等,用于实现一个特定的功能,可以被其他程序或模块调用,以提供相应的功能。
- 独立性
- 封装性
- 可重用性
- 可拓展性
- 可测试性
模块间耦合度
模块之间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系
模块之间的联系越多,其耦合度越强,同时表明其独立性越差
区分模块的要素是什么
功能、逻辑、状态
瀑布模型
包括需求分析、设计、编码、测试、运行与维护
瀑布模型强调每个阶段的顺序和相互依赖关系,必须在上一个阶段完成后才能进入下一个阶段。这种线性的开发方式能够确保软件开发过程的可控性和可预测性。以文档为驱动,适合于软件需求明确的软件项目。
增量模型
融合了瀑布模型的基本成分和原型实现的迭代特征,它假设可以将需求分段为一系列增量产品,每一增量产品可以分别开发。
第一个增量往往是核心的产品,客户对每个增量的使用和评估都作为下一个增量发布的新特征和功能,这个过程在每个增量发布后不断重复,直到产生了最终的完善产品。
喷泉模型
包括分析、设计、实现、维护、演化
喷泉模型是一种相对于传统的瀑布模型而言更加灵活的软件开发过程模型。它以用户需求为动力,以对象作为驱动的模型,适合于面向对象的开发。克服了瀑布模型的局限性,使得开发过程具有迭代性和无间隙性。
CMM模型
是一种软件开发能力评估模型,全称Capability Maturity Model,即能力成熟度模型。将软件开发能力分为五个不同的等级。是软件开发过程的评判标准。
黑盒白盒
- 白盒:结构测试,用于检测软件编码过程中的错误。
- 黑盒:功能测试,主要检测软件的每一个功能是否能够正常使用。在测试过程中,将程序看成不能打开的黑盒子,只通过接口测试,检查程序功能是否按照说明书的规定能够正常打开。
程序和软件的区别
程序是一系列代码或指令的集合,它是实现软件部分功能的代码。
软件是一个更加广泛的概念,它包括程序、数据、文档等多种元素。可以被安装到计算机上,并根据需要进行更新和升级。