2021 Java后端+大数据暑期实习大厂面经

目录

高频考点

操作系统篇

操作系统比较常考察的就是进程和线程、一些调度算法、死锁和IO模型。另外就是一些零碎的问题,我将一一介绍。

1.进程与线程的区别【常问】

进程和线程都是CPU工作时间段的描述,不过是颗粒大小不同。一个线程只能属于一个进程,但是一个进程可以拥有多个线程。进程是资源分配的最小单位,线程是程序执行的最小单位。进程有自己的独立地址空间,而线程没有。切换线程、创建线程、线程通信的开销均小于进程。

2.进程的通信方式?【常问】

(1)管道:它是半双工的(单向的),具有固定的读端和写端。管道分为pipe(无名管道)和fifo(命名管道)两种,除了建立、打开、删除的方式不同外,这两种管道几乎是一样的。他们都是通过内核缓冲区实现数据传输。在无名管道中,进程只能访问自己或祖先创建的管道。而命名管道有名字,该名字对应于一个磁盘索引节点,有了这个文件名,任何进程有相应的权限都可以对它进行访问。
(2)消息队列:消息队列就是一个消息的链表,是一系列保存在内核中消息的列表。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息,对消息队列有读权限的进程可以从消息队列中读取消息。消息队列与管道通信相比,其优势是对每个消息指定特定的消息类型,接收的时候不需要按照队列次序,而是可以根据自定义条件接收特定类型的消息。
(3)共享内存:共享内存允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存写入和读出,从而实现进程间的通信。采用共享内存进行通信的一个主要好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。进程之间在共享内存时,不是读写少量数据后就解除映射,有新的通信时再重新建立共享内存区域;而是保持共享区域,直到通信完毕为止,这样数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件,因此,采用共享内存的通信方式效率非常高。

3.操作系统调度方法?【腾讯】

(1)先来先服务:作业调度中,每次从后备作业队列中选择最先进入该队列的作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。进程调度中,每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机。FCFS调度算法的特点是算法简单,但效率低;对长作业比较有利,但对短作业不利。
(2)短作业(进程)优先:短作业优先(SJF)调度算法是从后备队列中选择运行时间最短的作业,将它们调入内存运行。短进程优先(SPF)调度算法,则是从就绪队列中选择估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某事件而阻塞时才释放处理机。SJF调度算法的平均等待时间、平均周转时间最少,但对长作业很不利。
(3)优先权调度:在作业调度中,优先级调度算法每次从后备作业队列中选择优先级最高的作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。
优先级用于描述作业运行的紧迫程度。根据新的更高优先级进程能否抢占正在执行的进程,可将该调度算法分为:
非剥夺式优先级调度算法。当某一个进程正在处理机上运行时,即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在运行的进程继续运行,直到由于其自身的原因而主动让出处理机时(任务完成或等待事件),才把处理机分配给更为重要或紧迫的进程。
剥夺式优先级调度算法。当一个进程正在处理机上运行时,若有某个更为重要或紧迫的进程进入就绪队列,则立即暂停正在运行的进程,将处理机分配给更重要或紧迫的进程。
而根据进程创建后其优先级是否可以改变,可以将进程优先级分为以下两种:
静态优先级。优先级是在创建进程时确定的,且在进程的整个运行期间保持不变。确定静态优先级的主要依据有进程类型、进程对资源的要求、用户要求。
动态优先级。在进程运行过程中,根据进程情况的变化动态调整优先级。动态调整优先级的主要依据为进程占有CPU时间的长短、就绪进程等待CPU时间的长短。
(4)高响应比优先:主要用于作业调度,每次先计算后备作业队列中每个作业的响应比,从中选出响应比最高的作业投入运行。响应比=(等待时间+要求服务时间)/要求服务时间。当作业的等待时间相同时,则要求服务时间越短,其响应比越高,有利于短作业。当要求服务时间相同时,作业的响应比由其等待时间决定,等待时间越长,其响应比越高,因而它实现的是先来先服务。
(5)基于时间片的轮转调度:系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中第一个进程执行,即先来先服务,但仅能运行一个时间片,如100ms。在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出处理机给下一个就绪的进程,而被剥夺的进程返回到就绪队列的末尾重新排队,等候再次运行。
时间片的大小对系统性能的影响很大。如果时间片足够大,以至于所有进程都能在一个时间片内执行完毕,则时间片轮转调度就退化为先来先服务调度。如果时间片很小,那么处理机将在进程间过于频繁切换,使处理机的开销增大。因此时间片的大小应选择适当。
(6)多级反馈队列调度:进程在进入待调度的队列等待时,首先进入优先级最高的Q1等待。首先调度优先级高的队列中的进程。若高优先级中队列中已没有调度的进程,则调度次优先级队列中的进程。对于同一个队列中的各个进程,按照FCFS分配时间片调度。比如Q1队列的时间片为N(优先级越高,时间片越短),若Q1中的作业在经历了时间片N后若还没有完成,则进入Q2队列等待,若Q2的时间片用完后作业还不能完成,一直进入下一级队列末尾,直至完成。在最后一个队列QN中的各个进程,按照时间片轮转分配时间片调度。在低优先级的队列中的进程在运行时,又有新到达的作业,此时须立即把正在运行的进程放回当前队列的队尾,然后把处理机分给高优先级进程。任何时刻,只有当第1~i-1队列全部为空时,才会去执行第i队列的进程(抢占式)。当再度运行到当前队列的该进程时,仅分配上次还未完成的时间片,不再分配该队列对应的完整时间片。

