本人2020年报考计算机技术,近期在准备复试,这是我们模拟复试团队在几个月的模拟过程中整理的专业问题,拿出来与大家分享,希望一起上岸!
1、内存泄露
答:内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。
内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。
内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。就相当于你租了个带钥匙的柜子,你存完东西之后把柜子锁上之后,把钥匙丢了或者没有将钥匙还回去,那么结果就是这个柜子将无法供给任何人使用,也无法被垃圾回收器回收,因为找不到他的任何信息
Java中内存泄漏的例子:静态集合类、各种连接、变量不合理的作用域、内部类持有外部类、改变哈希值。详见https://www.cnblogs.com/tiancai/p/9634332.html
2、堆内存和栈内存的区别
答:
(1)内存区域不同 堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间(手动释放)。栈内存在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配(运行结束自动释放)。
(2)特点不同 堆内存实际上指的是优先队列的一种数据结构,第1个元素有最高的优先权;栈内存实际上就是满足先进后出性质的数学或数据数学或数据结构。栈内存是存取速度比堆要快,仅次于寄存器,栈数据可以共享。
(3)范围不同 堆内存中分配的内存需要程序员手动释放。栈内存中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间。
比较容易理解的版本:
栈:为编译器自动分配和释放,如函数参数、局部变量、临时变量等等
堆:为成员分配和释放,由程序员自己申请、自己释放。否则发生内存泄露。典型为使用new申请的堆内容
在C++中,内存分成5个区,他们分别是堆,栈,自由存续区,全局/静态存续区,常量存续区。详见:
https://blog.csdn.net/summer_sy/article/details/88544433
3、堆排序
堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。
堆排序原理:
a.将无序序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;
b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;
c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。
4、CPU调度算法
答:(1)FCFS(先来先服务)调度算法,既可以用于作业调度,也可以用于进程调度。作业调度是从后备作业队列中选择一个或多个最先进入队列的作业,调入内存,分配资源、创建进程,然后放入就绪队列。进程调度,从就绪队列中选择一个最先进入的进程,为其分配处理机,使之运行,直至完成或发生某事件而阻塞后才放弃处理机。
(2)SJ(P)F-短作业(进程)优先调度算法,用于作业调度和进程调度。选择估计运行时间最短的。
(3)FPF-优先权优先调度算法,可以用于作业调度和进程调度。
用于作业调度时,系统从后备队列中选择若干个优先权最高的作业装入内存。
进程调度,是把处理机分配给就绪队列中优先权最高的进程。
a、非抢占式优先权算法,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。用于批处理系统和对实时性要求不严的实时系统。
b、抢占式优先权调度算法,系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程。常用于要求严格的实时系统和对性能要求较高的批处理和分时系统。
(4)高响应比优先调度算法,动态优先权。等待时间+服务时间=响应时间。
响应比=(等待时间+要求服务时间)/要求服务时间
优先权相当于响应比RP,与等待时间成正比,服务时间成反比。
(5)时间片轮转法 系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU 分配给队首进程,并令其执行一个时间片。当时间片用完时,发出时钟中断请求,调度程序停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。换言之,系统能在给定的时间内响应所有用户的请求。
(6)多级反馈队列调度算法,应设置多个就绪队列,并为各个队列赋予不同的优先级。 第一个队列最高,依次降低。各个队列中时间片大小不同,优先权越高,时间片越小。新进程进入时,按先来先服务原则排队等待。执行时,若能在该时间片内完成,撤离;反之,放入下一队列的末尾。 第一队列空闲,才可调度第二队列,以此类推。如果处理机正在为第i队列中某进程服务时,新的优先权高的进程进入前(i-1)队列,抢占该处理机。
5、请求调页 页面置换算法
答:(1)LRU 最近时间内 最久未被使用的页面被置换。双链表实现
(2)LFU 最少使用置换 基于访问次数 访问最少的被置换。数组实现
(3)FIFO 最早出现置换 队列实现
(4)CLOCK 根据页面内存是否被访问来决定是否置换该页面。用整型数组来表示当前每个内存页面是否被访问,其中1代表被访问过,0代表未访问过。每次置换,指针循环遍历,找出第一个访问位不为1的那个内存页面。
6、C语言static用法
答:static对全局变量的修饰,可以认为是限制了只能是本文件引用此变量。
static对栈变量的修饰,可以认为是栈变量的生命周期延长到程序执行结束后。
Static对函数的修饰与对全局变量的修饰相似,只能对本文件中的函数调用。
7、链表怎么实现随机访问
答:哈希表
8、哈希表的用途
答:提供更快的查找速度。例如MD5-hash算法、文件校验等
9、适合文件系统不适合数据库系统的例子
答: 数据的备份、软件或应用程序使用过程中的临时数据存储一般使用文件比较合适。早期的功能比较简单,比较固定的应用系统也适用文件系统。
10、JVM怎么编库?怎么加载JAVA类
答:当Java程序需要使用某个类时,如果该类还未被加载到内存中,JVM会通过加载、连接(验证、准备和解析)、初始化三个步骤来对该类进行初始化。
类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:
1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;
2)如果类中存在初始化语句,就依次执行这些初始化语句。
11、B树 B+树
答:
B树特征:
1.根节点至少有两个子女节点;
2.每个非根节点包含的关键字个数i满足:n/2 - 1 < i < n -1;
3.除根节点以外的所有节点(不包括叶子节点)的度数正好是关键字的总数+1,故内部子树个数k满足:n/2 < k < n -1;
4.所有的叶子节点都位于同一层。
B+树特征:
B+树是一个n叉树,每个节点通常都有多个孩子,一颗B+树包含根节点、内部节点和叶子节点。B+树的特征如下:
1.有n个子树的节点含有n个关键字;
2.所有叶子节点包含了全部关键字的信息,以及指向这些关键字记录的指针,且叶子节点本身依赖关键字的大小,即自小而大顺序连接;
3.所有的非终端节点可以看成索引的一部分,节点中包含了其他子树的最大或最小关键字。
B+树有效内容均保存在叶子节点,且B+树有两个指针,一个指向根节点,一个指向关键字最小的元素的叶子节点,因此B+树支持从根节点开始随机查询和从最小关键字顺序查询。
12、怎么检测死锁
答:首先为每个进程和每个资源指定一个唯一的号码; 然后建立资源分配表和进程等待表,可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源。检测方法包括定时检测、效率低时检测、进程等待时检测等。检测算法通过反复查找进程等待表和资源分配表, 来确定进程Pj对资源ri的请求是否导致形成环路,若是,便确定出现死锁。然后解除死锁:采取适当措施,从系统中将已发生的死锁清除掉。
13、Ipv4和Ipv6
答:
1.地址空间不同。IPv4中规定IP地址长度为32,而IPv6中IP地址的长度为128。
2.路由表大小不同。IPv6的路由表相比IPv4的更小。IPv6的组播支持以及对流的支持要强于IPv4。
3.安全性不同。IPv6的安全性更高,在使用IPv6的网络时,用户可对网络层的数据进行加密。
4.协议扩充不同。IPv6允许协议进行扩充而IPv4不允许。
14、线程和进程的区别
答:1、进程拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,系统开销比较大,而线程不一样,线程拥有独立的堆栈空间,但是共享数据段,开销比较小,切换速度也比进程快,效率高。进程安全性比较高,不会对其它进程产生影响,而线程只是一个进程中的不同执行路径,一个线程死掉就等于整个进程死掉。
2、在通信机制上面,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便。
15、【操作系统】页面抖动
指如果分配给进程的存储块数量小于进程所需要的最小值,进程的运行将很频繁地产生缺页中断,这种频率非常高的页面置换现象称为抖动。
16、printf函数的执行过程(网上搜索结合个人理解)
请求IO—触发中断,系统调用—处理器找到要输出的内容并送到输出设备—恢复上下文继续执行
17、数据结构的逻辑结构分为两种
线性结构和非线性结构(集合、树、网)。线性结构:有且只有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继。例如:线性表,典型的线性表有:顺序表、链表、栈(顺序栈、链栈)和队列(顺序队列、链队列)。它们共同的特点就是数据之间的线性关系,除了头结点和尾结点之外,每个结点都有唯一的前驱和唯一的后继,也就是所谓的一对一的关系。非线性结构:对应于线性结构,非线性结构也就是每个结点可以有不止一个直接前驱和直接后继。常见的非线性结构包括:树(二叉树)、图(网)等。
18、关系型和非关系型数据库关系型数据库
SQLite、Oracle、mysql是关系型数据库,是指采用了关系模型来组织数据的数据库;非关系型数据库:MongoDb、redis、HBase。非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。
19、死锁和饥饿的区别
死锁:多个并发进程相互等待对方占用的资源而产生的错误现象。
饥饿:在系统中,由于系统采用的资源分配算法不当,虽然每个资源占有者都在有限时间内释放它所占的资源,但仍然使一些进程永远得不到资源的一种错误现象。死锁是从系统的观点来看,而饥饿是从竞争资源的进程来说的。
20、进程间通信方式
管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
原文链接:https://blog.csdn.net/zhaohong_bo/article/details/89552188
21、广义表及广义表的应用(广义表中的【原子项】是指什么?)
广义表(Lists,又称列表)是线性表的推广。线性表定义为n>=0个元素a1,a2,a3,…,an的有限序列。线性表的元素仅限于原子项,原子是作为结构上不可分割的成分,它可以是一个数或一个结构,若放松对表元素的这种限制,容许它们具有其自身结构,这样就产生了广义表的概念。
应用(百度了一下,不完善,欢迎大家补充):人工智能等领域的表处理语言LISP语言中。
22、Linux文件系统的理解
Linux是一种开源的操作系统,它的特点是对所有文件(目录、字符设备、块设备、 套接字、打印机等)操作,读写都可用fopen()/fclose()/fwrite()/fread()等函数进行处理。屏蔽了硬件的区别,所有设备都抽象成文件,提供统一的接口给用户。
23、软件测试及其类型
软件测试描述的是一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。
24、分时,实时,批处理操作系统
分时操作系统将系统处理机时间与内存空间按一定的时间间隔,轮流地切换给各终端用户的程序使用。在一台机器上表现为处理器在一个时间内只处理一个进程或程序,不同时进行多任务处理。
实时系统则为同时可以进行多个任务的处理,即多个进程可以在同一时间段进行,共同利用CPU和内存。
批处理操作系统是指用户将一批作业提交给操作系统后就不再干预,由操作系统控制它们自动运行。
25、数据库的游标
游标是SQL 的一种数据访问机制 ,是一种处理数据的方法。众所周知,使用SQL的select查询操作返回的结果是一个包含一行或者是多行的数据集,如果我们要对查询的结果再进行查询,比如(查看结果的第一行、下一行、最后一行、前十行等等操作)简单的通过select语句是无法完成的,因为这时候索要查询的结果不是数据表,而是已经查询出来的结果集。游标就是针对这种情况而出现的。
我们可以将“ 游标 ”简单的看成是结果集的一个指针,可以根据需要在结果集上面来回滚动,浏览我需要的数据。
原文链接:https://blog.csdn.net/qq_27825451/article/details/81477618
26、关于缓冲区
缓冲区又称为缓存,它是内存空间的一部分。它用在输入输出设备和CPU之间,用来缓存数据。它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。
比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。
又比如,我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的CPU可以处理别的事情。
27、关于中断
中断是指程序执行过程中,遇到急需处理的事件时,暂时中止CPU上现行程序的运行,转去执行相应的事件处理程序,待处理完成后再返回原程序被中断处或调度其他程序执行的过程。
操作系统是“中断驱动”的;换言之,中断(广义)是激活操作系统的唯一方式。
28、数据结构从逻辑上划分为三种基本类型
线性结构、树型结构、 图型结构。
29、传输层TCP流量控制与拥塞控制
流量控制概念
接收端处理数据的速度是有限的,如果发送方的速度太快,就会把缓冲区u打满。这个时候如果继续发送数据,就会导致丢包等一系列连锁反应。
所以TCP支持根据接收端能力来决定发送端的发送速度。这个机制叫做流量控制。
拥塞控制
虽然TCP有了滑动窗口这个大杀器, 能够高效可靠的发送大量的数据. 但是如果在刚开始阶段就发送大量的数据, 仍然可能引发问题.因为网络上有很多的计算机, 可能当前的网络状态就已经比较拥堵. 在不清楚当前网络状态下, 贸然发送大量的数据, 是很有可能引起雪上加霜的.TCP引入 慢启动 机制, 先发少量的数据, 探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输。
详细拥塞控制机制见:https://blog.csdn.net/zgege/article/details/80445324
30、虚拟内存
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
现代所有用于一般应用的操作系统都对普通的应用程序使用虚拟内存技术,老一些的操作系统,如DOS和1980年代的Windows,或者那些1960年代的大型机,一般都没有虚拟内存的功能。
——维基百科
具体的虚拟内存实现原理比较复杂,提供其中一篇文章供参考: https://zhuanlan.zhihu.com/p/96098896
31、IP地址与子网掩码的关系
IP地址与子网掩码唯一的关系就是:
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。
32、什么是页面抖动,为什么会发生页面抖动
页面抖动是系统中频繁进行页面置换的现象。即如果一个进程没有一定数量的内存块,它很快就发生缺页。此时,它必须淘汰某页。由于所有这些页面都正在使用,所以刚被淘汰出去的页很快又被访问,因而要把它重新调入。可是调入不久又再被淘汰出去,这样再访问,再调入,如此反复,使得整个系统的页面替换非常频繁,以致大部分机器时间都用在来回进行的页面调度上,只有一小部分时间用于进程的实际运算方面。
33、Java异常处理机制
在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。
抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。
34、关系数据库与非关系数据库的区别
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。
优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型;
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。
非关系型数据库的分类和比较:
1、文档型
2、key-value型
3、列式数据库
4、图形数据库
35、Windows和Linux进程与线程的区别
windows下,一个典型的线程拥有自己的堆栈、寄存器(包括程序计数器PC,用于指向下一条应该执行的指令在内存中的位置),而代码段、数据段、打开文件这些进程级资源是同一进程内多个线程所共享的。因此同一进程的不同线程可以很方便的通过全局变量(数据段)进行通信,大家都可以对数据段进行读写,这很方便,也被在安全性方面诟病,因为它要求程序员时刻意识到这些数据不是线程独立的。
对于linux来说,则没有很明确的进程、线程概念。首先linux只有进程而没有线程,然而它的进程又可以表现得像windows下的线程。linux利用fork()和exec函数族来操作多线程。fork()函数可以在进程执行的任何阶段被调用,一旦调用,当前进程就被分叉成两个进程——父进程和子进程,两者拥有相同的代码段和暂时相同的数据段(虽然暂时相同,但从分叉开的时刻就是逻辑上的两个数据段了,之所以说是逻辑上的,是因为这里是“写时复制”机制,也就是,除非万不得已有一个进程对数据段进行了写操作,否则系统不去复制数据段,这样达到了负担最小),两者的区别在于fork()函数返回值,对于子进程来说返回为0,对于父进程来说返回的是子进程id,因此可以通过if(fork()==0)…else…来让父子进程执行不同的代码段,从而实现“分叉。
具体参见:https://blog.csdn.net/a3192048/article/details/82145897
36、数据库中事务的概念
定义:数据库事务是构成单一逻辑工作单元的操作集合
关于事务的定义有几点需要解释下:
1.数据库事务可以包含一个或多个数据库操作,但这些操作构成一个逻辑上的整体。
2.构成逻辑整体的这些数据库操作,要么全部执行成功,要么全部不执行。
3.构成事务的所有操作,要么全都对数据库产生影响,要么全都不产生影响,即不管事务是否执行成功,数据库总能保持一致性状态。
4.以上即使在数据库出现故障以及并发事务存在的情况下依然成立。
原子性(Atomicity):事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败。
一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。一致性状态是指:1.系统的状态满足数据的完整性约束(主码,参照完整性,check约束等) 2.系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。
隔离性(Isolation):并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。比如多个用户同时往一个账户转账,最后账户的结果应该和他们按先后次序转账的结果一样。
持久性(Durability):事务一旦提交,其对数据库的更新就是持久的。任何事务或系统故障都不会导致数据丢失。
在事务的ACID特性中,C即一致性是事务的根本追求,而对数据一致性的破坏主要来自两个方面:
1.事务的并发执行
2.事务故障或系统故障
数据库系统是通过并发控制技术和日志恢复技术来避免这种情况发生的。
37、快表TLB与cache的区别
1、快表TLB: 用于虚拟存储技术,是为了加快辅存向主存的地址映射速度(主存—辅存系统)
2、高速缓存器cache:用于解决CPU与主存速度不匹配问题。(CPU—主存系统)
根据执行步骤:当CPU执行机构收到应用程序发来的虚拟地址后,首先到TLB中查找相应的页表数据,如果TLB中正好存放着所需的页表,则称为TLB命中(TLB Hit),接下来CPU再依次看TLB中页表所对应的物理内存地址中的数据是不是已经在一级、二级缓存里了,若没有则到内存中取相应地址所存放的数据。可以看出TLB是单独的寄存器。
总的来说,两者属于两个不同的系统层次,功能也不同。
38、Linux文件系统
在LINUX系统中有一个重要的概念:一切都是文件。
Linux文件系统是以“/”为根的树状结构,例如第二层有 /bin用于存放二进制文件,/boot用于存放系统启动文件,/dev用于存放设备文件等。
具体参见:https://zhuanlan.zhihu.com/p/38802277
39、共享栈与用两个栈实现队列
共享栈:想要一个数组实现两个栈,那么就必须一个栈的栈顶从数组下标为0处开始,另一个栈从数组额最大下标处开始,两个栈相对而生如下图所示:
两个栈实现一个队列:https://blog.csdn.net/ailunlee/article/details/85100514
40、虚电路网络与数据报网络
网络层可以在两台主机之间提供无连接服务或连接服务。由网络层向运输层提供。
虚电路网络:仅提供连接服务。
数据报网络:仅提供无连接服务。
41、交换机路由器属于哪一层及其遵守的协议
交换机工作在第二层数据链路层,它使用MAC地址寻址,实现局域网内部的数据通信;
路由器工作在第三层网络层,它使用IP寻址实现源IP到目标IP的端到端数据通信。
42、决策树
决策树是一种机器学习的方法。决策树的生成算法有ID3, C4.5和C5.0等。决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。
决策树是一种十分常用的分类方法,需要监管学习,监管学习就是给出一堆样本,每个样本都有一组属性和一个分类结果,也就是分类结果已知,那么通过学习这些样本得到一个决策树,这个决策树能够对新的数据给出正确的分类。
43、数据库视图
视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示,其本质是对应于一条SELECT语句,结果集被赋予一个名字,即视图名字。
视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。
44、队列的应用
迷宫求解、图的广度优先搜索。
45、数据库三大范式
第一范式(1NF):在关系模式R中的每一个具体关系r中,如果每个属性值 都是不可再分的最小数据单位,则称R是第一范式的关系。
第二范式(2NF):如果关系模式R(U,F)中的所有非主属性都完全依赖于任意一个候选关键字,则称关系R 是属于第二范式的 (主属性)
第三范式(3NF):如果关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递依赖,则称关系R是属于第三范式的 (外键约束)
46、图灵机
1936年,英国数学家阿兰・麦席森・图灵(1912―-1954年)提出了一种抽象的计算模型——图灵机( Turing machine)。图灵机,又称图灵计算机,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人类进行数学运算。
所谓的图灵机就是指一个抽象的机器,它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。
图灵的基本思想是用机器来模拟人们用纸笔进行数学运算的过程,他把这样的过程看作下列两种简单的动作:
1、在纸上写上或擦除某个符号;
2、把注意力从纸的一个位置移动到另一个位置。
而在每个阶段,人要决定下一步的动作,依赖于 (1) 此人当前所关注的纸上某个位置的符号和(2) 此人当前思维的状态。
47、服务器端Session和客户端Session(和Cookie区别)
session是解决http协议无状态问题的服务端解决方案,它能让客户端和服务端一系列交互动作变成一个完整的事务,能使网站变成一个真正意义上的软件。
当用户首次与Web服务器建立连接的时候,服务器会给用户分发一个 SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在 HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端。这个SessionID就是保存在客户端的,属于客户端Session。
推荐详细参阅:https://blog.csdn.net/java_faep/article/details/78082802
48、特权指令与非特权指令
所谓特权指令是指有特权权限的指令,由于这类指令的权限最大,如果使用不当,将导致整个系统崩溃。比如:清内存、置时钟、分配系统资源、修改虚存的段表和页表,修改用户的访问权限等。如果所有的程序都能使用这些 指令,那么你的系统一天死机n回就不足为奇了。为了保证系统安全,这类指令只能用于操作系统或其他系统软件,不直接提供给用户使用。因此,特权执行必须在核心态执行。实际上,cpu在核心态下可以执行指令系统的全集。形象地说,特权指令就是 那些儿童不宜的东西,而非特权指令则是老少皆宜。
49、内存分配算法
首次适应算法(FirstFit):从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法的目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。
最佳适应算法(BestFit):从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。该算法保留大的空闲区,但造成许多小的空闲区。
最差适应算法(WorstFit):从全部空闲区中找出能满足作业要求的、且大小最大的空闲分区,从而使链表中的结点大小趋于均匀,适用于请求分配的内存大小范围较窄的系统。为适应此算法,空闲分区表(空闲区链)中的空闲分区按大小从大到小进行排序,自表头开始查找到第一个满足要求的自由分区分配。该算法保留小的空闲区,尽量减少小的碎片产生。
伙伴算法(buddy):使用二进制优化的思想,将内存以2的幂为单位进行分配,合并时只能合并是伙伴的内存块,两个内存块是伙伴的三个条件是:
PS:动态分区分配中的数据结构
空闲分区表:意思就是,在系统中设置一张空闲分区表,用于记录每个空闲分区的情况。每个空闲分区占一个表目,表目中包括分区号、分区大小、分区始址等数据项。
空闲分区链:为了实现对分区的分配和链接,在每个分区的起始部分设置一些用于控制分区分配的信息,以及用于链接各分区所用的前向指针,在分区尾部设置一些后向指针。通过这些就可以把所有的空闲分区链接成一个双向链。
50、Windows和Linux系统异同点?
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
Linux的基本思想有两点:第一,一切都是文件;第二,每个文件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。
一、价格
在价格方面,Linux和Windows服务器之间有比较明显的差异。Linux成为流行的Web操作系统之一,主要原因是它相对便宜。另一方面,Windows则昂贵得多。
二、安全性
许多管理员声称,Linux比Windows有更多的漏洞,这当然跟开源有关。不过,如果有一个好的管理员,安全应该不是一个重大问题,无论使用的哪种操作系统。
三、核心代码的可访问性
也许Linux和Windows之间最大的区别之一,就是Linux允许所有用户都具有完全访问代码的权限,可以做自己喜欢的任何改动。访问代码的好处是,它可以很容易地修复Bug,并改进系统。相反,大多数Windows用户不具有访问代码的权限,也不允许他们进行修改。有些人觉得,公开核心的代码,会有一些恶意开发者破坏系统,并降低安全性。
51、Java与C的区别
JAVA与C的本质区别是JAVA面向对象编程,C是面向过程编程,这就使得JAVA具有重用的特性,在开发速度上比之C更快,但是在运行速度上却是C更快,因为C属于底层语言,它比JAVA更加亲近机器,所以在许多系统开发上一般是用C语言,比如我们常用的XP系统,LINUX系统,都是C语言开发的.
JAVA现在主要用在WEB开发,例如网站开发,而且它具有很好的跨平台性,现在JAVA与LINUX结合的非常好,在手机等各种电子产品上应用非常广泛.