- 博客(112)
- 收藏
- 关注
原创 MySQL事务详解
在我们对数据库表进行操作的时候,都是为了完成某一件特定的事情,比如:我要给别人转账100,在SQL语句的编写上就需要 1.将我的账户余额减少100。2.将对方的账户余额增加100。MySQL就会将这两条完整的SQL语句封装成一个事务。一组完成特定事情的SQL语句集合。但是,MySQL是一个网络服务应用程序,是基于CS架构的。也就是说,一个服务器需要满足多个客户端的请求,也就意味着MySQL服务器上可能会有多个事务,如果这多个事务都需要对同一张表进行操作呢?那不就会造成数据错乱的问题吗。
2025-03-13 10:00:00
779
原创 MySQL索引详解
所谓的page在物理上其实就是一个个的大小为16kb的数据块,但又不仅仅是数据块那么简单。page是MySQL和操作系统进行数据IO的基本单位,在MySQL中,可能存在很多的page,MySQL为了管理好这些page,就要为其创建数据结构,如下所示:所以,page不仅仅是一个物理块,其内部还被写入了一些管理信息。
2025-03-12 18:19:21
965
原创 MySQL表的内外连接
一:对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要。在对两张表进行联合查询的时候,如果左侧的表完全显示,我们就叫做左外连接。在联合查询的时候,如果右侧的表完全显示,我们就叫做右外连接。二:列出部门名称和这些部门的员工信息,同时列出没有员工的部门。在MySQL中,表的连接分为内连和外连。两张表形成的笛卡尔积其实就是内连接。示例:显示SMITH的名字和部门名称。外连接分为左外连接和右外连接。
2025-03-09 11:29:37
376
原创 MySQL复合查询
示例一:查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自。示例三:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门。示例一:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人。示例二:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号。示例一:显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资。示例二:查找每个部门工资最高的人的姓名、工资、部门、最高工资。示例二:显示部门号为10的部门名,员工名和工资。
2025-03-08 14:15:06
594
原创 MySQL内置函数
为了方便MySQL表的操作,MySQL提供了一批内置函数,分别有:日期函数、字符串函数、数学函数……interval 后的数值单位可以是 year、day、minute、second。interval 后的数值单位可以是 year、day、minute、second。从左边开始提取string的length个字符。从右边开始提取string的length个字符。返回datetime的日期部分。在date中添加的日期或时间。在date中添加的日期或时间。
2025-03-08 12:02:51
933
原创 MySQL表的增删查改
在使用insert语句插入数据的时候,在表名左边不指定列名就表明需要进行全列插入,指定列名就表示向指定列插入(当然,如果指定全部的列名也表示全列插入);前面我们在使用select子句的时候,都是将一列数据的全部内容显示出来,如果我们想筛选出符合条件的记录,也就是表中的行,我们就需要使用where子句了。在我们插入数据的时候,可能因为主键or唯一键对应的值已经存在而导致插入失败,这是,我们可以使用insert语句的。在MySQL中,我们可以使用将select的查询结构插入一张和当前表结构一样的表中。
2025-03-08 00:03:15
1007
原创 MySQL表的约束
举个例子:在大学里面,每个同学都有自己的学号,每个同学的学号其实就是一个主键,在学校的学生管理系统中,我们使用学号就可以唯一的定位一个学生的信息。这是因为,主键是用来标识整条记录的为一性的,而唯一键是用来标识记录中的某一个数据项的唯一性的,而主键只能有一个,数据项有多个,因此,唯一键被发明出来了。在我们向数据库表中插入数据的时候,我们不敢保证我们就一定不会插入错误的数据,比如:插入用户的身份证号码时插入了重复的身份证号码,我们知道每个人的身份证号码都是不同的,所以这种情况是不被允许的。
2025-03-05 17:07:38
675
原创 MySQL数据类型
当我们往数据库表中插入数据的时候,插入的数据需要和对应的数据项的数据类型一 一匹配,如果不匹配的话,MySQL就会拦截这次插入操作,因此,数据类型本身就是数据库的一种。这回插入居然失败了!这是因为我们指定小数部分有两位数字,默认就有两位,没写的时候就是0,所以,我们插入的数字应该是123.40,超过了指定的4位。这是因为,bit类型的数据在现实的时候是按照ASCII表对应的位置显示,这1对应的位置刚好是不可显的字符,所以我们就看到这个奇怪的现象了。这和表的编码密切相关,在varchar类型的数据中,
2025-03-04 23:16:14
954
原创 Linux —— 线程池
线程池(Thread Pool)是线程的一种使用方式。它通过预先创建一组线程并管理它们的生命周期,来提高多线程应用程序的性能和资源利用率。线程池的核心思想是减少在创建和销毁线程时所产生的开销。
2025-03-04 15:56:55
1207
原创 信号量实现基于环形队列的生产者消费者模型
多个线程在互斥的情况下并发访问同一个共享资源时,由于竞争锁能力强弱的原因,可能造成竞争锁能力弱的线程饥饿,为了解决这个问题,我们需要让这些线程按照一定的顺序访问同一个共享资源,也就是实现线程同步。实现线程同步可以使用条件变量,对条件变量感兴趣的读者可以看看这篇文章 ——线程同步。除了使用条件变量实现线程同步,我们还可以使用信号量来实现线程同步。同时在博主之前的文章中有讲过 基于Blockqueue的生产者消费者模型,因此,我还想在这篇文章中讲解如何使用信号量实现 基于环形队列的生产者消费者模型。
2025-03-04 10:12:08
1189
原创 Linux线程同步
其中,就有一个人高马大 饭量也大的壮汉,把大家卡在身后,就让阿姨给他打饭,阿姨给他打完饭之后,他立马就吃完了,吃完之后立马伸手对阿姨说,“阿姨,我还要”,阿姨没办法,不把他打发走后面的同学也吃不上饭,于是阿姨又给他打了一份,这个壮汉又吃完了,又要……我们的代码示例中,创建了一个Boss线程,创建了五个Employer线程,通过这一个Boss线程实现了对五个Employer线程的控制,让着五个Employer线程能够按照一定的顺序运行。壮汉一听,没办法,吃完后老老实实去排队,这是,后面的同学也能吃上饭了。
2025-03-03 16:06:12
1000
原创 基于阻塞队列的生产者消费者模型
有一批执行流充当生产者角色,另一批执行流充当消费者角色,执行流可以是进程or线程,我们以线程为例进行学习。生产者和消费者之间需要进行数据的传递,也就是生产者生产数据给消费者消费。但是生产者生产的数据并不直接传递给消费者,而是放在一个容器中;消费者也不直接找生产者要数据,而是从容器中拿。两者之间通过一个容器间接完成数据的传递。像这种在并发请进行数据传递的模型就叫做生产者消费者模型。
2025-03-03 16:03:56
1135
原创 Linux线程互斥
当寄存器中的值变为1之后,就表示申请锁成功(此时,其他线程通过类似的方式申请互斥量,申请到的是0,表示申请失败),当该进程访问完临界区的代码之后,需要进行释放锁,也就是进行unlock操作,我们可以理解为该线程把之前通过交换申请到的1放回到内存的互斥量当中,把自己的0拿回来, 这样其他线程就可以申请到锁了。要想解决上面的问题,只需要保证多个执行流互斥的执行临界区的代码即可!申请到锁的执行流,执行完临界区的代码之后,需要释放锁,这样后面的执行流才能申请锁。,可以通过数据的共享,完成线程之间的交互。
2025-03-02 22:31:26
1022
原创 线程控制(创建、终止、等待、分离)
在Linux系统中,并不存在真正的线程,只有轻量级进程。所以,Linux系统只提供了操作轻量级进程的系统调用接口,并不提供直接操作线程的系统调用接口。但是,对于用户来说,用户想要对线程进行操作,只认线程相关的接口。于是,有人对轻量级进程的系统调用接口进行封装,转换成线程相关的接口语义给用户使用。与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”开头。要使用这些函数库,要通过引入头文。链接这些线程函数库时要使用编译器命令的“-lpthread”选项。
2025-03-02 18:27:41
1047
原创 Linux中线程的基本概念
举个例子:我们这个社会上存在了太多的资源,比如车子、房子、票子,而每个家庭就是承担社会资源的基本实体,家庭中由很多人,爸爸负责赚钱养家,妈妈负责貌美如花,你就负责上学,每个人其实就相当于家庭内部的执行流。,这句话不能说他错了,但是呢不够准确,一个程序被加载到内存之后,其本质是这个程序的代码和数据被加载到内存了,操作系统需要为加载到内存的程序创建PCB数据结构,所以,我们可以 以函数为例来理解,我们把每个函数单独的看成一个执行分支,每个函数在执行的时候,只会运行函数自己的代码,多个函数共同瓜分了进程的代码。
2025-03-02 15:15:41
846
原创 进程信号
进程当前正在执行main函数,这时发生中断或异常切换到内核态,在中断处理完毕后要返回用户态的main函数之前,检查到有信号SIGQUIT递达,进程决定返回用户态后不是恢复main函数的上下文继续执行,而是执行sighandler函数(sighandler函数和main函数使用不同的堆栈空间,它们之间不存在调用和被调用的关系,是两个独立的控制流程)。当进程收到信号之后,可能不立即处理信号,而是先将信号进行保存,等到合适的时候再处理信号,那么,保存信号是将信号保存在哪的呢?当前进程中被阻塞且未决的信号集。
2025-03-01 22:09:26
1175
原创 进程间通信 —— 共享内存
功能:用于创建或获取一个共享内存段。key_t key:这是共享内存段的键值,用于唯一标识共享内存段。可以通过 ftok函数生成,也可以直接使用 IPC_PRIVATE创建一个新的共享内存段。如果 key是,系统会创建一个新的共享内存段,且该段只能由当前进程及其子进程使用。size_t size:表示共享内存段的大小,以字节为单位;如果是创建新的共享内存段,必须指定大小;如果是获取已存在的共享内存段,可以设置为 0。int shmflg:这是一个int类型的标志位,用于控制共享内存段的创建和。
2025-02-28 23:30:45
1324
原创 进程间通信 —— 管道
然后父进程创建子进程,子进程的创建是要以父进程为模板的,子进程会继承父进程的大部分属性,其中就包括了这两个文件描述符。,a进程的数据b进程看不到,b进程的数据a进程也看不到;功能:在内存中创建一个没有名字的管道文件用于通信(该文件不占据磁盘空间,当通信结束,父子进程退出,该文件自动释放)。的,也就是说,操作系统需要提供进程间通信的场所,让不同的进程都能看到,这样就能实现进程间通信了。特性4:父子进程退出,管道文件自动释放,管道文件的生命周期是随进程的。为了完成这些任务,进程和进程之间就必须要进行通信。
2025-02-28 00:24:19
1169
原创 动静态库
在系统当中,库文件可以分为静态库文件和动态库文件,Linux系统中的静态库文件以.a结尾,动态库文件以.so结尾。我们以C语言程序为例,一个C语言程序要被编译器编译成可执行文件,需要经过预处理编译汇编链接四个步骤才能生成可执行文件,其中链接是在干什么呢?链接其实就是在和库文件进行链接。静态链接:链接静态库的方式叫做静态链接。静态链接是在编译时将将静态库拷贝一份到可执行文件中,生成的可执行文件包含了库中的所有代码,因此运行时不再需要外部的库文件;但是,通过静态链接形成的可执行程序比较大。
2025-02-27 18:09:19
1264
原创 文件系统
然后编写管理好一个分组的数据结构和算法,一个分组能够管理好,那么就能把管理管理一个分组的数据结构和算法拷贝给其他分组,这样就管理好了一个分区内的多个分组,也就意味着管理好了一个分区,既然能够管理好一个分区,那复用管理好着一个分区的数据结构和算法,就能管理好多个分区,管理好多个分区就意味着管理好了磁盘。我们计算机上的磁盘的存储空间是很大的,就现在而言,一般的计算机都有512GB的磁盘空间,那么操作系统要如何才能管理好着512GB的磁盘空间和磁盘上的文件呢?那么,一个文件就是多个扇区所承载的数据了。
2025-02-26 22:48:36
1199
原创 文件缓冲区
在我们使用C语言提供的文件IO接口进行文件操作的时候,是不是要通过一个FILE*类型的结构体指针来操作文件,这个FILE结构体当中就维护了一块内存区域,我们称之为文件缓冲区。文件缓冲区就是C语言标准库为打开的文件流提供的一块内存区域。int _flags;//缓冲区相关//封装的文件描述符#if 0#else#endif*/
2025-02-26 18:49:37
779
原创 文件描述符详解
计算机当中会存在很多进程,Linux操作系统为了管理进程就要为进程创建结构体,并且以双链表的形式进行组织起来。同理,每一个进程都会打开一个或者多个文件,所以,Linux操作系统也要为被打开的文件创建结构体,这个结构体就是,也以双链表的形式组织起来。然而,Linux的设计者认为这还不够方便,于是又设计了一个结构体,对象中有一个指向的指针,中有一个数组,这个数组中记录了当前进程打开的所有文件的 struct file 结构的指针。并且,这个数组的下标就叫做文件描述符。
2025-02-26 01:35:29
1567
原创 文件IO接口
函数原型:int fputs(const char *str, FILE *stream)str:要写入的字符串,字符串以空字符('\0')结尾。stream:这是一个指向FILE对象的指针,表示目标文件流。如果成功,fputs返回非负值(通常是0,但标准并没有规定具体的返回值,只要是非负即可)如果发生错误,fputs返回EOF,并设置errno来指示错误类型。(然而,需要注意的是,即使fputs返回EOF,也可能已经有一部分字符串被成功写入文件。功能:向指定的文件写入一个字符串。
2025-02-25 22:37:38
1112
原创 进程控制
一:凡是接口中带有l的都表示参数以字符串传入,如果想要执行系统命令,命令行怎么写,参数就怎么写。二:凡是接口中带有p的都表示不需要传入路径,程序会自动在PATH环境变量下查找要执行的文件。三:凡是接口中带有v的都表示以字符数组的方式传入要执行的命令。四:凡是接口中带有e的都表示可以自定义进程的环境变量。
2025-02-22 02:29:16
954
原创 进程地址空间和页表
当子进程创建的时候,是以父进程为模版的,会继承父进程PCB中的大部分属性,自然而然也就继承了父进程的进程地址空间,此时,父进程和子进程的进程地址空间完全相同,也就映射到了完全相同的数据。在这份代码中,子进程对全局变量g_val进行了修改,导致父子进程中的g_val存储到了不同的物理内存中,但是父子进程的进程地址空间中的虚拟地址没有改变,还是相同的值,况且我们使用的就是虚拟地址,所以,我们才看到了相同的地址,不同的值。,这个结构体中就包含了一个4GB大小的空间,这个空间就是进程的地址空间。
2025-02-20 22:13:10
849
原创 环境变量
对于变量,我们肯定不陌生,我们在写程序的时候,肯定会定义一些变量,定义变量的本质就是开辟空间并赋予内容即可。那环境变量是什么呢?环境变量就是操作系统自己定义的、具有特殊用途的变量。比如:我们在编写C/C++代码的时候,在链接的时候,我们并不知道程序所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
2025-02-20 18:19:30
703
原创 Linux下的进程切换与调度
当程序加载到内存形成进程之后,会以双链表的形式组织起来,CPU的运行队列的指针会指向其中一个task_struct,CPU就会从运行队列中拿进程去执行,当代计算机系统都有一个时间片,也就是进程占有CPU的最大时间,当时间片结束之后,就需要把当前正在执行的进程从CPU上剥离下来,换另一个进程去占有CPU,但是进程在运行过程中,会产生大量的临时数据,这些临时数据存放在CPU上的寄存器中,也就是说,Linux系统是通过优先级的方式来决定进程享受资源的先后顺序的。,剥离当前进程的时候,我们需要对进程的。
2025-02-12 22:57:31
1201
原创 冯诺依曼体系与操作系统
这么多的硬件,需要根据特定的结构组织在一起,才能够进行数据在不同设备之间的传递,才能够稳定且协调的运行。首先,我们要明白的是,软件是一个个的程序,计算机运行起来的其实是该程序的可执行文件,要运行一个可执行文件首先要将可执行文件加载到内存中,当该程序的可执行文件加载到内存中之后,就会形成一个进程;其实并不是这样的,CPU的工作速度是很快的,而输入输出设备的工作速度是很慢的,如果让输入输出设备直接和CPU进行数据之间的传递,必然会导致CPU大部分时间都在等待,这也就算是对CPU的一种浪费。
2025-02-09 19:20:21
870
原创 Linux下的调试器 —— gdb
众所周知,程序的编译有两种模式 —— debug模式和release模式。你肯定就要问了,为什么要有这两种模式呢?这是因为不同的人群需求不同。如果你是一个开发人员,你肯定希望你的可执行程序中包含调试信息,方便日后代码的维护;如果你是一个用户,你肯定不希望可执行程序中包含调试信息,因为用户往往希望更快的下载,并且下载的程序占用更少的空间。gcc默认是进行并且以编译程序的,如果我们想要以debug版本编译程序,需要带上。
2025-02-09 16:07:08
1041
原创 Linux下的项目自动化构建工具 —— make 和 makefile
但是,在Linux环境下,没有这些集成开发环境,我们想要将源文件编译形成可执行文件,就只能通过命令行的方式 使用gcc/g++等编译工具来进行编译,如果文件个数比较少,只有一两个,倒也无妨,如果文件的数量特别多的话,使用命令行逐个编译就显得费劲;也就达到了自动化编译的目的;,相当于make的配置文件,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能;make是一条命令,makefile是一个文件,两个搭配使用,共同完成项目的构建。
2025-02-09 00:20:08
969
原创 Linux下的编译工具 —— gcc、g++
同样的道理,当C语言被发明出来之后,我们也是先用C语言前面的语言写一个C语言的编译器,也就是汇编语言写的C语言的编译器,此时我们就能够编译C语言程序了,再用C语言写一个C语言的编译器,然后用汇编语言写的编译器编译,就得到了C语言写的C语言编译器,再对其进行优化,用旧的C语言写的编译器编译新的C语言写的编译器、就得到了新的C语言编译器。之后,我们再对汇编语言写的编译器进行优化,写一个。的用汇编语言写的编译器,再用老版本的汇编语言的编译器编译新版本的编译器,得到新版本的汇编语言的编译器。
2025-01-22 16:28:06
1012
原创 Linux下的编辑器 —— vim
在Windows下,我们通常使用 Visual Studio 、devC++、codeblocks这样的软件,这些软件其实是集成开发环境,意思就是,这些软件同时具有编辑、编译、调试代码,这些软件将这些功能集中于一体,这就是集成开发环境。在Linux中,将这些功能独立出来形成一个程序软件,用于编辑代码的就是vim。vim就是Linux下一款编辑器。你可能还听说过vi,vim其实是vi的升级版,它不仅兼容vi的所有指令,而且还有一些新的特性在里面,例如语法加亮……
2025-01-22 15:51:48
3530
2
原创 Linux 权限详解
举个例子就是:张三和李四在同一个目录下协同工作(这个目录是张三的),李四要在该目录下工作,那么李四必然要具有目录的w权限,这样他才能新建自己的文件和目录;字符表示法以三位一组,分别为rwx,如果对应的位置显示对应的字符,表示具有该权限,如果对应的位置为-,则表示没有对应的权限。我们希望的是,在张三的目录下,张三创建的文件,李四不能随便删除,即便李四具有目录的w权限。通过前面的问题,我们发现,只要具有目录的w权限,就可以删除目录下的文件,而不管是否具有文件的权限,这似乎不科学呀!
2025-01-20 10:16:08
1040
原创 shell外壳的原理
当我们登录Linux机器的时候,Linux提供的终端会出现这样一行内容:这其实就是一个shell外壳程序执行的结果,他负责将用户输入的内容翻译给操作系统内核,并将内核执行的结果翻译给用户。所以,从技术的角度看,shell外壳其实就是一个命令行解释器。在Linux系统中的shell外壳程序通常是bash,shell外壳是统称,bash是某一个具体的shell外壳程序,比如:老师是一个统称,张三老师是具体的一个人。我们可以使用可以在系统中找到这个bash程序所处的路径。
2025-01-19 16:34:34
390
原创 Linux入门指令(二)
当我们输入完之后,按下Ctrl+x之后,nano就会询问我们是否保存对当前文件的修改,我们输入y表示需要保存,然后回车就退出nano了。我们还可以再移动文件的时候修改文件的名字:将dir1目录下的file3文件移动到dir3目录下,并修改文件名位temp_file。常用选项:-a详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。输入rz命令,会自动跳出一个框框,然后选择要传输的文件,勾选下面的小框,点击打开。
2025-01-19 15:41:03
1003
原创 Linux入门指令(一)
我们都知道,在日常生活中接触的电脑有使用Windows操作系统的(微软),也有使用MacOS操作系统的(苹果),这些都是商业公司开发的,公司的目的是盈利,所以这些公司必须讨好其用户,其产品必须提供简单便捷的操作,所以装载Windows操作系统和MacOS操作系统的电脑通常会配备图形化界面,一般的“普通人”也可以很流畅的使用电脑。但是还有一款在计算机领域大名鼎鼎的操作系统——Linux,Linux因为其开源且免费,以及稳定且安全的特点,深受各大互联网公司的喜爱,通常将其作为后端服务器所搭载的操作系统。
2025-01-18 17:27:55
1025
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