- 博客(49)
- 收藏
- 关注
原创 CPU执行指令的过程
注意:以上所谈到的指令中的地址码,以及指令本身的地址,均是进程的虚拟地址空间中的地址,在CPU视角只需要对这些虚拟地址进行操作即可,具体物理内存地址在CPU和内存之间有MMU来进行虚拟地址和物理地址的转换(通过PCB内的页表)。通过前面两篇文章的介绍,我们已经认识到了:可执行程序通过作业调度装入内存,操作系统为进程创建虚拟地址空间,分配物理内存,建立页表(映射关系),申请并初始化PCB,开始调度进程。,产生特定指令的控制电位,将其送至微操作控制线路上,在时序部件定时信号的作用下,产生具体的操作控制信号。
2024-11-17 21:54:59
1377
2
原创 作业调度和程序装入内存
我们知道,磁盘上的可执行程序只有装入内存,成为进程才可以运行。在磁盘上有许多的可执行程序等待被操作系统唤入内存执行,我们把可执行程序在磁盘上的调度称之为作业调度。
2024-11-10 22:36:01
766
原创 进程设计理念
为满足多道批处理系统的并发调度需求,即程序间断性执行,操作系统需要对这些加载到内存中的程序加以描述和控制,从而能更好的实现并发调度。为了管理好每一个进程,操作系统使用的管理方案:先描述,再组织。
2024-11-10 11:23:07
215
原创 C++右值引用和移动语义
C++11后,基本所有的STL容器都新增了移动构造和移动赋值,以此来提高需要深拷贝的容器是将亡值时的拷贝效率。,那么析构函数 、拷贝构造、赋值重载一定都要手动写,此时就算我们不手动写移动构造,编译器也不会默认生成,利用右值引用在拷贝构造和赋值运算符重载函数中接收将亡值,并实现资源的置换,进而减少无意义的拷贝。在赋值运算符重载的实现中,实现一份形参使用右值引用接收的赋值运算符重载(即移动赋值),在拷贝构造的实现中,实现一份形参使用右值引用接收的拷贝构造(即移动构造)
2024-07-18 09:54:08
1230
13
原创 C++继承和多态
多态:多态就是一个接口多种实现,多种状态,是面向对象编程语言的一重要特征。当使用父类指针或引用接收子类对象指针或引用,并调用子类对象中重写的虚函数时,就会体现出多态性。即指向父类调父类,指向子类调子类。
2024-07-14 12:02:37
885
22
原创 C++类型转换&&可调用对象
static_cast是用于C语言中可以隐式类型转换的类型之间,当编译器隐式执行类型转换时,大多数编译器会给出警告该操作会损失精度,而采用static_cast可以明确告诉编译器,这是知情的情况下进行的。上面的例子中,Person* -> Student*的原因是它本来就是指向的一个Student,于是就可以从父类指针再回到子类指针。包装器是C++的一个模板类,可以将任何可调用对象赋值给包装器对象,常用于业务逻辑的注册。bind就像一个可调用对象适配器,通过接收一个可调用对象,生成一个新的可调用对象。
2024-07-01 21:45:10
935
20
原创 C++ initializer_list&&类型推导
C++支持统一初始化{ },出现了一个新的类型initializer_list,一切类型都可以用列表初始化。提供了一种更加灵活、安全和明确的方式来初始化对象。
2024-07-01 20:03:02
621
1
原创 TCP协议
这篇文章主要介绍网络协议栈中传输层的tcp协议,除了tcp协议本身,还会谈到linux内核中网络协议栈的周边问题的理解,介绍使得tcp协议可靠、高效的一些策略。可靠性:校验和 序列号(按序到达) 确认应答 超时重传 连接管理 流量控制 拥塞控制高效性:滑动窗口 快速重传 延迟应答 捎带应答首先我们看到,tcp在网络协议栈是位于传输层,它的全称是"传输控制协议在发送端将数据包通过应用层(使用系统调用)交给传输层,再向下交付。在接收端将数据包从传输层向上交付交给应用层。
2024-05-26 16:40:53
1129
12
原创 linux多线程
进程是分配资源的基本单位,线程是被调度的基本单位,是进程中的实际运作单位,一个进程可以被分为多个线程,每个线程都是一个执行流。由CPU并发调度执行。
2024-03-28 22:02:26
1063
原创 linux之信号
信号:用于进行信息传递的客观实体。例如,十字路口的红绿灯、下课铃声、防空警报声,这些都可以认为是信号,会给我们传递某种信息:红灯停,绿灯行;下课铃响表示下课,防空警报响表示有敌人入侵。上面的例子可以表明:一种信号起作用的基本条件是发信号和接收信号者形成一种共识(或者是一种规定),比如:红灯停,绿灯行必须要提前让行人知道,进而行人才会对信号做出相应的反应。linux中的信号有哪些?kill -l其中1-31号信号为普通信号。34-64号信号为实时信号。每个信号都有自己的特殊含义。
2024-03-11 08:30:00
753
原创 动静态库的理解、制作、使用。
静态库:以拷贝的方式,将方法的集合(库)直接拷贝到可执行程序中。动态库:以动态链接的方式,将要链接的库函数地址拷贝到可执行程序中。
2024-01-24 08:30:00
1343
27
原创 C++六大组件之一:仿函数
上面的代码,直接调用算法库中的sort(),并没有指定学生对象排序是按照什么排序,默认sort函数会用less里面直接用。来实现Student的比较方式,在把这个类的对象传入排序函数内部实现比较功能。,这样会使排序的结果为升序,如果我们要将冒泡函数的功能改为降序排序,那么。上面的代码是模板+冒泡函数对指定数组的排序,冒泡函数里面的交换条件是。来实现这个需求,定义两个不同的比较函数,在冒泡函数。仿函数本质是利用类的运算符重载,传入函数不同的对象。,但是有没有办法能更好的封装这个冒泡函数,
2024-01-13 11:24:44
1479
26
原创 linux进程管理,一个进程的一生(喂饭级教学)
进程的定义:程序的一个执行实例,加载到内存中的程序,即正在执行的程序。进程是操作系统执行任务的基本单元,也是分配资源、处理数据和被调度的基本单元。更加通俗的理解:操作系统要做事情,进程就是一件又一件的"事情"。
2023-10-23 21:42:00
4433
62
原创 C++模板,STL(Standard Template Library)
这篇文章的主要内容是C++中的函数模板、类模板、STL的介绍。希望对C++爱好者有所帮助,内容充实且干货,点赞+收藏防止找不到!
2023-08-12 08:45:49
1269
67
原创 C++内存管理(new与delete)
这篇文章的主要内容是new与delete的由来,使用new与delete对C++堆内存进行管理,(malloc、free)与(new、delete)的区别。希望对C++爱好者有所帮助,内容充实且干货,点赞+收藏防止找不到!
2023-08-11 09:25:29
574
55
原创 重生之我要学C++第七天(匿名对象、内部类)
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。,参见友元类的定义,内部类可以通过外部类的对象来访问外部类中的所有成员。但是外部类不是内部类的友元(外部类不能定义内部类对象来访问内部类成员)。当我们只想调用一次类里面的成员方法时,就需要专门创建一个对象,用对象来使用成员方法,未免太过麻烦。这样的代码会报错,原因是A()匿名对象具有常性,等号左边是A类型的引用,这样涉及权限的放大。顾名思义,匿名对象就是没有名字的对象。
2023-08-09 08:55:37
647
57
原创 重生之我要学C++第六天(const,static,友元)
const也可以修饰自定义类型对象,赋予对象常属性,保护对象内的成员变量不可被修改。const对象调用它的成员函数时,this指针也是const类型。重生之我要学C++第三天(类和对象)_无极太族的博客-优快云博客用Date类class Datepublic:_day = day;int _month;int _day;int main()//创建const类型对象d1return 0;此时,用d1调用成员函数。
2023-07-31 22:16:26
967
85
原创 重生之我要学C++第五天
这篇文章主要内容是构造函数的初始化列表以及运算符重载在顺序表中的简单应用,运算符重载实现自定义类型的流插入流提取。希望对大家有所帮助,点赞+收藏+评论,支持一下吧!
2023-07-30 16:20:49
11870
85
原创 重生之我要学C++第三天(类和对象)
类可以直接使用吗?答案是否定的。定义出一个类并没有分配实际的内存空间,要想使用这个模板,需要用类创建对象(申请空间),我们可以使用这个对象。这就是类的实例化的过程。一个类可以创建任意多的对象,每一个对象都是基于这个类的模板实例化出来的,每个对象又互不干涉,都是独立的个体。
2023-07-21 17:15:11
350
5
原创 堆排序精讲
堆排序的时间复杂度是n*logn,可以说吊打冒泡排序(n^2)。是建立在堆这种数据结构的理解上演化出来的一种排序方式。上篇文章对堆这种数据结构已经有详细的介绍。这篇文章就用堆这种数据结构基础搞定堆排序。
2023-06-20 10:40:48
182
2
原创 数据结构之堆
首先介绍一下什么是树树是有限个节点构成的具有层次关系的集合。因为这种关系的逻辑图看起来像一颗倒挂的树,故叫做树。其次介绍一下树的种类树又分为二叉树和非二叉树,二叉树又分为完全二叉树和满二叉树。这篇文章主要详细介绍堆,堆是一种完全二叉树。其次介绍一下堆的种类堆又分为大堆,小堆。大堆:父节点大于等于子节点 小堆:父节点小于等于子节点。
2023-06-16 23:34:26
185
2
原创 栈和队列经典OJ
我们知道,队列有先进先出(FIFO)的原则,所以要想用两个栈实现队列,就必须用这两个栈使得数据先进先出。如果popstack栈中没有元素,需要将pushstack栈中的元素捯入popstack栈。题目要求用两个栈实现一个队列,要求具备队列基本接口:入列,出列,返回队列头元素,判断队列是否为空。栈和队列相关代码在前面已经实现过了,接下来就手撕几道有关栈和队列的几道高频经典OJ,让大家更加深刻的理解栈和队列这两种数据结构。用栈实现队列本质需要了解栈与队列的区别,知道二者数据处理的差异,并灵活应用。
2023-06-11 13:04:12
173
1
原创 数据结构之栈和队列
栈和队列是数据结构的线性表中依附顺序表和链表产生的两种对前面两者进行规则限定的特殊数据结构。本质还是顺序表和链表,只不过是加以改装。
2023-06-10 16:10:45
182
1
原创 Leedcode链表经典OJ
OJ链接:206. 反转链表 - 力扣(LeetCode)这道题在这里提供两种方法:思路分析:细节分析:极端分析:空链表反转,单个节点的链表反转。思路分析:细节分析:代码设计: 极端分析:空链表反转,单个节点链表反转。
2023-05-27 16:56:06
132
1
原创 Leedcode链表经典OJ
上一篇文章带大家详细的学习了单链表的基本操作,例如创建单链表,单链表的头插尾插,头删尾删等等。当一个链表先遍历完毕,还没遍历完的那个链表节点的数据一定大于新链表中的数据,且是升序,可以直接将没遍历完的那个链表尾插到新链表。首先,两个链表是有序的,且都是升序的,这就启发我们将两个链表同时遍历。有了以上思路,接下来就是具体的代码实现 以及 代码的细节处理。二 . 两个链表同时遍历,数据小的节点尾插到新链表当中。二 . 记得分析极端场景,持着先普通再极端的道理。一 . 创建一个新链表,来存放合并后的链表。
2023-05-25 21:05:28
163
4
原创 深度剖析数据结构之单链表
在这篇文章中,你将熟练应用单链表,彻底玩转单链表,你会发现单链表真的很简单。首先,来介绍一下单链表的构成,单链表由一个或者多个内存不连续的独立节点构成,每一个节点都是一个结构体节点内部具有两个属性:1.节点所存储的数据 2.下一个节点的地址。
2023-05-18 16:01:19
201
3
原创 深度剖析数据结构之链表(引言)
的知识如果掌握的不是很扎实,那么学习链表必定是一大痛点。为了让更多小伙伴玩转链表,我写了这篇文章,这就是这篇文章的初心。随意拼接,种类很多,但是最常用的只有下面两种。,带头的,不带头的,循环的,非循环的。悄悄话:作者只写最简单易懂的技术文章。首先,链表有很多种类,单向的,双向的。结构之后,下一篇文章将会详细的介绍。从这篇文章开始,将会带大家玩转。对于初学者来说,相信很多人对。的理解都是含糊不清,如果。
2023-05-01 16:28:15
145
1
原创 内存管理函数malloc,calloc,realloc详解
当我们想开辟一块动态内存空间的时候,就需要使用动态内存函数了,比如char* p;当我们想要使用地址p下的内存时,就需要用到malloc函数注意,malloc函数的返回类型是(void*),形参是要开辟空间的字节数。所以要使用malloc这个函数,必须将返回值强制类型转换为想要的类型,比如注意,malloc函数开辟内存空间有时会开辟失败,这时会返回空指针(NULL),所以,要较好的使用malloc函数,还要检查一下是否成功开辟内存,代码如下。
2023-04-07 22:04:38
168
1
鸿蒙开发(关键词-开发环境)
2024-07-05
TA创建的收藏夹 TA关注的收藏夹
TA关注的人