基础知识学习---牛客网C++面试宝典(七)操作系统--第三节

news2024/11/26 8:19:58

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程;

2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等;
3、参加工作后(2021-2023年)岗位是嵌入式软件开发,主要是服务器开发,Linux、C/C++、网络编程、docker容器、CMake、makefile、Shell脚本、JSON等。

4、求职岗位是嵌入式软件开发、C/C++开发、自动驾驶岗位开发等。

在这里插入图片描述

此系列为在学习牛客网C++面试宝典过程中记录的笔记,本篇记录第三章操作系统部分的第三节:操作系统(三)

牛客网C++面试宝典链接:https://www.nowcoder.com/issue/tutorial?tutorialId=93&uuid=675fd4af3ab34b2db0ae650855aa52d5

文章目录

  • 2.41 单核机器上写多线程程序,是否要考虑加锁,为什么?
  • 2.42 说说多线程和多进程的不同?
  • 2.43 简述互斥锁的机制,互斥锁与读写的区别?
  • 2.44 说说什么是信号量,有什么作用?
  • 2.45 进程、线程的中断切换的过程是怎样的?
  • 2.46 简述自旋锁和互斥锁的使用场景
  • 2.48 多线程和单线程有什么区别,多线程编程要注意什么,多线程加锁需要注意什么?
  • 2.49 说说sleep和wait的区别?
  • 2.50 说说线程池的设计思路,线程池中线程的数量由什么确定?
  • 2.53 简述epoll和select的区别,epoll为什么高效?
  • 2.54 说说多路IO复用技术有哪些,区别是什么?
  • 2.55 简述socket中select,epoll的使用场景和区别,epoll水平触发与边缘触发的区别?
  • 2.57 简述同步与异步的区别,阻塞与非阻塞的区别?
  • 2.58 BIO、NIO有什么区别?
  • 2.59 请介绍一下5种IO模型
  • 2.60 请说一下socket网络编程中客户端和服务端用到哪些函数?
  • 2.61 简述网络七层参考模型,每一层的作用?

2.41 单核机器上写多线程程序,是否要考虑加锁,为什么?

参考回答
在单核机器上写多线程程序,仍然需要线程锁。

原因:因为线程锁通常用来实现线程的同步和通信。在单核机器上的多线程程序,仍然存在线程同步的问题。因为在抢占式操作系统中,通常为每个线程分配一个时间片,当某个线程时间片耗尽时,操作系统会将其挂起,然后运行另一个线程。如果这两个线程共享某些数据,不使用线程锁的前提下,可能会导致共享数据修改引起冲突。

2.42 说说多线程和多进程的不同?

参考回答

(1)一个线程从属于一个进程;一个进程可以包含多个线程。

(2)一个线程挂掉,对应的进程挂掉,多线程也挂掉;一个进程挂掉,不会影响其他进程,多进程稳定。

(3)进程系统开销显著大于线程开销;线程需要的系统资源更少。

(4)多个进程在执行时拥有各自独立的内存单元,多个线程共享进程的内存,如代码段、数据段、扩展段;但每个线程拥有自己的栈段和寄存器组。

(5)多进程切换时需要刷新TLB并获取新的地址空间,然后切换硬件上下文和内核栈;多线程切换时只需要切换硬件上下文和内核栈。

(6)通信方式不一样。

(7)多进程适应于多核、多机分布;多线程适用于多核

2.43 简述互斥锁的机制,互斥锁与读写的区别?

参考回答

互斥锁机制:mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒。

互斥锁和读写锁:

(1) 读写锁区分读者和写者,而互斥锁不区分

(2)互斥锁同一时间只允许一个线程访问该对象,无论读写;读写锁同一时间内只允许一个写者,但是允许多个读者同时读对象。

2.44 说说什么是信号量,有什么作用?

参考回答

概念:信号量本质上是一个计数器,用于多进程对共享数据对象的读取,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。

原理:由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),具体的行为如下:

