- 博客(105)
- 收藏
- 关注
原创 掌握线程安全之道:线程互斥与同步技术解析
临界资源:多线程执行流共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用原子性(后面讨论如何实现):不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成。临界资源和临界区进程之间如果要进行通信我们需要先创建第三方资源,让不同的进程看到同一份资源,由于这份第三方资源可以由操作系统中的不同模块提供,于是进程间通信的方式有很多种。
2024-12-28 19:06:11
976
16
原创 基于进程信号量的多线程同步机制研究与实现
信号量机制本质是对于资源的预订操作,线程或者进程预订了之后,确保未来有一段时间,资源是属于我的。对于预订资源,会有一个最小单位,资源都是以这个最小单位为整体被使用的。这里,由于是信号量的前导,我们简单的把信号量理解为一个计数器(是由OS维护的)。我们这里对于这个信号量的计数器的设计,提出几个问题?1.计数器能不能简单的设计成一个整型变量?
2024-12-28 19:05:45
604
3
原创 探秘磁盘内部的储存方式,揭露文件在软硬件上的不同模式
本文详细介绍了磁盘存储文件内容的基本模式,从硬件的物理存储模式,再到软件层的逻辑存储模式,以及两者之间如何进行转化。
2024-11-01 20:55:18
721
原创 Linux下的文件IO操作
本文主要讲解了,在Linux环境下一些C语言提供的文件接口,以及C语言文件接口底层封装的由操作系统Linux提供的系统调用接口
2024-10-28 20:15:02
1225
原创 描述进程和进程状态
一开始介绍进程的描述PCB,介绍了在Linux下进程的基本操作,fork函数的介绍以及操作系统下的进程状态和Linux下的进程状态
2024-10-09 17:14:16
1084
原创 Linux调试器---gdb的使用
2.要改变的变量必须是被定义了 (就是在修改这个变量的时候,程序必须运行过这个变量定义的那条指令了)。debug模式下形成的可执行程序会给我们添加了调试信息,但是用户并不需要,他们需要更快的下载速度。relese模式下形成的可执行程序,会去掉调试信息,这样会让release模式下的可执行文件更小。gcc默认编译出来的可执行程序是release模式的,这个模式下的可执行程序是无法调试的,在使用gcc的时候,添加 -g 选项更改编译出来的可执行文件为denug模式。gcc默认链接时,链接的是动态库。
2024-10-02 15:59:41
893
原创 Linux项目自动化构建工具-make/Makefile
因为会对时间进行一个对比,我们之间在VS上编译代码时,会发现我们解决了问题,但编译执行文件时依旧还是按照之前的程序执行,这就是因为VS识别文件不及时或者是没识别出来,还以为你的文件没有修改,所以他也没有对你的程序重新编译。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。不可能的,程序编译和代码修改都需要时间,逻辑上他们两个的时间根本就不会是一样的。
2024-09-23 16:27:21
880
原创 Linux编译器-gcc/g++使用
1. 预处理(进行宏替换)2. 编译(生成汇编3. 汇编(生成机器可识别代码)4. 连接(生成可执行文件或库文件格式gcc [选项要编译的文件选项] [目标文件先写好自己的文件,利用gcc编译好后会在当前目录下形成一个a.out文件,这个就是编译好的可执行程序。(上面程序有点小问题,格式不太好看)gcc在编译的时候,后面加上-o,就可以指定生成文件的名字。C语言可以用gcc和g++编译。c++只能用g++编译。
2024-09-20 10:17:16
1002
1
原创 验证二叉搜索树
这个就是Leetcode的官方写的题解,是不引入全局变量的写法,对于这个是否满足二叉树的情况,他传入了两个值,虽然两个值lower和upper都是当前根节点的值,但是,对于左右子树判断是否为二叉搜索树的意义是不同的。就是因为这道题目比较简单,我们的代码思路不在按照之前的三步走,我们反而去跟深层次的去理解一下全局变量,回溯,剪枝,在递归当中的意义。剪枝就是当没有判断到底时,但是,错误情况已经发生,结果已经明了,没有必要继续判断下去了,可以直接结束递归,出结果了,提升算法时间效率。
2024-09-17 15:53:43
335
原创 二叉树剪枝
目录1.题目解析2.算法原理讲解2.1重复子问题——>(函数头)2.2只关心其中一个子问题是如何解决的——>(函数体)2.3细节,递归出口——>(递归结束条件)3编写代码
2024-09-17 15:53:16
248
原创 Linux环境基础开发工具---yum
yum会有一个基础软件源,里面为了维持环境的稳定性,一定不会随随便便更新的,但是为了满足更新需要,此时就会有一个拓展软件源用于更新,当一个软件经过验证了之后才会被更新进入基础软件源。既然这些操作系统的侧重点不同,那么吸引到的人也不同,这些用户在社区讨论的问题也就不同,同样的,这些操作系统的配套设施,也肯定是围绕着自己的侧重点来建立的。但是,如果在使用虚拟机的时候,可能你的虚拟机还使用是国外的网址,这样就会导致你下载东西比较慢,这时候更新一下yum源就行了。CentOS-Base.repo:基础软件源。
2024-09-14 16:32:06
1028
1
原创 stack和queue
1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作push_back:尾部插入元素操。
2024-03-05 22:39:04
1258
原创 List类
1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
2024-03-05 21:55:37
930
原创 vector类
1. vector是表示可变大小数组的序列容器。2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自 动处理。3.本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小 为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。
2024-02-22 22:10:52
983
原创 二叉树与堆
目录1.树概念及结构1.1树的概念1.2 树的相关概念1.3 树的表示1.4 树在实际中的运用(表示文件系统的目录树结构)2.二叉树概念及结构2.1概念2.2现实中的二叉树:2.3 特殊的二叉树:2.4 二叉树的性质2.5 二叉树的存储结构3.二叉树的顺序结构及实现3.1 二叉树的顺序结构3.2 堆的概念及结构3.3 堆的实现3.2.1 堆向下调整算法3.2.2堆的创建3.2.3 建堆时间复杂度3.2.4 堆的插入3.2.5 堆的删除3.2.6 堆的代码实现3.4 堆的应用3.4.1 堆排序3.4.2 TO
2024-02-22 20:24:08
1180
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人