4.缓存算法(页面置换算法)?【字节、腾讯】

(1)FIFO先进先出:如果一个数据最先进入缓存中,则应该最早淘汰掉。当缓存满的时候,应当把最先进入缓存的数据给淘汰掉。
(2)LFU(Least Frequently Used)最近最少使用算法:如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小,当某一数据项被命中时,访问频次自增,在淘汰的时候淘汰访问频次最少的数据。
(3)LRU(Least Recently Used)最近最久未使用算法:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。

5.什么是死锁?如何避免死锁?

死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。
死锁的产生条件
(1)互斥条件:进程对于所分配到的资源具有排它性,即一个资源只能被一个进程占用
(2)请求和保持条件:一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持不放
(3)不可抢占条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,只能自己来释放(4)循环等待条件:当发生死锁时,所等待的进程必定会形成一个环路,造成永久阻塞。
预防死锁的发生
(1)破坏”请求与保持条件“:第一种方法静态分配即每个进程在开始执行时就申请他所需要的全部资源。第二种是动态分配即每个进程在申请所需要的资源时他本身不占用系统资源。
(2)破坏“循环等待”条件:将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的资源才能申请较大编号的资源。

6.IO模型

(1)同步阻塞IO(Blocking IO):用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作。而用户需要等待read将数据读取到后,才继续处理接收的数据。整个IO请求的过程中,用户线程是被阻塞的,对CPU的资源利用率不够。
(2)同步非阻塞IO(Non-blocking IO):用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断地调用read发起IO请求,直到数据到达后,才真正读取到数据,继续执行。整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源。
(3)IO多路复用(IO Multiplexing):使用Reactor模式实现,Reactor类可用于IO事件处理,并使用handle_events实现事件循环,不断调用select函数,通过Reactor的方式,可以将用户线程轮询IO操作状态的工作统一交给handle_events事件循环进行处理。用户线程为感兴趣的socket注册事件处理器之后可以继续做其他的工作(异步),而Reactor线程负责调用内核的select函数检查socket状态。当有socket被激活时,则通知相应的用户线程(或执行用户线程的回调函数),进行数据读取、处理的工作。用户可以注册多个socket,同时处理多个socket的IO请求。用户可以,然后不断地调用select读取被激活的socket。虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还是阻塞的。
(4)异步IO(Asynchronous IO):使用Proactor模式实现,用户使用AsynchronousOperationProcessor(异步操作进程)提供的API发出IO请求,然后继续执行其他任务,当异步IO完成后,内核将数据发送到Proactor,Proactor将IO完成的信息通知给用户线程,完成异步IO。

7.IO复用:select、epoll、poll的区别

