- 博客(88)
- 收藏
- 关注
原创 Linux中perf的使用
perf` 是 Linux 系统中的一个强大的性能分析工具,广泛用于内核和用户态程序的性能分析。`perf top` 类似于 `top`,但它分析的是系统上所有进程的实时性能数据,显示当前占用 CPU 最多的函数或事件。这将打开一个 TUI(文本用户界面),显示执行数据的分析报告,其中包括各个函数的执行频率(如 CPU 周期占比),帮助你识别程序的热点函数(耗时多的函数)。`perf trace` 是一个类似于 `strace` 的工具,它可以跟踪进程的系统调用并统计其频率和开销。
2024-10-10 15:55:02
760
1
原创 怎么感觉流量控制和拥塞控制基本差不多,都是调整窗口的大小来进行数据传输
两者的调整窗口的方式虽然相似,但服务的对象和目标不同。流量控制是端到端的控制,而拥塞控制是网络级别的控制。,避免因接收端缓存溢出而丢失数据。它是在发送方和接收方之间的通信中进行的,属于端到端的控制机制。,避免因网络资源过载而丢包。它关注的是网络路径的负载情况,属于端到网络的控制机制。
2024-08-27 15:07:24
290
原创 计算机基础知识总结(八股文总结----计算机网络、操作系统、数据库、c++、数据结构与算法)
内存分段是将一个程序的内存空间分为不同的逻辑段 segments ,每个段代表程序的一个功能模块或数据类型,如代码段、数据段、堆栈段等。每个段都有其自己的大小和权限。内存分页是把整个虚拟和物理内存空间分成固定大小的页(如4KB)。这样一个连续并且尺寸固定的内存空间,我们叫页Page。内存分段容易产生外部碎片,内存分页容易产生内部碎片。作用:逻辑隔离、内存保护、虚拟内存、共享内存、内存管理。(所以说这些技术都是相辅相成的)协程是一种比线程更加轻量级的并发执行单元,通常由程序本身而不是操作系统内核来调度。
2024-08-26 21:12:02
15562
1
原创 HTTPS 通信时是对称加密还是非对称加密?
握手完成后,实际的数据传输(如网页内容、表单数据等)使用对称加密算法(如 AES、ChaCha20)来进行加密和解密。这是因为对称加密速度快,适合传输大量数据。:在SSL/TLS握手期间,用于安全地交换对称密钥(Pre-Master Secret)。客户端使用服务器的公钥加密对称密钥,服务器使用私钥解密。因此,HTTPS通信中使用非对称加密来安全地交换对称加密密钥,而实际的通信数据则使用对称加密来保证传输效率和安全性。
2024-08-26 20:03:56
592
原创 知道哪些键值型存储数据结构?这些数据结构的时间、空间复杂度分别是什么?什么时候选⽤?
键值型存储数据结构主要用于高效地存储和检索数据,其中键用于唯一标识每个元素,而值则是与键相关联的内容。这类数据结构广泛应用于各种场景,如缓存、索引、哈希表等。常见的键值型存储数据结构包括哈希表、平衡二叉搜索树(如红黑树、AVL 树)、跳表等。下面详细介绍这些数据结构及其时间、空间复杂度,以及使用场景。
2024-08-26 16:58:25
664
原创 介绍几种常用的排序算法
通过重复地遍历要排序的序列,每次比较相邻的元素并交换它们的位置,使得每次遍历都将当前未排序部分中的最大(或最小)元素移动到末尾。:通过选择一个“基准”(pivot),将数据分为两部分,一部分比基准小,另一部分比基准大,然后对这两部分递归进行快速排序。:利用堆这种数据结构,将序列构造成一个大顶堆或小顶堆,然后反复将堆顶元素移到序列末尾,并重新调整堆结构。:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。:适用于数据范围较小的整数排序,效率高,但需要较大的额外空间。
2024-08-26 16:51:33
767
1
原创 优化MySQL性能的方法
建立索引:加速数据访问和操作。覆盖查询:减少数据读取,提高查询效率。避免索引失效:确保索引能够被有效利用,避免性能下降。通过合理使用这些策略,可以显著提升 MySQL 数据库的查询性能和整体效率。
2024-08-26 16:43:18
454
原创 malloc 和 new 的区别总结
内存分配和初始化malloc只分配内存,不进行初始化。new分配内存并调用构造函数进行初始化。异常处理malloc失败时返回NULL。new失败时抛出异常(除非使用类型安全malloc返回void*,需要强制转换为目标类型的指针。new返回正确类型的指针,不需要强制转换。内存释放malloc分配的内存用free释放。new分配的内存用delete或delete[]释放。malloc。
2024-08-26 14:52:48
338
原创 为什么要设计内核态、⽤户态两种状态
设计内核态(Kernel Mode)和用户态(User Mode)两种状态的主要目的是为了提高系统的稳定性、安全性和效率。
2024-08-26 14:47:56
552
原创 函数重载和重写的区别
是指在同一个作用域中定义多个同名的函数,但这些函数的参数列表必须不同(参数类型、数量或顺序)。重载函数与函数的返回类型无关,返回类型不能用来区分重载函数。是指在派生类中重新定义基类中的虚函数,使得派生类的版本会覆盖基类的版本。重写允许在派生类中提供基类函数的具体实现,通常用于实现多态性。重载和重写都是实现代码复用和多态的重要工具,但它们的应用场景和目的不同。理解它们的区别有助于更好地设计和实现 C++ 程序。是两个不同的概念,它们用于实现不同的编程需求。
2024-08-26 14:40:32
510
原创 代码编译的完整过程
通过这些步骤,源代码被转换为计算机可以理解和执行的机器码。这些步骤中的每一步都涉及不同的处理和优化,确保最终的可执行文件能够正确、高效地执行。源代码文件转换为可执行文件的过程涉及多个步骤,每个步骤都有其特定的任务。
2024-08-26 14:35:00
383
原创 了解哪些C++11特性
C++11引入了许多重要的语言特性和库改进,这些特性提高了语言的表达能力、性能和安全性。了解并使用这些特性可以使代码更简洁、更高效,并更好地利用现代C++的强大功能。C++11引入了许多新特性和改进,增强了语言的表达能力、性能和安全性。:表示独占的智能指针,确保只有一个指针拥有资源。:表示共享的智能指针,允许多个指针共同拥有资源。:提供固定大小的数组,替代传统的 C 风格数组。:基于哈希表的数据结构,提供更快的查找速度。:提供更简洁的类型别名定义方式,替代传统的。:用于自动推断变量的类型,使代码更简洁。
2024-08-26 14:31:49
480
原创 为什么要建⽴索引,索引为什么能够加快查询的速度
索引通过提供高效的数据检索路径来加快查询速度。它减少了需要扫描的数据量,优化了数据的定位和访问方式,支持快速的排序、过滤、联接和聚合操作。建立合适的索引能够显著提升数据库性能,但也需要注意过多或不适当的索引可能导致维护开销增加,因此在设计索引时需权衡查询性能和更新成本。建立索引的主要目的是为了加快数据库查询操作的速度,特别是对大型数据表进行查询时。索引是一种数据结构,它通过特定的算法和结构来优化数据检索过程。下面详细解释为什么索引能够加快查询速度及其工作原理。
2024-08-26 14:21:10
790
原创 操作系统如何进行进程的上下文切换?
进程的上下文切换(Context Switch)是操作系统内核用来切换处理器执行的进程的机制。当进程的执行被中断,并且操作系统决定切换到另一个进程时,必须保存当前进程的状态(上下文)并恢复另一个进程的状态。上下文切换使得多个进程可以共享处理器资源,实现多任务操作。上下文切换是操作系统在多任务环境下管理进程的关键机制,尽管有一定的开销,但它使得操作系统能够高效地调度多个进程在单个处理器上运行。
2024-08-26 14:15:35
417
原创 static 关键字有哪些作用?
关键字在不同上下文中的灵活运用,使得它在管理变量的生命周期、作用域和类成员的访问上起到了关键作用。关键字在C和C++中有多种用途,具体作用取决于它使用的上下文。
2024-08-26 14:11:10
352
原创 八股总结-----C++、数据结构、算法
存储可执行代码(程序指令)。:存储全局变量和静态变量(已初始化和未初始化)。:用于动态内存分配,由程序员管理。:存储函数调用中的局部数据(局部变量、参数、返回地址)。
2024-08-25 21:49:30
653
原创 进程、线程、协程的全面比较
进程:适用于需要隔离、独立资源管理的任务,开销较大,安全性高,适合并行处理任务。线程:适用于需要共享资源且需要并行执行的场景,开销适中,但需处理同步问题。协程:适用于轻量级、高并发的 I/O 密集型任务,开销最小,但只能实现并发,无法真正并行。
2024-08-25 20:25:48
921
原创 为什么进程切换开销更大?
进程切换开销更大的原因在于它涉及大量的系统资源管理和状态保存/恢复,包括内存管理、内核资源分配、缓存管理等。相比线程切换,进程切换需要更复杂的操作,因此开销更大。
2024-08-25 20:10:25
655
原创 什么是虚拟内存?为什么需要虚拟内存?
虚拟内存是一种强大的技术,通过地址映射、分页和页面调度等机制,提供了扩展内存容量、进程隔离、多任务处理和内存保护等重要功能。它使得系统可以更高效地使用物理内存,支持更大规模和更复杂的程序运行。
2024-08-23 17:30:59
621
原创 虚函数和纯虚函数
虚函数用于在基类中声明,并允许在派生类中重写,以实现多态性。纯虚函数是没有实现的虚函数,存在于抽象类中,必须在派生类中实现,否则派生类也将成为抽象类。纯虚函数常用于定义接口,强制派生类提供特定的功能。
2024-08-23 17:24:17
257
原创 死锁的四个条件
进程已经保持了至少一个资源,并且又提出了新的资源请求,但该资源已被其他进程占有,导致进程进入等待状态。存在一个进程链,使得链中的每个进程都在等待链中的下一个进程所占有的资源,形成一个闭环。进程已经获得的资源在未使用完之前,不能被强制剥夺,只能由进程自己释放。资源不能被共享,某个资源在某一时刻只能被一个进程占有。死锁的发生需要满足以下四个必要条件,这些条件被称为。当这四个条件同时存在时,系统就可能进入死锁状态。
2024-08-23 17:00:53
214
原创 互斥锁、信号量、条件变量的一些理解
Locker模块有三个类组成,互斥锁类,信号量类,条件变量类。信号量类是相当于一个计数器,来表示有多少资源可以被同时操作,也就是有多少线程能同时上锁的。总结:互斥锁是对一个共享资源(临界区)的并发控制,信号量则是对多个资源的并发控制,二者一般在高并发场景下配合使用。互斥锁和信号量解决了不同类型的并发控制问题:互斥锁保证对单一资源的独占访问,而信号量控制对多个资源的并发访问。互斥锁和信号量确实有不同的作用场景,但它们并不冲突,各自有独特的用途。你不能简单地用信号量替代互斥锁,因为它们解决的问题不同。
2024-08-23 12:49:22
821
原创 Reactor模式和Proactor模式
Reactor模式和Proactor模式是两种常见的I/O事件处理设计模式,用于在高并发网络服务器或其他I/O密集型应用中管理多个I/O事件。:应用程序只需在I/O操作完成后处理结果,实际的I/O操作由操作系统异步完成。它的核心在于将I/O操作与结果处理解耦,达到异步非阻塞的效果。:应用程序在事件发生时主动处理I/O操作,通常使用同步I/O操作。它的核心在于事件分发和处理的逻辑封装。这两种模式在不同场景下各有优劣,选择哪种模式取决于具体的系统需求、操作系统的支持以及设计目标。
2024-08-23 11:07:10
388
原创 把阻塞I/O、同步I/O、LT、长连接、CPU资源、Reactor分为一类,把非阻塞I/O、异步I/O、ET、短连接、I/O资源、Proactor分为一类,这样合理吗?
Reactor通过事件分发机制来处理I/O操作,通常与同步I/O和阻塞I/O结合,主线程负责分发事件,而处理逻辑通常由工作线程执行。:在ET模式下,内核仅在I/O事件状态发生变化时通知应用程序,减少了事件通知次数,提高了处理效率,通常与非阻塞I/O结合使用。:I/O操作和数据处理在同一线程进行,数据的读取或写入是同步完成的,线程在等待I/O操作完成的过程中无法做其他事情。:这些机制更倾向于有效利用I/O资源,减少不必要的CPU占用,如通过非阻塞I/O和异步I/O来提高I/O效率。
2024-08-23 10:55:51
245
原创 RAII在实现webserver这个项目中是怎么体现的?起到了什么作用
自动化资源管理:RAII将资源的获取和释放绑定在对象的生命周期内,自动管理资源,减少手动管理的负担,防止资源泄露。提高异常安全性:RAII确保即使在发生异常的情况下,资源也能被正确释放,从而提高系统的稳定性和可靠性。简化代码:通过RAII封装,开发者不需要显式地管理资源释放逻辑,简化了代码的复杂性,降低了出错的可能性。在WebServer项目中,RAII不仅简化了资源管理,还通过自动化的资源释放机制大大提高了系统的健壮性和可维护性。
2024-08-23 02:15:38
318
原创 单例模式在实现webserver这个项目中起到了什么作用
在WebServer项目中,单例模式主要用于管理全局性、关键性组件,确保它们在整个服务器生命周期中只有一个实例。这不仅提高了资源利用率,还简化了系统的设计和管理,使得系统各部分的行为更加一致和可控。在多线程环境下,单例模式还可以结合线程安全的机制,保证全局组件的正确性和可靠性。
2024-08-23 02:08:39
653
原创 阻塞队列对于实现异步日志系统的重要性
阻塞队列在多线程环境下被认为是安全的,是因为它内置了线程同步机制,能够确保多个线程在访问共享资源(如队列)时不会出现数据竞争问题。而非阻塞的实现方式并不是不安全的,但它需要开发者手动管理线程间的同步和资源保护,增加了出错的可能性。
2024-08-23 02:01:54
160
原创 什么是信号,信号是如何实现的
信号是操作系统用于向进程传递异步事件的一种机制。当某个事件(如非法操作、定时器超时、外部中断等)发生时,操作系统可以通过发送信号通知进程,以便进程可以采取相应的行动。信号是一种异步通知机制,进程可以在任何时刻接收到信号并处理它。
2024-08-22 21:20:23
439
原创 什么是零拷贝?以及数据在内存中的流动途径
零拷贝”这个术语强调了减少甚至避免内存拷贝,特别是在内核空间和用户空间之间。这不仅可以减少 CPU 占用,还能提高系统的 I/O 性能,特别适用于高性能网络服务器、文件传输等场景。在传统 I/O 操作中,数据在内存中的流动路径,尤其是在处理文件读取和网络发送时数据如何在内核空间和用户空间之间传递。读取数据:从磁盘到内核缓冲区(内核空间),通常使用 DMA 完成。用户读取:将数据从内核缓冲区复制到用户空间缓冲区。数据准备发送:将数据从用户空间缓冲区复制回内核缓冲区,准备通过网络发送。网络发送。
2024-08-22 16:00:21
673
原创 如何实现读写锁?如何实现读写优先级?读写锁的应用场景和原理
实现读写锁(也称为共享-独占锁)的基本思路是允许多个读线程同时访问资源,但在写线程访问资源时,需要独占访问权限。因此,读写锁可以提高并发性,特别是在读操作频繁且写操作较少的场景中。
2024-08-22 14:05:45
443
原创 内存大方向分为四个区域
存储函数调用中的局部数据(局部变量、参数、返回地址)。:存储全局变量和静态变量(已初始化和未初始化)。:用于动态内存分配,由程序员管理。:存储可执行代码(程序指令)。
2024-08-21 22:37:50
135
原创 红黑树的特点和使用场景
红黑树(Red-Black Tree)是一种,它在插入、删除和查找操作时保持了树的平衡性,从而保证了这些操作的时间复杂度为 O(log n)。红黑树在实际应用中广泛使用,例如在操作系统的内核中用于管理进程调度、文件系统、以及网络 I/O(如epoll机制中)。
2024-08-21 22:22:46
667
原创 epoll机制中最核⼼的数据结构是什么?
红黑树:用于高效地管理所有正在监视的文件描述符。双向链表:用于存储已经就绪的文件描述符,使得就绪事件的处理更加高效。epoll的高效性正是因为结合了这两种数据结构,能够在大规模并发连接的场景下提供极高的性能。epoll是 Linux 内核提供的一个高效的 I/O 多路复用机制,它的主要作用是在大量的文件描述符(通常是网络套接字)中,快速检测出哪些文件描述符已经准备好进行 I/O 操作,从而避免应用程序在这些文件描述符上进行轮询检查。epoll尤其适用于高并发服务器。
2024-08-21 22:14:23
492
原创 守护进程是什么?
守护进程通常在系统引导时启动,并一直在后台运行,直到系统关闭或显式终止。与一般的用户进程不同,守护进程不依赖于特定的终端或用户会话,它独立于终端控制并在系统级别执行特定的任务。是一种在后台运行的特殊类型的进程,通常不与用户直接交互,而是执行系统级的任务或服务。守护进程在系统启动时启动,并在后台持续运行,直到系统关闭。可以把守护进程是一类在后台运行、独立于终端的特殊进程,用于执行系统级别的任务和服务。通过在后台运行,守护进程能够周期性地检查和响应某些事件或请求,以满足系统的各种需求。
2024-08-21 20:44:10
229
原创 知道进程/线程/协程吗?谈⼀下什么是协程?线程和协程有什么区别,各⾃的优越性是什么?
协程是一种比线程更加轻量级的并发执行单元,通常由程序本身而不是操作系统内核来调度。协程允许在执行过程中手动暂停和恢复,不像线程那样由操作系统内核进行切换。每个进程中至少会有一个线程,这个线程通常被称为主线程(Main Thread)。在大多数操作系统中,当你启动一个进程时,操作系统会自动创建一个主线程来执行进程的代码。主线程可以创建更多的子线程,但即使只有一个线程,进程也可以正常运行。协程是一种可选的并发模型,并不是线程中的必需部分。一个线程中可以没有任何协程,线程仍然可以执行任务。
2024-08-21 17:13:00
579
原创 窗⼝满了的情况下, write函数的阻塞和⾮阻塞分别返回什么
read和write是通用的 I/O 操作系统调用函数,可以用于操作文件、设备、管道、以及套接字等。send和recv是专门为套接字设计的函数,通常在网络编程中使用。也就是write函数是网络编程的基本函数,客户端与服务端,一端通过write写入数据,另一端通过read读取数据,从而实现网络间通信。
2024-08-21 16:31:37
381
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人