- 博客(62)
- 收藏
- 关注
原创 MySql事务(AICD)和其并发场景
C - Create(创建): 向系统中添加新的数据记录或资源。示例(SQL),(REST API)U - Update(更新): 修改系统中已存在的数据记录或资源。示例(SQL),(REST API)R - Read(读取): 从系统中检索、查询数据记录或资源。示例(SQL),(REST API)D - Delete(删除): 从系统中移除数据记录或资源。示例(SQL),(REST API)特性第一类更新丢失(回滚覆盖)第二类更新丢失(提交覆盖)根本原因。
2025-12-02 15:29:52
930
原创 MySQL索引
至此,我们已经给我们的user构建完了主键索引。随便找一个id我们发现,现在查找的Page数一定减少了,也就意味着lO次数减少了,那么效率也就提高了。
2025-11-19 01:09:15
726
原创 五种IO模型
如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码.我们此处只是用第三种功能,获取/设置文件状态标记,就可以将一个文件描述符设置为非阻塞。任何IO过程中,都包含两个步骤.第一是等待,第二是拷贝,而且在实际的应用场景中,使用F_GETFL将当前的文件描述符的属性取出来(这是一个位图)在内核将数据准备好之前,系统调用会一直等待.,这对CPU来说是较大的浪费,一般只有特定场景下才使用.. 让IO更高效,最核心的办法就是让等待的时间尽量少.一个文件描述符,默认都是阻塞1O.
2025-11-07 16:26:19
284
原创 MySQL 表的 增 删 查 改
目录一. 创建 Create二. 读取 Retrieve2.2 WHERE 条件 2.3 结果排序2.4 筛选分页结果三. 更新 Update四. 删除 Delete目录 Create(创建), Retrieve(读取),Update(更新),Delete(删除) 1.2 单、多行数据 插入 1.3 替换二. 读取 Retrieve 全列查询 为查询结果指定别名 结果去重2.2 WHE
2025-11-02 22:40:50
545
原创 MySQL基础一
存储数据用文件就可以了,为什么还要弄个数据库?1.文件的安全性问题2.文件不利于数据查询和管理3.文件不利于存储海量数据4.文件在程序中控制不方便为了解决上述问题,专家们设计出更加利于管理数据的东西一一 数据库,它能更有效的管理数据。
2025-11-02 01:57:05
966
原创 传输层协议UDP
负责数据能够从发送端 传输到 接收端在TCP/IP协议中,用“源IP","源端口号",“目的IP",“目的端口号","协议号”这样一个五元组来标识一个通信(可以通过查看)
2025-11-01 15:40:34
363
原创 网络的基础概念
mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突;0-1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他们的端口号都是固定的.会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是5层协议。协议本质也是软件,在设计上为了更好的进行模块化,解耦合,也是被设计成为层状结构。因为:通信主机距离变远了,如果发送的消息没有统一的标准,就会造成反序列化错了,IP协议有两个版本,IPV4和IPv6,凡是提到IP协议,没有特殊说明的,
2025-11-01 13:54:30
931
原创 线程同步与互斥和生产消费模型
互斥:任何时刻,互斥保证 有且只有一个 执行流(线程)进入临界区,访问临界资源,通常对临界资源起保护作用 补充其他背景知识: 临界资源:多线程执行流 共享的资源 就叫做临界资源 临界区:访问临界资源的共享代码,就叫做临界区 原子性(后面讨论如何实现)不会被任何调度机制打断的操作,该操作只有两态,完成和没运行。 为什么需要互斥!!!因为,多个线程并发的操作共享变量,会带来一些问题,比如 网络多个用户抢票问题等。不细说了,懂得自然懂。
2025-09-23 14:36:13
598
原创 进程VS线程
CPU无法获取数据,CPU没有数据就无法进行计算,CPU罢工了用户进程也就出现了缺页中断,进程会从用户态切换到内核态,并将缺页中断交给内核的PageFaultHandler处理。3.3 页目录结构,两级页表的地址转换(级页表对连续内存要求高,于是引入了多级页表,但是多级页表也是一把双刃剑,在减少连续存储要求且减少存储空间的同时降低了查询效率。共用同一块虚拟地址空间,因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护。这样就解决了使用连续的物理内存造成的碎片问题。
2025-09-22 21:33:39
994
原创 linux信号产生和保存和捕捉
1. 键盘2. 系统调用 kill() 函数3. 系统命令 (在xshell 中输入 kill -9 pid)4. 硬件异常5. 软件条件OS来进行信号发送!本质就是修改比特位!
2025-06-30 18:28:03
703
1
原创 linux软硬连接
库是预先编写好的、用于实现特定功能的一组代码集合。这些库可以被多个程序共享使用,以减少重复代码的编写和提高代码的复用性。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是把.o文件编译到一起。库有两种:静态库.a[Linux]动态库.so[Linux]
2025-04-23 12:44:47
896
原创 进程控制(Linux)
1.2 fork函数返回值:1.子进程返回0。2.父进程返回的是子进程的pid。1. 分配新的内存块和内核数据结构给子进程。2. 将父进程部分数据结构内容拷贝至子进程。3. 添加子进程到系统进程列表当中。4. fork返回,开始调度器调度。可能造成“僵尸进程’的问题。代码运行完毕,结果不正确。3.1.1 wait方法。代码运行完毕,结果正确。2.调用exit()
2025-04-16 12:57:43
956
原创 进程概念(Linux)
笔记本,服务器,PC等大部分计算机都遵守冯诺依曼体系。这里的存储设备指的是内存,我们计算机存放游戏的磁盘叫外存!!CPU能且只能对内存进行读写!
2025-04-04 15:22:24
1126
原创 vim的一般操作(分屏操作) 和 Makefile 和 gdb
(也就是make),不过,我们可以显示要make执行。即命令—“make clean”,以此来清除所有的目标文件,以便重编译。
2025-03-22 13:33:27
1077
原创 哈希表以及封装unordered_map及其set
当key是string 等类型时,key不能取模,那么我们需要给其增加一个仿函数,这个仿函数支持把key转换成一个可以取模的整形,如果key可以转换为整形并且不容易冲突,那么这个仿函数就用默认参数即可,如果这个Key不能转换为整形,我们就需要自己实现一个仿函数传给这个参数。理想情况是找出一个好的哈希函数避免冲突,但是实际场景中,冲突是不可避免的,所以我们尽可能设计出优秀的哈希函数,减少冲突的次数,同时也要去设计出解决冲突的方案。断往后探测,直到寻找到下一个没有存储数据的位置为止。
2025-03-20 15:16:52
1207
原创 C++11(智能指针)
6. 把ListNode结构体中的_next和_prev改成weak_ptr,weak_ptr 绑定到 shared_ptr时不会增加它的引用计数,_next和_prev不参与资源释放管理逻辑,就成功打破了循环引用,解决了这里的问题.多个shared_ptr指向资源时就++引用计数,shared_ptr对象析构时就--引l用计数,引用计数减到o时代表当前析构的shared_ptr是最后一个管理资源的对象,则析构资源。左边节点中的_next管着呢,_next析构后,右边的节点就释放了。
2025-03-19 13:06:27
1047
原创 Linux 常见指令 和 文件访问权限的设置(笔记)
目录自己的笔记,所以有些简单的不写了(没那么多时间)一.Linux 常见指令1.ls2.pwd 3 cd4.rmdir 指令 && rm 指令5.man 指令6.cp 指令7.less 指令8.head 指令9.tail 指令10.alias 指令11.grep 指令12.zip/unzip 指令13.tar指令二.文件访问权限的相关设置方法1. chmod2. chown3. chgrp4.使用 sudo 分配权限功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。用
2025-02-26 00:34:57
1142
原创 红黑树简单讲解
红黑树是一棵二叉搜索树,他的每个结点增加一个存储位来表示结点的颜色,可以是红色或者黑色。通过对任何一条从根到叶子的路径上各个结点的颜色进行约束,,因而是接近平衡的。
2024-11-26 12:39:43
616
原创 AVL树解析
2.AVL树实现这里我们引入一个平衡因子(balance factor)的概念,每个结点都有一个平衡因子,任何结点的平衡因子等于右子树的高度减去左子树的高度,也就是说任何结点的平衡因子等于0/1/-1。1.AVL树是最先发明的自平衡二叉查找树,AVL是一颗空树,或者具备下列性质的二叉搜索树:它的。在parent的左子树,parent平衡因子--,parent的平衡因子初始化为 0.在parent的右子树,parent的平衡因子++,这里是二叉搜索树的,简单的代码总结。太长了,随便写点了,脑子坏了!
2024-11-12 20:46:11
983
原创 map和set和pair
一般情况下,我们都不需要传后两个模版参数。set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历是走的搜索树的中序,所以是有序的。map,set 和 vector/list等容器的使用,STL容器接口设计,高度相似。map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key支持小于比较,如果不支持或者需要的话可以自行实现仿函数传给第二个模版参数,map底层存储数据的内存是从空间配置器申请的。一般情况下,我们都不需要传后。
2024-11-05 20:39:42
960
原创 二叉搜索树
那么这样的效率显然是无法满足我们需求的,我们后续课程需要继续讲解二叉搜索树的变形,平衡二叉搜索树AVL树和红黑树,才能适用于我们在内存中存储和搜索数据。二叉搜索树中可以支持插入相等的值,也可以不支持插入相等的值,具体看使用场景定义,后续。另外需要说明的是,二分查找也可以实现 O(logN)级别的查找效率,但是二分查找有。,因为这两个结点中任意一个,放到N的位置,都满足二又搜索树的规则。4.无法直接删除N结点,因为N的两个孩子无处安放,只能用替换法删除。2.最多查找高度次,走到到空,还没找到,这个值不存在。
2024-10-25 12:50:44
790
1
原创 c++_ 多态
基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同看起来不符合重写的规则,实际上编译器对析构函数的名称做了特殊处理,编译后。但是要注意的这里继承下来的基类部分虚函数表指针和基类对象的虚函数表指针不是同⼀个,就像基类对象的成员和派生类对象中的基类对象成员也独立的。• 派生类中重写的基类的虚函数,派⽣类的虚函数表中对应的虚函数就会被覆盖成派⽣类重写的虚函数地址。),称派生类的虚函数重写了基类的虚函数。
2024-10-05 11:11:56
1043
原创 c++ 继承 和 组合
下⾯我们看到Person是基类,也称作父类。man是派生类,也称作子类。(因为翻译的原因,所以既叫基类/派生类,也叫父类/子类)继承的结构。
2024-09-24 22:50:15
1379
原创 c++_list
kw=liststd:: list列表列表是序列容器,允许对序列中任意位置的恒定时间插入和擦除操作,以及双向迭代。列表容器实现为双向链表;双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。排序在内部通过与指向其前面的元素的链接和指向其后元素的链接的每个元素的关联来保持。它们与非常相似:主要区别在于对象是单链表,因此它们只能向前迭代,以换取更小、更高效。与其他基本标准序列容器(arrayvector和deque。
2024-09-17 15:39:18
1232
原创 c++的 stack 和 queue(deque) 和 priority_queue 和 适配器
2.1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。2.2 queue的使用3.1priority_queue的介绍优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用默认情况下priority_queue是大堆。3.2 priority_queue的使用。
2024-09-12 20:51:32
1087
原创 vector 常见函数
如果 n 小于当前容器大小,则内容将减少到其前 n 个元素,删除超出此部分的元素(并销毁它们)。也大于当前容器容量,则会自动重新分配分配的存储空间(capacity)。大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,以达到。在所有其他情况下,函数调用不会导致重新分配,并且向量容量不受影响。的副本,否则,它们将进行值初始化.,则新元素将初始化为。从任意位置删除一个元素。
2024-09-03 14:50:44
684
原创 string的常用函数
擦除字符串的内容,该字符串将变为空字符串(长度为 0 个字符)。而cin>> 遇到空格(' ')就会停止输入。请求根据计划的大小更改调整空间的大小。在pos 位置 插入 字符 或 字符串。请求更改容量(capacity)可以参考返回值,判断是否相同。直到遇到 ‘\n’ 才会停止。rbegin 指向尾。计算分配的空间的大小。都是增加字符串的函数。
2024-08-24 16:33:47
2567
1
原创 c++ 内存管理
在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与。,实际在operator delete[]中调用operator delete来释放空间。,在operator new[] 中实际调用 operator new函数完成N 个对。是高效的I/O映射方式,用于装载一个共享的动态内存库。--非静态局部变量/函数参数/返回值等等,栈是向下增长的。用于程序运行时动态内存分配,堆是可以上增长的。,完成对象中资源的清理工作,,完成N个对象中资源的清理,释放的对象空间上执行。
2024-07-29 00:55:57
932
原创 C++ 基础(类和对象下)
4.2内部类默认是外部类的友元类内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地方都用不了。
2024-07-24 15:20:35
370
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