虎牙java高级一面 内核缓冲区面试题解析分享

Posted xy29981

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虎牙java高级一面 内核缓冲区面试题解析分享相关的知识,希望对你有一定的参考价值。

内核态和用户态

先来回顾下内核态和用户态:

众所周知,CPU 上会运行两种程序,一种是操作系统的内核程序(也称为系统程序),一种是应用程序。前者完成系统任务,后者实现应用任务。两者之间有控制和被控制的关系,前者有权管理和分配资源,而后者只能向系统申请使用资源。

显然,我们应该把在 CPU 上运行的这两类程序加以区分,这就是内核态和用户态出现的原因。

  • 内核态(kernel mode):当 CPU 处于内核态时,这是操作系统管理程序(也就是内核)运行时所处的状态。运行在内核态的程序可以访问计算机的任何资源,不受限制,为所欲为,例如协调 CPU 资源,分配内存资源,提供稳定的环境供应用程序运行等。

  • 用户态(user mode):应用程序基本都是运行在用户态的,或者说用户态就是提供应用程序运行的空间。运行在用户态的程序只能访问当前 CPU 上执行程序所在的地址空间,这样有效地防止了操作系统程序受到应用程序的侵害。

对操作系统来说,什么样的程序应该放在内核态呢?

这取决于对资源的需求、时间的紧迫和效率高低等因素。比如 CPU、内存、设备等资源管理器程序应该在内核态运行,否则安全性没有保证。对于文件系统和数据来说,文件系统数据和管理必须放在内核态,但是用户的数据和管理可以放在用户态。

应用程序如果想要访问系统资源,可以通过系统调用 or 中断(外中断、内中断)从而使得 CPU 从用户态转向内核态

所谓系统调用,其实就是一些函数,操作系统直接提供了这些函数用于对文件和设备进行访问和控制。

最常见的就是 read 和 write 这俩

简单介绍下:

  • read:从文件中读取内容

  • write:往文件中写入内容

内核缓冲区

根据内核态和用户态的定义,我们不难理解内核空间和用户空间的定义

  • 用户操作系统内核能够访问的内存区域呢,就称为内核空间,它独立于普通的应用程序,是受保护的内存空间

  • 而普通应用程序可访问的内存区域呢,就是用户空间

当我们说一个应用程序从磁盘上读取文件时,通常分两步走:

操作系统(内核)先从磁盘上读取数据存到内核空间,再把数据从内核空间拷贝到用户空间。此后,用户应用程序才可以操作此数据。

所以,在这个过程中有两次数据读取操作:

  1. 第一步:从磁盘上读取

  2. 第二步:从内存中读取

众所周知,访问磁盘的速度要远远低于访问内存的速度,完全不是一个量级的,所以理论上 read 磁盘的速度要远远慢于 read 内存。

那么整个文件读取过程的最大时间瓶颈就出现在了对磁盘的读取上。

要解决这个问题,内核缓冲区Kernel Buffer Cache)就应运而生了。

本质上其实就是内核空间的一块内存区域罢了

从 Buffer Cache(缓冲区缓存)这个名字上能看出来,内核缓冲区(准确的说,应该是内核缓冲区缓存),其实有两个作用,缓冲(Buffer) + 缓存(Cache)

小牛肉 PS:实话实说,各种各样的翻译很容易让我们的学习曲线陡峭起来,记住 Buffer Cache 比记住内核缓冲区或者用户缓冲区这俩名词要好得多,这俩容易让人摸不着头脑。

先来看看它是怎么充当 Cache 的:

⭐ 数据预读

数据预读指的是,当程序发起 read() 系统调用时,内核会比请求更多地读取磁盘上的数据,保存在缓冲区,以备程序后续使用。这种数据的预取策略其实就是基于局部性原理

因此当我们向内核请求读取数据时,内核会先到内核缓冲区中去寻找,如果命中数据,则不需要进行真正的磁盘 I/O,直接从缓冲区中返回数据就行了;如果缓存未命中,则内核会从磁盘中读取请求的 page,并同时读取紧随其后的几个 page(比如三个),如果文件是顺序访问的,那么下一个读取请求就会命中之前预读的缓存(当然了,预读算法非常复杂,这里只是一个简化的逻辑)。

再来看看内核缓冲区是怎么充当 Buffer 的:

⭐ 延时回写

回写指的是,当程序发起 write() 系统调用时,内核并不会直接把数据写入到磁盘文件中,而仅仅是写入到缓冲区中,几秒后(或者说等数据堆积了一些后)才会真正将数据刷新到磁盘中。对于系统调用来说,数据写入缓冲区后,就返回了。

延迟往磁盘写入数据的最大一个好处就是,可以合并更多的数据一次性写入磁盘,把小块的 I/O 变成大块 I/O,减少磁盘处理命令次数,从而提高提盘性能。

另一个好处是,当其它进程紧接着访问该文件时,内核可以从直接从缓冲区中提供更新的文件数据(这里又是充当 Cache 了)。

说起来一大堆,其实很简单,把握缓冲和缓存的定义就行了,如果你是读,我就会拿多一点放在内核缓冲区,这样你下次读的时候大概率就不需要访问磁盘了,直接从内核缓冲区拿就行;如果你是写,我就会等内核缓冲区中的数据堆积得多了再写磁盘,而不是来一点数据就写一次磁盘

无论是读操作还是写操作,无论是充当缓存还是缓冲,究其根本,内核缓冲区的作用都是为了减少磁盘 IO 的次数

用户缓冲区

