- 博客(104)
- 收藏
- 关注
原创 MySQL相关概念和易错知识点(2)(表结构的操作、数据类型、约束)
因此数据库要解决的一个关键问题就是这个数据符不符合规范?能不能存进去?这就是数据库约束存在的根本原因。因此数据库对数据类型有着更严格的限制,
2025-07-26 21:46:40
1000
原创 MySQL相关概念和易错知识点(1)(MySQL中不同概念的关系、MySQL基本使用)
我们可以将查询到的结果理解为:如果当前删掉这个数据库(假设库中没有table),想要还原一个一模一样的database时mysql实际执行的语句,它不一定就是我们当初创建时真正写的。也就是说当我们进入一个database后,里面看到的都会是table,而没有子database,这也是结构上和文件系统不一样的地方,文件夹可以嵌套,而database不能。在show语句中,结果通常为表格,但有的时候由于显示区域问题,会出现表格的打印出现混乱,不好查看,所以采用\G拼在结尾,就会换成列表形式显示。
2025-07-18 06:29:55
691
原创 Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
根据建立连接,我们可以推断出,在有的情况下四次挥手可以合并成三次,即双方都有很强的断开连接的意愿下。
2025-06-10 12:48:48
999
原创 Linux相关概念和易错知识点(41)(UDP、TCP报头结构)
解析报头时,UDP直接读取收到的报文前8个字节,剩下就是有效载荷。报文的前8个字节包括:16位源端口号和16位目的端口号,16位当前UDP报文有效载荷长度(自描述字段),16位校验和。由于记录了16位当前UDP报文有效载荷长度和16位校验和,因此报文会被完整合法地交给上层。如果出现了UDP检验和失败,那这个报文会被直接丢弃,而无需向接收方响应任何数据。
2025-05-25 14:58:24
1066
原创 Linux相关概念和易错知识点(40)(HTML资源交互、网页管理、搜索引擎)
各家都疯狂推出自己的浏览器,因此浏览器的标准争夺非常剧烈,每家都有自己的一面之词,都不甘服从别的公司的标准,这也造就了当今。注意对于301还是302,跳转的含义都是指的客户端再次发起请求,服务端不会跳转的,它只会告诉客户端下一步怎么做。,更新页面内容,这种情况下就不会跳转到新的静态网页,看起来还是在原来的网站,但内容更新了。,客户端的/test实际上会被对方的服务器单独处理,读取请求的参数,返回结果给客户端。(有的浏览器支持修改搜索引擎),所以对互联网厂商而言,浏览器就是自己的门面,非常重要。
2025-05-15 01:13:06
1256
原创 Linux相关概念和易错知识点(39)(URL、HTTP)
应用层协议是很多的,且大多都有现成方案了,因此可以满足用户不同的需求,其中最具代表性的就是HTTP协议。HTTP超文本传输协议(无连接、无状态)定义了客户端(如浏览器)和服务器的通信,是客户端和服务器通信的基础。HTTPS主要就是多了一层加密。HTTP是基于TCP的,具有收发完整性(TCP保证可靠传输,有相应的重传机制等)。什么叫做基于TCP?当客户端和服务器建立连接时采用的就是TCP,相互发数据也都是遵循TCP的规则来的,和普通的TCP通信没什么区别。不同之处在于而。
2025-05-14 09:17:36
1247
原创 Linux相关概念和易错知识点(38)(对会话和表示层的理解、网络计算器的实现)
本文在前面TCPServer、线程池、日志已经实现的情况下,以网络计算器的实现为主线,重点理解OSI定义的七层模型,以及理解为什么后面精简到了五层。
2025-04-02 22:57:55
483
原创 Linux相关概念和易错知识点(37)(序列化和反序列化、TCP协议、会话和守护进程)
json处理后的数据是有效载荷,我们还可以自己给这个有效载荷做一层包装。因为TCP是面向字节流的,有了这一层包装可以进一步保证资源传输完整性。格式:head_length(有效载荷的长度)\r\n + 有效载荷(json处理后的数据)+ \r\n到此为止,我们就实现了一个自己的协议。对于客户端,它需要将发送的数据通过协议里面的包装函数转换成上述格式的字符串传出去,接收端再按照相应的解包函数逆向还原结构化数据,然后调用将这些数据作为参数调用服务,最后再将结果通过协议返回给客户端。
2025-04-02 22:27:20
1047
原创 Linux相关概念和易错知识点(36)(TCP套接字编程、远程命令的实现)
远程命令,即让远程主机返回本地输入的结果。和聊天室的逻辑几乎一致。有的命令很危险,可以通过黑名单(哪些不能执行)和白名单(哪些命令可以执行)来实现保护。
2025-03-22 11:45:05
925
原创 Linux相关概念和易错知识点(34)(网络协议、网络通信)
虽然有七层,但定标准和实现的是不同人。OSI规定了标准,要求其它公司写系统需要遵循该网络协议,这些公司实现时发现不需要这么复杂,就省去了,但必要的接口都是按照标准来的,因此OSI还是实现了它的目标。下面是常见的协议分层(5层)应用层和传输层还存在表示层和会话层,后续用到再说,大部分情况这5层就足够了。
2025-03-02 23:38:35
917
原创 Linux相关概念和易错知识点(33)(基于阻塞队列和环形队列的生产消费模型实现、sem的应用)
1个交易场所(阻塞队列、环形队列等),不同的生产消费模型交易场所不同,可以满足不同需求。,在上篇博客中代码已经表明了。要维护好生产消费模型,3种关系一定要保证,即。(生产者和生产者、消费者和消费者、生产者和消费者)、后续我们的设计一定要满足这“321”原则,缺一不可。wait申请信号量如果成功就会继续执行下面的代码,并且这次我创建了两把锁,因为对于。要实现生产消费模型,无外乎是。于是满足生产消费模型的条件。这就是线程池中的采用的方法。,和mutex一样。这里需要注意的是生产者的。(生产者、消费者)、
2025-03-01 15:29:05
1069
原创 Linux相关概念和易错知识点(32)(互斥锁和条件变量的封装、日志和线程池的实现)
就像老师想关心学生成绩,就直接跑到班上去一个一个问。但万一记错了呢?跑错班了呢?这始终不方便。当封装之后,就形成一个管理一把锁的类。什么叫管理一把锁的类?就是这个。
2025-03-01 13:32:12
1210
原创 C++相关概念和易错语法(34)(C/C++缓冲区同步刷新、IO流)
cin和cout是绑定的,意思是调用cin就会先刷新输出缓冲区,调用cout就会先刷新输入缓冲区,这和前面我们遇到的效率问题类似。
2025-02-26 09:49:01
1059
原创 Linux相关概念和易错知识点(31)(生产者-消费者模型、认识信号量、线程安全)
形象的说法是,申请别人不会释放的资源,并且自己也不释放资源、僵持不下的状态就叫死锁。举个例子,B申请A的锁,并且说它得到A的锁后就会释放自己的锁;与此同时,A也在申请B的锁,并且说它申请到B的锁后才会释放自己的锁。它们两个线程谁也不让谁,这就陷入了死锁。单线程也可能产生死锁,一把锁也可能把自己锁住,如连续两次申请锁。当第二次申请锁时,这个线程的右手想要拿左手正在拿着的锁,左手对右手说它需要执行到unlock才会释放,而右手说它马上就要这把锁,不然不让走。这就陷入了死锁。
2025-02-23 21:17:20
1070
原创 Linux相关概念和易错知识点(29)(线程相关性质和操作、线程封装)
不仅如此,所有线程的属性也都做了上层封装,在struct pthread里面,由pthread.so维护,这是上篇文章提到的。我们接着看LWP,469053和469054,显然前者为主线程,后者是新线程,这个对象调用其成员函数的整个过程都是在主线程中执行的,只是在类域里面执行函数,创建线程还是算作主线程创建的。我们还能发现主执行流的LWP和PID的值一致,新线程的LWP是紧接着的数字。只要理解了线程控制的基本操作,基本的线程封装就很快能写出来了,我简要讲解思路即可。,我们之前因为都是单线程没发现这一点。
2025-02-19 03:05:00
1070
原创 Linux相关概念和易错知识点(27)(认识线程、页表与进程地址空间、线程资源划分)
接着刚才的例子:找到0010110101 0011010111 0000000000对应地址,这就是某一个页框的起始地址。虚拟地址101011010101会作为该页框的偏移量。至此,虚拟地址能够转为物理地址0010110101 0011010111 101011010101。
2025-02-14 17:06:24
839
原创 Linux相关概念和易错知识点(26)(命名管道、共享内存)
总的来说,key由用户层去设置更容易管理,但key怎么设置呢?理论上只要不冲突,就可以随便设。如果冲突,就会出错,需要手动改,如果我们不希望自己去设置,
2025-01-26 20:41:55
1041
原创 Linux相关概念和易错知识点(25)(信号原理、操作系统的原理、volatile)
对于OS来说,只要完全没有进程,它就陷在死循环中,但只要有进程,就会一直忙着调度,这是时钟源的中断推着它进行的。我们因此可以说。
2024-12-21 11:53:44
1154
原创 Linux相关概念和易错知识点(23)(进程间通信、匿名管道、进程池)
通过进程池的代码,我们能够进一步深入了解进程间通信的原理,其中最难理解的就是数据不一致问题,匿名管道的面向字节流就决定了它不适合多次数据传输,不过我们依然使用它走完了进程池的流程,了解即可。在整个过程中,读写端都将对方当作了文件,都是对pipe文件进行IO,这再次体现出Linux一切皆文件的思想,值得我们体会。
2024-12-05 22:06:09
977
原创 Linux相关概念和易错知识点(22)(ELF格式、可执行程序的加载、共享库)
如果没有逻辑地址的概念,那么编译器会很难办,因为内存的使用都是动态变化的,没有哪一块空间是每时每刻都空闲着的,如果给这个指令编址后,当运行程序时,这个地址被占用怎么办?除此之外,如磁盘上的文件的物理地址,各个section的位置都是以偏移量的形式来保存的。由于section偏移量及其大小属性的存在,程序加载时不一定就要加载数据,可以先根据section的偏移量初始化页表的虚拟地址,当执行时懒加载,当然也可以分批加载。调用库函数的基本逻辑是修改库所在位置的起始地址,加上库方法本来就有的逻辑地址定位。
2024-11-21 09:46:19
1139
原创 Linux相关概念和易错知识点(20)(dentry、分区、挂载)
系统最开始就要加载根目录到内存中,创建dentry,后续的访问也都是根据根目录文件的内容来逐渐建立dentry多叉树的。当我们cd进入某一个目录里时,有可能我们根本没有进入对应的目录文件(目录文件真实存在),而实际上进入了一个分区,这是通过挂载点进行特殊实现的。我们的dentry讲解中存在一个巨大的漏洞,那就是文件的inode是以分区为界限的。,会按照ext2的格式结合我们文件的大小自动将分区分为不同的块,初始化超级块等操作。问题的根源来自分区的确定,我们只要确定了分区,上面的问题就都能解释了。
2024-11-09 17:59:16
1054
原创 Linux相关概念和易错知识点(19)(HDD、Block group)
之后就需要存储内容了。我们需要知道,存储数据时会在GDT找Block Bitmap的空闲块,最后在对应的Data blocks存数据。但如果这个时候Data blocks存满了呢?inode是白白创建了吗?我们需要删掉这个inode,直到找到一个能存数据的组再创建inode并存储吗?
2024-11-09 08:24:39
901
原创 Linux相关概念和易错知识点(18)(重定向、语言级缓冲区)
用户级(语言级)缓冲区是为了减少系统调用的次数,减少系统调用的开销;系统级缓冲区是为了减少IO次数,减少和硬件访问的次数。语言级缓冲区的设计原则就是:尽量少的调用系统接口。我们能意识到C语言的语言级缓冲区的设计非常注重效率。C++文件流里面也有缓冲区,是类似的。我们平时其实也都需要遵循这个原则。如申请内存一般都是一次申请比较多的空间,用空间换时间。
2024-10-29 12:42:47
1027
原创 Linux相关概念和易错知识点(17)(文件、文件的系统调用接口、C语言标准流)
这显然需要每个进程的共同作用。并且还有一些文件相关的属性等也都需要单独维护,这就是files_struct干的事情了。
2024-10-28 21:15:00
795
原创 Linux相关概念和易错知识点(16)(Shell原理、进程属性和环境变量表的联系)
这样做的好处是子进程执行失败完全不会影响父进程的安全性,如果直接让父进程执行所有命令,那么如果出了一个较严重的错误,父进程就直接被挂掉了,这显然不是我们希望看到的。获取的环境变量是从我们自己拷贝得到的环境变量表中取,而不是在该进程原本的环境变量表中取。,我们可以在函数里定义string,然后返回它,这样做不会出现和数组那样的野指针问题,会自动初始化一个新的string。,但事实上修改cwd后PWD依然不变,cwd和PWD都只是数据而已,并没什么大不了的,因此我们需要手动putenv。但程序中还有一个变量。
2024-10-22 23:19:55
926
1
原创 Linux相关概念和易错知识点(15)(exec系列函数)
fork函数内部会为我们拷,数据和代码,创建PCB,当走到最后return语句时两个进程分别返回,之后父子进程保持独立。但当execl成功时,它是没有返回值的,因为execl是对进程的代码数据进行完整地替换,当execl成功时,它自己也被覆盖了,自然不存在返回值这种说法。这中间涉及到子进程原有代码和数据的回收,硬盘导入新的代码和数据到内存中,修改页表和进程地址空间,修改一些PCB属性等操作。如execlp("ls", "ls", "a", NULL),虽然第一个和第二个参数同,但含义却不同。
2024-10-10 16:47:33
1181
原创 Linux相关概念和易错知识点(14)(进程终止、进程退出、退出信息)
我们通过status可以得到退出相关信息,但是上图所示似乎不太对劲,每一次打印都是得到6144,而进程的退出码应该都是24才对。我们之前讲过当父进程退出而子进程还在工作时,子进程就会变成孤儿进程并被系统领养,孤儿进程会被自动移到后台运行。并且有的时候我们想要创造孤儿进程,不想让父进程一直等着一个相当长时间不会退出的子进程,父进程wait子进程除了避免僵尸或孤儿,还想要知道子进程任务完成的怎么样,也就是子进程的退出码。注意,如果这个父进程是系统相关的进程,我们就无需担心,它会自己wait。
2024-10-10 09:27:47
1227
原创 Linux相关概念和易错知识点(13)(进程地址空间、页表、虚拟地址)
编译器、用户访问、进程管理,你能想到的一切操作,它们都只能拿着虚拟地址进行访问和操作,这些操作都会传到页表的手上,一切对物理空间的访问都需要页表来管理。我们new出来的堆区空间本质上也不是在开辟物理空间,而只是在进程地址空间里做文章,这个空间本质是虚拟的,最终是靠页表帮我们创建的物理空间。,且不同的系统、编译器存在不同程度的优化,因此我们要接受理论和实践上的差别。我们先来认识常见的划分方式。,也就意味着无论我们修改数据,实际指向的代码大概率是不会被拷贝的,就算被拷贝,只要内容不变,也不影响上述结论,同时。
2024-10-08 11:11:36
1111
原创 Linux相关概念和易错知识点(12)(命令行参数、环境变量、本地变量)
当我们理解清环境变量的内存级属性,以及它和bash之间的关系之后,我们对环境变量又有了一个新的认识,也对之前的进程的属性的认识更上一层楼。同时bash也是一个进程,这个进程也有自己的cwd,它会使用类似chdir()的操作设置自己的cwd,这个cwd就是刚刚读取到的配置文件中HOME的路径,即家目录。,虽然我们可以进行内存级修改,但毕竟环境变量是程序启动的根基,所以一般都是以读的形式访问,这和本地变量有很大区别。PWD也是环境变量的一种,它指向了我们当前的工作目录,指令pwd就是读取该环境变量。
2024-10-07 01:01:04
726
原创 Linux相关概念和易错知识点(11)(进程调度、Linux内核链表)
比如假定bitmap[0]是5,根据101B,我们得到PCB* queue[140]的第0位和第2位有进程,其余30位都没有进程,可以直接跳过。当nr_active == 0时,active和expired的指针交换,这个时候我们就发现expired(原来的active)空了,active(原来的expired)满了。runqueue中active、expired、array[2]存在的意义很明确,没有它们就构不成整个调度的流转,上述的过程就是它们存在的意义。,链入规则和前面一样,都遵循哈希算法。
2024-10-02 18:33:36
1186
原创 Linux相关概念和易错知识点(10)(进程优先级、进程切换)
在ir保存指令且eip更新完成之后,CPU就会执行ir里面的指令,之后ir再次导入eip指定位置的指令,eip更新,CPU处理,以此类推......此外,还有。进程是基于时间片来进行调度轮转的,当一个进程在时间片到的时候,不一定执行完了,但此时为了公平性它不能再执行了,CPU必须切换开始执行下一个进程的任务。优先级(建立在已经有权限的基础之上,就是谁先谁后的问题),权限(能还是不能的问题),没权限一定没有优先级的概念。进程的优先级竞争的是CPU资源。,包括NI的修改是有限的,也是基于这个原则来限制的。
2024-09-30 17:06:44
1047
原创 Linux相关概念和易错知识点(9)(父进程、子进程、进程状态)
(如杀毒软件,常驻内存进程),对于那些进程而言如果不及时释放数据,确实会一直增加内存占用,但那种一跑起来就退的进程有点内存泄漏其实不影响。进程的创建遵循树状结构,(时刻注意bash的本质是命令行解释器的进程,并且是因为它最早出现,所有进程都是在它的界面下启动的,因此才成为用户的父进程)这样整个进程都被阻塞了,如果是代码也不会继续执行了,因为CPU需要进程的PCB才能操作,而此时PCB在设备队列里。对于由系统父进程创建的子进程而言,Z状态基本上就是一瞬间的事,但对于我们自己创建的进程,情况就有些不一样了。
2024-09-30 14:03:16
1448
1
原创 Linux相关概念和易错知识点(8)(操作系统、进程属性)
这些任务列表会根据并行的处理方式交给CPU每个核心处理,CPU的每个核心都配有一个调度器,任务列表会先交给调度器,由调度器决策如何并发处理,适时将对应的PCB交给运算器进行处理。包括生活中,上层对我们的管理也是面向对象的思想,他们不需要和我们见面,他们只需要拿到我们的描述信息,一天里干了什么没干什么,再通过传话就可以实现对我们的管理。,每一种硬件都要有自己的驱动程序(操作系统自带或需要自己安装),驱动程序不可或缺,因为不同硬件功能不同,实现不同,迭代速度快,在硬件层面,有文件系统对磁盘数据进行管理,而。
2024-09-26 07:52:04
868
原创 Linux相关概念和易错知识点(7)(git、冯诺依曼体系结构)
因为硬盘和CPU比起来太慢了,会受到木桶效应限制,而内存是读取速度稍快,价格稍低的硬件,可以说DRAM极大降低了计算机的价格,是冯诺依曼体系结构中很重要的一环。换句话说,就算哪一天Gitee和Gitub突然出问题,远端仓库全部销毁了,git管理的本地仓库依然有全套数据和修改,我们换一个能提供远端仓库的服务器就好了。隐藏的目录.git中,可以找到这个index暂存区,index是一个特殊编码的文件,使用git自己的编码格式。我们可以只建立一个本地的仓库,然后用git管理,这样也省去我们自己手动管理的时间。
2024-09-24 13:08:17
1134
原创 Linux相关概念和易错知识点(6)(make、makefile、gdb)
当我们执行make时,就会根据makefile在当前目录下找test.c文件,类似函数的参数,目标生成的文件就是test。在makefile我们可以写很多指令,实现不同功能,不同功能的指令都需要先声明依赖关系,再执行依赖方法。我们发现,目标文件是a,没有依赖文件,但是实际执行指令时用到了test.c,生成的文件又是test,和目标文件a完全不沾边,这应当如何解释?在很多情况下依赖文件和目标文件是一种建议,是一种规范,规范必定带来好处,其中有一个就是自动推导。当make时,会根据目标文件和依赖文件入栈出栈,
2024-09-23 22:42:51
967
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人