自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

AlexanderGan的博客

Although the basic idea is comparatively straightforward, the details can be surprisingly tricky...

  • 博客(87)
  • 收藏
  • 关注

原创 LLVM优化__通过循环向量化提高代码性能

通过向量化指令提高程序性能

2024-07-06 10:45:04 1733

原创 LLVM后端__llc中值定义信息的查询方法示例

i < n;return res;使用命令将learn_vni_info.cc编译为ll文件(这里我是用的NDK中自带的clang,因为我编出来的代码一般在安卓设备上运行,ndk中已经配置好了交叉编译环境,对应LLVM-17);;3:;!0,!1,!2,!3}!4}!0 =!{i32 1,!!1 =!{i32 8,!!2 =!{i32 7,!!3 =!{i32 7,!!4 =!然后使用命令生成CFG图,然后使用观察结构。

2024-06-02 21:16:12 1189 2

原创 JuiceFS__持久化缓存源码走读

总体来说,JuiceFS的持久化缓存实现方案比较简洁清楚,每个缓存块对应一个文件,通过定时清理空间,使可用空间保持在总容量5%以上,淘汰策略通过遍历keys哈希表来随机两两对比,清除atime较小的那个缓存块文件。该种淘汰策略相比经典的LRU策略更加简单,定时批量清理,留出足够的空间。这种方式清理缓存没有严格按照atime排序进行,可能在清理的准确性上稍弱。

2023-05-05 21:43:53 842

原创 fs/fuse__fuse IO模式与文件元数据一致性问题

fuse用户态文件系统在不同的IO模式下性能差距较大,如何选择合适的IO模式,是一个重要的问题。

2023-02-04 22:46:36 1484

原创 libfuse__源码走读--多线程运行时

本文对源码的分析基于libfuse 3.12.0,主要注释了了libfuse运行时的实现代码。

2022-11-13 19:44:22 950

原创 Android_JNI编程入门

在某些情况下,单独使用Java编程无法满足开发者的需求,这时可以使用JNI(Java Native Interface)来处理。

2022-08-16 23:23:47 927

原创 Rust__使用tonic实现一元及流式(Unary and Streaming)RPC的实例

本文展示了如何通过tonic(gRPC的rust实现)实现一元RPC和流式RPC。实例为通过Unary RPC实现对服务器中哈希表的单个读写,以及通过Streaming RPC进行批量读写。流式RPC可以使得客户端一边发送,服务器一边处理,不需要等到客户端全部发送完再处理,适用于数据量较大的批量处理情况。2.将Proto转换为Rust数据结构通过tonic自带的tonic_build工具(基于prost)将.........

2022-06-13 15:20:51 2105

原创 Rust__基于双向链表Safe实现的简单队列(ListQueue)

Rust__基于双向链表Safe实现的简单队列(ListQueue)  一个简单,不具有泛型的safe双向链表,可以在刷题的时候使用。

2022-06-01 21:35:16 662

原创 Rust__异步mpsc_ channel的基本设计

Rust__异步mpsc_ channel的基本设计1.基本概念  由于在多个线程间共享数据结构容易产生线程安全问题,所以在某些场景下在线程间使用消息发送的方式进行通信,更加安全方便。Go语言中的channel便是经典的案例。Effective Go中说道不要通过共享内存进行通信,应该通过通信的方式共享内存。  mpsc代表的含义是Multi producer, Single consumer FIFO queue,也就是多生产者单消费者先入先出队列。异步的mpsc channel结构具有如下的特点:

2022-04-26 11:49:59 2262

原创 Rust__从标准输入和文件读取二维数组示例程序

Rust__从标准输入和文件读取二维数组use std::io::{prelude::*, BufReader};use std::fs::File;use std::path::Path;pub fn main() { let mut array_2d: Vec<Vec<i32>> = vec![]; read_2d_array_from_stdio(&mut array_2d).expect("input error"); println

2022-01-24 12:52:39 719

原创 CMU15-445/645 Database System/Fall2021 #Project1_BufferPoolManager详细解析

CMU 15-445/645 Database System/Fall2021 #Project1_BufferPoolManagerCMU 15-445是一门数据库系统课程——官方主页CMU-15445。由于官方网站提示不能在公开网络张贴答案,所以本文不会有全面详细的代码,但是会有关键代码的部分。一、LRU Replacement Policy第一个任务是实现缓冲池的LRU算法,这里的LRU算法提供的接口和日常在LeetCode刷题中遇到的接口不一样:在这里插入代码片我们需要实现的是LRURe

2021-10-26 22:03:51 1547 2

原创 Ubuntu18.04安装gRPC-Go的详细步骤(2021/10)

Ubuntu18.04安装gRPC-Go的详细步骤1、

2021-10-10 13:25:28 857

原创 哈希表__C++泛型实现简易的哈希表

哈希表__C++泛型实现简易的哈希表1.简易的哈希表支持Value的泛型, Key值在这里只能用int型,如果要使用其他类型作为Key还需要定义hashCode函数,获取从其他类型映射到int型的哈希函数。这里的扩容机制采用的是负载因子超过限制或者桶中元素超过桶数,则扩容到二倍Size附近的质数,质数可以减少哈希碰撞。下面是简单的原理实现。template<typename K, typename V>struct Pair { Pair(const K& k, const V&

2021-09-20 11:11:28 398

原创 堆__C++泛型实现简易的优先队列

堆__C++泛型实现简易的优先队列最近复习优先队列的实现时,想到了使用泛型的方法来实现,可以灵活的调整优先队列的排序方法,这里小小的分享一下:template<typename T>class Less {public: bool operator()(const T& a, const T& b) { return a < b; }};template<typename T>class Greater {p

2021-08-28 20:36:45 185 1

翻译 分布式__或许是最易懂的Paxos分布式一致性协议基本原理

分布式__Paxos分布式一致性协议的基本原理一、什么是PaxosPaxos是一种算法,用于在一组通过异步网络通信的分布式设备之间达成共识。一个或多个客户向Paxos提出一个值,当大多数(一半以上)运行Paxos的设备同意其中一个提议的value时,我们就达成了共识。Paxos被广泛使用,因为它是第一个被严格证明为正确的共识算法。...

2021-08-15 20:34:26 455

原创 操作系统__锁(Lock)的几种简单实现方式

操作系统__锁(Lock)的几种简单实现方式(1)无锁访问共享资源带来的问题阅读上面的代码可以预计,g_count的预期输出结果是2000,下面我们看看实际的结果:实际运行结果中间出现了1057, 说明对于共享资源的并发访问会导致结果与预期不一致,这是为什么呢? 实际上g_count = g_count + 1 这个操作并不是原子操作。上图解释了为什么会出现这种情况,两个线程都各自执行完了一次循环,我们设想g_count的值会加2,但是实际上只加了1,所以会导致我们看到./lockTest的执

2021-05-22 14:35:53 3836

原创 nginx_图解nginx关键数据结构_双向链表ngx_queue_t

nginx_图解nginx关键数据结构_双向链表ngx_queue_t一、结构解析  ngx_queue_t是一种环形双向链表的数据结构,这个链表不会负责分配内存来存放元素,ngx_queue_t只是将已经分配好内存的元素用双向链表连接起来。  链表的优势在于,可以高效的执行插入、删除、合并等操作。移动链表元素的时候只需要修改链表的指向,因此适合频繁修改容器的情况。  nginx中,ngx_queue_t主要功能有 (1)实现了简单的插入排序 (2)支持两个链表的合并与拆分 (3)获取

2021-04-26 21:53:16 321

原创 缓存置换_LRU与LFU算法的C++实现

缓存置换_LRU与LFU算法的C++实现一、LRU算法的实现示例1输入[[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3返回值[1,-1]#include<unordered_map>struct Node{ Node(){} Node(int k, int v): _k(k), _v(v){} int _k; int _v;};class Solution {public:

2021-04-03 11:48:28 343 1

原创 位运算__从基本逻辑操作到LeetCode位运算习题

位运算__从基本逻辑操作到LeetCode位运算习题一、位运算的常用技巧  常用的位运算符号包括:“ ^ ” 按位异或、“ & ” 按位与、“ | ” 按位或、“ ~ ”按位取反、“ << ”算术左移和“ >> ”算术右移。下面以8位二进制数为例子,展示基本逻辑操作,x代表一个八位二进制数。//或运算x | 0b00000000 = xx | 0b11111111 = 0b11111111x | x = x//与运算x & 0b00000000

2021-02-26 15:16:12 306

原创 归并思想__LeetCode数组中的逆序对&计算右侧小于当前元素的个数

一、剑指Offer 51 数组中的逆序对  在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。题目地址示例 1:输入: [7,5,6,4]输出: 5这里的思路主要就是利用了归并的思想,举个例子,对于[1,4,5,7] ,[2,3,6,8]这两个待归并的序列,  当a[i] > a[j]的时候 显然 [i, m]这个闭区间的所有元素都大于a[j],此时可以将j为2时候的逆序对全部加入,个数为 m - i + 1

2021-02-22 14:58:20 272

原创 http服务器_Epoll类与Server类的实现(C++)

http服务器_Epoll类与Server类的设计与实现(C++)一、回顾Epoll的基础知识  请参见之前的博客文章《UNP学习_I/0复用之epoll函数实现回射服务器》二、代码讲解  很多的细节我会在注释中讲解。(1)Epoll Class://Epoll.h#ifndef __EPOLL_H__#define __EPOLL_H__#include <vector>#include <memory>#include <functional>

2021-02-09 21:15:56 525 1

原创 动态规划与贪心_上升子序列系列问题

动态规划与贪心_上升子序列系列问题一、最长递增子序列给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。来源:力扣(LeetCode)示例1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例2:输入:nums = [0,1,0,

2021-01-18 14:01:42 222

原创 http服务器_简易定时器的设计与C++实现(ref muduo)

http服务器_图文详解定时器的设计与实现(C++)一、定时器的意义  在网络程序中经常需要处理定时事件,比如定时检测一个客户端连接的活动状态,或者设定时间关闭客户端连接等。服务器程序通常管理着大量的定时器,如何高效的组织和管理这些定时器,使得其能在预期的时间点被触发,而且不影响服务器的主要逻辑,对于服务器的性能有很大的影响。二、定时器管理的结构设计  传统的最简单的管理方式是采用按照时间排好序的线性表如排序链表,常用操作的复杂度为O(N)所以在管理大量的定时器时效率不高。  第二种方案是采用二叉

2021-01-09 15:41:07 429

原创 http服务器_图文详解简易Buffer设计与C++实现(ref muduo)

高性能http服务器_Buffer设计与实现(ref muduo)一、Buffer缓冲区存在的意义  高性能http服务器常见的模型就是基于event loop的reactor反应堆模型,采用IO 复用(linux一般是用epoll) + non-blocking IO 网络编程提高性能。non-blocking编程思想的核心在于避免线程阻塞在read、write等系统调用上,否则对之后的event就不能及时做出响应。IO线程只能阻塞在IO复用的函数上,如epoll_wait,所以每个TCP连接都必须要

2020-12-31 16:45:21 620

原创 综合搜索_图解LeetCode_934最短的桥

在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。返回必须翻转的 0 的最小数目。(可以保证答案至少是 1。)来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shortest-bridge思路:先用dfs搜索到第一座岛,将所有的1置为2,并把第一座岛1周边为0的坐标全部加入队列中,便于后边进行bfs,在bfs的时候围绕之前找到的的0的坐标进行搜

2020-12-20 20:45:13 226

原创 线程池_详解C语言实现的线程池

一、线程池功能定义:  频繁的创建和启动线程会带来很大的开销,所以为了提高多线程任务处理效率,才有了线程池。其实池化技术都有一个特点,无论是内存池、线程池还是对象池等池化技术主要都是为了提高资源分配效率,预先分配一些资源在池子中,根据需要动态的调整和分配池中的资源(要弄清楚线程池,需要耐心阅读下面的代码哦,代码来自传智播客的教学资料)。  上图是对线程池基本工作原理的描述,但是实际实现还需要管理者线程来对工作线程进行调配,管理者线程不参与工作。线程池需要具备以下基本功能:1.需要维护一个任务队列,通

2020-12-15 16:59:25 2436

原创 nginx_图解nginx关键数据结构_链表ngx_list_t

nginx_图解nginx关键数据结构之ngx_list_t1、ngx_list_t的定义  ngx_list_t是nginx中封装的链表,与普通链表不同的是,每个链表元素中又挂载了一个连续内存空间,也可以理解为挂载了一个数组。ngx_list_t定义在nginx/src/core/ngx_list.h文件中,下面来看看代码:typedef struct ngx_list_part_s ngx_list_part_t;//链表元素struct ngx_list_part_s { voi

2020-12-02 17:30:33 353

原创 stl_algo_图解lower_bound & upper_bound算法及LeetCode例题

stl_algo_图解lower_bound & upper_bound算法1.1、lower_bound的作用  lower_bound就是二分查找的一种左边界版本,他返回一个迭代器。在排序好的[first, last)区间中寻找value,如果找到这些元素(可能有多个重复的),就返回指向第一个元素的迭代器;如果没找到,那么就返回指向该value的值在不破坏排序条件下应该在的位置的迭代器,例子如下:lb1 = lower_bound(first, last, 2);lb2 = lower_

2020-11-24 19:54:52 287

原创 Qt_undefined reference to `xxx‘ && collect2.exe:-1: error: error: ld returned 1 exit status的解决办法

Qt_undefined reference to `xxx’ && collect2.exe???? error: error: ld returned 1 exit status的解决办法可能的解决办法:这个错误是链接的时候发生的错误。1、检查include的头文件是否有遗漏。2、 .h文件中声明的函数在cpp中没有实现,但其他地方又调用了这个函数。比较隐秘的就是带参的构造函数,需要检查是否声明了没有实现,哪怕是空实现也需要有。3、外部链接库错误,在Pro文件中中重新添加外部

2020-11-16 10:35:37 2091

原创 stl_algo_图解next_permutation、prev_permutation算法

stl_algo_图解next_permutation、prev_premutation算法  STL提供了2个计算排列组合的算法,分别是next_permutation和prev_premutation,这两个算法的作用分别是计算当前排列的下一个排列和上一个排列。例如{1,2,3}的排列按字典序列分别是123, 132, 213, 231, 312, 321这六种,排列123的下一个排列就是132,它没有上一个排列。排列321的上一个排列是312,他没有下一个排列。  这里可以观察出一个规律,如果一个

2020-11-14 14:17:32 278

原创 Qt_Json文件构建与解析的简单实例

Qt_Json文件读写的简单实例1、Qt文件中的Json相关类的介绍(1)QJsonDocumentQJsonDocument类提供了一种读取和写入JSON文档的方法。QJsonDocument是一个包装完整JSON文档的类,它既可以从基于UTF-8编码的文本表示法,也可以从Qt自己的二进制格式中读取和写入这个文档。一个JSON文档可以使用QJsonDocument::fromJson()从基于文本的表示方式转换为QJsonDocument,toJson()将其转换回文本。该解析器非常快速和高效

2020-11-03 13:38:32 1339 1

原创 memstr、strcpy、memcpy的C语言实现

1、memstr的实现实现代码:/** * @brief 在字符串full_data中查找字符串substr第一次出现的位置 * * @param full_data 源字符串首地址 * @param full_data_len 源字符串长度 * @param substr 匹配字符串首地址 * * @returns * 成功: 匹配字符串首地址 * 失败:NULL */ char* memstr(char* full_data, i

2020-10-28 19:48:43 1312

原创 链表排序_使用归并实现LeetCode排序链表

链表排序_使用归并排序链表1、题目描述  在 O(nlogn) 时间复杂度和常数级空间复杂度下,对链表进行排序。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */示例 1:输入: 4->2->1->3输出: 1-&

2020-10-12 20:06:22 308

原创 图解旋转数组_Go实现C++ STL中的随机迭代器版本的rotate算法

旋转数组_Go实现C++ STL中的随机迭代器版本的rotate算法一、旋转数组(向左)的实现方法一  先上图:显然这个方式就是通过3遍reverse来实现旋转数组,这个方法比较简单,不是本文讨论的重点。二、Go实现的STL中的随机迭代器版本的rotate算法//辗转相除法求最大公约数func Gcd(a int ,b int) int{ max := Max(a,b) min := Min(a,b) for min!=0 { t := max % mi

2020-09-20 21:28:18 276

原创 二叉树_使用递归和迭代实现LeetCode二叉树重建

二叉树_使用递归和迭代实现LeetCode二叉树重建题目描述:  输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7限制:0 <= 节点个数 <= 5000题目链接,来源:力扣一、递归法1、思路

2020-09-17 14:45:10 357

原创 UNP学习_组播服务器与客户端的实现

UNP学习_组播服务器与客户端的实现1.1 组播概述  组播是一种介于单播和广播之间的方案,多播地址表示一组主机IP接口,多拨数据报只由对他感兴趣的接口接收。组播可以在Internet和局域网使用。一个多播地址和一个UDP端口的组合称为组播会话(session)。1.2 组播地址1.2.1 IPv4的D类地址  IPv4的D类地址(224.0.0.0到239.255.255.255)是IPv4的组播地址。D类地址的低28位称为组ID(group ID),完整32位称为组地址(group addre

2020-08-22 14:47:20 1449

原创 UNP学习_UDP广播服务器和客户端的实现

UNP学习_UDP广播和组播服务器实现

2020-08-20 16:28:01 589

原创 UNP学习_I/0复用之epoll函数实现回射服务器

UNP学习_I/0复用之epoll函数实现回射服务器一、函数原型#include<sys/epoll.h>int epoll_create(int size);int epoll_ctl(int epfd,int op, int fd, struct epoll_event* event);int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout);struct epoll_

2020-08-15 11:13:12 333

原创 UNP学习_I/O复用之poll函数实现回射服务器

UNP学习_I/O复用之poll函数实现回射服务器1、函数原型:#include<poll.h>struct pollfd{ int fd;//文件描述符 short events;//等待的事件 short revents;//实际发生的事件};int poll(struct pollfd *fds,nfds_t nfds,int timeout);//fds: 数组地址//nfds: 数组的最大长度,数组中最后一个元素下标+1。内核会轮询fd数组中的每个文件描述符//t

2020-08-07 23:17:56 167

原创 UNP学习_I/O复用之select函数实现回射服务器

UNP学习_I/O复用之select和poll函数1、I/O复用模型  I/O复用是阻塞在select系统调用之上,而不是阻塞在真正的I/O系统调用之上。2、函数声明#<sys/select.h>#<sys/time.h>int select(int maxfdpl, fd_set* readset, fd_set* writeset, fd_set* exceptset, const struct timeval *timeout);struct time

2020-07-30 22:50:05 401

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除