上面提到,read 磁盘的速度要远远慢于 read 内存,不过事实上,read 内存这个操作也挺费时的,因为应用程序想要访问系统资源的话,就要通过系统调用 or 中断(外中断、内中断)使得 CPU 从用户态转向内核态,这个状态的改变需要涉及堆栈的环境和数据变化,还是挺需要时间的。

那为了减少系统调用的发生呢(或者说,减少用户态和内核态的转换次数),就设计了用户缓冲区。

作用和内核缓冲区一样,数据预读 + 延时回写,既充当 Cache 又充当 Buffer。

不同的就是,内核缓冲区处理的是内核空间和磁盘之间的数据传递,目的是减少访问磁盘的次数;而用户缓冲区处理的是用户空间和内核空间的数据传递,目的是减少系统调用的次数(感觉这句话总结的不错,给自己点个赞)

另外,从上面的分析我们可以看出,read() 和 write() 都并非真正执行 I/O 操作(或者说,都并不直接和磁盘进行交互),它只代表数据在用户空间 / 内核空间传递的完成,read 是把数据从内核缓冲区复制到用户缓冲区,write 是把用户缓冲区复制到内核缓冲区

2022最新Java学习路线图

 互联网一线大厂面试题库(2021年版)

  • 百度篇

  • 京东篇

  • 腾讯篇

  • 头条篇

  • 美团篇

  • 华为篇

  • 滴滴篇

面试系列(2021年版):

  • 800+简历模板

  • Dubbo面试题

  • Java基础面试题

  • 互联网企业面试真题

PDF学习文档系列2021年版)

  • 87页的Spring+Boot核心笔记

  • 17页的Mybatis面试专题

  • 43页的多线程专题

  • 22页的数据库专题

  • 86页的JVM专题

  • 13页的设计模式专题

  • 473页的Spring专题

  • 127页的大厂面试题库

2021金三银四Java大厂面试题来袭!高级面试题+解析

网易严选java一面

基本只问了Java相关的内容

  • 近期做的项目有遇到什么困难吗,怎么解决的;

  • HashMap详细介绍一下,怎么计算下标值的,时间复杂度是多少,最坏的时间复杂度是多少,在扩容的时候时间复杂度是O(n)的,你有什么方式去优化这个时间复杂度吗;

  • ConcurrentHashMap的底层实现原理,怎么查找的的,如何保证查找时的线程安全性;

  • 多线程介绍一下,如果一个方法被synchronized修饰了,你有什么方法可以去掉这个关键字,保证线程安全并且可以提升效率吗;

  • 线程池介绍一下,常用的拒绝策略有哪些;

  • 线程池中一般设置多少线程,你是怎么设定的,为什么;

  • 线程中中常用阻塞队列有哪些,你一般用哪个,LinkedBlockingQueue与ArrayBlockingQueue的优缺点对比;

  • JVM的CMS介绍一下,CMS重新标记时标记什么,为什么这么标记,标记待回收垃圾和标记保留对象的区别是什么,哪个更好一些;

  • Java开发中遇到问题了(比如报了异常),你一般怎么去处理;

就这些问题,半个小时,因为研究生期间做CV的,项目都是CV相关的,感觉没岗位相关的项目真是弱点,赶紧去网上找个项目水一下了。不确认面试官心里怎么想的,给我一次二面机会吧,有二面再回来写面经。


网易严选java二面

面试官挺可爱,上来先自我介绍,然后介绍一个项目。

  • 问项目中redis怎么使用的;

  • 如果自己实现消息队列,选择什么数据结构比较好,怎么实现;

  • MySQL的索引,怎么建立索引,建立索引时有哪些好的习惯;

  • 对于MySQL的了解程度,平时使用MySQL写SQL语句时有哪些心得,SQL的范围查询如何建索引;

  • 继续聊项目,因为项目是CV相关的,所以让我介绍一下深度学习和用到的模型;

  • 平时用过哪些框架;

面试时间比较短,基本上就是在聊聊项目,然后问一些数据库和Java的基础问题,基本就以上内容。问题比较发散,面试官想到什么有趣的问题就会问出来。所以面试的时候不要说自己没有把握的知识点,不然可能会被面试官逮住问。


网易严选javaHR面

在杭州网易大厦现场面试的,十五分钟。面试这么快,一般是两个极端,要么已经打算刷了,要么已经打算要了。

首先介绍一下在做项目或者实习中,遇到的一些问题,有哪些挑战,怎么解决的,有什么收获;

在项目中,未来有什么可以提升的地方,怎么去提升;

未来工作想做什么岗位的工作,有什么打算

未来职业规划;

只有一轮hr面,面试结束就让走了。基本上都是在围绕项目来提问的,没有问那些个人情况的问题

如何快速更新自己的技术积累?

  • 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
  • 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
  • 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
  • 学习以后不知道有没有学成,则可以通过面试去检验。

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目,有需要的朋友点击这里即可免费领取

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

…(img-2BLq2Wcq-1626246487163)]

[外链图片转存中…(img-LMQ70plW-1626246487165)]

以上是关于虎牙java高级一面 内核缓冲区面试题解析分享的主要内容,如果未能解决你的问题,请参考以下文章

前端面试经历(字节滴滴虎牙),讲真的还挺难,前端大厂面试题总汇得看看

2021金三银四Java大厂面试题来袭!高级面试题+解析

iOS面试--虎牙最新iOS开发面试题

分享一份饿了么Java面试专家岗面试题,欢迎留言交流哦!

分享一份饿了么Java面试专家岗面试题,欢迎留言交流哦!

Java大厂高频面试题解析,分享面经!