- 博客(93)
- 收藏
- 关注
原创 I/O模型的一些理解
异步:把事情推到以后去做阻塞:专心做一件事情同步阻塞:马上专心做一件事情同步非阻塞:一边做一件事情,一边做另一件事情(一心二用)异步阻塞:把问题推到以后专心处理异步非阻塞:把问题推到以后时不时处理一下。
2024-03-28 16:29:49 892
原创 Bert的一些理解
BERT 模型的训练数据集通常是以预训练任务的形式来构建的,其中包括两个主要任务:Masked Language Model (MLM) 和 Next Sentence Prediction (NSP)。下面简要介绍这两个任务在数据集中的格式:举个例子举个例子:对于每一个训练样例,我们在语料库中挑选出句子A和句子B来组成,50%的时候句子B就是句子A的下一句(标注为IsNext),剩下50%的时候句子B是语料库中的随机句子(标注为NotNext)。接下来把训练样例输入到BERT模型中,用[CLS]对应的
2024-03-19 17:17:16 534
原创 记忆化搜索
的矩阵 ,要求选择一个起点,然后选择上下左右四个相邻方向之一开始行走,并且要保证行走的点的值比当前点小,即找一条单调递减的路径,要求这条路径最长。偏序关系其实就是代表了状态转移的方向,例如上面只允许值大的往值小的方向走,这就是一种偏序关系;今天每日一题可以用dp做,但是看答案有人用记忆化搜索,以前也经常听到这个名词,so今天好好来学一下,什么是记忆化搜索。因为在递归计算的时候,我们必须保证传入参数的合法性,所以这一步是必要的,比如坐标为负数之类的判断;的值,而不需要使用额外的变量。时,我们可以直接修改。
2024-03-15 17:35:25 748
原创 关于c++右值的一些理解
在测试程序中getObj()的返回值就是一个将亡值,也就是说是一个右值,在进行赋值操作的时候如果=右边是一个右值,那么移动构造函数就会被调用。移动构造中使用了右值引用,会将临时对象中的堆内存地址的所有权转移给对象t,这块内存被成功续命,因此在t对象中还可以继续使用这块内存。将亡值:与右值引用相关的表达式,比如,T&&类型函数的返回值、 std::move 的返回值等。,其生命周期与右值引用类型变量的生命周期一样,只要该变量还活着,该右值临时量将会一直存活下去。右值引用就是对一个右值进行引用的类型。
2024-03-04 14:20:39 884
原创 最小生成树Prim + Kruskal
通过这个例子可以看到,t.join(1, 3);还是t.join(3, 1);最后判断t.isSame(1, 3)都会是true。这里不能直接将isSame抽象出来,在join里面调用,必须寻根以后再。通过模板,我们可以知道,并查集主要有三个功能。这里直接用carl给的模板。
2024-02-28 18:33:50 345
原创 LFU算法
大致就是说LFUCache类维护一个存放node的map,同时维护两个双向链表,注意这个双向链表里面又包含了两个双向链表,访问的频率是first最大,last最小。其余的就是正常的双向链表的操作了(插入,删除)Leetcode有原题,之前手写过LRU,数据结构还是习惯于用java实现,实现是copy的评论题解。Least Frequently Used(最不频繁使用)
2024-01-24 17:07:33 384
原创 正向代理和反向代理
事实上,正向代理和反向代理的作用都是进行请求和转发,但是为了区别正向代理,所以后出现的就成为反向代理。生活中最常见的例子:1、正向代理: 卖票的黄牛2、反向代理: 出租房的二手东。
2024-01-16 17:39:31 827
原创 Linux高性能服务器编程——学习笔记①
当发送端使用send或write向一个TCP连接写入数据的时候,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即TCP报文段。 第二,ARP请求和应答是从以太网驱动程序发出的,而并非像图中描述的那样从ARP模块直接发送到以太网上,所以我们将它们用虚线表示,这主要是为了体现携带ARP数据的以太网帧和其他以太网帧(比如携带IP数据报的以太网帧)的区别。如何将机器的域名转换成IP?
2024-01-13 16:33:58 949
原创 virtualbox共享文件夹
home/zyt/win_workspace/ : 虚拟机的文件夹。shared_file : 共享文件夹的昵称。对应于D:\Workspace。
2023-12-27 16:21:55 474
原创 C++线程同步之条件变量
看这块的时候,可以结合c里面的条件变量一起看,机制都一样,函数不一样罢了。条件变量是C++11提供的另外一种用于等待的同步机制,它能阻塞一个或多个线程,直到收到另外一个线程发出的通知或者超时时,才会唤醒当前阻塞的线程。条件变量需要和互斥量配合起来使用,C++11提供了两种条件变量:std::mutexnotify_one()或者唤醒一个或者所有被阻塞的线程。
2023-12-22 11:19:52 44
原创 python删除空文件夹
这种方式只能删除树上,最底层的空文件夹,如果某个文件夹内部只有一个空文件夹,那么上述代码执行以后,该文件夹最后也会变成一个空文件夹,但是不会被删除掉。
2023-12-17 04:17:07 73
原创 UDP特性之广播
发送的ip统一填广播地址,比如10.82.254.255接收方的bind的ip要么INADDR_ANY要么具体的ip(这个好像不行,留个疑问)直接不填也行。
2023-12-14 14:33:49 191
原创 (important)关于socket的一些理解
因为之前都是统一指定的ip为127.0.0.1 一直只是尝试本机通信,明白上述三点以后,seraddr.sin_addr.s_addr到底应该填多少,相信大家心里都会清楚。然后再调用bind函数,表示服务端程序,允许任何本地IP地址接受连接,(因为可能有多个网卡,多个ip地址),同时绑定本地的9999端口。客户端的端口号应该是操作系统自动分配的。至于其他的通信函数,可以看之前写的文章。
2023-12-13 18:32:42 367
原创 基于UDP的套接字通信
udp是一个面向无连接的,不安全的,报式传输层协议,udp的通信过程默认也是阻塞的。UDP通信不需要建立连接,因此不需要进行connect()操作UDP通信过程中,每次都需要指定数据接收端的IP和端口,和发快递差不多UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息UDP对接收到的数据报不回复确认信息,发送端不知道数据是否被正确接收,也不会重发数据。如果发生了数据丢失,不存在丢一半的情况,如果丢当前这个数据包就全部丢失了。
2023-12-13 14:37:19 96
原创 IO多路转接之epoll
epoll 全称 eventpoll,是 linux 内核实现IO多路转接/复用(IO multiplexing)的一个实现。IO多路转接的意思是在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。epoll是select和poll的升级版,相较于这两个前辈,epoll改进了工作方式,因此它更加高效。对于待检测集合select和poll是基于线性方式处理的,epoll是基于红黑树来管理待检测集合的。
2023-12-11 16:37:48 48
原创 IO多路转接之poll
从上面的测试代码可以得知,使用poll和select进行IO多路转接的处理思路是完全相同的,但是使用poll编写的代码看起来会更直观一些,select使用的位图的方式来标记要委托内核检测的文件描述符(每个比特位对应一个唯一的文件描述符),并且对这个。一点自己的思考:现在写的一些通信方式,都是基于固定大小的数组,是理想的情况,如果数组比较小,多次write或者多次read怎么解决?内核会根据第二个参数传递的值对参数1数组中的文件描述符进行线性遍历,这一点和select也是类似的。指定poll函数的阻塞时长。
2023-12-11 10:28:30 26
原创 关于read函数阻塞的问题
末尾提到了一点,服务端读取每次是读取10个字节的,如果超过10个字节,需要读取多次,但是客户端只会read一次,第二次read的时候,直接阻塞了。
2023-12-08 17:58:45 109
原创 IO多路转接之select
但是上面的客户端代码有个问题,就是服务端多次写入的时候,客户端只能收到前面10个字节的数据,但是如果循环调用read,客户端read会阻塞,因为这里服务端是不会主动发送数据的,只是把客户端传过来的数据重新传回去。在select()函数中第2、3、4个参数都是fd_set类型,它表示一个文件描述符的集合,类似于信号集 sigset_t,这个类型的数据有128个字节,也就是1024个标志位,和内核中文件描述符表中的文件描述符个数是一样的。IO多路转接也称为IO多路复用,它是一种网络通信的手段(机制),
2023-12-08 16:27:15 219
原创 套接字通信类的封装
/ 创建监套接字return -1;printf("套接字创建成功, fd=%d\n", fd);return fd;// 绑定本地的IP和端口return -1;printf("套接字绑定成功, ip: %s, port: %d\n",return ret;// 设置监听return -1;printf("设置监听成功...\n");return ret;// 阻塞并等待客户端的连接elsereturn -1;
2023-12-07 19:51:53 69
原创 TCP数据粘包的处理
关于数据包的包头大小可以根据自己的实际需求进行设定,这里没有啥特殊需求,因此规定包头的固定大小为4个字节,用于存储当前数据块的总字节数。但是这种叫法不太对的,本身TCP就是面向连接的流式传输协议,特性如此,我们却说是TCP这个协议出了问题,这只能说是使用者的无知。多个数据包粘连到一起无法拆分是我们的需求过于复杂造成的,是程序猿的问题而不是协议的问题,TCP协议表示这锅它不想背。因为数据的传输是基于流的所以发送端和接收端每次处理的数据的量,处理数据的频率可以不是对等的,可以按照自身需求来进行决策。
2023-12-07 16:39:11 252
原创 Linux进程间通信——共享内存
共享内存不同于内存映射区,它不属于任何进程,并且不受进程生命周期的影响。通过调用Linux提供的系统函数就可得到这块共享内存。使用之前需要让进程和共享内存进行关联,得到共享内存的起始地址之后就可以直接进行读写操作了,进程也可以和这块共享内存解除关联, 解除关联之后就不能操作这块共享内存了。在所有进程间通信的方式中共享内存的效率是最高的。共享内存操作默认不阻塞,如果多个进程同时读写共享内存,可能出现数据混乱,共享内存需要借助其他机制来保证进程间的数据同步,比如:信号量,共享内存内部没有提供这种机制。
2023-12-04 15:48:11 35
原创 Linux进程通信——内存映射mmap
如上图所示:磁盘文件数据可以完全加载到进程的内存映射区也可以部分加载到进程的内存映射区,当进程A中的内存映射区数据被修改了,数据会被自动同步到磁盘文件,同时和磁盘文件建立映射关系的其他进程内存映射区中的数据也会和磁盘文件进行数据的实时同步,这个同步机制保障了各个进程之间的数据共享。使用内存映射区除了可以实现进程间通信,也可以进行文件的拷贝,使用这种方式拷贝文件可以减少程序猿的工作量,我们只需要负责创建内存映射区和打开磁盘文件,关于文件中的数据读写就无需关心了。
2023-12-04 15:07:17 55
原创 Linux进程间通信方式——管道
不管是有血缘关系还是没有血缘关系,使用有名管道实现进程间通信的方式是相同的,就是在两个进程中分别以读、写的方式打开磁盘上的管道文件,得到用于读管道、写管道的文件描述符,就可以调用对应的read()、write()函数进行读写操作了。匿名管道是管道的一种,既然是匿名也就是说这个管道没有名字,但其本质是不变的,就是位于内核中的一块内存,匿名管道拥有上面介绍的管道的所有特性,额外的我们需要知道,第一步: 在父进程中创建了匿名管道,得到了两个分配的文件描述符,fd3操作管道的读端,fd4操作管道的写端。
2023-12-01 18:04:19 41
原创 Linux进程详解
从严格意义上来讲,程序和进程是两个不同的概念,他们的状态,占用的系统资源都是不同的。程序:就是磁盘上的可执行文件文件, 并且只占用磁盘上的空间,是一个静态的概念。进程:被执行之后的程序叫做进程,不占用磁盘空间,需要消耗系统的内存,CPU资源,每个运行的进程的都对应一个属于自己的虚拟地址空间,这是一个动态的概念。
2023-12-01 17:03:19 61
原创 Linux多线程同步
一般情况下,每一个共享资源对应一个把互斥锁,锁的个数和线程的个数无关。当线程调用这个函数,并且sem中的资源数>0,线程不会阻塞,线程会占用sem中的一个资源,因此资源数-1,直到sem中的资源数减为0时,资源被耗尽,但是线程不会被阻塞,直接返回错误号,因此可以在程序中添加判断分支,用于处理获取资源失败之后的情况。当线程调用这个函数,并且sem中的资源数>0,线程不会阻塞,线程会占用sem中的一个资源,因此资源数-1,直到sem中的资源数减为0时,资源被耗尽,因此线程也就被阻塞了。
2023-11-29 15:29:13 866
原创 linux线程详解
线程c版本1、线程概述2、创建线程3、线程退出4、线程回收使用子线程栈使用全局变量使用主线程栈5、线程分离6、其他线程函数线程取消6.2 线程ID比较C++版本1、构造函数2、公共成员函数2.1 get_id()2.2 join()2.3 detach()2.4 joinable()2.5 operator()3、静态函数4、C++线程命名空间4.1 get_id()4.2 sleep_for()4.3 sleep_until()4.4 yield()参考链接c版本1、线程概述线程是轻量级的进程(L
2023-11-28 17:40:43 67
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人