2023-5-2面试题学习

news2024/12/28 20:12:51

1、内存的可见性你了解吗,讲述一下?

        内存可见性是指多个线程访问同一共享变量时,在一个线程修改了该变量值后,下一个线程能立即看到这种变化的能力。

        如果一个变量在多个线程间共享,那么为了避免出现数据不一致的情况,线程执行时会把变量存储在各自的CPU缓存中,而不是直接从内存中获取,这个时候可能会导致可见性问题,因为一个线程修改了变量的值,但是另一个线程并不知道这个变量的值被修改了,导致数据不一致的情况。

        为了解决这个问题,在Java中提供了volatile关键字来保证内存可见性。如果一个变量被声明为volatile,那么每次访问这个变量都会直接从内存中读取,并且每次修改也会立刻写入到内存中。这确保了所有的线程都能看到变量的最新值,从而避免出现内存可见性问题。

        也可以进行加锁synchronized或者lock锁解决这个问题。

2、 讲一下面向对象的三大特性,并说出自己理解

        面向对象的三大特性是:继承、封装和多态。

        封装:是把成员方法和成员变量都放在一个类中,其目的是隐藏内部的细节,防止外部干扰和误操作,提高代码的安全性。

        继承:指的是通过继承已经存在的类所拥有的成员变量和方法,而形成新的类。可以提高代码的复用性。

        多态:指的是对同一种操作(也可以说是方法),不同对象可以进行不同的行为。

3、C++多态的原理

        C++中的多态有两种方式:运行时多态和编译时多态。

        运行时多态是通过虚函数来实现的,当一个类定义了虚函数,它的子类如果没有重写该虚函数,则默认使用父类的实现,当父类指针指向子类对象的时候,

Animal a = new Dog();

 调用该虚函数会按照子类实现来执行,从而实现多态特性。

虚函数表是一个类的静态成员,它存储了该类所有虚函数的地址。当一个类被实例化时,会
在其对象中生成一个虚函数指针指向该类的虚函数表,这样就可以在运行时动态地确定调用的虚函数。

举个例子,假设有一个基类Animal和它的两个派生类Dog和Cat,其中Animal定义了一个虚函数makeSound()
,而Dog和Cat分别实现了该虚函数。那么,在编译时,编译器会为Animal、Dog和Cat中的虚函数makeSound()
生成一个相应的虚函数表,并将其存储在静态内存中。

当创建一个Animal类型的对象时,会在对象中生成一个虚函数指针vptr,该指针指向Animal的虚函数表。
同样地,当创建一个Dog类型或Cat类型的对象时,也会在对象中生成一个虚函数指针vptr,只不过该指
针分别指向Dog和Cat的虚函数表。

当程序调用某个对象的虚函数makeSound()时,实际上是通过该对象的虚函数指针vptr去访问该对象所属类的
虚函数表,从而找到该虚函数的地址,最终调用该虚函数。这种方式可以在程序运行时动态地确定调用的函
数,实现了多态性。

总结一下,虚函数表的工作原理可以简单归纳为:在程序运行时动态确定虚函数的地址,并通过该地址调用
正确的虚函数,实现多态性。

4 进程和线程的区别是什么?

        我们将计算机系统看成一个工厂,那么CPU就是工人,以单核CPU为例,那么这个工厂只有一个工人。

        进程就是这个工厂的产品生成线,我们可以有产品A线,B线等等。

        线程就是产品线上的几道工序。

那么进程要工作的时候,需要有工人(也就是CPU)来处理工序(线程),同时只有工序是不够的,肯定需要有原料等输入,然后对原料进行加工。

        这也就解释了进程是资源分配和调度的基本单位,而线程是CPU执行的基本单位。而且线程在进程上执行,那么多个线程就共享进程的资源。

5 记录对字节跳动面试的学习

字节跳动后端面经分享——从一面到HR面 - 知乎 (zhihu.com)

  1. 自我介绍

省略1分钟...

