- 博客(296)
- 资源 (4)
- 收藏
- 关注
原创 系统在哪些情况下会触发缺页中断
这意味着当程序访问某个内存地址时,如果该页尚未被加载到物理内存中,则会触发缺页中断。当程序再次访问这些已被交换到磁盘上的内存页时,会发生缺页中断。操作系统会将这些页从磁盘交换回物理内存。这时,如果该内存页尚未映射到物理内存,操作系统会触发一个缺页中断,并将对应的页映射到物理内存。当一个程序尝试访问一个虚拟内存地址,而该地址没有映射到物理内存(即该地址没有分配有效的物理内存页),操作系统会发生缺页中断。如果程序试图访问一个被标记为只读或禁止访问的内存区域(例如,写入一个只读页面),也会触发缺页中断。
2024-09-19 21:32:37 304
原创 C++中move和forword的区别
move用于将一个对象的资源所有权从一个对象转移到另一个对象,以避免不必要的复制。它是一种类型转换,表示你希望将一个对象视为一个右值,从而可以被“移动”而不是“复制”。forward用于完美转发模板参数。它确保在将参数传递给其他函数时,保留参数的值类别(即是左值还是右值)。这对于实现通用函数模板尤其重要。
2024-09-19 20:53:39 343
原创 多个线程如何轮流输出1到100
当线程需要等待某个条件变成真时,它会获取一个互斥锁,然后在条件变量上等待,等待期间会自动释放互斥锁。另一个线程在满足条件后会获取相同的互斥锁,并调用条件变量的 notify_one() 或 notify_all() 函数来唤醒等待的线程。是用于线程间协调的强大工具。这个面试问题主要考察如何让线程同步,首先线程同步必会用到的就是互斥锁,互斥锁保证多个线程对数据的同时操作不会出错。(条件变量)是 C++11 中提供的一种多线程同步机制,它允许一个或多个线程等待另一个线程发出通知,以便能够有效地进行线程同步。
2024-09-07 15:20:01 436
原创 C++内存泄露检测-Windows平台VLD
我们复制出来的vld文件,CmakeLists.txt,以及我们的程序main.cpp。第二部分是函数调用栈,可以看到在我们的代码中发生泄露的地址是main()+0xA的地址。第二部分是函数调用栈,可以看到在我们的代码中发生泄露的地址是main()+0xA的地址。安装过程就一路next即可,如果自定义安装目录的话,需要记住安装的目录,默认目录。然后我们在相同的文件路劲下创建build文件夹,用来存放编译过程的中间文件。第三部分是发生泄漏的内存的值,现在全部被覆盖为CD。,这个目录下的三个文件夹。
2024-08-14 17:11:27 411
原创 C++哪些变量在没有显式初始化的情况下会被初始化为0
首先,我们需要明白C++程序编译链接后会包含以下几个主要段(Section)。.text.data.bss.rodata.dynamic.plt.got.symtab.strtab从上述的编译后分段就可以看出来,只有BSS段的内容会被自动初始化为0,那么C++中的哪些数据会再编译链接后放入BSS段呢?就是全局变量和静态变量。
2024-08-14 09:57:33 257
原创 为什么父类的析构函数要定义为虚函数
在C++中,通过基类指针或引用访问派生类对象时,如果基类的析构函数不是虚函数,那么在删除基类指针时,只会调用基类的析构函数,而不会调用派生类的析构函数。这可能导致派生类中特有的资源没有被正确释放,从而引发资源泄露。
2024-07-12 14:22:12 392
原创 容器是线程不安全的,如果多线程下不加锁直接使用容器会发什么
这种情况下,容器的内部状态可能会被破坏,从而导致未定义行为。例如,容器的内部指针或迭代器被破坏,导致非法内存访问,从而引发段错误(Segmentation Fault)。由于多线程竞争条件的不可预测性,程序可能表现出随机性错误。某些情况下,错误可能不会立即显现,但在特定条件下可能会触发。中添加元素时,如果没有适当的同步,可能会导致内部数组的重新分配和指针失效。容器的内部数据结构可能会被多个线程同时修改,从而导致数据不一致。可以看到这里是引发了访问冲突,其实这种行为即使是重复也会出现不一样的结果。
2024-07-12 14:02:49 312
原创 delete删除new[]创建的数组会发生什么
举个例子class Tpublic:int main()delete p2;return 0;这段代码只会执行数组中第一个对象的析构函数,后面的对象就会有发生内存泄露的风险。比如后面的对象申请了一块内存,此时这块内存就再也收不回来了。运行一下,会报warning。
2024-07-12 13:38:10 506
原创 C++ 中多态的实现原理-虚函数表详解
编译时多态(Compile-time Polymorphism):也称为静态多态性,是在编译时确定的多态性。C++中的函数重载和模板(Templates)是编译时多态的例子。函数重载允许定义多个同名函数,但它们的参数列表不同,编译器根据参数类型或个数来决定调用哪个函数。模板允许编写通用的代码,以适用于不同类型的数据。运行时多态(Run-time Polymorphism):也称为动态多态性,是在运行时确定的多态性。C++中的虚函数和继承是运行时多态的例子。
2024-05-16 18:50:49 1173
原创 C++11 新特性 常量表达式 constexpr
为了解决常量无法确定的问题,C++11在新标准中提出了关键字constexpr,它能够有效地定义常量表达式,并且达到类型安全、可移植、方便库和嵌入式系统开发的目的。
2024-05-15 17:47:44 479
原创 C++11新特性 lambda表达式
lambda表达式是现代编程语言的一个基础特性,比如LISP、Python、C#等具备该特性。而C++在C++11标准才正式支持lambda表达式。
2024-05-12 21:20:11 783
原创 C++11新特性 右值引用详解
C++引入右值引用以及与之相关的移动语义和完美转发,C++的语义变得更加丰富和合理,与此同时它的性能也有了更大的优化空间。对于这些优化空间,C++委员会已经对标准库进行了优化,比如常用的容器均已支持移动构造函数和移动赋值运算符函数。
2024-05-11 15:50:01 791
原创 C++指针常量和常量指针的区别
常量指针是定义了一个指针,这个指针指向一个对象,不能通过常量指针来修改这个对象。指针常量是指定义了⼀个指针,这个指针的值只能在定义时初始化,其他地⽅不能改变。
2024-05-11 15:48:16 280
原创 Linux中的日志系统简介
在的Linux系统上使用的日志系统一般为rsyslogd。rsyslogd守护进程既能接收用户进程输出的日志,又能接收内核日志。
2024-05-10 10:04:34 981
原创 Linux网络编程(四) 同时处理一个端口的UDP与TCP连接
服务器如果要同时监听多个端口,就必须创建多个socket,并将它们分别绑定到各个端口上
2024-05-09 13:30:10 305
原创 Linux网络编程(三)IO复用二 poll系统调用
GNU为poll系统调用增加了一个POLLRDHUP事件,它在socket上接收到对方关闭连接的请求之后触发。poll系统调用的返回值,成功时返回就绪(可读、可写和异常)文件描述符的总数,如果在超时时间内没有任何文件描述符就绪,select将返回0。由XOPEN规范定义。fds参数是一个pollfd结构类型的数组,它指定所有我们感兴趣的文件描述符上发生的可读、可写和异常等事件。成员告诉poll监听fd上的哪些事件,它是一系列事件的按位或;
2024-05-08 09:43:44 853
原创 Linux网络编程(三)IO复用一 select系统调用
I/O复用使得程序能同时监听多个文件描述符。需要指出的是,I/O复用虽然能同时监听多个文件描述符,但它本身是阻塞的。并且当多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能按顺序依次处理其中的每一个文件描述符,这使得服务器程序看起来像是串行工作的。如果要实现并发,只能使用多进程或多线程等编程手段。
2024-05-08 09:42:46 1128
原创 Linux网络编程(一) 网络基础
向一个TCP连接写入数据时,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务。UDP则不同,UDP是不可靠的服务,当一个UDP数据报被成功发送之后,UDP内核缓冲区中的该数据报就被丢弃了。其工作原理是:主机保存了一份IP地址和MAC地址的映射高速缓存,先从表中查询,查询不到的话,主机向自己所在的网络广播一个ARP请求,该请求包含目标机器的网络地址。各层协议依次处理帧中本层负责的头部数据,以获取所需的信息,并最终将处理后的帧交给目标应用程序。
2024-05-07 14:55:42 1530
原创 Linux多线程(三) 线程池C++实现
我们使用线程的时候就去创建一个线程,这样实现起来非常简便。但如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。线程池就是为了让线程可以复用,不在线程的创建和销毁上浪费时间。线程池主要分为三个部分任务就是函数与参数组成的结构体。
2024-04-27 19:38:06 528 1
原创 Linux多线程(二) 线程同步 信号量&互斥锁&读写锁&条件变量
多个进程同时访问某些资源时,必须考虑同步问题,以确保任一时刻只有一个进程可以拥有对资源的独占式访问。通常,程序对关键资源的访问代码只是很短的一段,我们称这段代码为关键代码段或者临界区,对进程同步,也就是确保任意时刻只能有一个进程进入关键代码段。
2024-04-27 19:36:40 1030
原创 Linux多线程(一) 线程的创建与控制
线程是轻量级的进程(LWP:light weight process),在Linux环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合,指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位,分配系统资源,可以这样理解,进程是资源分配的最小单位,线程是操作系统调度执行的最小单位。进程有自己独立的地址空间, 多个线程共用同一个地址空间线程更加节省系统资源, 效率不仅可以保持的, 而且能够更高在一个地址空间中多个线程独享: 每个线程都有属于自己的栈区, 寄存器(内核中管理的)
2024-04-27 19:35:10 955
原创 Linux多进程(五) 进程池 C++实现
进程池是一种并发编程模式,用于管理和重用多个处理任务的进程。它通常用于需要频繁创建和销毁进程的情况,以避免因此产生的开销。减少进程创建销毁的开销:避免频繁创建和销毁进程所带来的系统资源开销。提高系统响应速度:由于进程已经初始化并且一直保持在内存中,可以立即分配执行任务,减少了任务等待时间。控制资源使用:通过限制进程池中的进程数量,可以控制系统资源的使用情况,避免资源过度消耗。
2024-04-26 16:31:32 1146 1
原创 Linux多进程(四) 守护进程
守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。
2024-04-26 16:29:38 593
原创 Linux多进程(二)进程通信方式三 共享内存
共享内存提供了一个在多个进程间共享数据的方式,它们可以直接访问同一块内存区域,因此比使用管道或消息队列等通信机制更高效。在多进程程序中,共享内存通常与信号量一起使用,以确保对共享内存的访问是线程安全的。
2024-04-25 14:47:30 1089
原创 Linux多进程(二)进程通信方式二 消息队列
消息队列是在两个进程之间传递二进制块数据的一种简单有效的方式。每个数据块都有一个特定的类型,接收方可以根据类型来有选择地接收数据,而不一定像管道和命名管道那样必须以先进先出的方式接收数据。
2024-04-24 12:48:40 1518 1
原创 Linux多进程(二)进程通信方式一 管道
管道的是进程间通信(IPC - InterProcess Communication)的一种方式,管道的本质其实就是内核中的一块内存(或者叫内核缓冲区),这块缓冲区中的数据存储在一个环形队列中,因为管道在内核里边,因此我们不能直接对其进行任何操作。
2024-04-24 12:43:08 1508
原创 Linux多进程(一)创建进程与进程控制
在子进程退出的时候, 进程中的用户区可以自己释放, 但是进程内核区的pcb资源自己无法释放,必须要由父进程来释放子进程的pcb资源,孤儿进程被领养之后,这件事儿干爹就可以代劳了,这样可以避免系统资源的浪费。在一个启动的进程中创建子进程,这时候就有了父子两个进程,父进程正常运行, 子进程先与父进程结束, 子进程无法释放自己的PCB资源, 需要父进程来做这个件事儿, 但是如果父进程也不管, 这时候子进程就变成了僵尸进程。消灭僵尸进程的方法是,杀死这个僵尸进程的父进程,这样僵尸进程的资源就被系统回收了。
2024-04-23 14:17:08 669
原创 Linux中的高级IO函数(三)fcntl
Linux提供了很多高级的I/O函数。它们并不像Linux基础I/O函数(比如open和read)那么常用(编写内核模块时一般要实现这些I/O函数),但在特定的条件下却表现出优秀的性能。这些函数大致分为三类:用于创建文件描述符的函数,包括pipe、socketpair、dup/dup2函数。用于读写数据的函数,包括readv/writev、sendfile、mmap/munmap、splice和tee函数。用于控制I/O行为和属性的函数,包括fcntl函数。本节接着介绍第三类。
2024-04-23 14:14:41 452
原创 Linux中的高级IO函数(二)readv & writev & sendfile & mmap & splice & tee
Linux提供了很多高级的I/O函数。它们并不像Linux基础I/O函数(比如open和read)那么常用(编写内核模块时一般要实现这些I/O函数),但在特定的条件下却表现出优秀的性能。这些函数大致分为三类:用于创建文件描述符的函数,包括pipe、socketpair、dup/dup2函数。用于读写数据的函数,包括readv/writev、sendfile、mmap/munmap、splice和tee函数。用于控制I/O行为和属性的函数,包括fcntl函数。本节接着介绍第二类。
2024-04-22 19:48:22 1178
麦克风阵列资料.zip
2020-09-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人