- 博客(78)
- 收藏
- 关注
原创 【Linux系统】线程控制
main thread,你如何保证?主线程join等待来保证,不join呢?会造成类似僵尸进程的问题,当然前提是父进程不会结束。当join时主线程就会阻塞等待新线程结束。
2024-07-23 15:07:04
853
1
原创 【Linux系统】线程概念
在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。
2024-07-21 17:28:19
1092
2
原创 【背包问题】01背包
最后一块石头的重量iipublic://我们模拟这个石头粉碎过程,//发现其实只需要把数组中的每个数添加正号或负号得到的最终结果尽可能小即可//与目标和类似,设a为正号,b为负号 |a - b|尽可能小,a + b = sum//a - b越接近绝对值才可能越小,所以a越接近sum/2结果越小//转化:从数组中选择一些数,让这些数尽可能的接近sum / 2->01背包问题i <= n;i++)j--)
2024-07-20 19:16:04
210
原创 【Linux系统】信号的保存和处理
OS不是不相信任何用户吗?用户无法直接跳转到3,4GB地址空间范围,那如何做到?必须在特定条件下,才能跳转过去,需要硬件(CPU)配合!!!其实在CPU内部有一个状态寄存器cs(code semgment)存放代码区的范围,在其中有两个比特位可以用来状态表示,0表示当前CPU处于内核态,3表示当前CPU处于用户态,如何跳转?不就是在我们的系统调用方法内把寄存器的两个比特位,由3置0不就完成了由用户态跳转到内核态!!!
2024-07-17 17:06:27
565
1
原创 【Linux系统】信号的产生
关于信号举一些生活中的例子 --- 比如交通指示灯...- 信号在生活中,随时可以产生 --- 信号的产生和我们是异步的!(异步的意思就是信号的产生和我没有直接关系)- 你能认识这个信号 --- 我们知道这是信号,我们才知道如何处理!- 我们知道信号产生了,信号该怎么处理!--- 我们应该知道如何处理!- 我们可能在做着更重要的事情,把到来的信号暂不处理 --- 1.我得记得这个事。2.什么时候处理?合适的时候!!!那么转回我们的OS中,上面的“我”不就是进程吗!!!
2024-07-16 18:05:00
552
原创 Linux系统设备安装Joplin笔记结合内网穿透实现远程访问本地笔记服务端
本文主要介绍如何在自己的服务器上利用docker搭建 Joplin Server,并对同步进行配置,再结合cpolar内网穿透工具实现公网远程访问本地Joplin Sever。Joplin 是一个开源的笔记工具,拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能,只有实现了多端同步,我们才能在工作电脑和手机之间无缝切换笔记体验。
2024-07-15 18:35:49
635
4
原创 【Linux系统】信号量(初次理解)
> 和共享内存,消息队列一样,也必须先让,不同的进程看到同一个“计数器”!这意味着信号量也是一个公共资源,保护临界资源的安全,前提是不是,你自己得是安全的!那里面要么没人,要么就一个人,1 or 0 ,二元信号量,当里面有人时,其他人就不能进入,这其实是互斥!回过头来再看,电影院的vip房间,不就是对共享资源的整体使用,其实不就是资源只有一个吗?信号量也是共享资源,所以申请信号量流必须经过,申请信号量,访问共享内存,释放信号量。-- 安全的操作,我们叫P操作 ++ 安全的操作,我们叫V操作。
2024-07-11 17:52:04
289
原创 【Linux系统】命名管道 && 共享内存
匿名管道是通过父子进程继承关系来看到同一份资源。命名管道是通过文件路径来看到同一份资源。缺点:共享内存不提供对共享内存的任何保护机制 --- 数据不一致问题优点:我们在访问共享内存的时候,没有使用任何系统调用,共享内存是所有进程间通信IPC,速度最快的,因为,共享内存大大减少了数据的拷贝次数!!!
2024-07-11 13:51:46
925
原创 【Linux系统】匿名管道 && 模拟实现进程池
进程也是需要某种协同的,所以如何协同的前提条件,需要通信,数据是有类别的,别人传递的信息对你来说,可能是通知就绪的、单纯要传递给我的数据、控制相关的信息...事实:进程具有独立性,进程=内核数据结构+代码和数据创建子进程时各自创建自己的内核数据结构,代码和数据遵守写时拷贝,所以进程是一定独立的!!!那么该如何通信?
2024-07-10 13:54:29
681
原创 【Linux系统】动态库和静态库 && 动态库加载
我们有没有使用过库呢?-- 用过c、c++的标准库c的各种函数,c++的各种STL容器,我们使用他们内部必须得有具体实现。Linux: .so(动态库) .a(静态库) Windows: .dll(动态库) .lib(静态库)库是拿来给别人使用的,所以库里面必然没有main函数,。
2024-07-07 12:25:02
986
原创 【Linux系统】文件系统 && 软硬链接
打开的文件是存储在内核、内存中,而没有打开的文件则存放在磁盘中,与文件系统相关!!!我们打开文件时有文本写入和二进制写入,计算机是只认识二进制的,所以文本写入这些都是语言层帮我们做的!!!
2024-07-04 13:51:02
824
原创 【Linux系统】重定向 && 缓冲区
文件 = 内容 + 属性而stat系列系统调用接口就是对文件:对内容的操作 + 对属性的操作。文件描述符的分配规则:查自己的文件描述表,分配最小的没有被使用的fd。我们学过的c语言中的printf是打印函数,那其实printf默认就是打印在显示器上,也就是stdout,我们如果使用sprintf传入stdout是两个函数的功能就完全相同的!!!
2024-07-02 13:26:56
857
原创 【Linux系统】文件描述符fd
我们之前对文件的理解是在语言层上,而语言层去理解文件是不可能的!!!下面是一份c语言文件操作代码!!!我们要进行文件操作,前提是我们的程序跑起来了。文件打开和关闭是,是CPU在执行我们的代码。w含义:1.如果不存在,就在当前路径下,新建指定的文件。2.默认打开文件的时候。就先把目标文件清空!--》所以可以用来新建文件,清空文件!我们又使用输出重定向符号操作文件,我们发现文件被清空了,输出重定向一定是文件操作!!!
2024-07-01 15:11:01
586
原创 【Linux系统】进程替换 && 自主实现shell(简易版)
我们用exec*函数执行新的程序,exec*系列的函数,执行完毕后,后续的代码不见了,因为被替换了。execl的返回值可以不关心了,只要替换成功,就不会向后继续运行,只要继续运行了,一定是替换失败了!
2024-06-30 20:09:58
878
原创 【C++进阶】红黑树
enum ColorRED,BLACK//该节点的左孩子//该节点的右孩子//该节点的双亲Color _col;//该节点的key和valueRBTreeNode(const pair<K, V>& kv) //该节点初始化, _kv(kv){}public:private://可以用来记录节点个数思考:默认节点为什么给红色的,黑色不行吗?我们要明白一个道理,也就是严母慈父,我们如果需要寻求父母帮助(在我们犯错误的情况下),我们肯定是会去找慈父啊,找严母不是找打吗。
2024-05-29 23:45:44
971
17
原创 【C++进阶】AVL树
/该节点的左孩子//该节点的右孩子//该节点的双亲//该节点的key和valueint _bf;//balance factor 平衡因子AVLTreeNode(const pair<K, V>& kv) //该节点初始化, _kv(kv), _bf(0){}
2024-05-22 17:57:06
1145
2
原创 【递归、回溯和剪枝】综合训练<二>
组合总和解法一:解法二: 2.字母大小写全排列字母大小写全排列 优美的排列 N皇后 有效的数独 解数独 单词搜索 黄金矿工 不同路径iii
2024-05-14 19:13:28
278
原创 【递归、回溯和剪枝】全排列 && 子集
什么是回溯算法回溯算法是⼀种经典的递归算法,通常⽤于解决组合问题、排列问题和搜索问题等。回溯算法的基本思想:从⼀个初始状态开始,按照⼀定的规则向前搜索,当搜索到某个状态⽆法前进时,回退到前⼀个状态,再按照其他的规则搜索。回溯算法在搜索过程中维护⼀个状态树,通过遍历状态树来实现对所有可能解的搜索。回溯算法的核⼼思想:“试错”,即在搜索过程中不断地做出选择,如果选择正确,则继续向前搜索;否则,回退到上⼀个状态,重新做出选择。回溯算法通常⽤于解决具有多个解,且每个解都需要搜索才能找到的问题。
2024-05-12 21:26:23
234
原创 【递归、回溯和剪枝】二叉树中的深搜
⼆叉树中的深搜,是我们树或者图这样的数据结构中常⽤的⼀种遍历算法。这个算法会尽可能深的搜索树或者图的分⽀,直到⼀条路径上的所有节点都被遍历完毕,然后再回溯到上⼀层,继续找⼀条路遍历。在⼆叉树中,常⻅的深度优先遍历为:前序遍历、中序遍历以及后序遍历。因为树的定义本⾝就是递归定义,因此采⽤递归的⽅法去实现树的三种遍历不仅容易理解⽽且代码很简洁。并且前中后序三种遍历的唯⼀区别就是访问根节点的时机不同,在做题的时候,选择⼀个适当的遍历顺序,对于算法的理解是⾮常有帮助的。
2024-05-09 19:25:02
393
原创 【C++进阶】map && set 使用特性
set文档介绍set是按照一定次序存储元素的容器。在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。set在底层是用二叉搜索树(红黑树)实现的。
2024-05-08 22:12:48
1152
6
原创 【动态规划】斐波那契数列模型
思路:简单的线性动态规划1.确定状态表示经验 + 题目要求本题为,以i位置为结尾,这个位置的泰波那契数是多少2.写出状态转移方程3.细节问题a.初始化b.填表顺序c.返回值。
2024-05-05 22:27:04
344
原创 【基础算法】模拟
如果差值大于等于duration,则说明中毒要持续duration妙。从a-z依次尝试替换?是否满足题意,第一个满足的就可break掉。如果差值小于duration,则说明中毒要持续两者的差值。计算两个相邻时间的差值。
2024-05-03 15:49:12
336
1
原创 【C++进阶】二叉搜索树特性 && 二叉搜索树模拟实现
我们之前在c语言部分数据结构初阶就已经讲过二叉树了,为什么那时我们不讲二叉搜索树呢?这是有原因的,这里讲二叉树进阶是因为:1.map与set特性需要先铺垫二叉搜索树的概念,理解了二叉搜索树可以更好的理解map与set2.当时用c语言讲二叉树时没有将进阶,是因为这部分较难,长时间下容易忘记。3.一些OJ题更适合用c++解决,当时用c语言会比较麻烦,需要动态开辟数组等。因此有了进阶二叉树部分,是对我们的二叉树进行的收尾总结。
2024-05-02 16:26:56
927
5
原创 【C++进阶】多态详解
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
2024-05-01 17:14:50
1020
17
原创 【基础算法】二分查找
在排序数组中查找元素的第一个和最后一个位置思路:二分左端点和二分右端点模版题public:// 处理边界情况// 记录开始位置// 二分左端点// 判断结果是否成立= target)else// 更新right位置// 二分右端点。
2024-04-29 16:08:25
433
原创 【C++进阶】继承详解
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了。
2024-04-25 19:49:09
604
4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人