select、poll、epoll?

        深入浅出理解select、poll、epoll的实现 - 知乎 (zhihu.com)

        这三个都是多路复用方面的技术。多路复用指的是:复用一个线程处理多个socket。

      1.1 select 

int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

        select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。当用户系统调用select时,select会将需要监控的readfds集合拷贝到内核空间(假设监控的仅仅是socket读),然后遍历自己监控的socket sk。如果发现某些sk是可以读,然后将可读socket的个数返回给用户。

poll和select很类似,都需要将监控集合拷贝到内核空间,造成性能问题。

        1.2 epoll

        相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率

epoll采用三个函数:epoll_create,epoll_ctl,epoll_wait,来做上述select的事情,监控文件描述符,当文件描述符有事件时,向用户返回事件。

  • epoll_create:创建一个epoll结构体(红黑树+链表),返回其句柄
  • epoll_ctl:向 epoll 对象中添加/修改/删除要管理的连接
  • epoll_wait:等待其管理的连接上的 IO 事件

epoll_create:创建一个红黑树,和一个就绪描述符链表。

epoll_ctl:epoll的事件注册函数,它不同于select,是想红黑树上面祖册要监听的事件类型。

epoll_wait:等待事件的产生,检查就绪描述符链表,是否为空不为空则返回就绪链表中FD的个数

        1.3 epoll的两种触发模式?

  • level 模式:该模式就是只要还有没有处理的事件就会一直通知
  • edge 模式:该模式是当状态发生变化时才会通知

       2 TCP三次握手过程,有什么状态,状态机如何变化?

        客户端从:closed --> syn_sent-->established

        服务器从:listen --> syn_revd-->established

四次挥手:

客户端:established-->final_wait-->time_wait-->closed

服务端:established-->close_wait-->last_ack-->closed

        3 什么是 TIME_WAIT 状态,为什么需要 TIME_WAIT 状态?时间是多久?

        2MSL时间是从客户端接收到FIN后发送ACK开始计时的。如果在这个时间段内,服务器没有收到ACK应答报文段,会重发FIN报文段,如果客户端收到了FIN报文段,那么2MSL的时间将会被重置。如果在2MSL时间段内,没有收到任何数据报,客户端则会进入CLOSE状态。

        4 Linux 中一个进程的虚拟内存分布长什么样?

         只读数据段(rodata):const修饰的全局变量是存放在常量段的

         代码段:存放代码

        数据段:存放全局变量和静态变量(已经初始化和未初始化的)

        堆:动态内存的分配

        内存映射段:常被用来加载共享库(动态库)

        栈:存放函数中局部变量

5 为什么要用虚拟内存?

  • 将主存当作辅存的高速缓存,经常活动的东西放在主存中,就像 GTA5 几十 GB 大的东西都放主存中是放不下的,因此可以高效利用主存
  • 每个进程地址空间都一样,方便管理
  • 进程间的隔离,避免进程破坏其他进程的地址空间

        

 6 虚拟地址映射为物理地址的过程?

       cpu获得虚拟内存,然后交给MMU(一般是通过页表进行转换)进行地址翻译成真实的物理内存。 TLB与MMU_mmu tlb_wagsyang的博客-CSDN博客

 

7 使用线程有哪些好处与坏处?

        好处:上下文切换代价小,通信方便       

        坏处:注意死锁,注意对共享资源的访问。

8 进程有哪些同步的机制?

        临界区、互斥、信号量、事件

9 什么是稳定排序?

        利用关键词排序后,关键词相同的元素之间的相互顺序不变的排序算法

10 手撕

        189.数组循环右移。将一个长度为 n 的数组,循环右移 k 位,要求时间复杂度为 O(n) 空间复杂度为 O(1) 。

思路:先整体reverse,然后前k位reverse,然后后n-k位reverse

class Solution {
    public void rotate(int[] nums, int k) {
        k %= nums.length;
        reverse(nums, 0, nums.length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.length - 1);
    }

