博主本人整理资料不易,如果文章对大家有用的话,恳请大家能够动动小手帮忙点个赞,如果能点个关注的话那就更好了…
文章目录
- C和C++的区别
- Java和C++的区别
- 进程调度算法
- 32位系统能上16G内存吗
- DNS的工作过程
- 冯·诺依曼体系结构
- 操作系统的基本概念(什么是操作系统/操作系统的目标和功能)
- 排序相关
- 点击一个链接的网络过程
- 数据库完整性操作
- 面向对象编程和面向过程编程的区别
- 进程上下文切换发生的条件
- 如何编写高效的查询语句
- 操作系统有哪些部分
- 什么是封装、继承和多态
- Spring IOC 和 AOP
- 贪心算法
- 动态规划算法
- 迪杰特斯拉最短路径
- 快速排序和插入排序哪个更高效
- 中断具体是什么操作的
- 中断隐指令
- 范式的定义
- 数据库的事务
- 事务的四个特性ACID
- 索引建的多好还是少好
- TCP/IP
- 网络的拓扑结构
- TCP和UDP的区别
- 网络分层有什么好处
- IP V4和V6的区别
- HTTPS协议是怎么实现的(HTTPS数据传输流程)
- SSL协议是什么
- XML和HTML
- Cookie是什么?有什么作用?
- UML是什么?以及在软件设计过程阶段分别用到UML中的哪几种图?
- 时间局部性和空间局部性
- 什么是内存泄漏
- 什么是异常处理
- Java怎么分配内存和释放内存
- 死锁产生的原因和必要条件
C和C++的区别
- 设计思想上
(1)C++是面向对象的语言,而C是面向过程的结构化编程语言
- 语法上
(1)C++具有封装、继承和多态三种特性
(2)C++相比C,增加许多类型安全的功能,如强制类型转换
(3)C++支持范式编程,比如模板类、函数模板等
- 结构上
(1)C和C++都有结构的概念,但是在C语言中结构只有成员变量,而没有成员方法;而在C++结构中,它可以有自己的成员变量和成员函数。但是在C语言中结构的成员是公共的,什么想访问它都可以访问。
Java和C++的区别
- 都是面向对象的语言,都支持封装、继承和多态;
- 指针
Java不提供指针来直接访问内存,程序更加安全;
- 继承
Java的类是单继承的,C++支持多重继承;
Java通过一个类实现多个接口来实现C++中的多重继承;
- 内存
Java有自动内存管理机制,不需要程序员手动释放无用内存;
进程调度算法
- 1、先来先服务算法(FCFS)
按照请求的顺序进程调整。非抢占式,开销小,无饥饿问题,响应时间不确定(可能很慢);对短进程不利,对IO密集型进程不利。
- 2、最短作业优先算法(SJF)
按估计时间最短的顺序进行调整。非抢占式,吞吐量高,开销可能较大,可能导致饥饿问题;对短进程提供好的响应时间,对长进程不利。
- 3、优先级调度算法
为每个进程分配一个优先级,按优先级进行调度。为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。
- 4、时间片轮转
将所有就绪进程按FCFS的原则排成一个队列,用完时间片的进程排到队列最后。抢占式(时间片用完),开销小,无饥饿问题,为短进程提供好的响应时间;若时间片小,进程频繁切换,吞吐量低;若时间片长,实时性得不到保证。
- 5、最高响应比优先
响应比=1+等待时间/处理时间。同时考虑了等待时间的长短和估计需要的执行时间长短很好的平衡了长短进程。非抢占式,吞吐量高,开销可能较大,提供好的响应时间,无饥饿问题。
- 6、多级反馈队列调度算法
设置多个就绪队列1、2、3…,优先级递减,时间片递增。只有等到优先级更高的队列为空时才会调度当前队列中的进程。如果进程用完了当前队列的时间片还未执行完,则会被移到下一队列。
抢占式(时间片用完),开销可能较大,对IO进程有利,可能出现饥饿问题。
32位系统能上16G内存吗
不能,支持的最大内存为4G
- 32位X86架构是指个人电脑的地址总线是32位的,CPU、内存控制器、操作系统都是按32位地址总线设计。32位地址总线可以支持的内存地址代码是4096MB,也就是4GB的地址代码,可以编4GB个地址。这个4GB的地址码正好可以分配给4GB内存
DNS的工作过程
DNS是应用层协议,事实上它是为其它应用层协议工作的,包括不限于HTTP和SMTP以及FTP,用于将用户提供的主机名解析为IP地址。
- 具体过程如下:
(1)用户主机上运行着DNS的客户端,就是我们的PC或者手机客户端运行着DNS客户端了。
(2)浏览器将接收到的URL中抽取出域名字段,就是访问的主机名,比如:http://www.baidu.com/,并将这个主机名传送给DNS应用的客户端。
(3)DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工作)。
(4)该DNS客户机最终会收到来自DNS的IP地址,就可以向该IP地址地位的HTTP服务器发起TCP连接。
(5)一但浏览器收到来自DNS的IP地址,就可以向该地址定位的HTTP服务器发起TCP连接。
冯·诺依曼体系结构
组成:
输入设备、输出设备、存储器、运算器、控制器
- 输入单元:包括键盘、鼠标、扫描仪、写字板等。
- 中央处理器(CPU):含有运算器和控制器等。
- 输出单元:显示器、打印机等。
对冯诺依曼体系结构的理解:
- 这里的存储器指的是内存。
- 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入设备或输出设备)
- 外设(输入设备或输入设备)要输入或输出数据也只能写入内存或从内存中进行读取。
- 所有设备都只能直接跟内存打交道。
操作系统的基本概念(什么是操作系统/操作系统的目标和功能)
- 1、操作系统是计算机资源的管理者
处理机管理(进程控制、进程同步、进程通信、死锁处理、处理机调度)
存储器管理(提高内存利用率,内存的分配与回收,地址映射,内存保护与共享,内存扩充)
文件管理(计算机中的信息都是以文件的形式存在的)
设备管理(完成用户的I/O请求,方便用户使用设备、并提高设备的利用率)
- 2、操作系统为用户提供使用计算机硬件的接口
命令接口(用户通过控制台或终端输入操作命令,向系统提供各种服务要求)
程序接口(由系统调用组成,用户在程序中使用这些系统调用来请求操作系统为其提供服务)
图形接口(最常见的是图形界面GUI最终还是通过调用程序接口实现的)
- 3、操作系统用作扩充器
没有任何软件支持的计算机为裸机,实现呈现在用户面前的计算机系统是经过若干层软件改造的计算机。操作系统将裸机改造成功能更强、使用更方便的机器。我们将覆盖了软件的机器称为扩充机器或虚拟机。
排序相关
- 插入排序
对于一个待排序数组来说,其初始有序数组个数为1,然后从第二个元素,插入到有序数组中。对于每一次插入操作,从后往前遍历有序数组,如果当前元素大于插入元素,则后移一位;如果当前元素小于或等于要插入的元素,则将要插入的元素插入到当前元素的下一位中。
- 希尔排序
先将整个待排序记录分割成若干子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。其子序列的构成不是简单的逐段分割,而是将每隔某个增量的记录组成一个子序列。希尔排序的时间复杂度与增量序列的选取有关,其最后一个增量值必须为1。
- 归并排序
该算法采用分治法:对于包含m个元素的待排序序列,将其看成m个长度为1的子序列。然后再两两合归并,得到n/2个长度为2或者1的有序子序列;然后再两两合并,直到得到一个长度为m的有序序列。
- 冒泡排序
对于包含n个元素的待排序数组,重复遍历数组,首先比较第一个和第二个元素,若为逆序,则交换元素位置;然后比较第二个和第三个元素,重复上述过程。每次遍历会把当前n-i个元素中的最大的元素移到第n-i位置。遍历n次,完成排序。
- 快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
- 选择排序
每次循环,选择当前无序数组中最小的那个元素,然后将其与无序数组的第一个元素交换位置,从而使有序数组元素加1,无序数组元素减1,初始时无序数组为空。
- 堆排序
堆排序是一种选择排序,利用堆这种数据结构来完成。其算法思想是将待排序的数据构造成一个最大堆(升序)/最小堆(降序),然后将堆顶元素与待排序数组的最后一个元素交换位置,此时末尾元素就是最大/最小的值。然后将剩余n-1个元素重新构造成最大堆/最小堆。
各个排序的时间复杂度、空间复杂度及稳定性如下:
点击一个链接的网络过程
在浏览器地址栏键入URL,按下回车之后会经历以下流程:
- 1、浏览器向DNS服务器请求解析该URL中的域名以及所对应的IP地址;
- 2、解析出IP地址后,根据该IP地址和默认端口80,和服务器建立TCP连接;
- 3、浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器;
- 4、服务器对浏览器请求作出响应,并把对应的HTML文本发送给浏览器;
- 5、释放TCP连接;
- 6、浏览器将该HTML文本解析并显示内容。
数据库完整性操作
数据库完整性可确保输入至数据库中的数据,是准确、有效及一致的。数据库中任何数据改动,都必须合乎所有完整性限制及数据有效性检验。
数据库完整性主要有以下三项完整性限制:
- 实体完整性,同一数据表中不可有多项记录拥有相同识别。
- 域完整性,限制字段中的数据必须合乎默认的数据类型,例如:日期。
- 参照完整性:如两个数据表是有关联的,父数据表的记录必须存在,子数据表的记录才存在。
面向对象编程和面向过程编程的区别
区别:
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步添加链接描述
骤一步一步实现,使用的时候一个一个依次调用就可以了。
- 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事务在整个解决问题的步骤中的行为。
进程上下文切换发生的条件
如何编写高效的查询语句
- 创建合理的索引
- 对查询进行优化,应尽量避免全表扫描
- 尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描
- 尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
- 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
编写高效的sql查询语句提高性能的建议
操作系统有哪些部分
设备管理、作业管理、文件管理、进程管理、存储管理
- 设备管理
主要负责内核与外围设备的数据交互,实质是对硬件设备的管理,包括对输入输出设备的分配,初始化,维护与回收等。例如管理音频输入输出。
- 作业管理
这部分功能主要是负责人机交互,图形界面或系统任务的管理。
- 文件管理
这部分功能涉及文件的逻辑组织和物理组织,目录结构和管理等。从操作系统的角度来看,文件系统是系统对文件存储器的存储空间进行分配,维护和回收,同时负责文件的索引,共享和权限保护。而从用户的角度来说,文件系统是按照文件目录和文件名来进行存取的
- 进程管理
说明一个进程存在的唯一标志是pcb(进程控制块),负责维护进程的信息和状态。进程管理实质上是系统采取某些进程调度算法来使处理合理的分配给每个任务使用。
- 存储管理
数据的存储方式和组织结构。
什么是封装、继承和多态
- 封装
对象数据和操作该对象的指令都是对象自身的一部分,能够实现尽可能对外部隐藏数据。
实际项目开发中,使用封装最多的就是实体类,常常和JavaBean(类必须是具体的和公共的,并且具有无参数的构造器)一起使用。
那么,实体类有那些东西呢?
答:私有的成员变量、无参数的构造器、有参数的构造器、setter和getters方法、重写tostring方法、重写hashCode和equals方法。
- 继承
①继承是面向对象程序设计能够提高软件开发效率的重要原因之一。
②继承是具有传递性的,就像现实中孙子不仅长得像爸爸而且还像他爷爷。
③继承来的属性和方法是隐式的,也就是在本类里面是看不见的。
④一个类只能有一个父类,也就是类只能是单继承。
⑤一个接口可以有多个父类,也就是接口可以是多继承。
实际项目开发中,一个类继承于另一个类,那么前者就是后者的子类,反则反之。
- 多态
①多态就是对象拥有多种形态:引用多态和方法多态。
②引用多态:父类的引用可以指向本类对象、父类的引用可以指向子类的对象。
③方法多态:创建本类对象时,调用的方法为本类的方法;创建子类对象时,调用的方法为子类重写的方法或者继承的方法。
④存在多态的必要条件:继承、重写。
⑤多态的作用是消除类型之间的耦合关系。
在实际项目开发中,A类继承B类,如果在A类中不重写B类的方法的时候,输出的仍旧是B类方法里面的信息(B b=new A());如果在A类中重写B类的方法的时候,输出的是A类方法里面的信息(B b=new A())。
Spring IOC 和 AOP
- IOC
IOC是一个容器,在Spring中,它会认为一切Java资源都是Java Bean,容器的目标就是管理这些Bean和它们之间的关系。所以在Spring IOC里面装载的各种Bean,也可以理解为Java的各种资源,包括Java Bean的创建、事件、行为等,他们由IOC容器管理。
- AOP
Aspect-OrientedProgramming,面向方面编程。用通俗一点的话来,其实就是把公用代码封装起来,减少重复代码。
贪心算法
- 定义
贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
- 解题的一般步骤:
1、建立数学模型来描述问题;
2、把求解的问题分成若干个子问题;
3、对每一个子问题求解,得到子问题的局部最优解;
4、把子问题的局部最优解合成原来问题的一个解。
动态规划算法
- 基本思想
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题。
但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。
如果能够保存已解决的子问题的答案,而在需要时再找出以求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。
- 求解步骤
1、找出最优解的性质,并刻划其结构特征。
2、递归地定义最优值。
3、以自底向上的方式计算出最优值。
4、根据计算最优值时得到的信息,构造最优解。
迪杰特斯拉最短路径
迪杰特斯拉(Dijkstra)算法是典型的最短路径算法,用于计算一个节点到其他节点的最短路径。
它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
- 基本思想
通过迪杰特斯拉计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。
此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。
起始时,S中只有起点s;U是除s之外的顶点,并且U中顶点的路径是“起点s到该顶点的路径”。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。…重复该操作,直到遍历完所有的顶点。
- 操作步骤
1、初始时,S中只包含起点s;U中包含除s外的其他顶点,且U中顶点的距离为“起点s到该顶点的距离”【例如:U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为无穷】。
2、从U中选出“距离最短的顶点k”,并将顶点k加入到S中;同时,从U中移除顶点k。
3、更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如:(s,v)的距离可能大于(s,k)+(k,v)的距离。
4、重复步骤2和3,直到遍历完所有顶点。
图解
快速排序和插入排序哪个更高效
- 就排序的速度而言,那么快速排序几乎是最佳选择。但是快速排序也有一定的局限性,对于完全顺序或者完全逆序且数据量十分庞大的数据,在递归的过程中会存在系统堆栈溢出的风险。
- 如果数据已经基本有序,插入排序或者希尔排序只需要进行比较以及进行少量的插入操作即可完成,速度会有大幅度提升,且不会出现快速排序面对几乎完全顺序的数据时可能出现的系统堆栈溢出的风险。
- 选择排序和堆排序相对稳定,没有最优情况和最差情况的区分。
中断具体是什么操作的
所谓中断是指系统发生某一事件后,CPU暂停正在执行的程序去执行处理该事件的程序过程,处理中断事件的程序称为中断处理程序,产生中断信号的那个部件称为中断源。硬件的中断机构与处理这些中断的程序统称为中断系统。
当中断发生时,硬件机构自动地进入响应中断过程,由操作系统的中断处理程序对中断事件进行处理,具体过程如下:
- 1、保存现场
系统开辟现场区,并将现场区组织成“栈”结构,当中断响应时
(1)硬件结构自动将PS和PC寄存器的内容压入栈中作为现场信息保护起来。
(2)根据发生的中断,硬件从指定的中断向量单元取出PS和PC内容,分别装入PS和PC寄存器,同时正确填入寄存器的“当前状态”和“先前状态”字段。
- 2、分析原因,转中断处理程序
不同原因产生的中断事件要进行不同的处理,根据中断的路寄存器内容得出发生该中断的具体原因。转入相对应的中断处理程序运行。
- 3、恢复现场
在多级中断系统中,考虑退回当前中断时,必须依据原先被中断的程序,完成不同的工作,中断处理结束后,软件必须退出中断。如果此次是高级中断,并且被中断的程序是一个低级中断处理程序,则此次中断应返回到该低级中断处理程序。如果原来被中断的是用户程序,则退出中断前应考虑进行一次调度选择,以挑选出更适合在当前情况下运行的新程序。
如下简单流程的回答应该也可以吧:
- 中断执行流程:
(1)中断源发出中断请求
(2)判断当前处理机是否允许中断和该中断源是否被屏蔽
(3)优先权排队
(4)处理机执行完当前指令或当前指令无法执行完时,则立即停止当前程序,保护断点地址和处理机当前状态,转入响应的中断服务程序
(5)执行中断服务程序
(6)恢复被保护的状态,执行“中断返回”指令回到被中断的程序或转入其他程序
上述操作中前四项是由硬件完成的,后两项是由软件完成的。
中断隐指令
CPU响应中断之后,经过某些操作,转去执行中断服务程序。这些操作是由硬件直接实现的,把它称为中断隐指令。中断隐指令并不是指令系统中的一条真正的指令,它没有操作码,所以中断隐指令是一种不允许、也不可能为用户使用的特殊指令。其完成的操作主要有:
- (1)保存断点
为了保证在中断服务程序执行完毕能正确返回原来的程序,必须将原来程序的断点(即程序计数器(PC)的内容)保存起来。断点可以压入堆栈,也可以存入主存的特定单元中。
- (2)暂不允许中断(关中断)
暂不允许中断即关中断。在中断服务程序中,为了保护中断现场(即CPU主要寄存器的内容)期间不被新的中断所打断,必须要关中断,从而保证被中断的程序在中断服务程序执行完毕之后能接着正确地执行下去。
并不是所有的计算机都在中断隐指令中由硬件自动地关中断,也有些计算机的这一操作是由软件(中断服务程序)来实现的。
- (3)引出中断服务程序
引出中断服务程序的实质就是取出中断服务程序的入口地址送程序计数器(PC)。对于向量中断和非向量中断,引出中断服务程序的方法是不相同的。
范式的定义
- 第一范式
当关系模式R的所有属性都不能再分解为更基本的数据单位时,称R是满足第一范式,即属性不可分。
- 第二范式
如果关系模式R满足第一范式,并且R的所有非关键属性完全依赖于R的每一个候选关键属性,称R满足第二范式。
- 第三范式
设R是满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,即非主属性不传递依赖于键码(简而言之,第三范式就是属性不依赖于其它非主属性)
数据库的事务
数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一些列操作,要么完全地执行,要么完全地不执行。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过一组相关操作组合为一个要么全部成功,要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性、持久性)属性。事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。
事务的四个特性ACID
- (1)原子性
原子性是指事务所包含的所有操作要么全部成功,要么全部失败的回滚,因此事务的操作如果成功就必须完全应用到数据库,如果操作失败则不能对数据库有任何影响。
- (2)一致性
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说事务执行之前和执行之后都必须处于一致性状态。
例如:拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转账几次,事务结束后两个用户的钱加起来应该还得是5000,这就是事务的一致性。
- (3)隔离性
隔离性是当多个用户并发访问数据库时,比如操作同一张表,数据库为每个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即:要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。这指的是在开发环境中,当不同事务操作相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与其它任何并发事务所做的修改隔离。
不同的隔离级别:
- Read Uncommitted(读取未提交):最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务提交的结果。所有的并发事务问题都会发生。
- Read Committed(读取提交内容):只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。
- Repeated Read(可重复读):在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。
- Serialization(可串行化):事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。
- (4)持久性
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
索引建的多好还是少好
索引并不是建立越多越好,把索引比作目录,相当于一本100页的书,如果有50页目录,书本这么厚,实际内容就那么少,谁还会去翻看呢,回答如下:
- (1)数据量小的表不需要建立索引,建立会增加额外的索引开销
- (2)数据变更需要维护索引,因此更多的索引意味着更多的维护成本
- (3)更多的索引意味着也需要更多的空间(索引也是需要用空间来存放的)
添加索引的规则:
- (1)在查询中很少使用的列或者参考的列不应该创建索引。这是因为这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间的需求。
- (2)只有很少数值的列也不应该增加索引。这是因为,由于这些列的数值很少,在查询的结果中,结果集的数据占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
- (3)定义为text、image和bit数据类型的列不应该增加索引。这是因为,这些列数据要么相当大,要么取值很少。
- (4)当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
TCP/IP
TCP/IP协议不是TCP和IP这两个协议的合称,而是因特网整个TCP/IP协议族。从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。
- 网络接口层(Network Access Layer):
在TCP/IP参考模型中并没有详细描述,只是指出主机必须使用某种协议与网络相连。
- 网络层(Internet Layer):
网络层是整个体系结构的关键部分,其功能是使主机可以把分组发往任何网络,并使分组独立地传向目标。这些分组可能经由不同的网络,到达顺序和发送顺序也可能不同。高层如果需要顺序收发,那么就必须自行处理对分组的排序。互联网使用因特网协议(IP,Internet Protocol)。
- 传输层(Transport Layer):
使源端和目的端机器上的对等实体可以进行会话。在这一层定义了两个端到端的协议:传输控制协议(TCP,Transmission Control Protocol)和用户数据报协议(UDP,User Datagram Protocol)。TCP是面向连接的协议,它提供可靠的报文传输和对上层应用的连接服务。为此,除了基本的数据传输外,它还有可靠性的保证、流量控制、多路复用、优先权和安全性控制等功能。UDP是面向无连接的不可靠传输的协议,主要用于不需要TCP的排序性和流量控制等功能的应用程序。
- 应用层(Application Layer):
应用层包含所有的高层协议,包括:虚拟中断协议(TELNET, TELecommunications NETwork)、文件传输协议(FTP,File Transfer Protocol)、电子邮件传输协议(SMTP, Simple Mail Transfer Protocol)、域名服务(DNS,Domain Name Service)、网上新闻传输协议(NNTP,Net News Transfer Protocol)和超文本传送协议(HTTP, HyperText Transfer Protocol)等。
网络的拓扑结构
网络拓扑结构是指用传输媒体对各种设备进行连接的物理布局,即用什么方式把网络中的计算机等设备连接起来。网络中的计算机等设备要实现互连,就需要以一定的连接方式进行连接,这种连接方式就叫作“拓扑结构”,它描述了网络设备是如何连接在一起的。目前常见的网络拓扑结构主要有:总线型拓扑结构、环形拓扑结构、星形拓扑结构、混合型拓扑结构和其他拓扑结构等。
- 一、总线型拓扑结构
总线结构上的所有的节点都连接到一条称为总线的公共线路上。即所有的节点共享一条数据通道,结点间通过广播进行通信,即一个节点发出的信息可以被网络上多个结点接受,而一段时间只允许一个结点传送信息。
- 优点
连接形式简单,易于实现,所用线缆最短,增加或者移除节点比较灵活,个别结点发生故障时,不影响网络中其结点的正常工作。
- 缺点
网络传输能力低,安全性低,总线发生故障时,会导致全网瘫痪。结点数量的增多会影响网络性能。
- 二、星形拓扑结构(应用最普遍)
星形结构是以一个结点为中心的处理系统。其它各结点都与该中心结点有着物理链路的直接互连,其他结点不能直接通信,其他结点的通信需要该中心结点进行转发。因此中心结点必须有着较强的功能和较高的可靠性。
- 优点
结构简单,建网容易,控制简单,维护容易,网络传输速度快。
- 缺点
属于集中控制。主机负载过重,可靠性低,通信线路利用率低,安全隐患大。
- 三、环形拓扑结构
环形拓扑结构是联网的计算机由通信线路连接成一个闭合的环,在环形结构网络中信息按照固定方向流动,或顺时针方向,或逆时针方向。
- 优点
一次通信的最大传输延迟是固定的,每个网上结点只与其他二个结点有物理链路直接互连。传输控制机制简单,实时性强。
- 缺点
一个结点发生故障时,可能导致全网瘫痪,可靠性差。维护困难,扩展性能差。
- 四、混合型拓扑结构
由星形结构和总线型结构结合的网络结构。解决了星形网络在传输距离上的局限,同时又解决了总线型网络在连接用户数量上的限制。
TCP和UDP的区别
- 1、TCP面向连接而UDP面向无连接。TCP有三次握手的连接过程,UDP适合消息的多波发布,从单个结点向多个结点传输信息。
- 2、可靠性。TCP是比较可靠的,它利用握手确认和重传机制提供了可靠性保证,而UDP则可能会丢失,不知道到底有没有被接收。
- 3、有序性。TCP利用序列号保证了消息报的顺序交互,到达可能无序但TCP最终会排序,而UDP是不具备排序性的。
- 4、速度。TCP速度比较慢,因为要创建连接,保证消息的可靠性和有序性,需要做额外的很多事情。UDP更适合对于速度比较敏感的应用,比如在线视频媒体、电视广播、多人在线游戏等。
- 5、量级。TCP属于重量级的,UDP属于轻量级的。体现在数据的头大小TCP是20个字节,UDP是8个字节。
网络分层有什么好处
计算机网络的理解上,人们往往进行分层处理,OSI和TCP/IP网络模型都是将网络体系工作的流程进行了层次化的划分,进行层次划分优点有以下几点:
- 1、各层次之间是独立的。某一层并不需要直到它的下一层是如何实现的,而仅仅需要直到该层通过层间的接口所提供的服务。这样,整个问题的复杂程度就下降了。也就是说上一层的工作如何进行并不影响下一层的工作,这样我们在进行每一层的工作设计时只要保证接口不变可以随意调整层内的工作方式。
- 2、灵活性好。当任何一层发生变化时,只要层间接口关系保持不变,则在这层以上或以下层均不受影响。当某一层出现技术革新或者某一层在工作中出现问题时不会连累到其它层的工作,排除问题时也只需要考虑这一层单独的问题即可。
- 3、结构上可以分割开。各层都可以采用最合适的技术来实现。技术的发展往往不对称的,层次化的划分有效避免了木桶效应,不会因为某一方面技术的不完善而影响整体的工作效率。
- 4、易于实现和维护。这种结构使得实现和调试一个庞大又复杂的系统变得易于处理,因为整个的系统已经被分解为若干相对独立的子系统。进行调试和维护时,可以对每一层进行单独的调试,避免了出现找不到、解决错问题的情况。
- 5、能促进标准化工作。因为每一层的功能及其所提供的服务都已有了精确的说明。标准化的好处就是可以随意替换其中的某一层,对于使用和科研来说十分方便。
IP V4和V6的区别
- 1、地址空间不同
IPv4地址长度是32位,支持的物理地址是2^32-1个地址;
IPv6地址长度是128位,支持的物理地址是2^128-1个地址。
- 2、路由表大小不同
IPv6的路由表大小比IPv4更小。
- 3、组播支持不同
IPv6的组播支持及对流量的支持比IPv4强。
- 4、安全性不同
IPv6安全性更高,在使用IPv6网络中,用户可以对IP报文进行加密,并对IP报文进行校验,增强了网络安全。
- 5、协议扩充不同
IPv6允许协议进行扩充而IPv4不允许。
HTTPS协议是怎么实现的(HTTPS数据传输流程)
- 1、浏览器将支持的加密算法信息发送给服务器
- 2、服务器选择一套浏览器支持的加密算法,以证书的形式回发给浏览器
- 3、浏览器验证证书合法性,结合证书公钥加密信息发送给服务器
- 4、服务器使用私钥解密信息,验证哈希,加密响应信息回发给浏览器
- 5、浏览器解密响应信息,并对信息进行验真,之后进行加密交互数据
SSL协议是什么
SSL证书全称为安全套接层协议(Secure Sockets Layer)证书,是遵守SSL安全套接层协议的服务器数字证书。它通过加密算法,将HTTP明文传输变成HTTPS暗文传输。由于此协议很好地解决了互联网明文传输的不安全问题,很快得到了业界的支持,并已经成为国际标准。
XML和HTML
HTML:超文本标记语言,超文本就是页面可以包含图片、连接、甚至音乐、程序等非文字元素。
XML:可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合万维网的传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
- 相似点
(1)都是标记语言
(2)有相似的语法,都是<>>的格式
- 不同点
(1)HTML主要用于数据的显示,侧重外拐;XML用于数据的传输,侧重内容;
(2)HTML用户不能自定义标签,标签都是预定义的;而XML更加灵活,因为它没有标签集和无语言规则的语言,用户可以自定义;
(3)HTML是写给浏览器看的语言;而XML则可以跨平台进行信息交流;
(4)HTML有的标签可以没有>作为结束;XML语法十分严格,必须对称,有开始就必须有结束。
Cookie是什么?有什么作用?
- 是什么?
Cookie本意是指就着牛奶一起吃的点心。在Internet上,Cookie指的是小量信息。
Cookie是由Web服务器创建并保存在用户浏览器上的小文本文件,它以key/value的形式保存用户的相关信息,这些数据通常会经过加密处理。当用户链接到服务器,Web站点可以访问Cookie信息。
- 作用
(1)Cookie的两个主要用途:存储用户信息和个性化定制。
(2)Cookie最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的作用。
(3)另一个重要应用场合是“购物车"之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的上面,这些信息都会写入Cookies,以便在最后付款时提取信息。
UML是什么?以及在软件设计过程阶段分别用到UML中的哪几种图?
统一建模语言(Unified Modeling Language-----UML)是一种面向对象的建模语言,它可以实现大型复杂系统各种成分描述的可视化、说明并构造系统模型,以及建立各种所需的文档,是一种定义良好、易于表达、功能强大且普遍适用的建模语言。
UML图包括九种:案例图、类图、对象图、构件图、部署图、活动图、协作图、状态图、序列图。在这些图中使用案例图、类图、序列图是最有用的。
- 1、需求阶段
采用用例图描叙需求
- 2、分析阶段
采用类图描述静态结构
采用顺序图、合作图、活动图、状态图描述动态行为
- 3、设计阶段
采用类图、包、对类的接口进行设计
- 4、实现阶段
将类用某面向对象语言实现
- 5、继承与交付阶段
构件图、包、部署图
- 6、测试阶段
单元测试—类图和类的说明书
时间局部性和空间局部性
在CPU访问寄存器时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。
- 时间局部性(temporal locality)
被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。
- 空间局部性(spatial locality)
如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。
什么是内存泄漏
内存泄漏是指:内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,直到程序结束。(说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。
什么是异常处理
异常处理又称异常错误处理,它提供了处理程序运行时出现任何意外或异常情况的方法。异常处理通常是防止未知错误的发生所采取的处理措施,对于某一类型的错误,异常处理应该提供相应的处理方法。例如:在设计程序时,如果可能会碰到除0错误或者数组访问越界错误,程序员应该在程序中设计相应的异常处理代码以便发生异常情况时,程序作出相应的处理。
Java怎么分配内存和释放内存
- 分配
程序员通过new为每个对象申请内存空间(基本类型除外)所有对象都在堆中分配内存。
- 释放
对象的释放是由垃圾回收机制决定和执行的,这样极大的简化CG(垃圾处理装置)的负担,当然同时也为程序员带来便利(例如:C语言需要手动的去处理已经不再使用的对象,如果遗忘内存就会被越占越多)
- 基本数据类型在栈中进行内存分配,引用数据类型在堆中进行分配,堆的读写速度远不及栈。
- 堆和栈的优缺点
栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存周期必须是确定的,缺乏灵活性。另外,栈数据可以共享。
堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢。
死锁产生的原因和必要条件
- 原因
(1)竞争资源
(2)进程间推进顺序非法
- 四个必要条件
(1)互斥条件:进程对所分配的资源排它性使用,即在一段时间内某资源只由一个进程占用。
(2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
(3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时自己释放。
(4)环路等待条件:指在发生死锁时,必然存在一个进程的环形链。