(1)P(sv)操作:如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行(信号量的值为正,进程获得该资源的使用权,进程将信号量减1,表示它使用了一个资源单位)。

(2)V(sv)操作:如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1(若此时信号量的值为0,则进程进入挂起状态,直到信号量的值大于0,若进程被唤醒则返回至第一步)。

作用:用于多进程对共享数据对象的读取,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。

2.45 进程、线程的中断切换的过程是怎样的?

参考回答

上下文切换指的是内核(操作系统的核心)在CPU上对进程或者线程进行切换。

进程上下文切换

(1)保护被中断进程的处理器现场信息

(2)修改被中断进程的进程控制块有关信息,如进程状态等

(3)把被中断进程的进程控制块加入有关队列

(4)选择下一个占有处理器运行的进程

(5)根据被选中进程设置操作系统用到的地址转换和存储保护信息

切换页目录以使用新的地址空间

切换内核栈和硬件上下文(包括分配的内存,数据段,堆栈段等)

(6)根据被选中进程恢复处理器现场

线程上下文切换

(1)保护被中断线程的处理器现场信息

(2)修改被中断线程的线程控制块有关信息,如线程状态等

(3)把被中断线程的线程控制块加入有关队列

(4)选择下一个占有处理器运行的线程

(5)根据被选中线程设置操作系统用到的存储保护信息

切换内核栈和硬件上下文(切换堆栈,以及各寄存器)

(6)根据被选中线程恢复处理器现场

2.46 简述自旋锁和互斥锁的使用场景

参考回答

互斥锁用于临界区持锁时间比较长的操作,比如下面这些情况都可以考虑

(1)临界区有IO操作
(2)临界区代码复杂或者循环量大
(3)临界区竞争非常激烈
(4)单核处理器
自旋锁就主要用在临界区持锁时间非常短且CPU资源不紧张的情况下。

2.48 多线程和单线程有什么区别,多线程编程要注意什么,多线程加锁需要注意什么?

参考回答
区别:
(1)多线程从属于一个进程,单线程也从属于一个进程;一个线程挂掉都会导致从属的进程挂掉。
(2)一个进程里有多个线程,可以并发执行多个任务;一个进程里只有一个线程,就只能执行一个任务。
(3)多线程并发执行多任务,需要切换内核栈与硬件上下文,有切换的开销;单线程不需要切换,没有切换的开销。
(4)多线程并发执行多任务,需要考虑同步的问题;单线程不需要考虑同步的问题。

多线程编程需要考虑同步的问题。线程间的同步方式包括互斥锁、信号量、条件变量、读写锁。
多线程加锁,主要需要注意死锁的问题。破坏死锁的必要条件从而避免死锁。

答案解析

死锁: 是指多个进程在执行过程中,因争夺资源而造成了互相等待。此时系统产生了死锁。比如两只羊过独木桥,若两只羊互不相让,争着过桥,就产生死锁。

产生的条件:死锁发生有四个必要条件:
(1)互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问,只能等待,直到进程使用完成后释放该资源;

(2)请求保持条件:进程获得一定资源后,又对其他资源发出请求,但该资源被其他进程占有,此时请求阻塞,而且该进程不会释放自己已经占有的资源;

(3)不可剥夺条件:进程已获得的资源,只能自己释放,不可剥夺;

(4)环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

如何解决:

(1)资源一次性分配,从而解决请求保持的问题
(2)可剥夺资源:当进程新的资源未得到满足时,释放已有的资源;
(3)资源有序分配:资源按序号递增,进程请求按递增请求,释放则相反。

2.49 说说sleep和wait的区别?

参考回答
sleep
sleep是一个延时函数,让进程或线程进入休眠。休眠完毕后继续运行。

在linux下面,sleep函数的参数是秒,而windows下面sleep的函数参数是毫秒。

windows下面sleep的函数参数是毫秒。

例如:

#include <windows.h>// 首先应该先导入头文件 Sleep (500) ; //注意第一个字母是大写。 //就是到这里停半秒,然后继续向下执行。

