计算机专业考研面试题大全———持续更新中

数据结构

  1. 堆栈和队列的区别

    • 栈只能从头部取数据,先放入的数据需要遍历整个栈后才能取出,而且在遍历的过程中还需要为数据开辟临时空间,以保证数据在遍历前后的一致性。
    • 队列基于地址指针进行遍历,而且可以从头或尾部开始遍历,无需开辟临时空间,速度要快得多。
    • 常见栈的应用场景:括号问题求解、表达式转换和求值、函数调用和递归以及深度优先遍历。
    • 常见队列的应用场景:计算机系统中各种资源的管理、消息缓冲以及广度优先遍历。
  2. 数组和链表的区别

    • 从逻辑结构来看:数组必须事先定义固定的长度,不能适应数据动态增减的情况。当数据增加时,可能会超出原先定义的长度;当数据减少时,造成内存浪费。链表动态地进行存储分配,可以适应数据动态增减的情况,且可以方便地插入、删除数据项
    • 从内存存储来看:数组从栈中分配空间,对于程序员来说方便快速,但是自由度较小。而链表是从堆中分配空间,自由度大但是申请管理的过程较复杂
    • 从上面的比较可以看出,如果需要快速访问数据,很少或者不插入和删除元素,就应该用数组;相反,如果需要经常插入和删除元素就许需要使用链表了
  3. 循环比递归的效率高吗?

    • 递归算法的代码简洁、清晰,并且容易验证正确性。但是它的运行需要较多次的函数调用,如果调用层数比较深,需要增加额外的堆栈处理(还有可能出现堆栈溢出的情况),比如参数传递需要压栈等操作,会对执行效率有一定影响。但是对于某些问题,如果不适应递归,那将是极端难看的代码。在编译器优化之后,对于多次调用的函数处理会有非常好的效率优化,效率未必低于循环
    • 循环算法的速度快、结构简单。但是它并不能解决所有的问题。有的问题适合使用递归而不是循环,如果使用循环不困难的话,最好使用循环
  4. 如何判断链表有环?

    两个指针分别按照固定的步长行走,P1一次走一步,P2一次走两步,如果链表有环,P1和P2会有相遇的时刻

  5. 栈的实现方式及其对比

    • 基于动态数组:添加元素时根据需要改变数组大小,与链表相比,动态数组的主要优点是数组提供了对数组元素的随机访问。由于对栈的操作总是在栈顶,因此动态数组的随机访问特性带来的好处并不明显。除此之外,随着动态数组长度的增加。他必须不时地resize数组,这是一个十分耗时的操作,需要将原数组元素复制到一个新的数组中去
    • 基于链表:链表通常动态地为每一个元素分配空间,在处理small-size的元素时,这种开销可能非常大,特别是当启发式被用来最小化数组需要调整大小的次数
    • 综合以上原因,在实际使用时,基于动态数组的栈往往比基于链表的栈faster
  6. 度为2的树和二叉树的区别

  7. B树和B+树的区别以及各自的应用场景

    • B树和B+树应用于数据库索引,可以认为是m叉的多路平衡查找树,由于磁盘IO速度很慢,数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存中,只能逐一加载每一个磁盘页(对应索引树上的结点)。所以我们要尽量减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是B树的特征之一。
    • 一个M阶的B树具有以下特征:1.任意非叶子结点对多有M个孩子,且M>2;2.根节点的孩子数为[2,M];3.除根节点以外的非叶子结点的孩子数为[M/2,M],向上取整;4.非叶子结点的关键字个数=孩子数-1;5.所有叶子结点位于同一层;6.k个关键字把结点拆成k+1段,分别指向k+1个孩子,同时满足查找树的大小关系;7.关键字集合分布在整棵树中;8.任何一个关键字出现且仅出现在一个节点中;9.搜索可能在非叶子结点结束;10其搜索性能等价于在关键字全集中做一次二分查找
    • 一个M阶的B+树具有以下特征:1.有n棵子树的非叶子结点中含有n个关键字(B树是n-1个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点上(B树每个结点都保存数据);2.所有的叶子结点中包含关键字的全部信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接,因此B+树既可以支持索引查找,也可以支持顺序查找;3.所有非叶子结点都可以看作成索引部分,结点中仅含其子树的最大(或最小)关键字;4.通常在B+树上有两个头指针,一个指向根节点,一个指向关键字最小的叶子结点;5.同一个数字会在不同的结点重复出现,根节点的最大元素就是B+树的最大元素;6.由于B+树的中间节点不保存数据,所以磁盘页能容纳更多结点元素,因此B+树更“矮胖”;7.B+树查询必须查询到叶子结点,而B树只要匹配到即可不用管元素位置,因此B+树更加稳定
    • 数据库系统和文件系统中常用B/B+树,通过对每个结点存储个数的扩展,使得对连续的数据能够进行较快的定位和访问,能够有效减少查找时间,提高存储的空间局部性而减少IO操作。如:
      • Windows:HPFS文件系统
      • Mac:HFS、HFS+文件系统
      • Linux:ResiserFS、XFS、Ext3FS、JFS文件系统
      • 数据库:Oracle、MySql、SqlServer等
  8. 如何理解哈希表,什么是哈希表?

    哈希表是根据关键码值而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组叫做散列表。

  9. 解决哈希冲突的方法:线性探测法、平方探测法、伪随机序列法、拉链法

  10. 图的存储结构

    • 邻接矩阵
    • 邻接表和逆邻接表
    • 十字链表
  11. 什么是最小生成树,有哪些最小生成树算法

    • 最小生成树来自于无向网,无向图在边上加上权值就变成了无向网;一个无向图可以有多种不同姿态连接的生成树。最小生成树就是各边权值之和最小的生成树。当连通图中各边的权值不相等时,最小生成树唯一;当有相等的权值时最小生成树可能不唯一,也可能唯一,具体情况具体分析

    • Kruskal算法:称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边加入到最小生成树的边集合中

    • Prim算法:称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。从某一个顶点开始,逐渐长大覆盖整个连通网的所有顶点

  12. 深度优先和广度优先的比较

    • 深度优先搜索(回溯法):它从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步状态,继续转移到其他状态。如此不断重复,直到找到最终的解。根据深度优先搜索的特点,采用递归函数(隐式地利用了栈进行计算)实现比较简单。DFS从最开始的状态出发,遍历所有可以到达的状态,由此可以对所有的状态进行操作,或者列举出所有的状态。DFS对于寻找一个解的问题作用很大。但是,搜索算法毕竟是O(n!)复杂度,在数据规模变大时,这种算法就显得力不从心了。关于DFS效率的问题,有多种解决方法,最通用的是“剪枝(prunning)”,也就是去除没有用的搜索分支,有可行性剪枝和最优性剪枝两种。
    • 宽度优先搜索:它与DFS类似,从某个状态出发搜索所有可以到达的状态,使用队列实现比较简单。与DFS不同在于搜索的顺序,BFS总是先搜索距离初始状态近的状态,也就是说,它是按照:开始状态->只需1次转移就可以到达的所有状态->只需2次转移就可以到达的所有状态->只需3次转移就可以到达的所有状态->……这样的顺序进行搜索。对于同一个状态,BFS只经过一次,因此时间复杂度为O(状态数*转移方式)。使用BFS可以很容易地解决求最短路径、最少操作之类的问题
  13. 常见的排序算法主要思想及各自的时间复杂度

    • 快速排序:
      • 选择一个基准元素,通常选择第一个元素或者最后一个元素
      • 通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小,另一部分记录的元素值均比基准元素值大
      • 此时基准元素在其排好序后的正确位置
      • 然后分别对这两部分记录用同样的方法进行排序,直到整个序列有序
  14. 二叉树的存储

    • 顺序存储:完全二叉树的存储可以按照从上到小,从左到右的顺序依次存储到一维数组中。但是如果按照这种方式把非完全二叉树也依次放入一维数组中,为了能够正确反映二叉树中结点之间的逻辑关系,需要在一维数组中将二叉树中不存在的结点位置空出。顺序存储对于完全二叉树来说是比较合适的,因为采用这种方式能够节省内存单元,并能利用公式得到每个结点的存储位置。但是对于非完全二叉树,这种存储方式会浪费内存空间
    • 链式存储:在二叉树中每一个结点都有一个双亲结点和两个孩子结点。从一颗二叉树的根结点开始,通过结点的左右孩子地址就可以找到二叉树的每一个结点。因此二叉树的链式存储结构包括三个域:数据域、左孩子指针域和右孩子指针域。有时为了方便找到结点的双亲结点,在二叉链表的存储结构中增加以指向双亲结点的指针域parent,这种存储结构被称为三叉链表结点存储结构

计算机网络

  1. 虚电路和数据报的区别

    • 数据报无连接,虚电路面向连接
    • 数据报的分组都是通过独立的路由选择和转发,而同属于一条虚电路的分组按照同一路由转发
    • 数据报不保证数据的可靠交付,虚电路的可靠性由网络质量保证
    • 数据报不保证分组的有序到达,虚电路可以保证
  2. 什么是Socket

    应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口,区分不同应用程序进程之间的网络通信和连接。生成套接字,主要有三个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意为“插座”。通过将这三个参数结合起来,与一个”插座“Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程和网络连接的通信,实现数据传输的并发服务。Socket可以看成在两个程序进行通讯连接的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另一个Socket,使这段信息能够传送到其他程序中。Socket是传输层在进行端到端通信时两端连接的端点。

  3. 简述一下七层协议:OSI参考模型又称开放系统互联模型,它是美国国际标准化组织定义的网络参考模型。OSI参考模型共分为7层,分别是:

    • 物理层:实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流。规定了电平、速度和电缆针脚。常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆。这些都是物理层的传输介质。IEEE802.2、Ethernet v.2、Internetwork
    • 数据链路层:将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测。数据链路层又分为2个子层:逻辑链路控制子层(LLC)和媒体访问控制子层(MAC)。MAC子层处理CSMA/CD算法、数据出错校验、成帧等;LLC子层定义了一些字段使上次协议能共享数据链路层。 在实际使用中,LLC子层并非必需的。MPLS多协议标签交换协议、XTP压缩传输协议、PPTP点对点隧道协议、Cisco协议、ARP地址解析协议和RARP逆向地址解析协议等
    • 网络层:本层通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的IP层。这一层就是我们经常说的IP协议层。IP协议是Internet的基础。EGP外部网关协议、OSPF开放最短路径优先协议、IGRP内部网关路由协议、NHRP下一跳解析协议、GGP网关到网关协议、ICMP互联网控制信息协议、IGMP互联网组管理协议、SLP串行链路IP协议、IP/IPv6互联网协议/互联网协议第6版
    • 传输层:建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。我们通常说的,TCP UDP就是在这一层。端口号既是这里的“端”。TCP传输控制协议、UDP用户数据报协议
    • 会话层:负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。SSL安全套接字层协议、TLS传输层安全协议、DAP目录访问协议、RPC远程过程调用协议
    • 表示层:提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。LPP轻量级表示协议、XDP外部数据表示协议
    • 应用层:OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。常见使用TCP协议的应用层服务:HTTP超文本传输协议、FTP文件传输协议、SMTP简单邮件传输协议、TELNET、POP3邮局协议第3版、Finger用户信息协议、NNTP网络新闻传输协议、IMAP4因特网信息访问协议第四版;常见使用UDP协议的应用层服务:BOOTP引导协议、DHCP动态主机配置协议、NTP网络时间协议、TFTP简单文件传输协议;同时使用TCP和UDP的服务:SOCKS安全套接字协议、FANP流属性通知协议、SLP服务定位协议、DNS域名系统
  4. 简述五层模型各层的功能及其网络设备(未完

    • 应用层的任务是通过应用进程间的交互来完成特定的网络应用。其协议定义的是应用进程间通信和交互的规则。对应于不同的网络应用需要不同的应用层协议。其协议有DNS、HTTP、SMTP等
    • 传输层:负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用”是指多种应用可以使用同一个运输层服务。由于一台主机可以同时运行多个进程,因此该层可实现复用和分用
    • 网络层:在计算机网络中进行通信的两台主机之间会经过很多个数据链路层,也可能还要经过很多通信子网。该层的任务就是选择合适的网间路由和交换节点,确保数据及时传送。把传输层产生的报文段或用户数据报封装成分组和包进行传送
    • 链路层:将网络层交付下来的IP数据报组装成帧,每一帧包括数据和必要的控制信息。在接收信息时,通过控制信息可以知道每一个帧从哪个比特开始到哪个比特结束,可以从中提取出数据部分上交给网络层。此外还包含有差错信息等。
    • 物理层:
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zv4yF0xD-1617010391225)(https://i.loli.net/2021/03/29/XLoUFD1dl52zvqM.png)]
  5. 浏览器访问网页的流程(点击一个网页链接的过程)

    • 域名解析成IP地址:
      1. 浏览器首先搜索浏览器自身缓存的DNS记录,浏览器自身也带有一层DNS缓存。Chrome缓存1000条DNS解析结果,缓存时间大概在一分钟左右。Chrome浏览器通过输入chrome://net-internals/#dns 打开DNS缓存页面
      2. 如果浏览器缓存中没有找到需要的记录或者记录已过期,则搜索hosts文件(linux系统的hosts文件在/etc/hosts下)
      3. 如果在hosts文件中没有找到需要的记录或者记录已过期,则向域名解析服务器发送解析请求。系统会向DNS服务器正式发出解析请求,这里是真正意义上开始解析一个未知的域名(在这期间可能会用到ARP协议来查找DNS服务器的MAC地址)
      4. 如果域名解析服务器也没有该域名的记录,则开始递归+迭代解析(略)
      5. 获取域名对应的IP后,一步步向上返回,直到返回给浏览器
    • 与目的主机进行TCP连接(三次握手):浏览器会选择一个大于1024的端口号向目标IP地址的80端口发起TCP连接请求。经过标准的TCP握手流程,建立TCP连接
    • 发起HTTP请求:其本质是在建立起的TCP连接上,按照HTTP协议标准发送一个索要网页的请求
    • 负载均衡:当一台服务器无法支持大量的用户访问时,将用户分摊到多个服务器上,常用的负载均衡是Nginx。如果我们的平台配备了负载均衡的话,前一步DNS解析获得的IP地址就是我们Nginx负载均衡服务器的IP地址,所以我们的浏览器将我们的网页请求发送到了Nginx负载均衡服务器上。然后Nginx根据我们设定的分配算法和规则,选择一台后端真实的Web服务器,与之建立TCP连接,并转发我们浏览器发出的网页请求。Web服务器收到请求后,产生相应,并将网页发送给Nginx负载均衡服务器。Nginx负载均衡服务器将网页传递给filters链处理,之后再返回给我们的浏览器
    • 浏览器渲染
      1. 浏览器根据页面内容,生成DOM Tree。根据CSS内容,生成CSS Rule Tree。调用JS代码执行引擎执行JS代码
      2. 根据DOM Tree和CSS Rule Tree生成Render Tree
      3. 根据Render Tree渲染网页
    • 网页静态资源加载
  6. DNS的工作过程

    注意:

    1. 主机向本地域名服务器的查询一般是采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询报文,相当于替主机继续查询,而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果要么是所要查询的IP地址,要么是报错表示无法查询所需的IP地址
    2. 本地域名服务器向根域名服务器的查询一般采用迭代查询。迭代查询的特点是:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器,你下一步应当向哪一个域名服务器查询。然后本地域名服务器自己进行后续的查询。根域名服务器通常把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要查询的IP地址或者报错,然后把这个结果返回给发起查询的主机

    假定域名为m.xyz.com的主机想知道另一个主机y.abc.com的IP地址,下面是查询步骤:

    1. 主机m.xyz.com先向本地域名服务器dns.xyz.com进行递归查询
    2. 本地域名服务器采用迭代查询,它先向一个根域名服务器查询
    3. 根域名服务器告诉本地域名服务器,下一次查询的顶级域名服务器dns.com的IP地址
    4. 本地域名服务器向顶级域名服务器dns.com进行查询
    5. 顶级域名服务器dns.com告诉本地域名服务器,下一步查询的权限域名服务器的IP地址是dns.abc.com
    6. 本地域名服务器向权限域名服务器dns.abc.com进行查询
    7. 权限域名服务器dns.abc.com告诉本地域名服务器所查询的IP地址
    8. 本地域名服务器最后把查询结果告诉m.xyz.com
  7. 网络的拓扑结构有哪些

    • 星型结构:以一台中心处理机为主而构成的网络,其他入网机器仅与该中心处理机之间有直接的物理链路,中心处理机采用分时和轮询的方法为入网主机服务,所有数据必须经过中心处理机。星型网络的特点有:网络结构简单,便于管理;每台入网机器均需物理线路与处理机互联,线路利用率第低;处理机负载重;入网主机故障不影响整个网络的正常工作,中心处理机故障将导致网络的瘫痪;适用于局域网、广域网
    • 总线型结构:所有入网设备共用一条物理传输线路,所有的数据发往同一条线路,并能够由附接在线路上的所有设备感知。入网设备通过专用的分接头接入线路。其特点有:多台机器共用一条传输信道,信道利用率高;同一时刻只能由两台计算机通信;某个结点故障不影响网络的工作;网络的延伸距离有限,结点数有限;适用于局域网,对实时性要求不高的环境
    • 环形网络结构:入网设备通过转发器接入网络,每个转发器仅与两个相邻的转发器有直接的物理线路。环形网络的数据传输具有单向性,一个转发器发出的数据只能被另一个转发器接收并转发。所有的转发器及其物理线路构成了一个环状的网络系统。其特点有:实时性较好,信息在网中传输的最大时间固定;每个结点只与相邻的两个结点有直接物理链路;传输控制机制比较简单;某个结点故障将导致网络崩溃;单个环网的结点个数有限;适用于局域网,实时性要求较高的网络
    • 网状网络结构:利用专门负责数据通信和传输的结点机构成的网状网络,入网设备直接接入结点进行通信。网状网络通常利用冗余的设备和线路来提高网络的可靠性,因此,结点机可以根据当前的网络信息流量有选择地将数据发往不同的线路;适用于地域范围大、入网主机多的环境,常用于构建广域网络
  8. TCP和UDP的区别

  9. 简述一下TCP/IP协议

  10. 三次握手和四次挥手


操作系统

  1. 进程和线程的区别
    • 从资源占有来看,线程是资源分配和调度的基本单位,而进程是拥有资源的基本单位;线程除了自身所必须分配的那一点资源外,基本不占用资源.
    • 从切换开销来看,每个进程都拥有独立的代码和数据空间,进程的创建和撤销都需要位置分配和回收资源,开销大;而同一类线程共享代码和数据空间,每个线程都拥有自己独立的运行栈和程序计数器PC,在线程切换时,系统只需要保存和设置少量寄存器的内容,开销很小。
    • 从并发性来看,在操作系统中能同时运行多个进程,而在同一个进程内又有多个线程同时执行
    • 从调度来看,线程是CPU调度的最小单位
    • 一个线程只能属于一个进程,而一个进程至少有一个线程
    • 处理机分给线程,即真正在处理机上运行的是线程
    • 一个进程挂掉不会影响其他进程,而线程挂掉会影响其他线程
  2. 为什么进程上下文切换比线程上下文切换代价高?
    • 上下文切换就是从当前执行的任务切换到另一个任务的过程。但是为了确保下次能从正确的位置继续执行,在切换之前,会保存上一个任务的状态
    • 由于每一个进程拥有自己的独立内存空间,而线程共享进程的内存空间,所以,进程上下文切换与线程上下文切换最主要的区别就是线程的切换其虚拟内存空间是相同的,因为他们都属于自己的线程,但是进程的切换虚拟空间内存则是不同的。进程切换分两步:切换页目录以使用新的地址空间、切换内核栈和硬件上下文。对于线程切换,第一步是不需要做的,第二步是进程和线程都要做的
    • 同时,这两种上下文切换的处理都是通过OS内核来完成的。内核的这种切换伴随的最明显的性能损耗是将寄存器中的内容切换出。
    • 另一个隐藏的损耗是上下文的切换会扰乱CPU的缓存机制,一旦去切换上下文,CPU中所有已经缓存的内存地址就全部作废了。还有一个区别就是当去改变虚拟内存空间的时候,处理的页表缓冲或者其他很多东西都会被全部刷新,这将导致内存的访问在一段时间会非常的低效。但在线程的切换中就不会出现这个问题。
  3. 为什么要有进程调度,有哪些进程调度算法?
    • 若没有处理机调度,就意味着要等到当前运行进程执行完毕之后,下一个进程才能执行。而实际情况中,进程时常需要等待一些外部设备输入,而外设与CPU的速度十分不匹配,导致CPU资源浪费严重
    • 调度的种类:
      • 高级调度:又称为作业调度,它决定把后备作业调入内存运行
      • 中级调度:又称为进程调度,它决定把CPU分配给就绪队列的某个进程
      • 低级调度:又称
    • 非抢占式调度与抢占式调度
      • 非抢占式调度:分配程序一旦把处理机分配给某个进程后便让他一直运行下去,直到进程完成或者发生特殊情况导致该进程阻塞,才把处理机分配给其他进程
      • 抢占式调度:操作系统将正在运行的进程强行暂停,由调度程序将CPU分配给其他就绪进程
    • 调度算法:
      • FCFS:先来先服务;公平、简单、非抢占、不适合交互式;未考虑任务特性,其平均等待时间可以缩短;其利于长作业,不利于短作业
      • SJF:短作业会越过长作业,跳至队列头;可以保证最小的平均等待时间;利于短作业,不利于长作业,不能保证紧迫性作业被及时处理;作业的长度也只是被估算出来的
      • RR:时间片轮转法,是基于适中的抢占策略的,以一个周期性间隔产生时钟中断,当中断发生后,当前正在运行的进程被置于就绪队列,然后基于FCFS选择下一个就绪作业运行。其优点是定时有响应、等待时间较短,缺点是上下文切换次数较多。如果时间片太大,那么响应时间太长;吞吐量变小,周转时间边长;当时间片过长时,退化为FCFS
      • HRRN:最高相应比优先,相应比R=(等待时间+需要服务的时间)/需要服务的时间。R最小为1,只有第一个进入系统的进程才能达到该值。调度规则为:当前进程完成或者被阻塞时,选择R值最大的就绪进程,它说明了进程的年龄。当偏向短作业时,长进程由于得不到服务,等待时间不断增加,从而相应比增加,最终在竞争中可以赢了短进程。需要估计预计服务时间
      • SRJF:最短剩余时间优先,是SJF的可抢占版本
      • 优先权调度:系统进程>用户进程、交互型进程>非交互型进程、IO型进程>计算(CPU)型,优先权太低的任务一直就绪,得不到运行,出现“饥饿”现象
      • 多级队列调度:按照一定的规则建立多个进程队列,不同的队列有固定的优先级,不同的队列可以设定不同的时间片和采用不同的调度算法
      • 多级反馈队列:在多级队列的基础上,任务可以在队列之间移动,更细致地区分任务。可以根据“享用”CPU时间的多少来移动队列,阻止”饥饿“的发生。是目前最通用的算法,多数OS都使用该方法或者其变形,如Unix和Windows等
  4. 进程通信的方式有哪些?
    • 进程通信是指进程之间的信息交换(信息量少则一个状态,多则成千上万个字节)。因此,对于用信号量进行的进程间的互斥和同步,由于其所交换的信息量少而被归结为低级通信
    • 所谓高级进程通信是指,用户可以利用OS所提供的一组通信命令传送大量数据的一种通信方式。OS隐藏了进程通信的实现细节,或者说,通信过程对用户是透明的
    • 高级通信机制可归结为三大类:
      • 共享存储器系统(在存储器中划分的共享存储区):实际操作中对应的是”剪贴板“的通信方式。多个进程共享一块内存空间,是专门用来解决不同进程之间通信问题的,由于是直接对内存进行数据传输操作,所以是速度最快的进程通信方式,因为是共享内存,所以需要配合信号量机制实现同步。比如:word进程按下ctrl+c,在记事本进程中按下ctrl+v,即完成了word进程和记事本进程之间的通信复制时将数据放入到剪贴板,粘贴时从剪贴板中取出数据,然后显示在记事本窗口上
      • 管道通信:管道是单向的、先进先出的、无结构的、固定大小的字节流,是一种半双工的通信方式。管道是用于连接读写进程以实现他们之间通信的共享文件。管道分为匿名管道和命名管道。匿名管道只能实现本地机器上两个进程之间的通信,而不能跨网络通信。而命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现进程通信。管道把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的头部读出数据。数据读出后将从管道中移走,其他进程都不能再读到这些数据,管道提供了简单的流控制机制,当进程试图读空管道时,在有数据进入管道前,进程将一直阻塞。同样的,管道已经满时,进程再试图写管道,在其他进程从管道移走数据之前,写进程一直阻塞
      • Socket通信:它可以用于不同机器之间的进程通信
      • 消息队列:是消息的链接表,存放在内核中并由消息队列标识符标识。用户可以从消息队列中读取数据和添加数据。其中,发送进程将消息添加到队列的末尾,接收进程从队列的头部接收消息,消息一旦接收,就会从队列中删除。
      • 信号量:为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,信号量提供这样一种机制,让一个临界区同一时间只能有一个线程访问它,也就是说信号量是用来协调进程对共享资源的访问的。信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对他进程等待和发送信息的操作(即P、V)。最简单的信号量是只能取0或1的变量,这也是信号量中最常见的一种,叫做二进制信号量。而可以取多个正整数的信号量被称为通用信号量
  5. 什么是缓冲区溢出?有什么危害?
    • 缓冲区就是OS为函数执行专门划分出的一段内存空间,包括栈、堆和静态数据区。缓冲区溢出发生在栈里,栈存放了函数的参数、返回地址、EBP(当前函数的存取指针,即存储或者读取数时的指针基地址,可以看作一个标准的函数起始代码)和局部变量。
    • 当函数中对局部变量的赋值超过了为其分配的空间,超出部分就会覆盖栈里其他部分的数据,这就是缓冲区溢出。如果缓冲区溢出只是导致程序执行出错,那么危害还不算大。但如果溢出到返回地址的数据是另一段函数或代码的入口地址,那么这段函数或代码就会被执行,这就是缓冲区溢出漏洞真正的危害所在。通过精心构造溢出数据,将函数返回地址修改为其他函数或代码的入口地址,从而达到运行的目的。而且被攻击的程序如果有管理员权限,那么新指向的函数或代码也会继承其权限,这就是缓冲区溢出攻击容易获得系统最高权限的原因。
  6. 什么是死锁?死锁和饥饿的区别?资源的类别?死锁产生的条件?处理死锁的方法?
    • 在两个或多个并发进程中,如果每个进程都持有某种资源而又等待其他进程释放它所保持着的资源,在未改变这种状态之前所有进程都不能向前推进,称这一组进程产生了死锁。通俗的讲就是多个进程无限期的阻塞、相互等待的一种状态
    • 饥饿是指一个进程一直得不到资源。死锁和饥饿都是由于进程竞争资源而引起的。饥饿一般不占有资源,而死锁进程一定占有资源
    • 死锁产生的四个条件(缺一不可):
      • 互斥:一个资源一次只能被一个进程使用
      • 请求与保持:一个进程因请求资源而阻塞时,对自己已获得资源保持不放
      • 不可剥夺:进程获得的资源,在未完全使用完之前,不能强行剥夺
      • 循环等待:若干进程之间形成一种头尾相连的环形等待资源的关系
    • 资源分为可重用资源、消耗性资源(生产者进程创建,消费者进程消耗)、可抢占资源(CPU和主存)、不可抢占资源(磁带机和打印机)
    • 死锁产生的原因:
      • 竞争不可抢占资源:通常系统中拥有的不可抢占资源数量不足以满足多个进程运行的需要时,进程在运行过程中会因为争夺资源陷入僵局
      • 竞争消耗性资源
      • 进程推进顺序不当:进程请求和释放资源的顺序不当,例如进程P1、P2分别保持了资源R1、R2,而进程P1申请R2、进程P2申请R1,这时就产生死锁
      • 信号量使用不当:进程间彼此相互等待对方发来的消息,例如A等待B的消息,B又在等待A的消息,可以看出A和B不是因为竞争统一资源,而是在等待对方的资源而导致死锁
    • 处理死锁的方法:
      • 预防:通过设置某些限制条件,破坏四个必要条件中的一个或多个,来防止死锁的产生
      • 避免:在资源动态分配的过程中,用某种方法防止系统进入不安全状态,从而避免死锁的发生
      • 检测:允许系统在运行过程中发生死锁,但可设置检测机构及时检测死锁的发生,并采取适当措施加以清楚
      • 解除:当检测出死锁后,采用适当措施将进程从死锁中解脱出来

计算机组成原理

  1. cpu中有哪些寄存器以及他们的作用?
    • 指令寄存器:存放当前正在执行的指令
    • 数据寄存器:是CPU、内存和外存的中转站、缓冲,用来暂存计算过程中读出或存入的数据
    • 程序计数器:用来指出小一条指令在主存中的地址
    • 地址寄存器:用来保存CPU当前访问的主存地址
    • 程序状态字寄存器:保存当前运算的各种状态条件标志
    • 累加寄存器
  2. 冯诺依曼体系结构

数据库

  1. 外模式,模式和内模式
    • 外模式又称用户模式和子模式,是用户可见的局部数据的逻辑结构和特征的描述
    • 内模式是数据库的物理结构和存储方式,是数据在内部的组织方式,内模式在数据库中唯一,其还描述数据是否加密、压缩等。
    • 模式又称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,数据库中只有一个模式。其与数据的物理存储细节和硬件环境无关,与具体的应用程序、开发工具和高级程序设计语言无关。
    • 模式:外模式=1:n,外模式:应用=1:n

人工智能

  1. 什么是人工智能,人工智能有哪些应用?
    • 人工智能是研究、开发用于模拟、延伸和扩展人的只能理论、方法、技术的一门新的技术科学
    • 其应用于指纹识别、机器人、人脸识别、虹膜识别、专家系统、博弈和智能搜索等领域
  2. 什么是深度学习
    • 学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如数字、图像、声音等的解释有很大帮助。它的最终目标是让机器人能够像人一样具有分析学习能力,能够识别文字、图像等数据。

大数据

  1. 大数据5V特征:
    • Volume:体积大
    • Variety:种类多
    • Velocity:增长速度快
    • Value:价值高
    • Veracity:真实性

其他

  1. 面向对面和面向过程的区别以及代表语言(答案略)。
  2. 你在平时编程中遇到过哪些错误?
    • 空指针异常:调用了未经初始化的对象或是不存在的对象,混淆数据初始化和数组元素初始化
    • 数组下标越界:显式调用不易出现该错误,隐式调用易出错,或是定义的数组长度是通过某些特定的方法决定的而不是事先声明的,最好先查看一下数组的length。
  3. C++和Java的特点
  4. 常见的http状态码
    • 1XX:接受信息正在处理
    • 2XX:正常处理完毕,200(OK,请求成功)
    • 3XX:附加操作,301(永久重定向),302(临时重定向)
    • 4XX:无法处理:401(语法错误),402(未认证),403(禁止访问),404(资源未找到)
    • 5XX:请求出错:500(服务器出错),501(服务器繁忙)
  5. C或C++编译的程序的内存如何分配
    • 栈区(stack):由编译器自动分配并释放,存放函数的参数值,局部变量的值等。其操作方式类似与数据结构中的栈。声明在函数中的一个局部变量int b,系统会自动在栈中为b开辟空间。只要栈的剩余空间大于所申请空间,系统将为程序提供能存,否则将报异常提示栈溢出。在windows中,栈的空间大小一般为4M,栈的分配速度较快
    • 堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束后可能由OS回收。注意它与数据结构中的堆是两回事,它的分配方式更类似于链表。需要程序员自己申请并指明大小,例如在c中p1=(char *)malloc(10);在C++中p2=new string("hello");操作系统中有一个记录空闲内存地址的链表,当系统收到程序的内存申请时,会去遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该节点从空闲结点链表中删除,并将该结点的空间分配给程序。另外,对于大多数程序来说,会在这块内存空间的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确释放本块内存空间。另外,由于找到的堆结点的大小不一定整好等于申请的大小,系统会自动将多余的那部分重新放入空闲链表中。堆的大小受限于计算机系统的有效虚拟内存,堆获得的空间较大,也比较灵活。堆的分配速度较慢,且容易产生内存碎片,不过用起来最方便
    • 全局区(静态):全局变量和静态变量的存储在一起的,初始化的全局变量和初始化的静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后系统自动释放
    • 文字常量区:常量字符串存放于此,程序结束后系统自动释放
    • 程序代码区:存放函数体的二进制代码
  • 4
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜色如墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值