    public void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start += 1;
            end -= 1;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/483218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么DDD难落地?

为什么DDD难落地&#xff1f; lorne 2023-04-23 视频地址&#xff1a; 为什么DDD难落地&#xff1f;_哔哩哔哩_bilibili 洋葱架构图&#xff1a; DDD能解决什么问题&#xff1f; 其实DDD的核心是&#xff1a;提升业务的聚合性、提升业务的拓展性。 DDD的错误认知&#xff…

CentOS7安装和部署Jenkins

安装Java环境 检查旧版&#xff1a; rpm -qa | grep java若已经安装了旧版本&#xff0c;则需要先删除&#xff0c;删除方法&#xff1a; rpm -qa nodeps [java package]安装新版&#xff1a; yum install java-11-openjdk yum install java-11-openjdk-devel&#xff08;开…

07 KVM虚拟机引导固件安装

文章目录 07 KVM虚拟机引导固件安装7.1 概述7.2 安装方法7.2.1 安装edk软件包7.2.2 查询edk软件是否安装成功 07 KVM虚拟机引导固件安装 7.1 概述 针对不同的架构&#xff0c;引导的方式有所差异。x86支持UEFI&#xff08;Unified Extensible Firmware Interface&#xff09;…

MySQL示例数据库(MySQL Sample Databases) 之 World数据库

文章目录 MySQL示例数据库(MySQL Sample Databases) 之 World数据库官方示例数据介绍World数据库World 数据库安装world-db/world.sql的脚本内容参考 MySQL示例数据库(MySQL Sample Databases) 之 World数据库 官方示例数据介绍 MySQL 官方提供了多个示例数据库&#xff0c;在…

【致敬未来的攻城狮计划】— 连续打卡第十九天:RA2E1串口通信基础知识

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

什么是GPT模型,GPT下载和国内镜像

什么是GPT模型&#xff0c;GPT模型是通过预训练的方式&#xff0c;采用无监督学习方式&#xff0c;大量语料输入&#xff0c;经过多次训练后得到模型。它能够自动学习并理解自然语言中的语义、句法和语法信息&#xff0c;并可以用于文本生成、对话系统、情感分析、机器翻译等自…

HTTP第二讲——HTTP相关概念

与HTTP 相关的各种应用 1.网络世界 实际的互联网是由许许多多个规模略小的网络连接而成的&#xff0c;这些“小网络”可能是只有几百台电脑的局域网&#xff0c;可能是有几万、几十万 台电脑的广域网&#xff0c;可能是用电缆、光纤构成的固定网络&#xff0c;也可能是用基站、…

SQL之SQL索引

文章目录 一、索引概述介绍演示优缺点 二、索引结构二叉树B-Tree (多路平衡查找树)BTreeHash 三、索引分类四、索引语法五、SQL性能分析SQL执行频率慢查询日志profile详情 索引使用原则验证索引效率最左前缀法则索引列运算字符串不加引号模糊查询or连接的条件数据分布影响 .SQL…

[LeetCode周赛复盘] 第 103 场双周赛20230429

[LeetCode周赛复盘] 第 103 场双周赛20230429 一、本周周赛总结2656. K 个元素的最大和1. 题目描述2. 思路分析3. 代码实现 2657. 找到两个数组的前缀公共数组1. 题目描述2. 思路分析3. 代码实现 2658. 网格图中鱼的最大数目1. 题目描述2. 思路分析3. 代码实现 2659. 将数组清…

二分(整数二分 浮点数二分)

目录 一、整数二分 模板 右边界二分查找&#xff08;左开右闭&#xff09; 左边界二分查找&#xff08;左闭右开&#xff09; 应用 数的范围 二、浮点数的二分 模板 应用 算术平方根 三、习题 1.数的三次方根 一、整数二分 tip&#xff1a;满足单调性的数组一定可以…

【Linux】进程优先级 + 环境变量

文章目录 &#x1f4d6; 前言1. 进程优先级1.1 什么是优先级&#xff1a;1.2 如何修改优先级&#xff1a; 2. 进程的其他概念2.1 竞争性与独立性&#xff1a;2.2 并行与并发&#xff1a;2.3 进程间优先级的体现&#xff1a;2.4 O(1) 调度算法&#xff1a;2.4 进程上下文&#x…

C语言进阶——数据在内存中的存储,你知道吗?

今天我们深度剖析数据在内存中的存储&#xff1a; 重点知识&#xff1a; 1、数据类型详细介绍 2、整形在内存中的存储&#xff1a;原码、反码、补码 3、大小端字节序介绍及判断 4、浮点型在内存中的存储解析 之前我们涉及关于这一部分的知识只是大致的进行讲解&#xff0…

网络编程:UDP socket

文章目录 阅读前导 服务端定义日志框架成员属性服务端框架 初始化服务器创建套接字绑定 运行服务端读取数据参数解读 处理数据向客户端发送响应数据关闭文件描述符 客户端定义创建套接字绑定发送数据接收服务器的响应数据关闭文件描述符 测试1本地环回作用 本地测试netstat 指令…

继续科普:ChatGPT 最新写论文使用方法

这两天发现了几个国内就能用的ChatGPT,不需要魔法! 给大家推荐两种方法,大家自行选择: 1、电脑端安装VSCode软件,使用GPT插件: 优点: 无需魔法、无需付费、软件简单易用(稍懂电脑就会用) 缺点: ① 只支持电脑端,不支持手机:软件安装虽简单,但不一定所有人都…

行业常识_RFID

文章目录 1 RF2 RFID2.1 RFID的应用场景2.2 RFID工作原理 1 RF RF&#xff0c;是Radio Frequency的缩写&#xff0c; Radio&#xff0c;n. 收音机&#xff1b;无线电通讯&#xff1b; v. 用无线电通讯&#xff08;或发送消息&#xff09; Frequency&#xff0c;n. 频率 RF中文…

electron+vue3全家桶+vite项目搭建【16】electron多窗口,pinia状态无法同步更新问题解决

文章目录 引入实现效果展示问题展示解决方案思路整理1.主进程添加handle2.编写pinia插件3.完善pinia插件4.最终实现效果 引入 pinia是vue3官方支持的全局状态管理工具&#xff0c;简单易用&#xff0c;但是electron的多窗口虽然加载的页面是单个路由&#xff0c;但其实已经是另…

【全网首发开源教程】【Labview机器人仿真与控制】Labview与Solidworks多路支配关系-四足爬行机器人仿真与控制

&#x1f389;欢迎来到Labview专栏~四足爬行机器人仿真与控制 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Labview-3D虚拟平台 文章作者技术和水平有限&#xff0c;如果文中出现错误&#…

【python】keras包:深度学习

Part 0. 环境配置 与 学习数据下载 keras包 与 tensorflow包 WinR &#xff0c;输入指令&#xff1a; pip install tensorflow pip install keras 推荐镜像&#xff1a;-i https://pypi.tuna.tsinghua.edu.cn/simple/ 关于包 keras包相当于是 tensflow 包的前端 tensflow包…

15 | Qt的自定义信号

1 前提 Qt 5.14.2 2 具体操作 2.1 自定义信号 2.1.1 UI界面设置 2.1.1.1 widget.ui 2.1.1.2 setdialog.ui 2.1.2 headers 2.1.2.1 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui {class Widget; } QT_END_NAMESP…

105-Linux_Libevent库的安装与使用

文章目录 一.Libevent 概述1.Libevent的特点2.Libevent使用模型3.Libevent 支持的事件类型 二.Libevent的安装三.Libevent简单使用实例 一.Libevent 概述 Libevent 是开源社区的一款高性能的 I/O 框架库&#xff0c;使用 Libevent 的著名案例有&#xff1a;高性能的分布式内存…