在 Linux C语言中 sleep的单位是秒
例如:

#include <unistd.h>// 首先应该先导入头文件 sleep(5); //停5秒 //就是到这里停5秒,然后继续向下执行。

wait

wait是父进程回收子进程PCB资源的一个系统调用。进程一旦调用了wait函数,就立即阻塞自己本身,然后由wait函数自动分析当前进程的某个子进程是否已经退出,当找到一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞,直到有一个出现为止。函数原型如下:

#include<sys/types.h>   #include<sys/wait.h>     pid_t wait(int* status);  

子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一起返回。如果不需要结束状态值,则参数status可以设成 NULL。

区别:

(1)sleep是一个延时函数,让进程或线程进入休眠。休眠完毕后继续运行。

(2)wait是父进程回收子进程PCB(Process Control Block)资源的一个系统调用。

2.50 说说线程池的设计思路,线程池中线程的数量由什么确定?

参考回答

1、设计思路:
实现线程池有以下几个步骤:
(1)设置一个生产者消费者队列,作为临界资源。
(2)初始化n个线程,并让其运行起来,加锁去队列里取任务运行
(3)当任务队列为空时,所有线程阻塞。
(4)当生产者队列来了一个任务后,先对队列加锁,把任务挂到队列上,然后使用条件变量去通知阻塞中的一个线程来处理。

2、线程池中线程数量:
线程数量和哪些因素有关:CPU,IO、并行、并发

如果是CPU密集型应用,则线程池大小设置为:CPU数目+1 如果是IO密集型应用,则线程池大小设置为:2*CPU数目+1 最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1* CPU数目

所以线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。

答案解析

1、为什么要创建线程池:

创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程,再加上业务工作线程,消耗系统资源的时间,可能导致系统资源不足。同时线程池也是为了提升系统效率。

2、线程池的核心线程与普通线程:

任务队列可以存放100个任务,此时为空,线程池里有10个核心线程,若突然来了10个任务,那么刚好10个核心线程直接处理;若又来了90个任务,此时核心线程来不及处理,那么有80个任务先入队列,再创建核心线程处理任务;若又来了120个任务,此时任务队列已满,不得已,就得创建20个普通线程来处理多余的任务。 以上是线程池的工作流程。

2.51 进程和线程相比,为什么慢?

参考回答
1、进程系统开销显著大于线程开销;线程需要的系统资源更少。

2、进程切换开销比线程大。多进程切换时需要刷新TLB并获取新的地址空间,然后切换硬件上下文和内核栈;多线程切换时只需要切换硬件上下文和内核栈。

3、进程通信比线程通信开销大。进程通信需要借助管道、队列、共享内存,需要额外申请空间,通信繁琐;而线程共享进程的内存,如代码段、数据段、扩展段,通信快捷简单,同步开销更小。

2.53 简述epoll和select的区别,epoll为什么高效?

参考回答

