- 博客(130)
- 收藏
- 关注
原创 Mysql的索引
索引:从本质上来说索引就是一个数据结构,索引也是磁盘文件。使用索引需要进行磁盘IO操作。当索引文件过多时,数据的改变会导致索引的更改,而索引也涉及了磁盘的IO操作。当没有索引时,进行全表扫描,而有索引时只需要进行索引扫描速度会更快一些。当给name列加上索引时:经常作为where过滤条件时要加上索引,字符串列创建索引时尽量控制索引的长度不能过程。总结来说,InnoDB引擎下的数据确实是存储在索引树节点上的,具体的存储方式取决于数据是通过聚簇索引还是辅助索引进行访问的。索引的类型:单列索引 多列索引。
2024-08-29 20:16:57
317
原创 有效的括号--利用栈
思路:从字符串的第一个位置开始遍历,若是该位置和栈顶元素能配对那么让栈顶元素出栈,若是不能和栈顶元素配对则讲该元素压入栈中。若是有效的字符串那么当栈中将没有字符串元素。,判断字符串是否有效。
2024-08-29 15:45:57
210
原创 数据库的范式
你在关系型数据库管理系统(RDBMS),例如SQL Server,Oracle,MySQL中创建数据表的时候,如果数据表的设计不符合这个最基本的要求,那么操作一定是不能成功的。也就是说,只要在RDBMS中已经存在的数据表,一定是符合1NF的。第三范式:属性不依赖于其他的非主属性。应该把学生表和学院表单独作为一个表,是一对多的关系。一对多的关系时需要加一个外键子表关联父表的主键。第二范式:非联合主键的每一个属性都和联合主键的每个键都有关系。所示的情况,就不符合1NF的要求。作用是减小表的冗余。
2024-08-26 13:50:24
161
原创 最长递增子序列---动态规划
dp【i】为在位置为i时的子序列的最大长度。dp【i】的值取最大的一个。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。最长递增子序列是 [2,3,7,101],因此长度为 4。,找到其中最长严格递增子序列的长度。
2024-08-25 16:59:25
155
原创 动态规划--爬楼梯
从而得出转移方程为:F(i) = min(F(amount - 1) , F(amount - 2) F(amount - 5)F(amount - 7)) ...............;给你一个整数数组 coins ,表示不同面额的硬币;计算并返回可以凑成总金额所需的 最少的硬币个数。则,当 i==0 时无法用硬币组成,为 0。当 i<0 时,忽略 F(i)你有多少种不同的方法可以爬到楼顶呢?F(0) 0 //金额为0不能由硬币组成。F(i) 最小硬币数量。
2024-08-24 17:16:15
228
原创 单词拆分【动态规划】
返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。dp[i]的递推公式:dp[i] = find(substr(s,i - j))&&dp[j];返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。单词拆分我们可以看作是背包问题,即字典中的物品是否可以放满背包。不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。如果可以利用字典中出现的一个或多个单词拼接出。注意,你可以重复使用字典中的单词。
2024-08-15 17:02:42
308
原创 股票买卖的最佳时机一、二
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。我们用dp[i][0]表示第i天持有股票的最大利润,dp[i][1]代表第i天不持有股票的最大利润。dp[i][1] 在第i天不持有股票意味着 第 i-1 天可能持有然后在第i天卖了,也可能第 i-1 天也不持有保持不变。在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。你也可以先购买,然后在。
2024-08-14 18:43:04
515
原创 合并两个有序数组
此题通过双指针来解答,一个i指针指向nums1数组的尾部,j指针指向nums2数组的尾部,大的写到nums1数组的最尾部(注意不是真正的尾部)。,5,6] ,其中斜体加粗标注的为 nums1 中的元素。最终,合并后数组不应由函数返回,而是存储在数组。需要合并 [1,2,3] 和 [2,5,6]。个元素表示应合并的元素,后。中,使合并后的数组同样按。
2024-08-13 15:51:36
106
原创 智能指针shared_ptr的交叉引用
在程序结束的时候p2在栈上将会释放new B()的资源,此时new B()被应用的次数为2,此时引用计数减一,不进行释放。p1的结束时释放new A()的资源,此时new A()被引用的次数为2,引用计数减一不进行释放。所以最后未进行释放。
2024-08-12 00:48:16
196
原创 单例模式(懒汉模式,饿汉模式)
线程安全的懒汉单例模式:懒汉单例模式是在调用函数的时候生成的,为了防止同一个线程调用需要加上互斥锁。同时减小锁的粒度,采用锁+双重判断的方式。极为简洁的懒汉单例模式:在局部的静态变量中默认存在着互斥锁,本身不存在线程安全问题,所以在局部变量的情况下不需要维护线程安全问题。单例的饿汉模式:在主函数未调用之前该单例就已经存在了,所以不存在线程安全的问题。
2024-08-08 21:13:00
538
原创 使用RPC服务的步骤
1.首先服务的发布方在proto文件里面描述发布的方法,例如发送一个注册方法。这样就完成了一个服务方和调用方对rpc服务的使用。
2024-08-07 19:59:20
289
原创 RPC远程调用方在调用时需要进行的操作
protobuf允许我们使用 fixbug::UserServiceRpc_Stub stub(new MprpcChannel()),来调用rpc的服务方法。其中stub对象需要通过channel构造,在调用login函数时,会进入到callmethod方法。我们可以重写channel的callmethod方法来处理将login里面的参数序列化发送到服务的提供方。
2024-08-07 19:34:00
240
原创 ProviderRpc发送服务二将远程调用来的信息反序列化后调用服务方的方法,并将服务方的结果返回给发送方
/ 获取service对象 new UserService。// 获取method对象 Login。获取方法的参数:request和response,这些。
2024-08-06 18:44:20
324
原创 RpcProvider发送Rpc服务一
在此期间为了防止出现,粘包问题,在buffer中以此格式存放数据:”11helloworld4mess“,通过读取前四个字节来获取头部的长度为11字节。然后取前11个字节的数据,进行反序列化得到相应的值。再根据序列化的值会得到4从而得到最后“mess”。OnMessage函数用于处理连接到服务端的请求,接收到的buffer数据通过protobuf进行反序列化为rpcreader类,从而得到服务类和服务方法的名字。
2024-08-05 20:55:09
269
原创 RPC和gRPC的区别
头部压缩(Header Compression)是 HTTP/2 引入的一项技术,用于减少 HTTP 请求和响应头部的大小,从而提高网络传输的效率和性能。在 HTTP/1.x 中,每个请求和相应地都会承载完整的头部信息,这些头部信息往往包含大量的波形数据。在 gRPC 中,支持四种不同的 RPC 模式:单向 RPC、服务器流式 RPC、客户端流式 RPC 和双向流式 RPC。客户端请求一个用户的所有订单,服务器以流的形式返回订单信息。客户端发送一个请求来获取用户信息,服务器返回该用户的信息。
2024-08-05 19:48:15
1074
原创 RPC通信的简单流程
UserRpcServiceRpc和UseRpcServiceRpcStub是继承关系,UseRpcServiceRpcStub里面通过channel成员去调用callMethod方法。通过重写channel来调用不同的method方法。远程调用者假设需要调用Login方法,将调用的信息通过muduo库,同时进行了序列化和反序列化,发送到Rpcprovider上,RpcProvider通过对象和方法表来确定需要调用哪个服务对象的哪个方法。
2024-08-05 18:48:22
290
原创 RpcProvider启动网络服务
RpcProvider主要将一些服务发布为rpc方法,可供其他进程或者机器调用使用,之后启动该节点,开始提供远程网络调用服务。在run操作中主要使用muduo库来启动网络服务。
2024-08-05 17:10:20
276
原创 线程的创建Linux下
进程的创建:第一个参数通常传递一个pthread_t 的地址,第二个参数为线程的属性,第三个参数为函数指针,是子线程要做的事情。sleep主要是为了等待子线程退出,因为当主线程退出时,子线程将没有进程空间,子线程自然无法运行。因为t是存储在子线程的栈中的,所以上述代码应该将t定义为全局变量或者是静态变量。,可以避免僵尸线程状态和资源泄露,确保线程资源在子线程终止后得到正确处理。线程退出是指将调用该函数的线程退出,但是不会导致此空间释放。来等待子线程结束,并获取其退出状态。内核负责标记和回收子线程的资源。
2024-08-01 11:15:43
120
原创 信号量的实例
/最后一个成员通常被设置为SEM_UNDO,使得操作系统跟踪当前进程的信号量修改情况,如果进程在没有使用该信号量的情况下终止掉,那么操作系统会自动释放该进程持有的信号量。cmd通常有两个最常用的值,SETVAL,IPC_RMID,SETVAL表示把信号量初始化一个已知的值,IPC_RMID表示删除无需再使用的信号量。key的作用是一个整数值,不相关的进程可以通过他访问同一个信号量。semid是第一个函数返回的信号量描述符,类似于文件描述符。该函数的作用是创建一个新的信号量或者是获取一个信号量。
2024-07-26 19:28:57
260
原创 select、poll、epoll的区别
1. SELECT的机理以及缺陷:1. SELECT的机理以及缺陷:poll函数实现的机理:1.在调用select函数时,第二个参数为&read_fds,这个参数实际上就是左侧图中的bitmap,总共有1024位,CPU会将该bitmap从用户态拷贝到内核态,由内核去判断是否有就绪事件的发生。2.在判断过程中,调用select函数的进程会处于阻塞状态,当客户端给服务端发来数据时,会拷贝到数据的接收队列中,当接收队列中有数据时,会唤醒相应的进程。
2024-07-25 17:10:43
572
原创 epoll的实现
首先在epoll_create()会创建一个file事例,通过private_data创建eventpoll实例,当增删改时,会对rbr进行操作,rdllist存储的是就绪的事件。2.epoll在epoll_wait()函数中,struct epoll_event *events参数只带出就绪事件。红黑树在比较的时候,会按照文件地址进行比较,如果地址相同则比较文件描述符,因为相同地址的文件会有不同的文件描述符。1.epoll在内核里维护了一颗红黑树,减少了在用户态和内核态之间数据的拷贝。
2024-07-24 20:41:00
188
原创 阻塞IO和非阻塞IO【多路复用】
从标准输入读上数据,通过write将数据从网卡发送到服务器接收,夫区其发来的数据通过网卡传递到接收缓冲区,客户端来读取数据。fgets和read函数默认状态下都为阻塞状态,因此当fgets处于阻塞状态时,即使read对应的接收缓冲区有数据时,也不会读到。IO阻塞:例如在socket中,接收内核缓冲区内没有数据时,read将会处于阻塞状态,阻塞的程序将会被挂起。IO复用将标准输入、输出、套接字等都看作IO的一路,无论哪一路有事件发生时都会通知应用程序取处理相应的事件。磁盘io、网络io、标准输入输出。
2024-07-24 19:53:30
344
原创 系统调用【用户态和内核态之间的转换的基本流程】
当我们从用户态转入到内核态时往往需要通过系统调用,在使用printf函数时,可能内部会调用一系列其他函数来到达对操作系统的调用接口。将printf封装这是库函数,方便我们进行使用,在printf中会有一个write()函数,此时通过write系统调用的接口进入内核态,内核态中同样也有write函数,此函数里面会出现out或者in操作。2.根据调用的方法来获取系统调用号,因为在系统调用程序时需要通过系统调用表(操作系统初始化时确定的)来决定调用具体哪一个方法。1.将用户态寄存器的地址保存到pt_regs中。
2024-07-23 21:13:40
634
原创 键盘是如何使用中断机制的?当打印一串字符到显示屏上时发生了什么???
当打印完后需要响应一次中断,之后CPU还需要将内存的打印字符再送到打印机的寄存器中,会极大浪费cpu的开销。此时加入一个DMA机制来缓解CPU的的开销,将数据移动的任务交给DMA,只需要在所有打印任务完成之后触发一次中断,最后恢复应用程序1的后续操作即可。
2024-07-23 20:25:42
501
原创 CPU与IO设备交互
程序执行时判断状态寄存器是否为busy,如果busy则等待,如果ready则将内存的数据写到exa寄存器中,再将寄存器里的值写数据寄存器里面,此时需要处理数据,所以设置状态寄存器为busy,再将数据加载到命令寄存器中,通过控制电路去打印相应的数据,当打印完成时再将设置为ready,ready时才可以往数据寄存器内写入数据,通过一个中间件来完美地控制打印机的操作。通过判断状态寄存器是否busy或者ready来决定是否将数据加载到寄存器里。问题:CPU如何知道将数据发送给哪一个寄存器?
2024-07-23 18:36:20
184
原创 操作系统的启动以及用户态和内核态
开始时通过bootloader将os程序从磁盘加载到内存中,cpu通过读取内存中的操作系统指令进行操作。应用程序通过系统调用和操作系统交互,操作系统和外设可通过两种方式进行交互,例如汇编指令和中断机制。1.计算机通电后,主板接上电,cpu执行主板上的bios指令,bios检查bootloader指令,将其加载到内存中。2.cpu执行bootloader指令,bootloader将os程序从磁盘加载到内存中。内核态:是操作系统进行时的状态,在操作系统中出现一些特权指令是被允许的。
2024-07-23 17:43:49
173
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人