字节跳动暑期实习不知是面是凉经
- 介绍一下自己(balabala)
- 聊一下linux吧,常用命令了解吗。
- 对虚拟内存的理解。
- 线程和进程的区别,为什么要有多线程。
- CPU 密集型和 IO 密集型了解吗(我不会,面试官和我大概的讲了一下)。在这两种场景下该如何分配线程池?
- 讲JVM的运行时数据区,类加载机制讲一下。
- JIT了解吗,为什么需要 JIT,我编译后运行不是速度更快?
- TCP为什么要三次握手,四次挥手?
- TCP面向连接的,可靠的。那我要用UDP实现传输可靠可以吗,讲一下思路。
- 算法题,判断是否是回文链表(时间复杂度和空间复杂度要求最好)。
- 反问。
以下是我自己的回答,仅供参考😶
- 没有项目经验,面试官也知道在学校里一般接触不到什么项目,实习生也不太要求这个,注重基础的掌握。
- linux 实在不怎么用,玩过几下虚拟机。
- 虚拟内存是一种很重要的思想技术。CPU 在进行访问内存时,通过虚拟地址来访问,CPU 内的页表寄存器存储了进程的页表位置,通过该寄存器找到页表后,从页表里找该虚拟地址对应的实际物理页号:
- 如果有就通过物理页号与偏移量结合得到实际的物理地址,CPU 再从实际物理地址中获取数据。
- 如果没有则触发缺页中断,系统由用户态转为内核态,内核去将所需的数据存入内存,此时页表中就存有我们所需数据的物理页号。即第一种情况。
- 为什么要有虚拟内存? 如果没有虚拟内存,那么程序运行时就必须知道自己所在的运行环境的内存大小等信息,否则可能发生访问内存越界等问题,显然这是很麻烦的一件事。但假如使用虚拟内存,那么程序就无需考虑这一点,内存的分配完全交给内核去分配,程序只需要提出内存申请即可,这也是解耦的一种思想。
- 线程是 CPU 分配任务的基本单元,进程是分配资源的基本单元。一个进程可能包含多个线程,线程可以共享进程中的资源。多线程可以提高 CPU 的利用率。灵活使用多线程可以充分例用系统资源。
- CPU 密集型指的是程序需要充分例用 CPU 资源来进行运算,例如矩阵运算等。IO 密集型是指程序主要进行 IO 操作。CPU 4核的情况下,CPU 密集型的话线程分配可以比核数多一点的线程(五六个),IO 密集型的话可以多分配一些线程,例如8个线程,因为这些线程不太需要 CPU 运算,可能大部分都是处在 IO 阻塞状态,如果线程数较少的话, CPU 大部分时间都会被闲置。
- 八股文
- Java是半编译半解释型语言,启动时使用解释器运行,如果哪一部分代码使用频率很高,那么使用次数在触发一个阈值时,jvm会将该代码编译成本地机器码。下次执行到时直接使用本地机器码来运行。如果一个项目很大,那么全部编译的话时间需要很久,使用解释器可以快速启动。
- 八股文
- 再写一层协议,将 UDP 包装成 TCP。
- (回文链表)[https://leetcode-cn.com/problems/palindrome-linked-list/]
- 我离成为一名实习生,还欠缺什么。如果我暑期找不到实习,那我暑假该如何利用,学习哪方面的知识。
全部评论
(0) 回帖