区别:
(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大;而epoll保证了每个fd在整个过程中只会拷贝一次。
(2)每次调用select都需要在内核遍历传递进来的所有fd;而epoll只需要轮询一次fd集合,同时查看就绪链表中有没有就绪的fd就可以了。
(3)select支持的文件描述符数量太小了,默认是1024;而epoll没有这个限制,它所支持的fd上限是最大可以打开文件的数目,这个数字一般远大于2048。

epoll为什么高效:
(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。
(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把当前进程往设备等待队列中挂一次,而epoll只要一次拷贝,而且把当前进程往等待队列上挂也只挂一次,这也能节省不少的开销。

2.54 说说多路IO复用技术有哪些,区别是什么?

参考回答

select,poll,epoll都是IO多路复用的机制,I/O多路复用就是通过一种机制,可以监视多个文件描述符,一旦某个文件描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。

区别:
(1)poll与select不同,通过一个pollfd数组向内核传递需要关注的事件,故没有描述符个数的限制,pollfd中的events字段和revents分别用于标示关注的事件和发生的事件,故pollfd数组只需要被初始化一次。
(2)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。
(3)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把当前进程往设备等待队列中挂一次,而epoll只要一次拷贝,而且把当前进程往等待队列上挂也只挂一次,这也能节省不少的开销。

2.55 简述socket中select,epoll的使用场景和区别,epoll水平触发与边缘触发的区别?

参考回答
1、select,epoll的使用场景:

都是IO多路复用的机制,应用于高并发的网络编程的场景。I/O多路复用就是通过一种机制,可以监视多个文件描述符,一旦某个文件描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。

2、select,epoll的区别:

(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大;而epoll保证了每个fd在整个过程中只会拷贝一次。

(2)每次调用select都需要在内核遍历传递进来的所有fd;而epoll只需要轮询一次fd集合,同时查看就绪链表中有没有就绪的fd就可以了。

(3)select支持的文件描述符数量太小了,默认是1024;而epoll没有这个限制,它所支持的fd上限是最大可以打开文件的数目,这个数字一般远大于2048。

3、epoll水平触发与边缘触发的区别

LT模式(水平触发)下,只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作;

而在ET(边缘触发)模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无论fd中是否还有数据可读。

2.57 简述同步与异步的区别,阻塞与非阻塞的区别?

参考回答
1、同步与异步的区别:

同步:是所有的操作都做完,才返回给用户结果。即写完数据库之后,再响应用户,用户体验不好。

异步:不用等所有操作都做完,就响应用户请求。即先响应用户请求,然后慢慢去写数据库,用户体验较好。

2、阻塞与非阻塞的区别:

阻塞:调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的检查这个函数有没有返回,必须等这个函数返回后才能进行下一步动作。

非阻塞:非阻塞等待,每隔一段时间就去检查IO事件是否就绪。没有就绪就可以做其他事情。

2.58 BIO、NIO有什么区别?

参考回答

BIO(Blocking I/O):阻塞IO。调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的检查这个函数有没有返回,必须等这个函数返回后才能进行下一步动作。

NIO(New I/O):同时支持阻塞与非阻塞模式,NIO的做法是叫一个线程不断的轮询每个IO的状态,看看是否有IO的状态发生了改变,从而进行下一步的操作。

2.59 请介绍一下5种IO模型

参考回答

1、阻塞IO:调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停的检查这个函数有没有返回,必须等这个函数返回后才能进行下一步动作。

2、非阻塞IO:非阻塞等待,每隔一段时间就去检查IO事件是否就绪。没有就绪就可以做其他事情。

3、信号驱动IO:Linux用套接口进行信号驱动IO,安装一个信号处理函数,进程继续运行并不阻塞,当IO事件就绪,进程收到SIGIO信号,然后处理IO事件。

4、IO多路复用:Linux用select/poll函数实现IO复用模型,这两个函数也会使进程阻塞,但是和阻塞IO所不同的是这两个函数可以同时阻塞多个IO操作。而且可以同时对多个读操作、写操作的IO函数进行检查。知道有数据可读或可写时,才真正调用IO操作函数。

5、异步IO:Linux中,可以调用aio_read函数告诉内核描述字缓冲区指针和缓冲区的大小、文件偏移及通知的方式,然后立即返回,当内核将数据拷贝到缓冲区后,再通知应用程序。用户可以直接去使用数据。

答案解析

前四种模型–阻塞IO、非阻塞IO、多路复用IO和信号驱动IO都属于同步模式,因为其中真正的IO操作(函数)都将会阻塞进程,只有异步IO模型真正实现了IO操作的异步性。

异步和同步的区别就在于,异步是内核将数据拷贝到用户区,不需要用户再自己接收数据,直接使用就可以了,而同步是内核通知用户数据到了,然后用户自己调用相应函数去接收数据。

2.60 请说一下socket网络编程中客户端和服务端用到哪些函数?

参考回答

1、服务器端函数:
(1)socket创建一个套接字
(2)bind绑定ip和port
(3)listen使套接字变为可以被动链接
(4)accept等待客户端的链接
(5)write/read接收发送数据
(6)close关闭连接

客户端函数:
(1)创建一个socket,用函数socket()
(2)bind绑定ip和port
(3)连接服务器,用函数connect()
(4)收发数据,用函数send()和recv(),或read()和write()
(5)close关闭连接

在这里插入图片描述

2.61 简述网络七层参考模型,每一层的作用?

在这里插入图片描述

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

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

相关文章

从 数据工程 到 Prompt 工程

动动发财的小手&#xff0c;点个赞吧&#xff01; 数据工程构成了数据科学过程的很大一部分。在 CRISP-DM 中&#xff0c;这个过程阶段称为“数据准备”。它包括数据摄取、数据转换和数据质量保证等任务。在本文[1]章中&#xff0c;我们使用 ChatGPT 和 Python 解决了典型的数据…

用HTML5制作精美战机游戏

每天要被大学老师催H5作业&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb; 不如看看本文&#xff0c;代码齐全&#xff0c;直接用来做参考案例&#x1f44c;&#x1f3fb; 干货满满不看后悔&#x1f44d;&#x1f44d;&#x1f44d; 代码…

用友畅捷通CRM SQL注入漏洞复现

0x01 产品简介 用友畅捷通CRM是面向小企业全力打造的简单、实用的客户关系管理应用。帮助企业用好自己的客户资源、管好商机跟进过程、引导好业务员跟单行为&#xff0c;促进团队销售能力的提升&#xff1b;通过查询和分析&#xff0c;识别企业的价值客户&#xff0c;融合电话、…

JUC笔记(二)

多线程编程核心 在前面&#xff0c;我们了解了多线程的底层运作机制&#xff0c;我们终于知道&#xff0c;原来多线程环境下存在着如此之多的问题。在JDK5之前&#xff0c;我们只能选择synchronized关键字来实现锁&#xff0c;而JDK5之后&#xff0c;由于volatile关键字得到了…

湖南大学CS-2021期末考试解析

【特别注意】 答案来源于@wolf 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 有必要一做。 【试卷与答案】 1.简答题(10 分) 小明设计了一款机器,整数和浮点数都占 10 个 bit,其中整数采用补码表示,浮点数采用 IEEE 754 标准。 (1)…

matlab横向连接字符组成文件路径

f fullfile(myfolder,myfile.tif) %字符串中不包含反斜杠 f strcat(myfolder\,myfile.tif) %字符串中包含反斜杠,strcat函数直接拼接得到的结果一致

【软件测试】测试用例设计要点总结

文章目录 考试题型简答题(一) 等价类划分1.1 划分等价类1.2 设计测试用例 (二) 边界值分析2.1 列出边界值分析表2.2 设计测试用例 (三) 因果图分析3.1 确定原因和结果3.2 确定原因和结果之间的逻辑关系3.3 在因果图上使用标准的符号标明约束条件 (四) 判定表驱动4.1 将因果图转…

【轻量化网络系列(7)】EfficientNetV2论文超详细解读(翻译 +学习笔记+代码实现)

前言 今天我们要学习的是EfficientNetV2 &#xff0c;该网络主要使用训练感知神经结构搜索和缩放的组合&#xff1b;在EfficientNetV1的基础上&#xff0c;引入了Fused-MBConv到搜索空间中&#xff1b;引入渐进式学习策略、自适应正则强度调整机制使得训练更快&#xff1b;进一…

深入了解 OkHttp 协议:优雅的网络请求框架

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

Spring Boot项目的搭建和运行

✨Spring Boot项目的搭建和运行 &#x1f351;Spring Boot概述&#x1f34a;&#x1f34a;传统框架技术存在的问题&#x1f34a;&#x1f34a;主要特点&#x1f34a;&#x1f34a;环境要求 &#x1f351;聚合工程/父子模块&#x1f351;第一个Spring Boot项目&#x1f351;目录…

《UNUX环境高级编程》(1)UNIX基础

1、引言 2、UNIX体系结构 操作系统 一种软件&#xff0c;控制计算机硬件资源&#xff0c;提供程序运行环境。操作系统包含了内核和一些其他软件&#xff08;如shell、公用函数库、应用程序等&#xff09;。例如Linux就是GNU操作系统的内核&#xff0c;因此也称为GNU/Linux操作…

Netty实战(十五)

UDP广播事件&#xff08;一&#xff09;UDP简介和示例程序 一、UDP基础1.2 UDP介绍1.2.1 UDP和TCP的区别 1.3 UDP广播1.3.1 单播模式1.3.2 UDP的传输模式 二、UDP示例程序三、消息 POJO: LogEvent 一、UDP基础 到目前为止&#xff0c;我们已经见过的绝大多数的例子都使用了基于…

Android系统中最重要的一个组件【Framework】

Android Framework是Android系统中最重要的一个组件&#xff0c;它为Android应用开发者提供了一套完整而稳定的API框架&#xff0c;可以方便地实现各种应用功能。Android市场对Framework的需求量非常大&#xff0c;尤其在当前移动互联网时代&#xff0c;Android应用的市场需求也…

SpringCloud Alibaba-Nacos

SpringCloud Alibaba-Nacos 1. Nacos安装1.1 Nacos概要1.2 Nacos架构1.3 Nacos安装1.3.1 单机模式 Derby安装1.3.2 单机模式 MySQL安装1.3.3 Docker 安装Nacos 2 Nacos功能应用2.1 Nacos服务注册与发现2.2 负载均衡2.3 配置中心2.3.1 配置管理2.3.2 多环境切换2.3.3 共享/扩展 …

Spark集群部署和启动与关闭

上一篇我们讲了Hadoop集群部署和启动与关闭&#xff0c;今天我们讲一下Spark集群部署和启动与关闭。首先我们先来了解一下Spark集群部署模式&#xff0c;分别有以下三种&#xff1a; Standalone   Standalone&#xff08;独立模式&#xff09;是Spark一种简单的集群部署模式&…

随着用户体验质量的不断追求,性能优化成了Android开发中的重要一方面

在移动互联网时代&#xff0c;Android系统的使用越来越广泛&#xff0c;而随着用户对体验质量的不断追求&#xff0c;性能优化已经成为了Android应用开发中的重要方面。以下是对Android市场对性能优化的需求量及应用广度进行详细分析的几个方面。 1. 用户需求 随着Android系统…

DataLeap的全链路智能监控报警实践(三): 系统实现

系统实现 整体架构 基线 管理模块&#xff1a;负责基线创建、更新、删除等操作&#xff0c;管理基线元信息&#xff0c;包括保障任务&#xff0c;承诺时间&#xff0c;余量及报警配置等&#xff09;&#xff1b; 基线 实例生成&#xff1a;系统每天定时触发生成基线实例&#x…

2023 年最新互联网 Java 面试八股文出炉(附大厂 P5-P8 技术栈)

为什么感觉 Java 面试变难了&#xff1f; 几年前&#xff0c;你只需要简单的 ssm 框架&#xff0c;就能轻松找到一份 Java 的工作&#xff0c;但现在不一样了&#xff0c;随着涌入这个行业的人越来越多&#xff0c;同一个岗位需要筛选掉更多人&#xff0c;要求自然水涨船高&am…

ubuntu 20.04 aarch64 平台交叉编译 opencv 静态库

编译环境 win10 64 位 VMware Workstation Pro 16 虚拟机 虚拟机安装 ubuntu 20.04 opencv 版本&#xff1a; 来自 github 当前最新 4.7 目的 交叉编译 opencv 生成静态库&#xff08;.a&#xff09;&#xff0c;用于 嵌入式 aarch64 平台。 环境配置方法 参考上一篇 u…

基于Java汽车配件销售业绩管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…