- 博客(50)
- 收藏
- 关注
原创 进程间通信(命名管道)
2. 命名管道通过特殊的管道文件路径来标识唯一性,不同的进程的文件描述符表是独立的,但如果都对同一个文件进行操作,该文件的属性,缓冲区,方法级,都是一样的,所以不通过的进程只需要让自己的文件描述符指向同一个文件的相关属性即可,怎么知道不同的进程打开的文件是一样的?1. 前一章说了匿名管道是通过借鉴文件系统的属性方法缓冲区等,操作系统实现的一套具有血液关系的进程通信机制,本质是让不同的进程看到同一份资源(通过子进程继承父进程的文件描述符表),那么命名管道如何标记同一份资源呢?
2025-05-27 18:09:09
217
原创 进程间通信(匿名管道)
字面意思来看管道是单向流动的,只许一方读一方写,或者一方写一方读,也就是特殊的半双工,除非创建2个管道通信,也就是全双工。
2025-05-27 15:34:18
826
原创 动静态库--
1. 每个函数内部的地址都是相对于该函数的起始位置的偏移量,比如 1168 -> 1 ,-> 2 , -> 3,1加上1168就能访问到具体的语句,被称为相对编址,而上图没有采用,而是采用的绝对地址,1168 -> 116c,直接访问116c不需加上偏移量,被称为绝对编址,这种采用绝对编制范围 全0 ~ 全F,也可以说是逻辑地址(虚拟地址),这个文件里面的地址都是采用ELF格式进行编制的,有自己的固定格式。3. 动态库加载到内存,他的地址是不变的,不管虚拟地址是否变化,最终映射到的库的起始地址是不变的。
2025-05-25 00:00:52
1044
原创 软硬链接--
他们的Inode号是一样的,Link也和上面的软连接不一样,Link就是硬链接数,标识有多少文件与Inode的映射关系,也就是说Inode只有一个,但文件可以有很多个并同时指向这个Inode,类似引用计数,删除任意一个不会影响Inode,只要硬链接数为0,Inode也就会释放掉了。如果被链接的文件被删除或者移动到别的目录下,软连接也就失效了,不会动态随着目标文件而改变,但如果目标文件不在了,但又创建一个和目标文件同名的文件,且路劲和软连接文件的路劲是一样的,就不会失效了。
2025-05-23 00:06:26
662
原创 K个一组链表翻转
很好解决让new一个指针ans,定义一个指针tmp=ans指向他,那怎么让反转后的最后一个节点1指向下一个节点?反转后的状态直接让tmp指向他,也就是 ans的next 指向 prev 所在的位置并让 tmp进行指向(ans后续返回答案要用)。总共5个节点,5/2,总共反转2次,结束让最后的指针指向剩余的节点。然后让tmp指向之前标记的cur也就是pos,也就是反转之前的头部。只要最开始记录1和2,2个节点,并让1指向空,在根据2得到3节点。结束,让tmp指向没反转的节点,节点就是cur指向的节点。
2025-05-21 23:16:21
331
原创 Socket echo server
因为他们的第一个字段是一样的,所以可以用 sockaddr_in和sockaddr_un强转成sockaddr结构,并提取第一个字段判断是AF_INET还是AF_UNIX选择强转成sockaddr_in还是sockaddr_un结构,也就是C语言版的继承和多态。知名端口号比如:HTTP(80),HTTPS(443),DNS(53)。2. 当server启动的时候,就需要accpet获取连接,也就是有连接来了,获取到的连接分配一个文件描述符来进行读写,所以要起多线程/多进程,不然会阻塞后续的accpet。
2025-05-16 19:19:23
617
原创 NAT/代理服务器/内网穿透
当某个内网想访问公网,就必须先找到处于同一个网段的出入口路由器,而内网又不能暴露在公网上,所以当IP地址到达路由器时,路由器会把源IP转换成路由器的WAN口IP,并和源IP进行映射,这里他们互为 key <=> val,当服务器回显时,填充目的服务器IP地址,也就是之前经过转换后的IP地址,源地址填服务器的IP地址,在路由到目的IP所在的路由器,并由该路由器进行查映射表,查到转换之前的私有IP,在进行转发。路由器进行查表:202.244.174.37,查到得到:10.0.0.10,并交付给最初的主机。
2025-05-14 21:45:23
868
原创 -MAC桢-
当某台主机首次通信时,交换机会记录当前主机的mac地址,下次在进行通信,比如交换机首次记录A的mac地址,A再次通信,如果目的mac地址是B,则不需要往交换机右边的碰撞域发送数据包,同时C也能给E/F发送数据,进而减少了数据碰撞,如果A给右边的碰撞域发送数据,那就不会给B/D发送数据包,而是给右边的碰撞域所有的主机发送数据包。4. TCP三次握手的时候,双方会进行MSS的协商,在可变选项指定,因为双方的MTU可能不一样,最终双方使用的MSS取最小的那一个来进行后续数据包发送的大小避免数据包拆分。
2025-05-12 19:34:29
621
原创 ARP协议
5. 当路由器收到数据包,解包之后发现和自己mac地址一样,发现桢类型为0806,交给上层ARP,拿到ARP报头,先看op字段,因为不知道是别人构建的应答还是请求,这次是应答,首先看目的mac地址和目的IP地址和路由器的mac地址和IP地址一样,确定报文是发给路由器,然后得到源macE的地址,自此通过ARP请求根据目的IP地址得到目的主机的mac地址,后续重新封装mac桢填入目的主机mac地址发送数据包。前5个字段为固定字段,填充源ip,mac地址,目的ip地址,目的mac地址缺省广播。
2025-05-11 21:15:14
846
原创 Redis(持久化)
为什么要持久化Redis是跑在内存上的,但内存上的数据是临时的,Redis服务挂了,数据也就丢失了,所以为了解决上述问题,Redis的数据同时都要在内存和硬盘上,理论上内存上和磁盘上的数据要是一致的。
2025-04-19 19:01:51
879
原创 IO多路复用
传统的read,write,都需要等对端写/缓冲区剩余空间足够才能写,相当于大部分时间都在等某个资源就绪,这样会不会太慢了?再比如appect获取连接,如果一直没人来连,就会一直阻塞等待。换句话说,一次性只能处理一个连接,有没有能同时等待多个事件?原理是一次性等待多个事件就绪,然后上层在进行统一处理,在同一时间段效率比传统的阻塞式等待效率要高,就好比如钓鱼,一次抛一个鱼竿和一次抛100个鱼竿,肯定是一次性抛100个鱼竿钓到鱼的概率要大些。
2025-03-25 12:40:05
810
原创 HTTPS
当服务器把自己的公钥传输给客户端的时候,中间人拿到,并用自己伪造的M公钥交给客户但,客户端拿中间人的公钥加密自己的对称密钥,传给服务器,中间人再次拿到客户端加密的数据,拿自己的私钥解密得到客户端的对称密钥,在用客户端的公钥和服务器的公钥加密,传给服务器,服务器解密,得到客户端的对称密钥,但客户端的对称密钥和服务器的公钥已被窃取,后续通信采用对称密钥,中间人已经有了对称密钥,所以也有问题。如果对最开始的密钥进行加密,那么解密的密钥也要传给服务器进行解密,无限套娃,所以只采用对称加密不安全。
2025-03-20 19:28:34
4346
原创 MySQL(索引)
MySQL与磁盘IO交互的基本单位是16kb,这是在逻辑上的角度,因为MySQLd是在内存中的,属于应用层,访问磁盘硬件,必须通过操作系统进行交互,而操作系统IO交互的基本单位是4kb,也就是说操作系统内的文件缓冲区设置为16kb,在从磁盘读取4kb,读4次,在刷新到MySQL预先开辟的buffpoo缓冲区里,所以MySQL与操作系统page的比例为1:4,所以提交效率指的是IO的次数,就好比如读取100k,分一次读100k和分100次读1k,IO交互越少效率越高。
2025-03-18 22:45:50
925
原创 MySQL(事物下)
因为当第一次快照读的时候生成READ VIEW 后续所有的读都会复用第一次形成的READ VIEW,所以即使提交了,但用的是第一次的快照,第一次的时候已经在活跃列表里,所以提交了也看不到。当事物2进行快照读之前,事物4已经提交,根据上面的描述,事物2应该看到事物4的修改(事物4不在活跃列表当中且不大于等于尚未被分配的事物4>4+1)但在读提交的表现可以看出:每次读的时候都会生成新的READ VIEW,新的读取生成的快照里的活跃列表已经不存在提交之后的事物了。,记录最近对表的操作的事物ID。
2025-03-15 22:12:17
1065
原创 MySQL(事物上)
只要输入 begin/start transaction ,事物就需要手动commit,与是否是自动提交没有关系执行事物的时候异常,MySQL会自动回滚到最开始的状态普通的单条SQL也是事物,如果全局提交为0,则需要手动commit,为1执行完自动提交, select 除外上述的操作验证了原子性(回滚),持久性(手动提交(commit)/自动提交(set auto commit=1)) 数据永久有效。
2025-03-14 19:58:35
1057
原创 Cookie/Session
假设有这么一个场景:比如登录一次bilibili,后续在访问就不需要登录了,又因为HTTP是无状态有,无连接的,无状态指客户端与服务器的请求是独立的,HTTP并不会保存客户端的任何信息,即使历史访问过。无连接指每次请求都会建立一次连接,结束关闭该连接,即:HTTP/1.0,比如后续采用HTTP/1.1持久连接:Keep-Alive等。1.HTTP Cookie(也称为Web Cookie、浏览器Cookie或简称Cookie。
2025-03-08 23:24:48
853
原创 TCP全连接队列
假设没有全连接队列/或者backlog为空,当上层很忙来不及appcet,则在忙的期间,可能有很多新的连接,但被服务器直接拒接了,当不忙的时候,之前的新连接就没了,忙的时候很忙,不忙的时候没有连接处理,也就是提高了服务器闲置率和减少给用户服务和体验的效率,但如果有全连接队列,不忙的时候就可以向里面获取连接。假设全连接队列长度很大,比如长度为1000,当全连接队列有连接,说明服务器已经很忙了,处于末端的连接注定要等待更久的时间来被拿走,也减少给用户的体验和效率,长度更大,空间也会有一定的浪费。
2025-01-22 01:15:08
558
原创 TCP协议
上述是数据都收到了的情况,如果前2次丢包了,直接重发,但最后一次,也就是最新的数据丢了,客户端是不知道了,但这时客户端把ACK出去之后,直接进行通信,如果服务器收到就没什么,如果没收到,说明3次握手没完成,客户端就发送数据,服务器收到了数据,但3次握手还没完成,服务器就不会应答ACK,而是应答RST标志位告诉客户端3次握手没完成,连接要重置。当接收端拿到数据不取走,应答的窗口只会越来越小,滑动窗口也就越来越小,也就是右指针不变,当接收端一次把缓冲区数据都取完了,窗口只会越来越大,也就是右指针变得很大。
2025-01-06 02:36:01
627
原创 MySQL(表的约束)
学生表为从表,班级表为主表,学生表的class_id字段跟班级表的id字段建立关系,class_id就称为外键约束,如果不建立外键约束,相当于2个表物理上没有关系,但逻辑上未来插入的学生表的class_id必须在班级表的id里,如果没有外键约束,也就是没有关联起来,在逻辑上是不允许的,但物理上能插入进去,如果添加了外键约束,2张表建立了关系,学生表插入班级表没有的id值就会受外键约束,从而插入失败,反之将来学生表的id数据都是在班级表id当中的。通常和主键搭配使用,作为逻辑主键。
2024-12-12 22:42:29
707
1
原创 MySQL(数据类型)
对标C语言:tinyint->char(1字节): 有符号:127 ~ 255 无符号:0 ~ -128。smallint->shot int(2字节):有符号:32767 ~ 65535 无符号:0 ~ -32768。mediumint(3字节) 有符号:8388607 ~ 16777215 无符号:0 ~ -8388608。
2024-12-11 20:51:19
814
原创 MySQL(库的操作)
1. 大写的是关键字2. [ ]可带可不带3. db_name 数据库名称4.CHARACTER SET: 指定数据库采用的字符集&&COLLATE: 指定数据库字符集的校验规则。创建数据库的时候有两个编码集:1. 数据库的编码集:数据库存储的数据的编码。2. 数据库的校验集:读取数据采用的编码格式。比如:写字写的是中文,别人看得是个会中文的看,而不是不懂中文的。数据库对数据的任何操作对应的编码集必须是一致。
2024-12-09 21:54:00
836
原创 C++(new/delete)
1. new调用函数申请空间。2.在申请的空间上执行构造函数,完成对象的构造。1.在空间上执行析构函数,完成对象中资源的清理工作2.调用函数释放对象的空间。
2024-12-05 22:13:45
1027
原创 C++(右值引用和移动语义,lambda)
析构函数 、拷贝构造、拷贝赋值当中的任意一个,也就是3个都不能写,编译器才会默认生成,对内置类型值拷贝,自定义类型有移动构造和移动赋值 就调 移动构造和移动赋值,没有就调用拷贝构造和赋值重载。先来看看左值引用的常见场景:引用做返回值和传参效率高,无拷贝,但引用返回局部对象,局部对象销毁就有问题,但是传值返回又会拷贝效率低,右值引用则是解决这方面的问题。2. 一但接收参数如果是右值,属性则会退化成左值(为了后续的资源交换),而后续在调用的时候就当作从左值调用了。左值引用就是给左值的引用,给左值取别名。
2024-12-04 21:36:25
802
原创 C++(4个类型转换)
2. 强制类型转换:能隐式类型转换就能强制类型转换,隐式类型之间的转换类型强相关,强制类型转换之间类型关联没有那么大,如:整形和指针,指针与指针。但打印出来的结果不对劲,因为被const修饰了,编译器默认他不会修改,直接放到寄存器里,下次取数据直接拿寄存器里面的,不会到内存里拿。具有相近的类型才能进行互相转换,如:int,char,double都表示数值。2. 支持内置类型转自定义类型,如:单/多参数的构造函数支持隐式类型转换。3.缺点:转换的可视性比较差,所有的转换形式都是一样的,不好排查错误。
2024-12-02 23:55:12
535
原创 设计模式(单例模式)
如果类与类之间有相互依赖关系,全局对象创建顺序可能是乱的,那么就会导致A需要用B类,A类先创建,而B类未创建。如果程序里出现大量的懒汉模式的单例,程序运行起来要预先创建大量的资源,导致程序启动慢。缺点:在C++11之前,多线程环境下有线程安全问题,要加锁保护。借助全局对象在程序运行之前创建初始化,每次访问都是同一个对象。为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。
2024-12-02 17:57:57
755
原创 C++(智能指针)
2.1.1 什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。2.1.2内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。
2024-12-01 23:19:50
751
原创 C++(多态)
2.1.1.必须通过基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。p2,p3是指针或者引用指向了S1,所以调用Student里的fun,s4则是s1拷贝构造,没有指向所以调用Person里的fun。2.2.1 虚函数:即被virtual修饰的类成员函数称为虚函数。
2024-11-29 20:14:39
866
原创 3.无重复字符的最长子串
答案是不需要,因为只有j指向的元素是重复的,这个重复的元素就在i和j之间(包括i和j),那是不是只要让i进行移动到与j重复的元素停下来,然后删掉判断是不是还有与j重复的,如果有就继续往后走,如果没有就让j继续往后遍历,最坏的情况就是与j刚好相遇,由此而知这个思想是基于双指针的一个优化,就是滑动窗口。我们第一个能想到的解法就是暴力解法:固定一个下标i,j往后遍历记录字母出现的次数,如果有重复的则记录结果,j则回到i位置i++,j=i,在重新遍历记录结果,即:双指针,但这个解法时间复杂度为O(n^2)
2024-11-08 21:26:39
324
原创 2658(网格中鱼的最大数目)
本体题意:找一段非0相邻起来的下标,求这些非0相邻起来的下标和的最大值比如上图,最大的非0相邻起来的下标和为13。
2024-10-30 23:27:18
460
原创 初始 ‘IP’ 地址和 ‘端口号’
一.认识IP地址端口号网络字节序等网络编程中的基本概念一.认识IP地址端口号网络字节序等网络编程中的基本概念。
2024-10-26 21:08:30
931
原创 C++模板初阶
重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数。那有没有一个模具,根据模具自动推成代码呢?代码的可维护性比较低,一个出错可能所有的重载均出错。实现一个通用的Swap函数,可以用函数重载。类模板实例化与函数模板实例化不同,,对于字符类型也是如此。,对于模板函数的使用,
2024-02-07 22:37:12
398
1
原创 C++(类与对象中)
通过前面构造函数的学习,我们知道一个对象是怎么来的,那一个对象又是怎么没呢的?析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由 编译器完成的。这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需。无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
2024-02-03 19:41:35
954
1
原创 归并排序及特征复杂度
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。两个有序表合并成一个有序表,称为二路归并。类似与二叉树的后续遍历(左右根),当递归到数据个数为0或1进行排序并回归。
2023-12-16 19:33:07
83
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人