vector与array
vector 与 array 的区别以下是 C++ 中 std::vector 和 std::array 的区别,涵盖定义、特点、性能和使用场景等方面。 1. 定义 **std::vector**: 动态数组,来自 <vector> 头文件。 可以在运行时动态调整大小,支持插入、删除元素。 基于堆内存分配,容量不足时自动扩容。 **std::array**: 固定大小数组,来自 <array> 头文件(C++11 引入)。 封装了 C 风格数组,长度在编译时确定,无法动态改变。 通常分配在栈上(或静态存储区)。 2. 主要区别 特性 std::vector std::array 大小 动态大小,可通过 resize、push_back 等调整 固定大小,编译时确定 内存分配 堆内存,动态分配 栈内存(通常)或静态存储区 性能 访问速度快,但扩容/重新分配有开销 访问速度快,无动态分配开销 容量管理 支持 capacity 和 reserve,可预分配空间 无容量概念,大小固定 接口 丰富(如...
操作系统中的调度算法
操作系统中的调度算法操作系统中的调度算法用于决定进程或线程的执行顺序,以优化 CPU 利用率、吞吐量、响应时间等。以下是常见的调度算法,分为非抢占式和抢占式两类: 1. 非抢占式调度算法进程一旦获得 CPU,将运行至完成或主动让出 CPU。 先来先服务(First-Come, First-Served, FCFS): 按进程到达顺序执行。 优点:简单,易实现。 缺点:可能导致“短进程等待长进程”问题(护送效应),平均等待时间长。 时间复杂度:队列操作 ( O(1) )。 短作业优先(Shortest Job First, SJF): 选择预计运行时间最短的进程优先执行。 优点:最小化平均等待时间(理论上最优)。 缺点:需预知运行时间,难以实现;长进程可能饥饿。 时间复杂度:选择最短进程 ( O(n) ),可用优先队列优化。 优先级调度(Priority Scheduling): 根据进程优先级调度,优先级高的先执行。 优点:支持重要进程优先。 缺点:低优先级进程可能饥饿。 时间复杂度:取决于优先级队列实现,通常 ( O(\log n) )。 2....
用户态和内核态的区别及切换方法
用户态与内核态的区别及切换用户态(User Mode)和内核态(Kernel Mode)是操作系统中两种不同的运行状态,用于隔离用户程序和系统核心功能,以确保安全性和稳定性。以下是两者的区别及切换机制。 1. 用户态与内核态的区别 特性 用户态 (User Mode) 内核态 (Kernel Mode) 定义 应用程序运行的状态,受限访问权限 操作系统核心运行的状态,拥有完全控制权 权限级别 低权限(Ring 3),无法直接访问硬件或核心资源 高权限(Ring 0),可直接访问硬件和系统资源 可访问资源 受限,仅能访问用户空间内存和部分指令 可访问所有内存、硬件设备和特权指令 典型操作 执行用户程序、调用库函数、处理用户逻辑 执行系统调用、中断处理、设备驱动管理 安全性 隔离运行,防止程序破坏系统 完全控制,可能导致系统崩溃 性能开销 较高,因需通过系统调用访问内核 较低,直接访问资源 用户态: 用户程序(如浏览器、文本编辑器)运行在此状态。 只能访问用户空间内存,无法直接操作硬件(如 CPU、磁盘)或修改内核数据。 通过系统调用(如...
c++内存管理
C++ 内存管理与 malloc(无垃圾回收机制)C++ 是一种手动管理内存的编程语言,开发者需要显式分配和释放内存。与依赖垃圾回收(Garbage Collection, GC)的语言(如 Java)不同,C++ 不提供内置的 GC 机制,内存管理主要通过 new/delete 和 C 风格的 malloc/free 实现。以下是 C++ 内存管理的核心内容,重点介绍 malloc 及相关概念。 1. C++ 内存管理概述C++ 程序的内存分为以下主要区域: 栈(Stack): 存储局部变量、函数参数和返回地址。 由编译器自动分配和释放,速度快,生命周期固定。 示例:int x = 10;(栈上分配)。 堆(Heap): 用于动态分配内存,生命周期由程序员控制。 使用 new/delete 或 malloc/free 管理。 示例:int* p = new...
各种各样的锁~
各种锁的介绍在并发编程中,锁是用于保护共享资源、防止数据竞争和确保线程安全的机制。以下是对你提到的各种锁(mutex、lock_guard、shared_lock、unique_lock、分布式锁、自旋锁、悲观锁、乐观锁)的详细介绍,涵盖定义、用途、实现原理、优缺点及适用场景。由于你提到自旋锁两次,我会将其合并处理,并结合 C++ 上下文(基于之前的线程池讨论)进行讲解。 1. 互斥锁(std::mutex)定义std::mutex 是 C++11 提供的互斥锁(Mutual Exclusion Lock),用于保护共享资源,确保同一时间只有一个线程可以访问临界区。 用途 防止多个线程同时访问共享资源(如线程池中的任务队列)。 实现线程同步,确保数据一致性。 实现原理 std::mutex 提供 lock() 和 unlock() 方法,锁定和释放互斥量。 线程尝试获取锁时,若锁已被占用,线程会阻塞(进入休眠)直到锁可用。 操作系统底层通常通过原子操作和内核调度实现。 代码示例12345678910111213141516171819202122#include...
模板元编程
C++ 模板元编程模板元编程(Template Metaprogramming, TMP)是 C++ 中利用模板在编译期进行计算和逻辑处理的编程范式。它将模板作为一种“编译期函数式语言”,在编译时生成代码或执行计算,广泛用于提高代码的通用性、性能和类型安全性。以下是模板元编程的核心概念、用法和示例。 1. 什么是模板元编程? 定义:模板元编程利用 C++ 模板在编译期执行计算,通过模板特化和递归生成代码,生成高效的运行时代码。 特点: 编译期执行:所有计算在编译时完成,运行时无额外开销。 类型安全:通过模板参数推导和特化实现类型检查。 函数式风格:使用递归、条件判断等函数式编程思想。 应用场景: 实现通用库(如 std::tuple、std::variant)。 编译期计算(如计算阶乘、斐波那契数)。 类型操作(如类型选择、类型转换)。 优化运行时性能(如展开循环、生成内联代码)。 2. 模板元编程的核心机制2.1 模板与特化 模板:允许定义泛型类或函数,接受类型或非类型参数。12template<typename T>T add(T a, T b)...
协程
协程(Coroutine)介绍及其分类1. 什么是协程?协程也可以叫做”轻量级的线程,用户线程“。 ...
线程池
线程池(Thread Pool)与 C++ 实现1. 什么是线程池?线程池是一种多线程编程模式,用于管理一组预先创建的线程,以高效执行多个任务。它通过复用线程避免频繁创建和销毁线程的开销,适合处理大量短生命周期任务的场景。 线程池的核心思想 预分配线程:启动时创建固定数量的线程,保持空闲状态等待任务。 任务队列:将待执行的任务放入队列,线程从队列中获取任务执行。 线程复用:任务完成后,线程不销毁,而是返回线程池等待新任务。 负载均衡:多个线程并行处理任务,提高并发性能。 优点 性能提升:减少线程创建/销毁的开销(创建线程可能需要数百微秒)。 资源管理:限制线程数量,防止系统资源耗尽。 任务管理:通过队列管理任务,支持优先级或异步执行。 可扩展性:适合动态调整任务负载。 应用场景 Web 服务器处理 HTTP 请求。 数据库查询并行处理。 批量任务处理(如图像处理、文件解析)。 实时计算任务(如游戏服务器)。 2. C++ 线程池实现C++11 及以上提供了...
分布式锁
分布式锁是什么?分布式锁是一种在分布式系统中用于协调多个节点访问共享资源或执行互斥操作的机制。它的核心目标是确保在分布式环境中,同一时间只有一个节点(或进程)能够访问某个共享资源,避免数据不一致或竞争条件。类似于单机系统中的锁(如 Java 的 synchronized 或 ReentrantLock),但分布式锁需要解决多节点间的同步问题,因此更复杂。 通俗来说,分布式锁就像一个“共享钥匙”:多个节点(或服务)想要操作某个资源时,必须先拿到这把钥匙。一次只能有一个节点持有钥匙,用完后释放,别的节点才能抢到。 分布式锁的机制分布式锁通常依赖一个中心化的协调服务(如 ZooKeeper、Redis、etcd)或某种一致性协议来实现。以下是分布式锁的典型工作流程: 获取锁: 节点 A 尝试向协调服务(如 Redis)请求锁,比如通过 SETNX(set if not exists)命令在 Redis 中设置一个键(如 lock:resource1),并带上过期时间(防止死锁)。 如果键设置成功,节点 A 获得锁;如果键已存在,说明其他节点持有锁,节点 A...
LSM-Tree
云之重器。。。这个仇,我记下了。27届怎么你了 LSM Tree (Log-Structured Merge-Tree)LSM Tree(日志结构合并树)是一种数据结构,广泛应用于高性能、高吞吐的存储系统,特别是在写密集型场景中。它通过将写操作转化为顺序追加日志,并定期合并数据来优化性能。以下从定义、原理、实现、优缺点及应用场景详细介绍LSM Tree,并结合Linux环境和分布式系统(如分布式锁)的上下文。 1. LSM Tree 定义LSM Tree 是一种面向写优化的持久化数据结构,结合了内存和磁盘存储,通过日志结构和多级合并实现高效的写操作和合理的读性能。它最初由 Patrick O’Neil 等人在1996年提出,适用于需要高吞吐量写入的数据库系统。 2. LSM Tree 工作原理LSM Tree 的核心思想是将随机写转化为顺序写,并通过后台合并操作维护数据的有序性。其结构和操作流程如下: 结构组成 内存组件(MemTable): 内存中的数据结构(如跳表、红黑树),用于存储最近写入的数据。 MemTable 提供快速的读写操作,数据按键排序。 当...