(1)Select:时间复杂度O(n),仅知道有I/O事件发生,却并不知道是谁,只能无差别轮询所有流,找出能读出数据或者写入数据的流,对他们进行操作。同时处理的流越多,无差别轮询时间就越长。缺点是单个进程的监视端口大小有限,每次调用select,都需要把fd(文件描述符)集合从用户态拷贝到内核态,然后进行轮询,这个开销在fd很多时会很大,需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。
(2)Poll:时间复杂度O(n),poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构(链表结构)而不是select的fd_set结构,因此它没有最大连接数的限制。poll还有一个特点是“水平触发”,如果报告了fd后没有被处理,那么下次poll时会再次报告该fd。
(3)Epoll:时间复杂度O(1),epoll实际上是事件驱动的,会把哪个流发生了怎样的I/O事件通知我们。epoll有EPOLL LT和EPOLL ET两种触发模式。LT模式下,只要这个fd还有数据可读,每次epoll_wait都会返回它的事件提醒用户程序去操作,而在ET模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无论fd中是否还有数据可读。所以在ET模式下,read一个fd的时候一定要把它的buffer读光,也就是说一直读到read的返回值小于请求值,或遇到EAGAIN错误。还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知。

8.Linux常用命令【腾讯ping、iotop】

(1)ping IP地址用来检测网络的连通情况和分析网络速度,bytes值表示数据包大小,time值表示响应时间,这个时间越小,说明这个地址速度越快,TTL值该数据报被保存的时间;ping -a可以将地址解析为主机名;ping -r count记录传出和返回数据包经过的路由,最多九个。
(2)top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。可以显示当前登录用户数,进程总数,正在运行进程数,睡眠、停止的进程数,CPU信息等。
(3)kill 信号参数 进程PID -1代表SIGHUP信号,作用类似重新启动进程;-2代表SIGINT信号,作用相当于在命令行输入Ctrl+C组合键中断进程运行;-9代表SIGKILL信号,代表强制中断进程;-15代表SIGTERM信号,表示正常的终止进程;-17代表SIGSTOP信号,相当于在终端输入Ctrl+Z组合键来暂停进程的运行。

9.虚拟地址怎么映射到物理地址【字节】

CPU通过地址来访问内存中的单元,CPU向MMU(内存管理单元)发送虚拟地址,MMU将虚拟地址映射成物理地址发到内存芯片的引脚上。不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。
Win32通过一个两层的表结构来实现地址映射,第一层称为页目录,实际就是一个内存页,Win32的内存页有4KB大小,这个内存页被分为1024项,每一项大小为4字节,称为页目录项。第二层称为页表,这一层共有1024个页表,页表结构与页目录相似,每个页表也都是一个内存页,这个内存页也被分为1024项,每一项大小为4字节,被称为页表项,可知共有1024×1024个页表项。每一个页表项对应一个物理内存中的某一个“内存页”,即共有1024×1024个物理内存页,每个物理内存页为4KB,这样就可以索引到4G大小的虚拟物理内存。
每个虚拟地址都是一个32位的整数值,也就是我们平时所说的指针,即指针的大小为4B。它由三部分组成:第一部分,即前10位为页目录下标,用来寻址页目录项。第二部分则用来在页表内寻址,用来找到页表项。第三部分用来在物理内存页中找到对应的字节,一个页的大小是4KB,12位刚好可以满足寻址要求。由于页目录项和页表项大小为4KB,所以第一和第二部分的地址需要左移二位。
PS:我是这么回答的,但面试官好像不太满意?不太清楚他想问的是不是这个

计算机网络篇

1.网络协议分层【腾讯七层】

物理层:定义物理设备之间如何传输数据
数据链路层:在通信的实体间建立数据链路链接
网络层:为数据在节点之间的传输创建逻辑链路
传输层:向用户提供可靠的端到端服务,传输层通过封装向高层屏蔽了下层数据通信的细节
【会话层、表示层】
应用层:为应用软件提供了很多服务,构建于tcp协议之上,屏蔽了网络传输相关的细节

2.HTTP请求结构?【字节】

HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据;请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。比如 GET /data/info.html HTTP/1.1。大多数请求头并不是必

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值