文章目录
- 一. 腾讯
- 二. 华为
- 三. 快手
- 1. Long 的长度和范围,为什么要减 1 (Java基础)
- 2. 线程池配置无界队列了之后,拒绝策略怎么搞,什么时候用到无界队列 (JUC并发)
- 四. 美团
- 五. 阿里
- 六. 百度
- 七. 字节
- 八. 大疆
- 1. 为什么创建进程开销比线程大? (操作系统)
- 2. 物理地址和虚拟地址 (操作系统)
- 3. Synchronize给静态和非静态方法的区别 (JUC并发编程)
- 4. 匿名内部类为什么可以访问外部类的对象 (Java基础)
- 九. OPPO
- 1. 什么是操作系统,有什么组成 (操作系统)
- 2. 文件系统,IO索引 (操作系统)
- 3. 线程安全问题 (JUC并发)
- 4. 对象加载过程,内存组成,访问方式 (JVM虚拟机)
- 5. 序列化使用场景 (Java基础)
一. 腾讯
二. 华为
三. 快手
1. Long 的长度和范围,为什么要减 1 (Java基础)
像 byte、short、int、long能表示的最大正数都减 1 了。这是为什么呢?这是因为在二进制补码表示法中,最高位是用来表示符号的(0 表示正数,1 表示负数),其余位表示数值部分。所以,如果我们要表示最大的正数,我们需要把除了最高位之外的所有位都设为 1。如果我们再加 1,就会导致溢出,变成一个负数。
2. 线程池配置无界队列了之后,拒绝策略怎么搞,什么时候用到无界队列 (JUC并发)
线程池配置无界队列了之后,拒绝策略其实就失去了意义,因为无论有多少任务提交到线程池,都会被放入队列中等待执行,不会触发拒绝策略。不过,这样可能堆积大量的请求,从而导致 OOM。因此,一般不推荐使用无界队列。
四. 美团
五. 阿里
六. 百度
七. 字节
八. 大疆
1. 为什么创建进程开销比线程大? (操作系统)
添加链接描述
- 线程的创建时间比进程快,因为进程在创建的过程中,还需要资源管理信息,比如内存管理信息、文件管理信息,而线程在创建的过程中,不会涉及这些资源管理信息,而是共享它们;
- 线程的终止时间比进程快,因为线程释放的资源相比进程少很多;
- 同一个进程内的线程切换比进程切换快,因为线程具有相同的地址空间(虚拟内存共享),这意味着同一个进程的线程都具有同一个页表,那么在切换的时候不需要切换页表。而对于进程之间的切换,切换的时候要把页表给切换掉,而页表的切换过程开销是比较大的;
- 由于同一进程的各线程间共享内存和文件资源,那么在线程之间数据传递的时候,就不需要经过内核了,这就使得线程之间的数据交互效率更高了;
2. 物理地址和虚拟地址 (操作系统)
我们程序所使用的内存地址叫做虚拟内存地址(Virtual Memory Address)
实际存在硬件里面的空间地址叫物理内存地址(Physical Memory Address)
那么对于虚拟地址与物理地址的映射关系,可以有分段和分页的方式,同时两者结合都是可以的。
- 虚拟内存的作用
第一,虚拟内存可以使得进程对运行内存超过物理内存大小,因为程序运行符合局部性原理,CPU 访问内存会有很明显的重复访问的倾向性,对于那些没有被经常使用到的内存,我们可以把它换出到物理内存之外,比如硬盘上的 swap 区域。
第二,由于每个进程都有自己的页表,所以每个进程的虚拟内存空间就是相互独立的。进程也没有办法访问其他进程的页表,所以这些页表是私有的,这就解决了多进程之间地址冲突的问题。
第三,页表里的页表项中除了物理地址之外,还有一些标记属性的比特,比如控制一个页的读写权限,标记该页是否存在等。在内存访问方面,操作系统提供了更好的安全性。
3. Synchronize给静态和非静态方法的区别 (JUC并发编程)
Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称“对象锁”;
Synchronized修饰静态方法,实际上是对该类对象加锁,俗称“类锁”。
添加链接描述
4. 匿名内部类为什么可以访问外部类的对象 (Java基础)
- 匿名内部类
class Test {public static void main(String[] args) {Thread thread = new Thread(// 匿名内部类new Runnable() {@Overridepublic void run() {System.out.println("Thread run");}});}
}
匿名内部类也是不能有访问修饰符和 static 修饰符的
匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。
添加链接描述
九. OPPO
1. 什么是操作系统,有什么组成 (操作系统)
- 定义
操作系统:负责管理计算机中各种软硬件资源并控制各类软件运行(他是介于硬件和应用软件系统之间的软件,运行在逻辑上,是人与计算机通信的桥梁) - 操作系统的组成
1、进程管理:系统资源的分配单位(基本单位使进程 重点区分一下CPU调度和分派的基本单位线程)
2、存储管理:内存分配,存储保护,虚拟存储
3、设备管理:管理外设和接口
4、文件管理:保存程序和数据等软件信息
5、程序接口:提供指令或函数的调用方式,使程序能够调用系统的服务
6、用户界面:为用户提供操作环境
2. 文件系统,IO索引 (操作系统)
添加链接描述
- 文件系统的作用
存储管理:将文件数据存储到物理存储介质中,并且管理空间分配,以确保每个文件都有足够的空间存储,并避免文件之间发生冲突。
文件管理:文件的创建、删除、移动、重命名、压缩、加密、共享等等。
目录管理:目录的创建、删除、移动、重命名等等。
文件访问控制:管理不同用户或进程对文件的访问权限,以确保用户只能访问其被授权访问的文件,以保证文件的安全性和保密性。 - IO索引
Linux 文件系统会为每个文件分配两个数据结构:索引节点和目录项,它们主要用来记录文件的元信息和目录层次结构。
索引节点,也就是 inode,用来记录文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是文件的唯一标识,它们之间一一对应,也同样都会被存储在硬盘中,所以索引节点同样占用磁盘空间。
目录项,也就是 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是缓存在内存
3. 线程安全问题 (JUC并发)
synchronized方式
Lock接口下的类
threadLocal
乐观锁
Volatile
4. 对象加载过程,内存组成,访问方式 (JVM虚拟机)
5. 序列化使用场景 (Java基础)
- 对象在进行网络传输(比如远程方法调用 RPC 的时候)之前需要先被序列化,接收到序列化的对象之后需要再进行反序列化;
- 将对象存储到文件之前需要进行序列化,将对象从文件中读取出来需要进行反序列化;
- 将对象存储到数据库(如 Redis)之前需要用到序列化,将对象从缓存数据库中读取出来需要反序列化;
- 将对象存储到内存之前需要进行序列化,从内存中读取出来之后需要进行反序列化。