- 博客(23)
- 收藏
- 关注
原创 一文看懂TCP三次握手和四次挥手
如果客户端发送时因为宕机(需要重启),发送了一个SYN报文,之后又发送一个新的SYN报文。如果是旧报文先到,返回的ack会让客户端发送RST报文,服务端释放连接,新的SYN到了之后就会重新建立连接。如果发送RST之前,服务端收到了新SYN报文,那么服务端会返回旧连接的ACK,客户端依然会发送RST报文。如果是新报文先到并建立了连接,旧报文再到就会被服务端根据序列号认定为旧连接不管。如果是两次握手,收到SYN后直接进入ESTABLISHED状态,没有中间状态来阻止历史连接,造成资源浪费。
2024-10-11 14:33:46
1249
原创 TCP/UDP初识
一定是一对一连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;:TCP 协议在传输数据时,并不关心数据的边界。它将数据视为一连串的字节,而不是消息或数据包。这意味着 TCP 不会保留消息边界,它只是负责将字节流从发送端传输到接收端。不会保留发送数据时的任何消息边界。发送方发送的数据可能被 TCP 分割成多个段,也可能将多个消息合并成一个段发送。接收方需要根据应用层协议来识别和重组消息。
2024-10-02 19:48:14
1224
原创 C++语法——多态,虚函数,纯虚函数,虚函数表,虚继承
包含纯虚函数的类称为抽象类(Abstract Class)。抽象类仅仅提供了一些接口,但是没有实现具体的功能。作用就是制定各种接口,通过派生类来实现不同的功能,从而实现代码的复用和可扩展性。
2024-10-02 19:48:02
935
原创 c++强制类型转换
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_ cast。强制类型转换告诉程序的读者和编译器:我们知道并且不在乎潜在的精度损失。如果编译器发现一个较大的算术类型试图赋值给较小的类型,就会给出警告信息;但是当我们执行了显式类型转换,警告就关闭了。static_ cast 对于编译器无法自动执行的类型转换也非常有用。
2024-10-01 13:14:11
951
原创 c++异常处理:throw,try,catch
当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理。此时,检测出问题的部分应该发出某种信号以表明程序遇到了故障,无法继续下去了,而且信号的发出方无须知道故障将在何处得到解决。一旦发出异常信号,检测出问题的部分也就完成了任务。try语句块中检测异常,如果出现异常,通过throw抛出异常,catch语句块中捕捉异常进行对应操作。
2024-10-01 13:13:45
282
原创 指针与引用
引用就是给对象取了另一个名字,声明符&d的形式来定义引用类型。一般在初始化变量时,初始值会被拷贝到新建的对象中。然而定义引用时,程序把引用和它的初始值绑定(bind)在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象一直绑定在一起。因为无法令引用重新绑定到另外一个对象,因此引用必须初始化。引用并非对象,相反的,它只是为一个已经存在的对象所起的另外一个名字。因为引用本身不是一个对象,所以不能定义引用的引用。
2024-08-16 13:10:17
833
原创 智能指针shared_ptr,unique_ptr,weak_ptr
在C++中,动态内存的管理是通过一对运算符来完成的: new,在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化: delete,接受一个动态对象的指针,销毁该对象,并释放与之关联的内存。为了更容易(同时也更安全)地使用动态内存,新的标准库提供了两种智能指针(smapointer)类型来管理动态对象。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。新标准库提供的这两种智能指针的区别在于管理底层指针的方式:shared ptr允许多个指针指向同一个对象;
2024-08-09 12:24:59
837
原创 常量表达式和constexpr
常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。
2024-08-08 21:32:50
241
原创 lambda表达式
谓词是可调用的表达式,返回结果是能作为条件的值,c++算法库algorithm使用一元谓词和二元谓词,比如sort的第三个参数,但是有时操作需要更多的参数,超出了算法对谓词的限制。
2024-08-08 15:09:54
347
原创 Mit6.s081 lab8
基本思想是为每个CPU维护一个空闲列表,每个列表都有自己的锁。因为每个CPU将在不同的列表上运行,不同CPU上的分配和释放可以并行运行。主要的挑战将是处理一个CPU的空闲列表为空,而另一个CPU的列表有空闲内存的情况;在这种情况下,一个CPU必须“窃取”另一个CPU空闲列表的一部分。窃取可能会引入锁争用,但这种情况希望不会经常发生。
2024-08-04 17:06:43
625
原创 Mit6.s081 lab7
假设现在有两个线程T1和T2,两个线程都走到put函数,且假设两个线程中key%NBUCKET相等,即要插入同一个散列桶中。本实验是在给定的代码基础上实现用户级线程切换,相比于XV6中实现的内核级线程,这个要简单许多。实验要求: 实现线程的同步,即每一个线程必须等待其他所有线程都到达barrier之后才能继续进行下面的操作,需要用到。清零之后才能将所有正在睡眠的线程唤醒, 否则如果先唤醒线程的话其他线程如果跑得很快, 在之前的线程将。加1. 注意, 一定要等到所有的线程都达到了这个round, 将。
2024-08-02 17:44:46
287
原创 Mit6.s081 lab6
许多内核使用页面错误来实现写时拷贝版本的fork——。要解释COW fork,请回忆第3章内容:xv6的fork通过调用uvmcopy:309) 为子级分配物理内存,并将父级的内存复制到其中,使子级具有与父级相同的内存内容。如果父子进程可以共享父级的物理内存,则效率会更高。然而武断地实现这种方法是行不通的,因为它会导致父级和子级通过对共享栈和堆的写入来中断彼此的执行。由页面错误驱动的COW fork可以使父级和子级安全地共享物理内存。
2024-08-01 13:43:03
525
原创 Leetcode.203.移除链表元素
本题主要是在于头节点的删除和中间节点删除不一样需要考虑到,因为我们还需要返回这个链表的头节点。2.假设头节点后面连续几个都是目标节点,那么需要去进行加一个while循环处理。5.虚拟头节点可以把两种情况变为一种情况,因为可以方便记录头节点的位置。3.在链表的题目里需要注意,需要先判断节点是否为空才能访问节点。1.假设头节点就是目标节点,所以头节点需要特殊处理。4.c++中需要对删除的节点手动释放。
2024-07-25 17:13:19
241
原创 Mit6.s081lab4
有三种事件会导致中央处理器搁置普通指令的执行,并强制将控制权转移到处理该事件的特殊代码上。一种情况是系统调用,当用户程序执行ecall指令要求内核为其做些什么时;另一种情况是异常:(用户或内核)指令做了一些非法的事情,例如除以零或使用无效的虚拟地址;第三种情况是设备中断,一个设备,例如当磁盘硬件完成读或写请求时,向系统表明它需要被关注。
2024-07-25 15:23:40
1046
原创 Mit6.s081 lab3
首先是物理地址布局理解pagetable_t是uint64*页表指针(64位无符号整数),他指向包含512个页表项的数组,每个页表项也是uint64类型即64位无符号整数,512×64 bits=512×8 bytes=4096 bytes=4 KB,那么每个页表就是占用4KB物理内存申请内存(kalloc.c)添加页表映射copyin函数,将用户态下的地址通过页表查询,转换成物理地址,再把数据从用户空间,拷贝到内核空间,供内核使用。后面会修改成,不拷贝到内核空间,通过进程内核页表直接解引用用户指针。
2024-07-16 19:43:26
702
原创 Leetcode28.找出一个字符串中第一个匹配项的下标(KMP)
kmp实操,分为strstr处理比较函数,和get_next处理next数组。核心还是在于理解next数组,这里给没有匹配的next赋值-1,所以代码中需要有>0的判断。next[j]记录的是到j为止,包括j,前后缀重复长度,所以应该应用于子串j+1的位置。
2024-07-15 13:00:04
256
1
原创 LeetCode--49.字母异位词分组、128.最长连续序列
本题实际意义是将字母组成相同的单词分为一组,那么我们显然首先想如何将“这个条件转化,他们之间的区别实际上就是字母顺序,那么通过对单词排序其实就可以让他们没有差别。而排序后相同的单词分为一组,那么区分组与组之间的就是单词了,所以我们可以用哈希表的方式,让排序后的单词为键,排序前的单词装在一个vector<string>里,因为我们要返回vector<vector<string>>的类型。
2024-04-18 17:22:16
433
1
原创 leetcode——两数之和(新手总结自用)
对于本题,很容易想到暴力解法,两个for循环可以解决,时间复杂度为O(n^2);但我们可以想到式子其实是两个数x+y=target,y=target-x;所以通过一次遍历,在查找对应的y就可以解决,利用unordered_map就可以很好滴解决查找问题;时间复杂度为O(n);
2024-04-15 23:40:05
423
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人