【Java八股文】09-计算机操作系统面试篇
文章目录
- 计算机操作系统面试篇
- 用户态和内核态的区别?
- 用户态和内核态的区别?
- 进程管理
- 线程和进程的区别是什么?
- 进程,线程,协程的区别是什么?
- 创建一个协程的过程
- 线程运行过程中申请到的东西在切换时是否全部要保存,比如线程中有个循环,或者声明了很多对象,这些是否都要保存,也存在线程私有区吗?
- 多线程比单线程的优势,劣势?
- 进程切换和线程切换的区别?
- 进程上下文有哪些?
- 进程间通讯有哪些方式?
- 说一下同步和异步
- 异步过程中谁来通知谁
- 内存管理
- 堆和栈的区别?
- 虚拟内存
- 32位与64位总线的操作系统的理论虚拟内存
- 分段,分页对比
- 中断和异常
- 硬中断、软中断讲一下
- 异常
- 网络IO
- BIO、和NIO、AIO区别
- select、poll、epoll 的区别是什么?
- epoll过程
- epoll 的 边缘触发和水平触发有什么区别?
- redis,nginx,netty 是依赖什么做的这么高性能?
- Redis
- Netty
- Nginx
- 零拷贝是什么?
计算机操作系统面试篇
用户态和内核态的区别?
用户态和内核态的区别?
- 内核态(Kernel Mode):在内核态下,CPU可以执行所有的指令和访问所有的硬件资源。这种模式下的操作具有更高的权限,主要用于操作系统内核的运行。
- 用户态(User Mode):在用户态下,CPU只能执行部分指令集,无法直接访问硬件资源。这种模式下的操作权限较低,主要用于运行用户程序。
进程管理
线程和进程的区别是什么?
- 定义:
- 进程是操作系统资源分配的基本单位
- 线程是任务调度和执行的基本单位。
- 调度及切换:
- 每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销。
- 线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
- 内存分配:
- 系统在运行的时候会为每个进程分配不同的内存空间。
- 对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
- 稳定性:
- 进程中某个线程如果崩溃了,可能会导致整个进程都崩溃。
- 进程中的子进程崩溃,并不会影响其他进程。
- 包含关系:
- 没有线程的进程可以看做是单线程的。
- 如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线。
进程,线程,协程的区别是什么?
- 进程是操作系统中进行资源分配和调度的基本单位,它拥有自己的独立内存空间和系统资源。每个进程都有独立的堆和栈,不与其他进程共享。进程间通信需要通过特定的机制,如管道、消息队列、信号量等。由于进程拥有独立的内存空间,因此其稳定性和安全性相对较高,但同时上下文切换的开销也较大,因为需要保存和恢复整个进程的状态。
- 线程是进程内的一个执行单元,也是CPU调度和分派的基本单位。与进程不同,线程共享进程的内存空间,包括堆和全局变量。线程之间通信更加高效,因为它们可以直接读写共享内存。线程的上下文切换开销较小,因为只需要保存和恢复线程的上下文,而不是整个进程的状态。然而,由于多个线程共享内存空间,因此存在数据竞争和线程安全的问题,需要通过同步和互斥机制来解决。
- 协程是一种用户态的轻量级线程,其调度完全由用户程序控制,而不需要内核的参与。协程拥有自己的寄存器上下文和栈,但与其他协程共享堆内存。协程的切换开销非常小,因为只需要保存和恢复协程的上下文,而无需进行内核级的上下文切换。协程需要程序员显式地进行调度和管理,相对于线程和进程来说,其编程模型更为复杂。
创建一个协程的过程
使用 CompletableFuture
实现异步协程
在 Java 中,CompletableFuture
提供了对异步任务的支持。它允许你定义异步任务并在任务完成时做一些处理,从而实现类似协程的效果。
线程运行过程中申请到的东西在切换时是否全部要保存,比如线程中有个循环,或者声明了很多对象,这些是否都要保存,也存在线程私有区吗?
- 线程运行过程中申请到的东西(如循环中的状态、声明的局部对象等)在切换时,不需要全部保存。线程切换时,操作系统只会保存和恢复线程的上下文信息(如栈指针、寄存器、程序计数器等)。
- 对于局部变量,它们存储在栈中,线程切换时会自动保存和恢复。线程私有区中的数据会保留,因为它是与线程相关联的。
多线程比单线程的优势,劣势?
- 优势:
- 提高程序的运行效率,可以充分利用多核处理器的资源
- 同时处理多个任务,加快程序的执行速度。
- 劣势:
- 存在多线程数据竞争访问的问题,需要通过锁机制来保证线程安全,增加了加锁的开销,还有死锁的风险。
进程切换和线程切换的区别?
- 进程切换:
- 进程是由内核管理和调度的,所以进程的切换只能发生在内核态。
- 操作系统需要保存当前进程的状态(如寄存器值、程序计数器等),然后加载目标进程的状态。这不仅包括虚拟内存的切换,还包括内核堆栈、文件描述符、信号处理等资源的切换。
- 线程切换:
- 同一进程中的线程共享相同的 虚拟内存,所以内存切换的开销要比进程切换小。
- 线程切换只需要保存和加载线程的上下文(如寄存器、栈指针等),而不需要切换整个进程的内存空间。
进程上下文有哪些?
进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的资源。
进程间通讯有哪些方式?
- 管道pipe:用于在同一主机上的进程间传输数据的一种通信方式。通常在父子进程之间使用。
- 使用内存缓冲区,数据写入一端后,从另一端读取。
- 消息队列
- 共享内存:不同进程间共享一块内存区域的通信方式,允许进程直接读写这块共享内存。
- 需要使用 信号量 或 互斥锁 等同步机制,避免并发访问时出现数据冲突。
- 信号signal:信号是操作系统用来通知进程某个事件发生的一种机制。
- 信号量(Semaphore):信号量是一种用于同步和控制对共享资源的访问的计数器。它可以被视为一个整数,用于表示资源的数量。
- socket:套接字是一种跨网络的进程间通信方式,通常用于不同主机之间的通信。它支持面向连接(如 TCP)和无连接(如 UDP)通信。支持全双工通信。
说一下同步和异步
- 同步(Synchronous):同步是指任务的执行是按顺序进行的,后续任务必须等前一个任务完成后才能开始执行。
- 异步(Asynchronous):异步是指任务的执行不需要等待前一个任务完成,任务可以并行执行,后续任务可以在前一个任务未完成时开始。
异步过程中谁来通知谁
- 通常是由事件循环、回调函数或Future对象来“通知”A任务。具体来说,A任务可以通过
await
或回调机制来等待和接收结果。 - 如果A任务依赖于I/O操作或其他异步任务的完成,通常会使用上述机制来管理任务状态的切换,确保任务完成时,能够通知A任务并继续执行后续操作。
内存管理
堆和栈的区别?
-
分配方式:堆是动态分配内存,由程序员手动申请和释放内存,通常用于存储动态数据结构和对象。栈是静态分配内存,由编译器自动分配和释放内存,用于存储函数的局部变量和函数调用信息。
-
内存管理:堆需要程序员手动管理内存的分配和释放,如果管理不当可能会导致内存泄漏或内存溢出。栈由编译器自动管理内存,遵循后进先出的原则,变量的生命周期由其作用域决定,函数调用时分配内存,函数返回时释放内存。
-
大小和速度:堆通常比栈大,内存空间较大,动态分配和释放内存需要时间开销。栈大小有限,通常比较小,内存分配和释放速度较快,因为是编译器自动管理。
虚拟内存
- 传统内存:
- 一次性:作业必须一次性全部装入内存后才能开始运行。
- 驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。
- 虚拟内存:虚拟内存的最大容量是由计算机的地址结构(CPU寻址范围)确定的。虚拟内存的实际容量= min{内存和外存容量之和,CPU寻址范围}。32位计算机地址结构为4GB。
- 多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。
- 对换性:在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。
- 虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。
虚拟内存实现有3种方式:请求分页存储管理、请求分段存储管理、请求段页式存储管理。
无论哪种方式都需要一定的硬件支持:包括一定容量的内存与外存;页表机制、段表机制作为主要的数据结构;中断机制:当用户程序要访问的部分会调入内存时产生中断;地址转换机构逻辑地址到物理地址的转换。
32位与64位总线的操作系统的理论虚拟内存
虚拟内存大小=min{内存+外存,总线位数}
-
32位总线大小为4G
-
Windows 64 位操作系统通常为每个进程分配 8 TB 的虚拟地址空间。
-
Linux 在 x86_64 架构下,默认每个进程可以使用 128 TB 的虚拟内存。
分段,分页对比
-
存储特性:
- 页是信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理上的需要,完全是系统行为,对用户是不可见的。
- 段是信息的逻辑单位。分段的主要目的是更好地满足用户需求。一个段通常包含着一组属于一个逻辑模块的信息。
-
存储大小:
- 页的大小固定且由系统决定。
- 段的长度却不固定,决定于用户编写的程序。
-
用户进程地址维度:
- 分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址。
- 分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址。
-
碎片问题:
- 分页的内存利用率高,不会产生外部碎片,只会有少量内部碎片。
- 如果段长过大,会产生外部碎片。
中断和异常
硬中断、软中断讲一下
硬中断(Hardware Interrupt)和软中断(Software Interrupt)是计算机系统中中断机制的两种基本类型,它们都是用来打断当前的程序执行,转而处理一些重要任务或事件。
- 硬中断(Hardware Interrupt):由外部硬件设备发出的信号,用来通知CPU有紧急的事件或任务需要处理。
- 定时器中断:CPU通过定时器定期中断自己,以便执行操作系统的任务调度。
- I/O设备中断:例如,网络接口卡接收到数据包时,触发中断通知CPU进行处理。
- 软中断(Software Interrupt):软中断是由程序中的软件指令触发的中断,它通常用于程序之间的通讯、系统调用或实现某些特定功能。
- 系统调用:用户程序通过触发软中断向操作系统请求资源,如文件读写、进程管理等。
异常
异常(Exception),陷入,也成为内中断,来自于CPU内部的事件。
如非法操作码、地址越界、算术溢出、虚存系统缺页等等,异常不能被屏蔽,一旦出现应当立即处理。
网络IO
BIO、和NIO、AIO区别
特性 | BIO | NIO | AIO |
---|---|---|---|
工作模式 | 阻塞 I/O,数据流模式 | 非阻塞 I/O,缓冲区 + 通道 + 选择器 | 异步 I/O,回调通知 |
线程模型 | 每个连接一个线程 | 多个通道由单线程管理(通过 Selector) | 异步 I/O,无需阻塞或轮询 |
I/O 操作 | 阻塞,直到 I/O 操作完成 | 非阻塞,可以轮询多个通道的事件 | 异步,不会阻塞,完成时回调通知 |
适用场景 | 并发连接数少,低性能需求 | 高并发、大量连接,I/O 密集型应用 | 超高并发、大数据量 I/O 操作 |
性能问题 | 并发连接数多时性能差(线程开销大) | 比 BIO 性能好,但需要轮询(高并发时更有效) | 性能非常高,尤其适用于高并发应用 |
select、poll、epoll 的区别是什么?
- select:
select
是最早出现的一种 I/O 多路复用机制,它允许在多个文件描述符上监视是否有 I/O 事件发生(如可读、可写等)。select
调用会阻塞并等待直到文件描述符集中的某个或某些文件描述符准备就绪,之后就返回。- 缺点:
- 文件描述符限制:
select
限制了每次监视的文件描述符数量,通常是 1024(可以通过修改编译时的宏来增大,但还是有限制)。 - 性能问题:每次调用
select
都需要遍历所有的文件描述符集合,这对于大规模的文件描述符集会导致性能瓶颈。 - 重新设置:每次调用
select
时,必须重设文件描述符集,带来了额外的开销。
- 文件描述符限制:
- poll:
poll
是对select
的改进,具有与select
相似的功能,但没有文件描述符数量限制。poll
用一个pollfd
结构体数组来表示多个文件描述符及其事件,它返回时会告知哪些文件描述符有 I/O 事件发生。- 优点:
- 没有文件描述符限制:相较于
select
,poll
不再有最大文件描述符数量的限制。 - 动态文件描述符集合:
poll
可以动态地管理文件描述符集合,而不需要像select
一样每次都重设整个集合。
- 没有文件描述符限制:相较于
- 缺点:
- 性能瓶颈:尽管去除了文件描述符的数量限制,但
poll
仍然需要遍历整个文件描述符集合,每次调用时都需要遍历整个数组,这对于大量文件描述符来说性能较差。 - 返回值不够直观:
poll
只是返回哪些文件描述符有事件发生,没有直接告诉应用程序事件发生的位置,因此需要遍历pollfd
数组进行判断。
- 性能瓶颈:尽管去除了文件描述符的数量限制,但
- epoll:
epoll
是 Linux 中引入的 I/O 多路复用机制,是对select
和poll
的进一步优化,专门为高并发场景设计。epoll
使用事件驱动的机制,提供了更高效的事件通知方式。epoll
会通过内核级别的事件通知,不需要每次遍历所有的文件描述符,只有在某些文件描述符准备就绪时,内核才会通知用户进程。- 优点:
- 无文件描述符数量限制:
epoll
不受文件描述符数量限制,可以处理成千上万的连接。 - 高效的性能:
epoll
使用基于回调的机制,只在事件发生时通知用户程序,不需要每次都遍历文件描述符集合。 - 边缘触发和水平触发:
epoll
支持两种触发模式,水平触发(Level Triggered)和边缘触发(Edge Triggered),提供了更灵活的控制。 - 内存管理:
epoll
在内核中维护一个事件通知队列,通过epoll_wait
来通知应用程序哪些文件描述符有事件发生,效率较高。
- 无文件描述符数量限制:
- 缺点:
- 只能在 Linux 上使用:
epoll
是 Linux 特有的系统调用,无法在其他操作系统上使用。 - 复杂度较高:相较于
select
和poll
,epoll
需要更复杂的设置和管理,尤其是在使用边缘触发模式时。
- 只能在 Linux 上使用:
epoll过程
lfd=socket()
创建lfd套接字—>bind()
绑定地址—>listen()
设置监听上限—>epoll_create()
创建监听红黑树—>epoll_ctl()
把lfd加入红黑树—>while(1) 服务器端上线等待连接。epoll_wait()
服务器监听—>有事件发生—>epoll_wait()
返回监听满足数组—>一旦有事件发生则lfd一定在满足数组中,lfd
进行accept()
—>用lfd进行accept()
返回的连接套接字cfd
放到红黑树中—>执行读操作—>进行大小写转换操作—>把cfd
节点的属性从EPOLLIN
变为EPOLLOUT
—>再把cfd
重新挂上红黑树去监听写事件—>等待epoll_wait()
返回—>有返回说明能写—>执行写操作—>把cfd
从红黑树中拿下来—>再把cfd
节点的属性从EPOLLIN
变为EPOLLOUT
—>再把cfd重新挂上红黑树去监听读事件—>epoll_wait()
服务器监听。从而形成一个完美的闭环。
epoll 的 边缘触发和水平触发有什么区别?
epoll 支持两种事件触发模式,分别是边缘触发(edge-triggered,ET)和水平触发(level-triggered,LT)。
特性 | 水平触发 (LT) | 边缘触发 (ET) |
---|---|---|
通知方式 | 当文件描述符的事件条件满足时,每次调用都会返回 | 只有文件描述符的事件从未就绪变为就绪时才通知一次 |
事件处理 | 只要事件没有处理完,epoll 会继续返回该文件描述符 | 事件一旦通知后,必须完全处理,否则不会再次通知 |
是否重复通知 | 会重复通知,直到事件完全处理 | 不会重复通知,只有状态变化时才通知一次 |
适用场景 | 适合大多数简单应用,处理事件比较慢时使用 | 适合高性能、高并发应用,要求迅速处理事件 |
性能 | 性能较低,重复通知会增加开销 | 性能较高,因为不重复通知 |
实现难度 | 简单,容易实现 | 稍复杂,要求处理得当,否则可能错过事件通知 |
- 使用水平触发模式,当内核通知文件描述符可读写时,接下来还可以继续去检测它的状态,看它是否依然可读或可写。
- 使用边缘触发模式,I/O 事件发生时只会通知一次,而且我们不知道到底能读写多少数据,所以在收到通知后应尽可能地读写数据,以免错失读写的机会。因此,我们会循环从文件描述符读写数据,那么如果文件描述符是阻塞的,没有数据可读写时,进程会阻塞在读写函数那里,程序就没办法继续往下执行。所以,边缘触发模式一般和非阻塞 I/O 搭配使用,程序会一直执行 I/O 操作,直到系统调用返回错误,错误类型为 EAGAIN 或 EWOULDBLOCK。
redis,nginx,netty 是依赖什么做的这么高性能?
主要是依赖Reactor 模式实现了高性能网络模式,这个是在i/o多路复用接口基础上实现的了网络模型。
Reactor 模式主要由 Reactor 和处理资源池这两个核心部分组成,它俩负责的事情如下:
- Reactor 负责监听和分发事件,事件类型包含连接事件、读写事件;
- 处理资源池负责处理事件,如 read -> 业务逻辑 -> send;
Redis
Redis 6.0 之前使用的 Reactor 模型就是单 Reactor 单进程模式。
- 因为只有一个进程,无法充分利用 多核 CPU 的性能;
- Handler 对象在业务处理时,整个进程是无法处理其他连接的事件的,如果业务处理耗时比较长,那么就造成响应的延迟
单 Reactor 单进程的方案不适用计算机密集型的场景,只适用于业务处理非常快速的场景。所以Redis的瓶颈不在CPU上,网络IO才是瓶颈。
因此在Redis6.0后,Redis 在启动的时候,默认情况下会额外创建 6 个线程(这里的线程数不包括主线程):
- Redis-server : Redis的主线程,主要负责执行命令。
- bio_close_file、bio_aof_fsync、bio_lazy_free:三个后台线程,分别异步处理关闭文件任务、AOF刷盘任务、释放内存任务;
- io_thd_1、io_thd_2、io_thd_3:三个 I/O 线程,io-threads 默认是 4 ,所以会启动 3(4-1)个 I/O 多线程,用来分担 Redis 网络 I/O 的压力。
Netty
Netty 是采用了多 Reactor 多线程方案
每个客户端通过通道(Channel)与服务端进行数据交互,客户端通过端口向服务端发送连接请求。服务端使用一个线程,通过多路复用器(Selector)来监听多个客户端的连接请求和数据事件,服务端会将每个客户端的通道注册到 Selector 上进行管理。
- 主线程和子线程分工明确,主线程只负责接收新连接,子线程负责完成后续的业务处理。
- 主线程和子线程的交互很简单,主线程只需要把新连接传给子线程,子线程无须返回数据,直接就可以在子线程将处理结果发送给客户端。
Netty特点:
- 事件驱动和异步机制:通过回调机制处理I/O结果
- boss-worker:boss只负责管理,具体处理交给worker,还有更加智能的线程管理
- 内存管理优化:采用内存池化区别于传统每次读取都会分配新的字节数组
- 支持多种协议:不仅有tcp、udp还有http、https、websocket等等
Nginx
nginx 是多 Reactor 多进程方案,不过方案与标准的多 Reactor 多进程有些差异。
- 主进程中仅仅用来初始化 socket,并没有创建 mainReactor 来 accept 连接
- 由子进程的 Reactor 来 accept 连接,通过锁来控制一次只有一个子进程进行 accept(为了避免多个子进程同时响应同一个请求,也就是惊群现象),子进程 accept 新连接后就放到自己的 Reactor 进行处理,不会再分配给其他子进程。
零拷贝是什么?
-
传统 IO 的工作方式,从硬盘读取数据,然后再通过网卡向外发送,我们需要进行 4 上下文切换,和 4 次数据拷贝,其中 2 次数据拷贝发生在内存里的缓冲区和对应的硬件设备之间,这个是由 DMA 完成,另外2 次则发生在内核态和用户态之间,这个数据搬移工作是由 CPU 完成的。
-
零拷贝技术,它通过一次系统调用(sendfile 方法)合并了磁盘读取与网络发送两个操作,降低了上下文切换次数。另外,拷贝数据都是发生在内核中的,天然就降低了数据拷贝的次数。使用
sendfile()
,内核直接将文件内容从磁盘缓冲区传输到网络接口,无需通过用户空间。
适用场景:
- Web 服务器:在 Web 服务器中,零拷贝可以用来提高大文件(如视频、图片等)的传输效率。例如,Nginx 使用了
sendfile()
实现零拷贝。 - 高性能网络应用:零拷贝特别适用于需要频繁进行大规模数据传输的应用,如文件传输、数据库备份、视频流等。
- 数据库管理系统:数据库的磁盘和网络传输操作常常使用零拷贝技术,以提高数据读取和写入的效率。
相关文章:

【Java八股文】09-计算机操作系统面试篇
文章目录 计算机操作系统面试篇用户态和内核态的区别?用户态和内核态的区别? 进程管理线程和进程的区别是什么?进程,线程,协程的区别是什么?创建一个协程的过程线程运行过程中申请到的东西在切换时是否全部…...

【Redis】在Java中以及Spring环境下操作Redis
Java环境下: 1.创建maven 项目 2.导入依赖 <!-- redis --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.2</version></dependency> 此处使用的是Jedis&…...

MFC—加法器
1.需要为编辑框添加变量 2.在cpp文件中的按钮中添加代码 void CMFCAddtionDlg::OnBnClickedButton1() {// TODO: 在此添加控件通知处理程序代码UpdateData(true);//把控件里的值更新给变量m_add m_add1 m_add2;//加法UpdateData(false);//把控件相加的值赋值给控件 }...

SpringBoot五:Web开发
精心整理了最新的面试资料,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 要解决的问题 导入静态资源首页jsp,模板引擎Thymeleaf装配扩展SpringMVC增删改查拦截器国际化(非重点) 可以使用以下方式处理静态…...

电机控制的空间矢量调制 (SVPWM)
目录 概述 1 电机控制的空间矢量调制 (SVPWM)介绍 2 实现原理 2.1 设计要求 2.2 SVPWM 的实现 3 SVPWM的C语言 3.1 代码文件 3.2 STM32G4平台上验证 4 源代码文件 概述 本文主要介绍电机控制的空间矢量调制 (SVPWM),空间矢量调制 (SVPWM) 是感应电机和永磁…...
jupyterhub on k8s 配置用户名密码 简单版
如果只是小组内使用 不想共用密码 也不想搞复杂认证方案 那么就直接通过map(用户名,密码md5值)来制定密码 config.yaml部分内容 hub:config:JupyterHub:shutdown_on_logout: true # 用户logout 自动stop jupyter pod,家目录下所有文件会被保存到pvc 即启动后之前家目录下…...
c++笔试准备
一、 输入输出 1.多组数据【while】 cin #include <iostream> using namespace std;int main() {int a, b;while (cin >> a >> b) { // 当读取到EOF时,循环自动终止cout << a b << endl;}return 0; }getline #include <iostrea…...
【Docker】如何在Linux、Windows、MacOS中安装Docker
Linux安装Docker 在终端中执行一键安装脚本命令安装dockersudo curl -fsSL https://gitee.com/tech-shrimp/docker_installer/releases/download/latest/linux.sh | bash -s docker --mirror Aliyun1.1 配置docker镜像源 在终端执行 一行命令,编辑配置文件sudo tee /etc/docke…...

欧拉回路与哈密尔顿回路: Fleury算法与Hierholzer 算法(C++)
图论中的回路是指一个路径, 它从某个顶点开始, 经过所有边恰好一次, 并回到起始顶点. 定义 欧拉回路: 从一个顶点出发, 经过每条边恰好一次, 并且最终回到起始顶点. 哈密尔顿回路: 从一个顶点出发, 经过每个顶点恰好一次, 并且最终回到起始顶点. 欧拉路径: 从一个顶点出发, …...
JavaSE学习笔记26-集合(Collection)
集合 Java 中的集合(Collection)是 Java 标准库中非常重要的一部分,用于存储和操作一组对象。Java 集合框架(Java Collections Framework)提供了一套丰富的接口和类,用于处理各种数据结构,如列…...
本地开发用ASP.NET Core Web API项目创建及测试
1. 服务端代码(C#) 1.1 创建ASP.NET Core Web API项目 打开Visual Studio 2022。 选择“创建新项目”。 选择“ASP.NET Core Web API”模板,点击“下一步”。 输入项目名称(如OracleApi),选择项目位置&…...

Redis——用户签到BitMap,UV统计
目录 BitMap 使用场景 1. 用户签到系统 2. 用户行为标记 3. 布隆过滤器(Bloom Filter) BitMap介绍 Redis中的使用 Redis功能示例 添加: 获取: 批量获取: java中实现 统计本月连续签到次数 UV统计 UV 统计…...

一文详解U盘启动UEFI/Legacy方式以及GPT/MBR关系
对于装系统的老手而说一直想研究一下装系统的原理,以及面对一些问题时的解决思路,故对以前的方法进行原理上的解释,主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导,我们可以看一下微pe制作的启动盘&#…...

Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果
目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 (1)提取较亮区域 - pass1 (2)高斯模糊 - pass2&3 (3ÿ…...

小迪安全-24天-文件管理,显示上传,黑白名单,访问控制
上节课回顾,token问题 没有更新token值,造成了复用 加上这段代码就好了,就不会复用了 文件管理-文件上传 upload.html文件,找ai生成就行 uoload.php接受文件上传的信息 这里在写个临时文件存储换个地方 因为上面临时文件存在c盘…...
java23种设计模式-建造者模式
建造者模式(Builder Pattern)学习笔记 1. 模式定义 建造者模式是一种创建型设计模式,通过分步构建复杂对象的方式,将对象的构建过程与表示分离。允许使用相同的构建过程创建不同的对象表示。 2. 适用场景 ✅ 需要创建包含多个…...
JMeter 中实现 100 个用户在 3 秒内并发登录
在 JMeter 中实现 100 个用户在 3 秒内并发登录,需要合理配置线程组、定时器和测试逻辑。以下是具体步骤: 1. 创建测试计划 打开 JMeter。右键点击“Test Plan”,选择 Add > Threads (Users) > Thread Group。 : 设置为 100(模拟 100 个用户)。 : 设置为 3...

SOME/IP-SD -- 协议英文原文讲解2
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.2 S…...

IntelliJ IDEA中Maven配置全指南
一、环境准备与基础配置 1.1 Windows 环境下载并配置 Maven 见此篇博文:环境配置 1.2 IDEA配置步骤 打开设置面板:File → Settings → Build → Build Tools → Maven 关键配置项: Maven home path E:\apache-maven-3.9.9 (…...

第438场周赛:判断操作后字符串中的数字是否相等、提取至多 K 个元素的最大总和、判断操作后字符串中的数字是否相等 Ⅱ、正方形上的点之间的最大距离
Q1、判断操作后字符串中的数字是否相等 1、题目描述 给你一个由数字组成的字符串 s 。重复执行以下操作,直到字符串恰好包含 两个 数字: 从第一个数字开始,对于 s 中的每一对连续数字,计算这两个数字的和 模 10。用计算得到的新…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...