- 博客(34)
- 收藏
- 关注
原创 Linux环境变量与本地变量
操作系统或运行时环境中存储的一些变量,用来存储与进程或系统相关的配置信息。这些变量在进程启动时由操作系统或Shell读取,并对进程的行为和资源访问产生影响。
2024-11-28 19:11:03
683
原创 页表的结构
当一个进程需要访问其虚拟内存空间中的某个地址时,操作系统会首先通过查找页目录表,使用前10位找到对应的页目录项,然后从该页目录项中读取出页表的物理地址。接着,操作系统会使用中间10位在页表中找到对应的页表项,从该页表项中读取出物理页框的地址。当操作系统查找一个地址的时候,先通过地址的前10位,确定这个地址所在的页数,找到页数以后,通过后中间10位找到该页中存放的物理页框的起始地址,后12位看作一个偏移量,在物理内存中找到对应的物理页框后加上这个偏移量就是实际的地址。页表项中包含了物理页框的地址。
2024-10-20 22:20:07
557
原创 线程的同步
是 POSIX 线程库中的一个函数,用于唤醒等待在指定条件变量上的所有线程。在生产消费者模型下,队列还剩余一个被生产满,刚好这时唤醒了一批线程,其中一个抢到了锁,并将队列生产满,释放锁之后,这个锁又刚好被上次唤醒的线程抢到,又要去执行生产任务,但是队列是满的,所以就发生了伪唤醒的情况。是用于初始化条件变量的函数,条件变量是多线程编程中的一种同步机制,允许线程在等待某个条件满足时进入休眠状态,并在条件满足时被唤醒。这种行为可以防止等待条件的线程占用互斥锁,使得其他线程可以修改条件并唤醒等待线程。
2024-10-20 22:10:04
923
原创 线程以及linux中原生线程库
__thread定义一个单独属于自己的线程全局变量,这是一个编译选项,编译的时候会给每个线程的局部存储开辟一份。虽然一个线程栈是独立的一人一份的,但是其他的线程还是可以访问到,但是我们禁止这样操作。线程分离是一种设置,当线程被标记为分离状态后,线程结束时,其资源会被系统自动回收,而不再需要在其他线程中使用。假如我们想要给每一个线程开辟一个全局变量,我们需要用到线程的局部存储,线程局部存储在每个线程的独立栈结构中。线程和线程之间没有秘密,线程上的栈上的数据,也是可以被其他线程看到并且访问的。
2024-10-20 22:08:07
795
1
原创 C++多态
多态的两个条件:1.调用函数重写的虚函数2.基类的指针或者引用虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。析构函数为什么要加virtual当我们通过基类指针或引用指向派生类对象时,如果析构函数不是虚函数,那么删除对象时只会调用基类的析构函数,而不会调用派生类的析构函数。这可能导致派生类中分配的资源(如动态内存、文件句柄等)没有被正确释放,造成内存泄漏或其他资源泄漏。final 定义的
2024-10-07 22:29:26
795
原创 智能指针原理
在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这个情况下,p1的指针指向p2的空间,造成p1的空间泄露,p2指向的空间不仅有p2指向,现在还有p1指向,会导致free两次。在C++中new一个对象以后,需要手动的释放这块空间,这样会触发很多情况,导致不能被释放。原理:不增加引用计数,不参与资源的释放管理,可以访问资源。都应该被销毁,然而,由于它们互相引用,两个。对象,指向两个不同的。
2024-10-04 17:53:06
972
原创 c++11
参数包emplace系列接口可以传递多个参数,这些参数会被传递给对象的构造函数以在容器中直接构造对象,避免了构造临时对象然后移动或拷贝的开销。传递对象:如果你传递一个已经构造好的对象,emplace会尽量调用移动构造函数(如果对象是通过std::move传递的),否则调用拷贝构造函数。emplace系列接口的优势在于它可以灵活处理不同类型的参数传递方式,从而减少性能损耗,尤其是避免了不必要的拷贝或移动操作。
2024-10-04 17:48:10
648
原创 右值引用和移动语义
左值:可以获取地址,一般可以对它赋值,左值可以出现在赋值符号的左边,右值不能出现在赋值符号的左边。定义const修饰后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。右值:右值也是一个表示数据的表达式,如:字面常量,表达式返回值,函数返回值。可以出现在赋值符号的右边,但是不能出现在赋值符号的左边,右值不能取地址。左值引用:给左值取别名右值引用:给右值取别名左值引用的价值:1.做参数 2.做返回值 都可以减少拷贝。但是左值引用并不能解决传值返回的多次深拷贝问题。
2024-10-02 19:51:34
567
原创 TCP协议
tcp在传输层有发送缓冲区和接受缓冲区,我们在用户级缓冲区调用的write,read,recv,send等接口,都是将用户级缓冲区的数据拷贝给发送缓冲区。
2024-09-30 22:07:23
1089
原创 IP协议讲解
IP协议的本质:提供一种能力,将数据跨网络从A主机传输到B主机指定IP协议的版本, 对于IPv4来说, 就是4.IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节.3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于。
2024-09-30 22:04:45
1452
原创 HTTP协议
https://www.baidu.com/ --域名https://183.2.172.185/ 上下两个等价域名会被域名解析系统解析为ip地址http服务器默认绑定80端口,所以这里没有显示端口号,浏览器默认添加80端口。
2024-09-30 22:00:14
1205
原创 动态库的加载全过程
cpu首先会通过入口地址去查找相应的指令,这时的程序还没有加载到内存,所以在完成页表虚拟地址到物理地址的映射时发生缺页中断,然后程序就会正常的放入内存中,接着cpu按顺序执行每一条指令,(cpu每次执行指令前拿到该指令的虚拟地址,然后找到对应的物理地址,再找到相应的指令),当执行到相应的库函数时,假如是printf,这个函数的虚拟地址为0x1122,操作系统会触发缺页中断,将相应的库函数加载到进程地址空间的共享区当中。首先一个进程有自己的进程地址空间,进程地址空间中的正文代码段是程序加载的地方。
2024-09-30 21:50:30
327
原创 线程及条件变量
什么是线程:是进程内的一个执行分支,是一个新的执行流。线程的执行粒度要比进程要细。linux中线程如何理解linux实现方案,在Linux中,线程在进程”内部”执行,线程在进程的地址空间内运行任何执行流都要有资源cpu只有调度执行流的概念不关心是进程还是线程linux没有真正意义上的线程,而是用“进程”的数据结构模拟的线程pcb也就是一个执行流linux中的执行流,是一个轻量级进程。重新定义线程和进程线程是操作系统调度的基本单位进程是承担系统资源的基本实体。
2024-06-13 21:45:41
602
原创 进程等待与程序替换
我们创建多个进程以后,哪个进程先运行是不确定的,是由进程调度器决定。整个的调度过程我们不可知,父子兄弟进程谁先运行我们不确定。exit()为什么main函数总是返回0,这个东西给谁了,不能返回1,2,3等等其他的吗。main函数的返回值表示的是进程运行完成时是否是正确的结果,如果不是,可以用不同的数字,表示不同的出错原因。进程的退出场景:代码运行完毕,结果正确代码运行完毕,结果不正确代码异常终止0表示进程的退出码,进程的结果是正确的。谁会关心我们进程运行完的结果呢?
2024-05-16 08:59:01
748
原创 消息队列与信号量
是一个用于获取 System V 消息队列标识符的系统调用。让我为您解释一下它的用法和参数。: 指定的键值,用于关联消息队列。: 控制行为的标志。 可以用于两个目的:例如,以下代码片段演示了如何使用 创建一个新的消息队列:创建一个消息队列,如果该队列不存在,则会创建一个新的队列。msgget()函数的返回值为消息队列的标识符(一个非负整数),如果出错,返回值为 -1,同时 会被设置以指示错误原因 是一个用于在消息队列中传递消息的结构体,通常用于 和 系统调用。让我为您解释一下它的结构
2024-05-10 21:37:58
907
1
原创 进程,进程状态,进程切换,程序地址空间
一个已经加载到内存的程序,叫做进程。进程也可以叫做任务。正在运行的程序叫做进程一个操作系统不仅仅只运行一个进程,可以同时运行多个进程任何一个进程在加载到内存的时候,形成进程时,操作系统,要先创建描述进程(用足够多的属性值来描述)的结构体对象。pcb进程控制块(进程属性的集合)(struct 结构体类型 )进程的属性有哪些: 进程编号 进程状态 优先级描述该进程的PCB以及该进程的数据和代码,一起组成了进程。
2024-05-08 16:18:46
1014
原创 linux指令篇
ll与ls -l 等价d开头是目录,-开头的是普通文件。带a的现实出了. 带点的是隐藏文件。-a表示显示出所有的文件,包括隐藏文件。linux 任何一个目录下都有两个隐藏文件,一个点和两个点的文件。…表示当前路径的上级路径cd … 退回到上级路径cd … 相当于window 下面的回退符. 一个点表示当前路径。一个点作用是在形成可执行程序时,运行可执行程序,限定在当前文件下,帮助用户定位当前目录下的文件。pwd 显示用户所在的目录。中间路径上级的/叫做路径分割符。
2024-04-26 22:41:44
599
1
原创 C++基础知识点
一个函数有多个意思。函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(**参数个数或者类型或类型顺序)**不同,常用来处理实现功能类似数据类型不同的问题。函数重载对返回值没有要求。参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。// “f”: 对重载函数的调用不明确 cout << Add(1 , 2) << endl;return 0;
2023-05-27 14:00:24
120
1
原创 排序算法——快速排序
我们的排序这里采用升序解释:给定一个数组,我们定义left,right两个变量来当作数组下标,一个keyi变量当作用来比较数据的下标。我们需要先从右边找小,在右边找到比keyi位置小的数据后,我们再从左边找大,找到后两个位置的数据交换顺序,直到left= right时我们的循环结束,这样就可以把比keyi位置大的数据分到右边,把小于的数据分到左边。我们完成代码后发现虽然它可以完成排序,但是在一定情况下效率很低,我们需要对代码进行分析,并且改进。
2023-04-23 15:47:00
122
原创 堆的排序应用
向下调整需要满足的条件是这个堆是大堆或者小堆,n 是堆中的数据个数,leftchild = parent*2+1,rightchild = parent * 2+2;这里以大堆为例,如果以下的数据是大堆,选出两个孩子中大的数据,与parent数据交换,然后继续判断交换后的数据是否满足大堆的关系,如果不能满足,继续交换,循环的结束条件是孩子的数组下标位置已经大于数据的个数,这里数据的个数相当于数组最后一个数据的下一个位置的下标。
2023-04-08 15:06:28
131
原创 单项链表中的循环
我们这里依然采用快慢指针来解决这个问题,定义一个快指针,一次走两步,一个慢指针一次走一步,快指针会先进入循环,慢指针后进入,这样问题就能变为快指针追击慢指针问题,快指针一次追击一个节点,所以快指针一定可以追上慢指针。当两个指针相等时链表则必定有环。
2023-03-27 23:09:24
73
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人