- 博客(46)
- 收藏
- 关注
原创 线程池的介绍
固定线程池:线程池中的线程数量固定,这些线程会一直存在,不会随任务的增 加或减少而动态调整,超出的任务会在队列中等待。使用场景:任务量比较固定但耗时较长的任务。缓存线程池:可根据需要创建新线程的线程池,如果新任务到达,但线程池中没有可用线程,则创建一个新线程并添加到池中,如果有被使用完但是还没销毁的线程,就复用该线程。线程池中超过60秒未使用的线程,将会被移除和销毁。使用场景:任务量大但耗时少的任务。
2025-03-01 22:24:16
313
原创 基于C++11的线程池
线程池可以控制并发执行的线程数量,通过设定线程池的大小来限制系统中同时执行的线程数量,避免资源的过度占用和线程竞争导致的性能下降。线程池技术通过在系统中预先创建一定数量的线程,当任务请求到来时从线程池中分配一个预先创建的线程去处理任务,线程在处理完任务之后并不会销毁,而是把线程归还到线程池中,继续为后续的任务提供服务。提供线程管理和监控:线程池提供了易于管理和监控线程的方式,可以设置线程的属性、监控线程的状态、统计任务执行情况等。熟悉多线程理论:多线程基本知识,线程同步,线程互斥,原子操作等;
2025-02-28 12:31:50
151
原创 计算机网络
计算机网络是一个将分散的(地理位置不同的)、具有独立功能的计算机系统,通过通信设备(路由等)与线路(光纤等)连接起来,由功能完善的软件实现资源共享和信息传递的系统。计算机网络是一些互联的、自治的计算机系统的集合对等层的实体在通信过程应当遵循的规则的集合规定了报文格式和次序,以及接收和传输时采用的动作。
2024-11-04 19:16:24
726
1
原创 裸指针的六个问题
5>假设上述的问题都解决了,也很难保证在代码的所有路径中(分支结构,异常导致的跳转),有且仅有一次销毁指针操作;3>在已经确定需要销毁指针的情况下,也无法确定是用delete关键字删除,还是有其他特殊的销毁机制例如通过将指针传入某个特定的销毁函数来销毁指针所指资源;4>即便已经确定了销毁指针的方法,由于1的原因,仍然无法确定到底是用delete(销毁单个对象还是delete[]销毁一组对象;2>使用完指针之后无法判断是否应该销毁指针,因为无法判断指针是否“拥有”指向的对象;
2024-10-22 21:11:38
215
原创 四类IO操作
为了减少CPU等待时间引入中断机制。在I/O设备输入每个数据的过程中,无需CPU干预,一定程度实现CPU和I/O并行工作。通道是独立于CPU的专门负责输入输出控制的处理机,他控制设备与内存直接进行数据交换。拥有通道指令,这些指令由CPU启动,并在操作结束时向CPU发出中断信号。为了进一步减少CPU对I/O设备的干预,防止因并行操作设备过多使CPU来不及处理或因速度不匹配而造成的数据丢失现象,引入DMA控制方式。直接访问由用户进程直接控制主存或CPU和外围设备的信息传送。直接程序控制方式又称为忙/等待方式。
2024-10-16 23:09:45
214
原创 list和vector的区别
deque删除的时候不会导致迭代器失效(非迭代器位置),插入会导致迭代器失效。4>list内部排序是指针指向的更改,vector涉及对象的创建和销毁。list删除元素导致当前迭代器失效,不影响其他迭代器。list节点不连续,容易造成内部碎片,空间利用率低。3>list是双向迭代器,vector是随机迭代器。2>list删除元素会释放空间,vector不会。7>vector连续空间,不容易产生内部碎片。5>vector改变元素,导致迭代器失效。6>vector是连续存储容器,动态数组。
2024-10-15 23:23:59
529
原创 C++四种类型转化
2)指针转换的限制:不能转换掉const,volatile或者__unaligned属性。5)在进行下行转换时,dynamic_cast具有类型检查的功能,更加安全。内置类型在打印时,编译器看到是常性值,直接进行替换操作,无法实现修改值。说明:要求类型必须是一个指针、引用、算数类型、函数指针或者成员指针。6)动态类型转换能将对象类型转换成无类型,不能将无类型转换成对象类型。1)用于基本类型间的转换,如int->char,int->enum。下行转换是不安全的:把基类指针或引用转换成派生类时,没有动态检查。
2024-10-15 00:01:32
273
原创 虚拟管理,分页分段,端页
连续分配管理:为用户分配一个连续的内存空间块式管理将内存分成几个固定大小的块,每个块只包含一个进程。如果程序需要的内存较少,那么分配的这块内存很大一部分几乎被浪费了。在块中没有被使用到的空间即为碎片离散分配管理:允许一个程序使用的内存分布在离散或者不相邻的内存中页式管理将内存分为大小相等且固定的一页一页的形式,页较小,相比于块式管理划分得更细,提高内存利用率,减少碎片。页式管理通过页表对应逻辑地址和物理地址。
2024-10-14 16:10:35
995
原创 操作系统中的虚拟内存
虚拟内存是计算机系统提供的一种内存管理技术它给每个进程提供了一连续的虚拟地址空间,使得每一个进程具有独占主存的错觉,通过将内存扩展到硬盘空间,让程序可以拥有超过系统物理内存大小的可用内存空间它定义了一个连续的虚拟地址空间,并且把内存扩展到了硬盘空间虚拟内存允许程序不用将地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序成为可能对于没有映射到物理内存的页,可以在使用的时候将其装入物理内存。
2024-10-13 23:36:07
362
原创 操作系统之锁和原语
再基于锁,就能够实现各种各样的同步机制(信号量、消息、Barrier等) 在多线程编程中,为了保证数据操作的一致性,操作系统引入了锁机制,用于保证临界区代码的安全。操作系统之所以能构建锁之类的同步原语,是因为==硬件已经为我们提供了一些原子操作==,例如: 中断禁止和启用(interrupt enable/disable) 内存加载和存入(load/store)测试与设置(test and set)指令 禁止中断这个操作是一个硬件步骤,中间无法插入别的操作。缺点:使用中断实现锁,繁忙等待,不可重入。
2024-10-10 12:17:52
329
原创 为什么Linux系统下的程序无法在Windows下运行
还有一点是Linux下和Win下系统API不同,这个API是操作系统API,在Linux中API通常指系统调用,通过0x80软中断实现的。而Win中的API是在动态链接库文件中的,也就是DLL,这是一个库,里面包含代码和数据。Linux中的可执行程序获得系统资源的方法是不同的。两个系统的格式不同,格式就是协议,是在固定位置有意义的数据。Linux下可执行文件格式是elf,可使用readelf查看elf文件头。而Windows下的可执行程序是PE格式,是一种可执行文件。
2024-10-08 12:11:39
297
原创 操作系统笔记
进程管理的主要作用就是进程调度,在单核CPU下,操作系统会为每个进程分配一个任务,进程管理十分简单。内存管理主要是操作系统负责管理内存的分配、回收,在进程需要时分配内存以及在进程结束时回收内存,协调内存资源,使用合理的页面置换算法进行页面的换入换出。为了进一步减少CPU对I/O设备的干预,防止因并行操作设备过多使CPU来不及处理或因速度不匹配而造成的数据丢失现象,引入DMA控制方式。通常计算机都运行着许多程序,它们都需要对内存和CPU进行交互,操作系统的目的就是为了保证这些操作可以准确无误的进行。
2024-10-06 13:55:15
476
原创 继承与构造函数与析构函数
4,若在基类未设计拷贝构造函数,派生类设计了,在派生类中没有指明基类构造函数类型时,使用缺省的拷贝函数,若没有缺省函数,编译错误 // 0 1。3,若在基类和派生类均设计了拷贝函数,在派生类中没有指明基类构造函数类型时,使用缺省的拷贝函数,若没有缺省函数,编译错误 // 1 1。2,若基类有拷贝函数,派生类没有函数,将在派生类中生成按位拷贝的拷贝构造函数 // 1 0。
2024-08-25 21:29:46
167
原创 构造析构函数设置访问限定符的意义
public:构造函数和析构函数一般是public的,以便在类外部自由创建和销毁对象。适用于普通类的标准使用场景。protected:限制类的直接实例化或销毁,通常用于继承结构中,确保基类不能被直接实例化或销毁,但允许派生类访问。private:完全控制对象的创建和销毁,适用于单例模式或工厂模式,防止类的实例在不受控制的情况下被创建或销毁。
2024-08-25 21:07:40
604
原创 继承—构造函数—引用等
4,无论采取什么继承方式,派生类对象的成员方法都可以去访问基类对象中的保护和共有属性。继承时,数据成员,函数成员全盘接收,如果碰见同名成员屏蔽基类成员。1,无论采取什么继承方式,基类中所有数据成员都将继承到派生类。2,在类型的继承层次里,保护属性当作共有属性使用。函数同名隐藏不应被看作是函数重载,因为作用域不同。
2024-08-25 17:53:03
180
原创 vector容器库
元素被连续存储,这意味着不仅可通过迭代器,还能用指向元素的常规指针访问元素。所用的方式不在每次插入元素时,而只在额外内存耗尽时进行重分配。通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。重分配通常是性能上有开销的操作。如果元素数量已知,那么。元素的指针能传递给任何期待指向数组元素的指针的函数。vector 的存储是自动管理的,按需扩张收缩。是封装动态数组的序列容器。(对于 bool 以外的。函数可用于消除重分配。返回多余的内存给系统。(C++17 起)及。
2024-08-24 21:58:31
396
原创 11111
private:char* ptr;public:if (s.ptr!= nullptr)elseif (str!= nullptr)elseif (ptr!= nullptr)if (ptr!= nullptr)if (ptr!= nullptr)delete ptr;if (s.ptr!else。
2024-08-23 18:51:42
241
原创 计算机启动
这个其实也不难猜测,启动区的内容就是我们自己写的代码了,复制到这里之后,就开始执行呗,之后我们的程序就接管了接下来的流程,BIOS 的使命也就结束啦。其实,我的解释也只能说是人家规定了这个值,后人们替他们解释这个合理性,并不是说当初人家就一定是这样想的,就好比我们做语文的阅读理解题一样。然后正因为所有写操作系统的,启动区的第一行汇编代码都写死了这个数字,那 BIOS 开发者最初定的这个数字就不好改了,否则它得挨个联系各个操作系统的开发厂商,说我这个地址改一下,你们跟着改改。哦,前面说过了是加载,
2024-08-18 11:48:32
519
原创 计算机启动
由于用于启动盘的磁盘是人家写操作系统的厂商制作的,俗称制作启动盘,所以他也肯定知道操作系统的核心代码存储在磁盘的哪个扇区,因此启动区就把这个扇区,以及之后的好多好多扇区(具体取决于操作系统有多大)都读到内存中,然后跳转到开始的程序开始的位置。这个就不像 0x7c00 这个数那么经典了,不同的操作系统肯定也不一样,也不用事先规定好,反正写操作系统的人给自己定一个就好了,别覆盖其他关键设备用到的区域就好。启动区里的代码写了啥?就 512 字节就是全部操作系统内容了?没错,就是这个套路。
2024-08-17 13:17:42
245
原创 计算机的启动过程
BIOS 程序的入口地址也就是开始地址是 0xFFFF0(人家就那么写的),也就是开机键一按下,一定有一个神奇的力量,将 pc 寄存器中的值变成 0xFFFF0,然后 CPU 就开始马不停蹄地跑了起来。如果再说具体些,CPU 将段基址寄存器 cs 初始化为 0xF000,将偏移地址寄存器 IP 初始化为 0xFFF0,根据实模式下的最终地址计算规则,将段基址左移 4 位,加上偏移地址,得到最终的物理地址也就是抽象出来的 PC 寄存器地址为 0xFFFF0。你可以算算我们现在的 64 位机的地址范围。
2024-08-16 10:31:22
789
原创 什么是复杂度
我们在做一些算法题时,经常会发现题目会对时间复杂度或者有所要求,如果你不知道什么是复杂度时,你可能就无法正确的完成题目。因此,我们在学习数据结构与算法的第一步,就是要理解什么是复杂度。什么是复杂度复杂度是衡量算法效率的标准,而算法分析效率分为两种:时间效率和空间效率。由此,复杂度也被分为两种:时间复杂度和空间复杂度。时间效率被称为时间复杂度, 而空间效率被称作空间复杂度。时间复杂度主要衡量的是一个算法的运行速度。
2024-08-15 16:58:08
375
原创 名字粉碎.
PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一个“0”代表一次重复;_fastcall 调用约定是“人”如其名,它的主要特点就是快,因为它是通过寄存器来传送参数的 (实际。_fastcall调用约定在输出函数名前加上一个”@“符号,函数名后面也是一个”@“符号和其函数的字节数。4、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;送,被调用的函数在返回前清理传送参数的内存栈),在函数名修饰约定方面,它和前两者均不。
2024-07-28 16:26:59
353
原创 直接寻址和间接寻址
是指在指令中给出的是一个指向要操作的数据地址,处理器首先访问该地址,再获取实际数据的地址,最后才进行相应的读/写操作。指令给出了存放操作数地址的存储单元的地址(也称地址指针)。:是指在指令中明确要操作的数据的地址,处理器可以直接访问该地址并进行读取或写入操作。指令直接使用存储器或寄存器的元件名称和地址编号。在指令中,数据类型应与指令表示符相匹配。
2024-07-28 15:14:52
288
原创 C++中的变量的同名隐藏
同名隐藏是C++中的一个概念,在一个类的继承关系中,子类中定义了一个与父类中同名的成员函数。当这种情况发生时,子类中的函数会隐藏掉所有父类中同名的函数,这意味着在子类中调用这个函数时,会优先调用子类中定义的版本,而不是父类中的版本。代码中有两个g_max,我们会优先打印main函数里的g_max,遵循就近原则。如果想要使用全局变量的g_max需要添加::全局解析符表明用意。首先通过C中的代码来进入这个问题。
2024-07-16 14:43:34
446
原创 C++9 构造析构
这时我们的Print打印的将是20,因为此时形参与类中变量名相同,局部优先将打印20。在a=x时,会隐式类型转化从而再次调用构造函数和析构函数。普通函数不可以使用。
2024-07-13 17:47:46
184
原创 C语言杂谈:从Hello world说起 #include| main| printf| return
return,printf,main函数,#include
2024-06-03 14:33:24
1713
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人