- 博客(116)
- 收藏
- 关注
原创 Linux相关概念和易错知识点(50)(读者写者模型、读写锁、自旋锁、活锁的形成)
下面是最关键的读写锁的申请代码,也是体现读者写者模型的核心。我们发现。
2025-10-25 14:26:26
843
原创 Linux相关概念和易错知识点(49)(HTTPS、数据摘要、SSL证书、ARP欺骗)
我们上述的安全性的讨论都基于一个事实,就是中间人只会窃听我们的数据,即它能够知道我们双方所有的通信数据。在这种情况下,就算中间人知道客户端和服务端通信的所有的数据,方案4也能保证安全可靠。但是,中间人还可以篡改数据!首先,中间人一定在双方通信的路径中,这是中间人的定义。其次,这个中间人必须在双方开始通信前就已经做好准备。满足这两个条件,中间人它能借助数据篡改破解方案4。在通信前,中间人就已经准备好了一个公钥和私钥,当采用非对称加密 + 对称加密时:首先,服务端发送自己的公钥给客户端,
2025-10-25 01:12:04
941
1
原创 Linux相关概念和易错知识点(47)(五种IO模型、多路转接、select、poll、epoll)
fd_set具体是什么数据结构(用来保存fd的)?位图!0号描述符对应位图的0号位置,该位置设置为1就表示关心该fd。
2025-10-21 17:05:19
1156
原创 Linux相关概念和易错知识点(46)(全连接队列、Linux网络内核设计)
三次握手建立连接的过程与服务端是否调用accept无关,只要服务端处于监听状态,客户端调用connect依旧能够连接上,可以用netstat验证。
2025-10-16 18:18:19
1011
原创 Linux相关概念和易错知识点(44)(IP地址、子网和公网、NAPT、代理)
在目标服务器眼里,一直都是正向代理服务器在请求服务,而实际上代理服务器只负责转发请求和应答,
2025-09-14 02:17:33
871
原创 Linux相关概念和易错知识点(43)(数据链路层、ARP、以太网、交换机)
不同类型说明了以太网中数据的类型,以及接收方怎么处理数据,应该将数据交给哪个协议去处理,0800交给IP,0806交给ARP,8035交给RARP。通过类型我们也彻底理解了ARP的过程,先接收IP数据报,根据报头IP信息发起0806的请求mac帧,收到应答后再发出0800的mac帧。如果发现目标IP不在当前局域网内时ARP的目标IP就是路由器了,路由器应答后直接发给路由器。整个过程中会发现网络层的报头目标IP和源IP不变(暂不考虑NAT)。路由器收到后进行路径选择、转发,直到到达目标主机处。
2025-09-13 13:46:26
1062
原创 MySQL相关概念和易错知识点(6)(视图、用户管理)
我们初次接触时,可以将建立视图理解成C++中赋值兼容转换,其中视图就是那个父类,子类就是张完整的表。因此,可以说视图就是一张虚拟表,其内容是所引用的表的子集。回收用户权限和授权格式几乎一样,这里仅做一个示例。
2025-08-13 21:38:05
749
原创 MySQL相关概念和易错知识点(4)(分组查询、连接查询、合并查询、子查询)
上篇文章讲了select的基本用法,所以该部分是对上篇文章的延伸。
2025-08-09 17:41:45
1032
原创 MySQL相关概念和易错知识点(3)(表内容的CURD、内置函数)
select ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值。
2025-08-01 15:50:17
645
原创 MySQL相关概念和易错知识点(2)(表结构的操作、数据类型、约束)
因此数据库要解决的一个关键问题就是这个数据符不符合规范?能不能存进去?这就是数据库约束存在的根本原因。因此数据库对数据类型有着更严格的限制,
2025-07-26 21:46:40
1102
原创 MySQL相关概念和易错知识点(1)(MySQL中不同概念的关系、MySQL基本使用)
我们可以将查询到的结果理解为:如果当前删掉这个数据库(假设库中没有table),想要还原一个一模一样的database时mysql实际执行的语句,它不一定就是我们当初创建时真正写的。也就是说当我们进入一个database后,里面看到的都会是table,而没有子database,这也是结构上和文件系统不一样的地方,文件夹可以嵌套,而database不能。在show语句中,结果通常为表格,但有的时候由于显示区域问题,会出现表格的打印出现混乱,不好查看,所以采用\G拼在结尾,就会换成列表形式显示。
2025-07-18 06:29:55
786
原创 Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络环境的处理)
根据建立连接,我们可以推断出,在有的情况下四次挥手可以合并成三次,即双方都有很强的断开连接的意愿下。
2025-06-10 12:48:48
1056
原创 Linux相关概念和易错知识点(41)(UDP、TCP报头结构)
解析报头时,UDP直接读取收到的报文前8个字节,剩下就是有效载荷。报文的前8个字节包括:16位源端口号和16位目的端口号,16位当前UDP报文有效载荷长度(自描述字段),16位校验和。由于记录了16位当前UDP报文有效载荷长度和16位校验和,因此报文会被完整合法地交给上层。如果出现了UDP检验和失败,那这个报文会被直接丢弃,而无需向接收方响应任何数据。
2025-05-25 14:58:24
1179
原创 Linux相关概念和易错知识点(40)(HTML资源交互、网页管理、搜索引擎)
各家都疯狂推出自己的浏览器,因此浏览器的标准争夺非常剧烈,每家都有自己的一面之词,都不甘服从别的公司的标准,这也造就了当今。注意对于301还是302,跳转的含义都是指的客户端再次发起请求,服务端不会跳转的,它只会告诉客户端下一步怎么做。,更新页面内容,这种情况下就不会跳转到新的静态网页,看起来还是在原来的网站,但内容更新了。,客户端的/test实际上会被对方的服务器单独处理,读取请求的参数,返回结果给客户端。(有的浏览器支持修改搜索引擎),所以对互联网厂商而言,浏览器就是自己的门面,非常重要。
2025-05-15 01:13:06
1377
原创 Linux相关概念和易错知识点(39)(URL、HTTP)
应用层协议是很多的,且大多都有现成方案了,因此可以满足用户不同的需求,其中最具代表性的就是HTTP协议。HTTP超文本传输协议(无连接、无状态)定义了客户端(如浏览器)和服务器的通信,是客户端和服务器通信的基础。HTTPS主要就是多了一层加密。HTTP是基于TCP的,具有收发完整性(TCP保证可靠传输,有相应的重传机制等)。什么叫做基于TCP?当客户端和服务器建立连接时采用的就是TCP,相互发数据也都是遵循TCP的规则来的,和普通的TCP通信没什么区别。不同之处在于而。
2025-05-14 09:17:36
1355
原创 Linux相关概念和易错知识点(38)(对会话层和表示层的理解、网络计算器的实现)
本文在前面TCPServer、线程池、日志已经实现的情况下,以网络计算器的实现为主线,重点理解OSI定义的七层模型,以及理解为什么后面精简到了五层。
2025-04-02 22:57:55
516
原创 Linux相关概念和易错知识点(37)(序列化和反序列化、TCP协议、会话和守护进程)
json处理后的数据是有效载荷,我们还可以自己给这个有效载荷做一层包装。因为TCP是面向字节流的,有了这一层包装可以进一步保证资源传输完整性。格式:head_length(有效载荷的长度)\r\n + 有效载荷(json处理后的数据)+ \r\n到此为止,我们就实现了一个自己的协议。对于客户端,它需要将发送的数据通过协议里面的包装函数转换成上述格式的字符串传出去,接收端再按照相应的解包函数逆向还原结构化数据,然后调用将这些数据作为参数调用服务,最后再将结果通过协议返回给客户端。
2025-04-02 22:27:20
1095
原创 Linux相关概念和易错知识点(36)(TCP套接字编程、远程命令的实现)
远程命令,即让远程主机返回本地输入的结果。和聊天室的逻辑几乎一致。有的命令很危险,可以通过黑名单(哪些不能执行)和白名单(哪些命令可以执行)来实现保护。
2025-03-22 11:45:05
963
原创 Linux相关概念和易错知识点(34)(网络协议、网络通信)
虽然有七层,但定标准和实现的是不同人。OSI规定了标准,要求其它公司写系统需要遵循该网络协议,这些公司实现时发现不需要这么复杂,就省去了,但必要的接口都是按照标准来的,因此OSI还是实现了它的目标。下面是常见的协议分层(5层)应用层和传输层还存在表示层和会话层,后续用到再说,大部分情况这5层就足够了。
2025-03-02 23:38:35
990
原创 Linux相关概念和易错知识点(33)(基于阻塞队列和环形队列的生产消费模型实现、sem的应用)
1个交易场所(阻塞队列、环形队列等),不同的生产消费模型交易场所不同,可以满足不同需求。,在上篇博客中代码已经表明了。要维护好生产消费模型,3种关系一定要保证,即。(生产者和生产者、消费者和消费者、生产者和消费者)、后续我们的设计一定要满足这“321”原则,缺一不可。wait申请信号量如果成功就会继续执行下面的代码,并且这次我创建了两把锁,因为对于。要实现生产消费模型,无外乎是。于是满足生产消费模型的条件。这就是线程池中的采用的方法。,和mutex一样。这里需要注意的是生产者的。(生产者、消费者)、
2025-03-01 15:29:05
1128
原创 Linux相关概念和易错知识点(32)(互斥锁和条件变量的封装、日志和线程池的实现、策略模式)
就像老师想关心学生成绩,就直接跑到班上去一个一个问。但万一记错了呢?跑错班了呢?这始终不方便。当封装之后,就形成一个管理一把锁的类。什么叫管理一把锁的类?就是这个。
2025-03-01 13:32:12
1249
原创 C/C++相关概念和易错知识点(59)(C/C++缓冲区同步刷新、IO流)
cin和cout是绑定的,意思是调用cin就会先刷新输出缓冲区,调用cout就会先刷新输入缓冲区,这和前面我们遇到的效率问题类似。
2025-02-26 09:49:01
1157
原创 Linux相关概念和易错知识点(31)(生产者-消费者模型、认识信号量、线程安全)
形象的说法是,申请别人不会释放的资源,并且自己也不释放资源、僵持不下的状态就叫死锁。举个例子,B申请A的锁,并且说它得到A的锁后就会释放自己的锁;与此同时,A也在申请B的锁,并且说它申请到B的锁后才会释放自己的锁。它们两个线程谁也不让谁,这就陷入了死锁。单线程也可能产生死锁,一把锁也可能把自己锁住,如连续两次申请锁。当第二次申请锁时,这个线程的右手想要拿左手正在拿着的锁,左手对右手说它需要执行到unlock才会释放,而右手说它马上就要这把锁,不然不让走。这就陷入了死锁。
2025-02-23 21:17:20
1109
原创 Linux相关概念和易错知识点(29)(线程相关性质和操作、线程封装)
不仅如此,所有线程的属性也都做了上层封装,在struct pthread里面,由pthread.so维护,这是上篇文章提到的。我们接着看LWP,469053和469054,显然前者为主线程,后者是新线程,这个对象调用其成员函数的整个过程都是在主线程中执行的,只是在类域里面执行函数,创建线程还是算作主线程创建的。我们还能发现主执行流的LWP和PID的值一致,新线程的LWP是紧接着的数字。只要理解了线程控制的基本操作,基本的线程封装就很快能写出来了,我简要讲解思路即可。,我们之前因为都是单线程没发现这一点。
2025-02-19 03:05:00
1110
原创 Linux相关概念和易错知识点(27)(认识线程、页表与进程地址空间、线程资源划分)
接着刚才的例子:找到0010110101 0011010111 0000000000对应地址,这就是某一个页框的起始地址。虚拟地址101011010101会作为该页框的偏移量。至此,虚拟地址能够转为物理地址0010110101 0011010111 101011010101。
2025-02-14 17:06:24
897
原创 Linux相关概念和易错知识点(26)(命名管道、共享内存)
总的来说,key由用户层去设置更容易管理,但key怎么设置呢?理论上只要不冲突,就可以随便设。如果冲突,就会出错,需要手动改,如果我们不希望自己去设置,
2025-01-26 20:41:55
1103
原创 Linux相关概念和易错知识点(25)(信号原理、操作系统的原理、volatile)
对于OS来说,只要完全没有进程,它就陷在死循环中,但只要有进程,就会一直忙着调度,这是时钟源的中断推着它进行的。我们因此可以说。
2024-12-21 11:53:44
1203
原创 Linux相关概念和易错知识点(23)(进程间通信、匿名管道、进程池)
通过进程池的代码,我们能够进一步深入了解进程间通信的原理,其中最难理解的就是数据不一致问题,匿名管道的面向字节流就决定了它不适合多次数据传输,不过我们依然使用它走完了进程池的流程,了解即可。在整个过程中,读写端都将对方当作了文件,都是对pipe文件进行IO,这再次体现出Linux一切皆文件的思想,值得我们体会。
2024-12-05 22:06:09
1036
原创 Linux相关概念和易错知识点(22)(ELF格式、可执行程序的加载、共享库)
如果没有逻辑地址的概念,那么编译器会很难办,因为内存的使用都是动态变化的,没有哪一块空间是每时每刻都空闲着的,如果给这个指令编址后,当运行程序时,这个地址被占用怎么办?除此之外,如磁盘上的文件的物理地址,各个section的位置都是以偏移量的形式来保存的。由于section偏移量及其大小属性的存在,程序加载时不一定就要加载数据,可以先根据section的偏移量初始化页表的虚拟地址,当执行时懒加载,当然也可以分批加载。调用库函数的基本逻辑是修改库所在位置的起始地址,加上库方法本来就有的逻辑地址定位。
2024-11-21 09:46:19
1226
原创 Linux相关概念和易错知识点(20)(dentry、分区、挂载)
系统最开始就要加载根目录到内存中,创建dentry,后续的访问也都是根据根目录文件的内容来逐渐建立dentry多叉树的。当我们cd进入某一个目录里时,有可能我们根本没有进入对应的目录文件(目录文件真实存在),而实际上进入了一个分区,这是通过挂载点进行特殊实现的。我们的dentry讲解中存在一个巨大的漏洞,那就是文件的inode是以分区为界限的。,会按照ext2的格式结合我们文件的大小自动将分区分为不同的块,初始化超级块等操作。问题的根源来自分区的确定,我们只要确定了分区,上面的问题就都能解释了。
2024-11-09 17:59:16
1151
原创 Linux相关概念和易错知识点(19)(HDD、Block group)
之后就需要存储内容了。我们需要知道,存储数据时会在GDT找Block Bitmap的空闲块,最后在对应的Data blocks存数据。但如果这个时候Data blocks存满了呢?inode是白白创建了吗?我们需要删掉这个inode,直到找到一个能存数据的组再创建inode并存储吗?
2024-11-09 08:24:39
1190
原创 Linux相关概念和易错知识点(18)(重定向、语言级缓冲区)
用户级(语言级)缓冲区是为了减少系统调用的次数,减少系统调用的开销;系统级缓冲区是为了减少IO次数,减少和硬件访问的次数。语言级缓冲区的设计原则就是:尽量少的调用系统接口。我们能意识到C语言的语言级缓冲区的设计非常注重效率。C++文件流里面也有缓冲区,是类似的。我们平时其实也都需要遵循这个原则。如申请内存一般都是一次申请比较多的空间,用空间换时间。
2024-10-29 12:42:47
1093
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