- 博客(43)
- 收藏
- 关注
原创 Mysql系列--4、表的约束
注:建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值。mysql中null和' '是两个不同的概念,前者表示空属性,后者表示空内容。注:只有设置了default的列,才可以在插入值的时候,对列进行省略。给字段默认的值,数据在插入的时候不给该字段赋值,就使用默认值。为保证除主键外的其他字段的唯一性,主键不能为空,唯一键可以。
2025-07-22 00:43:54
989
原创 Mysql系列--3、数据类型
在Mysql中数据类型本身就相当于一种约束,拦截不合法的数据,保证库中的数据均按用户要求存储。set用数字做下标对应选项时从1开始,但为位图上一个比特位对应,如3其实对应选项1和选项2。若小数位数超过显示长度,mysql会四舍五入,但若四舍五入时超过限制时会拦截数据存储。MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。char是要多少直接给多少,varchar根据填入的数据给相应的空间。注:enum用数字做下标对应选项时从1开始,且为整数对应。下,与其如此,还不如设计时,将。
2025-07-19 11:32:19
269
原创 Mysql系列--2.表的相关操作
上文我们谈及了Mysql的库的相关操作,如今我们已经存在了库我们就可以建立表来格式化存储数据了。建表的操作与建库基本一致。
2025-07-19 02:15:00
374
原创 Linux线程--2.理解分页式存储管理
由于磁盘,物理内存均按4KB设计那么我们就可以将物理内存按0到全F平坦编址,当磁盘文件加载到物理内存中,在page中设置一个类似数组用于保留代码和数据所在的页框起始地址(看作下标),方便寻址,以及使物理内存抽象的看成连续的。因为每⼀个程序的代码、数据⻓度都是不⼀样的,按照这样的映射⽅式,物理内存将会被分割成各种离散的、⼤⼩不同的块。虚拟内存看上去被虚线“分割”成⼀个个单元,其实并不是真的分割,虚拟内存仍然是连续的这个虚线的单元仅仅表⽰它与⻚表中每⼀个表项的映射关系,并最终映射到相同⼤⼩的⼀个物理内存⻚上。
2025-07-18 15:04:16
1243
原创 Linux线程--1.初始线程
在⼀个程序⾥的⼀个执⾏路线就叫做线程(thread)。更准确的定义是:线程是“⼀个进程内部的控制序列”;(1)进程是承担分配系统资源的基本实体(2)线程是OS调度的基本单位,是一种执行流,是进程内部的一个执行分支。
2025-07-18 13:58:27
1004
原创 Mysql系列--1、库的相关操作
本文介绍了MySQL数据库的基本终端操作,包括创建数据库(CREATE DATABASE)、字符集和校验规则设置(utf8_general_ci不区分大小写,utf8_bin区分大小写),以及查看系统默认编码(SHOW VARIABLES)。详细说明了数据库的增删改查操作:显示数据库(SHOW DATABASES)、修改编码(ALTER DATABASE)、删除数据库(DROP DATABASE),并演示了数据库备份(mysqldump)与恢复(source)方法。最后补充了查看当前数据库(SELECT D
2025-07-16 17:19:21
762
原创 Mysql系列--0、数据库基础
这篇文章概要介绍了MySQL数据库的相关知识。主要内容包括:数据库的概念及其优势,MySQL作为客户端-服务器网络服务的本质;MySQL的架构特点及其跨平台性;SQL语言的分类(DDL、DML/DQL、DCL);以及存储引擎的概念、查看方法和对比。文章还介绍了MySQL的登录方式,并阐述了数据库与MySQL服务的关系。整体内容涵盖了MySQL的基础架构、操作语言和核心技术特点,为读者提供了对MySQL数据库系统的入门级理解。
2025-07-16 17:19:11
547
原创 Linux进程信号--3、信号处理
在信号序章中我们收到信号时不会立即处理,而是在合适的时间处理,该合适的时间就是进程从内核态返回到用户态的时候。
2025-07-15 15:14:24
699
原创 Linux进程信号--2、信号保存
在序章中我们提到了信号在到来时由于某些原因无法及时取到,但我们要知道信号来过,要保存信号后续处理,那么我们如何保存信号?
2025-07-15 15:14:14
796
原创 Linux进程信号--1、信号产生
例如当前 进程执⾏了除以0的指令, CPU的运算单元会产⽣异常, 内核将这个异常解释为SIGFPE信号发送给进 程。再⽐如当前进程访问了⾮法内存地址, MMU会产⽣异常,内核将这个异常解释为SIGSEGV信号发送 给进程。键盘组合键(快捷键)按下被OS识别,在PCB中修改位图结构(前32个信号)(后面的信号为实时信号用不到)由0->1->0,根据比特位上的位置从对应的执行方法结构体函数指针数组上获得信号对应方法并执行。硬件异常被硬件以某种⽅式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。
2025-07-15 15:13:57
607
原创 Linux进程信号--0、序章
std::cout << "我是: " << getpid() << ", 我获得了⼀个信号: " << signum << std::endl;exit(0);// {// }
2025-07-15 15:13:04
993
原创 mmap映射文件
在上文进程间通信一文最后我们提到了c结构上的多态是结构体套结构体,其中对于共享内存来说其结构体struct shm中含有一个struct *file的成员,表明共享内存本质上是个文件,那么它就含有inode和block指向它的缓冲区进行IPC,但它并没有文件fd进行文件操作,这就要提到文件映射了。
2025-07-14 00:00:00
526
原创 进程间通信--2.System V相关通信方式
System V的背景:System V是UNIX操作系统的一个重要分支(由贝尔实验室开发和发布),它是商业化的UNIX版本之一,与BSD等其他UNIX分支并列System V引入了许多现代操作系统的特性,包括:System V IPC(进程间通信机制):包括共享内存、消息队列和信号量,这些IPC机制是由操作系统内核提供的,但他们的接口和设计是由System V标准化的。因此,当我们提到"System V IPC"时,通常指的是这些机制的标准实现;
2025-07-13 12:29:35
844
原创 进程间通信--1.管道与模拟进程池实现
通过对程序命名,编译器,编译方式的包装,实现面向对象,减少出现自定义的程序命名。但我们的管道是进程间通信所以我们需要实现类似一个纯内存级的文件及内核缓冲区!(1)父进程要先打开文件形成管道(以读写方式,子进程在拷贝时也会拷到读写)父进程预先准备好多个管道和子进程,进行任务的分配实现通信,叫做进程池。(2)父进程创建子进程,子进程拷贝fd表,然后看到同一资源。(1)通信的前提:OS为不同进程提供同一份资源。(2)主要用来进行具有血缘关系的进程的通信。(2)对于本地通信OS提供的通信标准分类。
2025-07-13 11:05:11
741
原创 动静态库加载
a.将静态库建立好后拷贝至系统目录中(eg:user/bin/lib/),然后使用gcc/g++编译,但我们是第三方库,则在编译时要使用新的命令(gcc xxx -l 库名)将磁盘上的库加载到内存中经过页表映射在需要该库的文件的PCB中的struct files_struct中的堆栈间的共享区。a.软连接--独立的文件,有自己的inode,保存的是目标文件的路径,相当于创建了一个文件的快捷方式。ar -rc libxxx.a{(.版本)(.o文件)(...)}(xxx库名)
2025-07-13 10:57:30
303
原创 解析磁盘文件系统
(3)我们对于文件的增删查改就可以在map上进行0/1交换,而且对于OS来说,在内存上有专门的结构体struct_sb/gdt将一个分区中的super_block(sb)与GDT读取,进而将每个组的文件信息像链表一样链接起来,这样就变成了链表的增删查改。(1)首先我们会去其inodebitmap上找一个位用来记录刚文件已存在,然后在GDT上查找每个组的起始inode,然后将自己的位数和初始inode相加后得到的值在去Inode Table上的对应位置储存文件属性。inode结构体主要的信息就是上图。
2025-07-13 10:55:39
500
原创 详解程序运行(3)进程执行过程
一般而言父进程创建子进程,父进程就要等待子进程结束主要为了回收子进程的僵尸状态,那么等待的方法是什么?今天我们就从进程创建,终止,等待,替换四个方面详解进程的执行过程!参数:输出型参数,获取子进程退出状态,不想获得则可设置成NULL。(2)exit在代码任何地方表示进程结束,且会刷出缓冲区的内容。(3)_exit同exit,但它不会刷出缓冲区内容。其返回值:成功返回被等待进程pid,失败返回-1。●将父进程部分数据结构内容拷贝至子进程。那么我们如何获取输出型的状态参数?● fork返回,开始调度器调度。
2025-07-13 10:54:30
310
原创 文件系统格式ELF
一个可执行程序包括:text代码段data数据初始化bss未初始化的全局变量.......可执行程序(.exe)虽为二进制文件但其也有格式ELF,并不是杂乱无章的,这样便于编译器进行文件的读写链接操作,节省时间ELF(Executable and Linkable Format)文件是一种目标文件格式,主要用于Linux平台。ELF文件格式包括可执行文件、可重定位文件(.o)、共享目标文件(.so)和核心转储文件等。xxx.o xxx.so xxx.exe等文件均存在且遵循ELF格式可执行程序进行链接本质:
2025-07-13 10:49:44
384
原创 Git系列--4.Git分支设计规范
本文介绍了软件开发环境和GitFlow分支模型。开发环境分为开发、测试、预发布和生产环境,对应不同开发阶段。GitFlow模型包含master(主分支)、release(预发布分支)、develop(开发分支)、feature(功能分支)和hotfix(热修复分支),各分支有特定用途和命名规范。master分支用于正式发布,develop分支保持最新代码,feature分支开发新功能,release分支用于测试,hotfix分支处理线上问题。该模型规范了代码管理流程,确保开发过程有序可控。
2025-07-12 22:57:48
1101
原创 Git系列--3.分支管理
目录一、理解分支 1.1图示 1.2 打印仓库下有哪些分支 1.3创建分支 1.4HEAD与切换分支 1.5合并分支 1.6流程图理解二、删除分支三、合并分支冲突 3.1.问题导入 3.2.解决 3.3合并图示四、合并模式 4.1合并编辑 4.2变基五、bug分支 5.1背景建立 5.2解决步骤
2025-07-09 22:31:45
843
原创 Git系列--2.文件的增删改
Git三板斧--add,commit,push,本文不谈论push(提交到远程仓库)将文件增删改后重新add与commit就可以进行文件修改。
2025-07-09 14:44:19
486
原创 Git系列--1.初始Git
其中我们将文件从工作区加载进版本库中,objects会储存所有修改版本文件,为管理这些文件我们将objects看作数组,每个文件都有自己的下标,stage,master存储的是文件索引,HEAD指向master。上述描述中,我们把文件和.git所处的目录下成为工作区(.git不属于),.git称作版本库,.git中又包括暂存区/索引(stage),objects等。怎么管理不断迭代的版本?文件只有被放入git仓库中才能被管理,但我们无法手动将文件放入.git中,一旦手动操作失误我们的库可能会直接崩溃。
2025-07-09 14:44:06
337
原创 深入理解函数指针:解锁C语言的高级特性
函数指针是C语言中一个非常强大的特性,它能够为程序设计带来更多的可能性和动态性。通过函数指针,我们可以实现回调函数、函数表等高级功能,让代码变得更加优雅和高效。然而,在使用函数指针时,我们需要注意类型匹配、空指针检查等问题,以避免程序崩溃或出现不可预测的行为。
2025-04-04 10:47:57
777
原创 # 深入解析 C 语言中的 memcpy 与 memmove:内存操作的双雄
memcpy` 和 `memmove` 是 C 语言中用于内存操作的两个重要函数。`memcpy` 假设源内存和目标内存之间没有重叠,因此在没有重叠的情况下效率更高;而 `memmove` 能够正确处理内存重叠的情况,虽然可能会稍微慢一些,但提供了更高的安全性。在实际编程中,如果不确定内存是否重叠,建议优先使用 `memmove`,以确保程序的健壮性。
2025-04-04 10:44:12
857
原创 深入解析 `std::unique_lock` 的三个标签及其应用场景
std::unique_lock` 的三个标签(`std::defer_lock`、`std::try_to_lock` 和 `std::adopt_lock`)为多线程编程提供了灵活的锁定策略。通过合理使用这些标签,你可以更好地控制互斥量的锁定和解锁行为,从而避免死锁、提高系统响应性,并简化代码逻辑。
2025-03-29 13:02:43
977
原创 进一步了解程序运行(2)
env查询默认:储备:我们在Linux终端上写的执行命令如何实现的呢?为什么我们写的代码运行要加./xxx进行运行呢?这便与命令行参数有关:那么这些继承的参数,命令执行的路径怎么确定?a. (.PATH):指定命令的搜索路径告诉shell该去哪一路径下查指令默认:/usr/local/bin:(多个路径间用:连接)进程启动时,子进程会从父进程那将.PATH继承下来查看默认进程用echo$b.(.HOME)记录当前用户家目录路径c.(.SHELL)记录shell的版本d.(.PWD)保存当前进程所在的工作路径
2024-10-06 15:01:46
288
原创 程序运行(1)----OS与进程
**/在Linux中进程状态具体有:R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列 里。S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(进程可被kill -编号杀掉)D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的 进程通常会等待IO的结束。(进程不可被强制杀掉)T停止状态(stopped)
2024-10-06 15:01:33
1183
原创 Linux调试器--gdb/cgdb
编辑代码并运行,但如果一个代码有问题,我们如何像在编译器上调试一样在Linux上调试代码,就可以用到gdb/cgdb.(5)display + 变量名(窗口显示变量值)(本质上也是一个断点,类型为可视断点)(11)set var +变量 = xxx(改变变量的值为xxx)(2)b + 行号/函数名(打断点,并自动形成断点编号)(4)s(单步进行,进入函数内部,相当于F11)(12)b +行号 +if...(添加条件断点)(3)n(逐步执行代码,逐过程相当于F10)(7)c(从一个断点调至下一个断点)
2024-09-12 21:46:25
610
1
原创 数据存储第二部分(整数与浮点数的储存)
例如:0.5 的⼆进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则1.0*2^(-1),其阶码为-1+127(中间值)=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位。这时,浮点数就采⽤下⾯的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第⼀位的1。最高位存s的值,接着的8个bit位存E(E的二进制形式),剩下32个bit位存M的值(M的二进制)两部分,符号位都是用0表示“正”,用1表示“负”,而数值位最。
2023-12-03 11:12:36
1347
1
原创 数据内存储存函数与【数据存储(一部分)】
是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,存储模式将地址的高低和数据位权有效地结合起来。,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,存储模式类似把数据当作字符串顺序处理。因不知道数据类型所以用void*,可以接收任何类型,num限制拷贝长度,返回类型为void*因不知道数据类型所以用void*,可以接收任何类型,num限制拷贝长度,返回类型为void*返回值为大于0的数,等于0,小于0的数,若为字符串比较,则比较每个字符。
2023-11-25 21:58:08
1310
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人