- 博客(162)
- 收藏
- 关注
原创 Linux服务器编程——浅谈同步IO与异步IO的区别
0 前言Linux网络编程中经常出现同步IO和异步IO这对概念。遗憾是的,在这之前我从没找到一个关于这两个概念的清晰定义和理解。今找到一点这方面的材料,特分享之。在解释二者区别之前,先提出一个前置知识,也即同步IO和异步IO的场景:在网络数据传输中,Linux内核进程将TCP/UDP等传输层协议传输来的数据首先存放在内核的内核空间(内核缓冲区)。用户应用进程根据需要或事件驱动,向内核空间发起IO请求,内核进程需要在内核空间(内核缓冲区)中完成数据IO的一系列准备工作(如果此时内核缓冲区中没有数据,内核
2022-05-19 22:37:47
1622
原创 Mysql数据库学习——C++实现Mysql数据库连接池
0 数据库连接池材料清单Mysql数据库连接池包含以下关键组成部分:数据库连接队列数据库最大连接数当前已用连接数当前可用连接数并发安全控制参数数据库连接队列的**互斥锁**数据库连接队列的**同步信号量**1 两处优化单例函数get_instance–用于保证连接池对象全局唯一connectionRAII类–维护和管理连接池对象的生命周期2 实现代码主要包含sql_connection_pool.h、sql_connection_pool.cpp以及locker
2022-05-04 17:27:01
2073
1
转载 【转】深入理解操作系统——对Linux 虚拟内存和物理内存的理解
转载声明对Linux 虚拟内存和物理内存的理解,参见:https://blog.csdn.net/csbmww/article/details/124020707
2022-04-27 11:19:14
193
原创 muduo源码剖析——Singleton单例模式之懒汉模式与DCL双重检查
0 懒汉与饿汉对于Singleton单例模式我们并不陌生,但我们常用的多是饿汉模式:Singleton实例的声明和实例化在instance()函数中同时完成。而懒汉模式要求,Singleton实例的声明和实例化分开:先声明Singleton实例对象,然后调用时才在instance()中完成实例化。具体见下面代码。1 饿汉模式没有事先声明Log单例对象,Log实例同时完成声明和实例化。class Log{public: //C++11以后,使用局部变量懒汉不用加锁 st
2022-04-25 09:52:26
353
原创 muduo源码剖析——ThreadPool线程池的实现
1 线程池原理muduo源码中线程池的实现是基于生产者/消费者模式的,其中缓冲区(即下图中的任务队列)为“环形缓冲区”。其实现原理如下:2 代码实现2.1 类图2.2 代码ThreadPool.h// Use of this source code is governed by a BSD-style license// that can be found in the License file.//// Author: Shuo Chen (chenshuo at chenshuo
2022-04-05 21:58:27
849
原创 muduo源码剖析——基于生产者/消费者模式原理实现无界缓冲区和有界缓冲区
0 生产者/消费者模式两种实现原理我们熟知的生产者/消费者模式都是“有界的”,这里的有界是指缓冲区空间是有限的,缓冲区有填满的时刻。而无界限缓冲区是指缓冲区空间理论上是没有无限大的,没有上上限。因此,第一种缓冲区有限的生产者/消费者模式在进行产品的存取之前,需要借助条件信号量对缓冲空间“为空”、“为满”进行判断。第二种缓冲区无限的生产者/消费者只需要判断缓冲空间是否为空即可。下面以队列作为缓冲区存储结构为例对两种实现原理简述。无界缓冲区// 生产者lock(mutex) queue.p
2022-04-03 09:55:19
1067
原创 muduo源码分析——线程同步中门栓类的设计与实现
0 门栓类最近在看muduo源码时,遇到门栓类这个概念,在此做一下剖析和整理。门栓类,顾名思义,其作用类似于一个门控开关,用于控制和协调主线程与各子线程之间的启动顺序。门栓类主要有以下两种作用方式:用于所有子线程等待主线程发起“起跑”–>主线程发起“起跑”命令后,子线程才可以执行;–>主线程要通知所有的子线程;用于主线程等待子线程初始化完毕才可以工作一个门栓类的实现是建立在互斥信号量和条件信号量的基础上的。1 互斥信号量实现class CAPABILITY("mu
2022-03-30 22:36:44
170
原创 muduo源码剖析——基于RAII思想设计mutex锁的管理类实现mutex锁的动态创建和销毁
0 前言对于mutex锁的使用,mutex的加锁和解锁操作是需要配对使用的。考虑下面这种情况: MutexLock mutexLock;// MutexLock参见后面"1 mutex锁实现类" void f() { mutexLock.lock(); ... if (条件) { return; } mutexLock.unlock(); }该种情况,由于程序提前退出,导致mutexLock未能解锁,从而出现问题。因
2022-03-27 22:30:38
1276
原创 muduo源码剖析——使用pthread_atfork避免多进程多线程并用中出现的死锁问题
0 前言一般情况下,要么只是用多线程并发,要么只使用多进程并发。如果同时使用多进程、多线程,且结合锁的使用,可能会出现死锁。1 多线程多进程并用中出现死锁的场景1.1 代码示例观察下面代码:#include <stdio.h>#include <time.h>#include <pthread.h>#include <unistd.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
2022-03-26 22:44:06
798
原创 leetcode刷题——T494目标和
1 思路分析这个问题至少有两种解法,分别为回溯法和动态规划法。本题使用动态规划法求解的关键在于问题的转换,如何将问题转换为动态规划问题。1.1 问题转换记数组的元素和为sum,添加-号的元素之和为neg,则其余添加+的元素之和为sum−neg,+元素之和减去-好元素之和即为所有元素±元素后的总结果,即:(sum − neg) − neg = sum − 2⋅neg = target即:neg = (sum - target) / 2该问题便可以转换为:在数组nums中选取若干元素,使得这
2022-03-16 11:45:05
434
原创 leetcode刷题——T647回文子串
0 前言今天开一个新的专题,做leetcode刷题的讲解,其目的是对每个题目进行精打细磨,以加深理解,触类旁通。后期会按照题型进行归类整理。1 思路解析本题考虑使用dp动态规划来解。1.1 dp数组二维数组dp[i][j]表示区间[i,j]范围内的子串是否为回文串,是则为true,否则为false。1.2 dp状态转移方程s[i] == s[j]时:若i == j,例"a"、"b"则必然为回文子串,此时dp[i][j]为true;若i与j相邻,例如"aa"、"bb"也是回文子串,此时d
2022-03-12 16:01:08
844
原创 OS系列——操作系统镜像加载BIOS固件工作原理详解
0 前言装过n多系统,制作过n多个启动优盘,所有教程上都讲重装系统前的第一步就是设置BIOS/UEFI为“U盘启动”,但一直不知道何为BIOS/UEFI。最近在学习南大蒋炎岩老师/教授的《操作系统:设计与实践》,终于弄明白了BIOS/UEFI是啥、BIOS/UEFI的工作原理以及操作系统镜像的加载过程这几问题。特将学习笔记整理如下。1 Firm固件/BIOS首先,BIOS和UEFI是两种常用的Firm固件,其中BIOS较为古老,UEFI较为新。思考一个问题:计算机是如何将操作系统镜像源码加载到硬件中
2021-11-10 12:07:36
4239
原创 C++STL系列——深入理解vector容器作用原理
本文源码以GNU2.9编译器为例展开说明,同时参考一下GNU4.9的部分源码。1 vector内存结构和源码1.1 vector内存结构和GNU2.9源码结构1.2 GNU4.9源码结构1.2.1 GNU4.9源码结构1.2.2 GNU4.9源码2 vector内存二次分配原理以push_back()函数为例分析vector内存的二次分配原理。2.1 vector内存分配的整体流程2.2 当空闲空间不够时的二次分配流程注意:vector的两倍增长前后,不仅要大量调用拷贝构造函数
2021-11-09 16:44:39
1457
1
原创 C++STL系列——深入理解list容器作用原理
1 list主要源码和数据结构本文list源码以GNU2.9编译器为例展开说明。2 iterator迭代器list的迭代器本质上是一个class,单纯从list这种数据结构本身来看,list的遍历不能通过next指针++的方式对list元素进行遍历–list的存储空间为链表,其内存空间不是连续的,因此不能使用next指针++的方式推动指针指向下一个元素–封装list迭代器iterator,使变成一个智能的“指针”,可以通过iterator++就可以实现指向下一个元素(list的iterator迭代
2021-11-08 16:05:52
501
原创 C++STL系列——对于allocator分配器中pool allocator分配器的理解
1 pool allocator的优点先说pool allocator相对于其他allocator的优势。如下图所示,当前的主流/默认分配器是基于malloc进行内存分配的,容器中每一个元素在使用malloc进行内存分配时存在一个问题,就是实际需要的内存和额外分配的内存cookie(这些额外内存用于记录实际需要的内粗的大小等信息,在free()时使用)之间的比例太小,即有用的内存太小,额外内存太大。这显然会造成极大的浪费。而pool allocator的思想是,对于相同大小的元素/同一类型的元素放到一
2021-11-02 11:49:51
647
原创 C++系列——关于类中添加virtual虚函数只声明不定义报错的一点理解
1 问题情景经过测试发现,C++类中对普通函数和virtual函数只定义不声明在程序链接时会发生不同的情况。1.1 类中普通函数只声明不定义如下图所示,类中普通函数只声明不定义。程序编译、连接都没有任何问题。1.2 类中virtual函数只声明不定义如下图所示,类中virtual函数只声明不定义。此时程序编译不会出错,但是在程序链接时报错:virtual_test.cpp:(.text._ZN4BaseC2Ei[_ZN4BaseC5Ei]+0xe):对‘vtable for Base’未
2021-10-23 22:03:18
2819
原创 中标麒麟NeoKylin系统使用--使用UFEI安装中标麒麟系统过程中/dev/disk/by-label/NeoKylin does not exit问题的解决
1 问题背景在使用UEFI安装中标麒麟系统时,出现warning:/dev/disk/by-label/NeoKylin does not exit如下图所示(图来源网络):2 原因分析系统在DXE(Driver Execution Enviroment)驱动加载过程中需要查找系统的启动项/启动文件,也就是waining中的:/dev/disk/by-label/NeoKylin显然,根据报错我们可知,问题就出在该启动文件的路径上–找不到对应的启动文件。3 解决方法3.1 确定/查看
2021-08-27 15:00:29
1709
原创 论文阅读——Weakly Supervised Fine-grained Image Classification via Guassian Mixture Model Oriented DisLea
00 文章基本信息文章来源:CVPR2020作者信息:01 摘要以往方法存在的不足:一句话:inaccurate discriminative region localization.分析:the operation of stacking local receptive filed–>Convolutional Neural Network causes the discriminative region diffusion in high-level feature maps–
2021-07-30 09:44:56
660
原创 C++系列——关于指针数组和内存管理的一点思考
(时间紧张,先记一些关键点,回头完善)1 问题核心–指针数组的访问方式指针数组的访问是从数组的第一个元素的地址开始访问,按照每个元素的大小,依次往下。2 指针数组做形参、指针数组返回等系列问题本质:指针数组作为形参时,传入的指针这个指针数组的那个指向首地址的指针,也就是说:函数形参里那个变量其实是一个指针而已,并不是整个数组。同理,指针作为返回值的时候,返回的只是指针(以及这个数组的长度和数组类型(即每个元素的大小–指针每次移动的长度))!!!3 C++变量创建、删除与内存管理3.1 指针数组
2021-07-23 09:08:15
151
原创 项目实战系列——ubuntu18.04下Nginx安装与配置以及踩坑实录
0 前言最近一个项目需要搭建集群,用到负载均衡服务器,因此尝试一下Nginx,一些安装、配置与踩坑实录如下。1 环境配置1.1 我的环境配置ubuntu18.04无jdk、无jre、无tomcat、无nginx1.2 安装jre因为tomcat是基于jre环境的,因此需要安装jre这个java运行环境。网上部分材料说要安装jdk,在这里其实是不需要jdk的。(jdk是java开发套件,像我这种不进行java开发,只需要一个java程序运行环境的,只需要配置jre就可以了)因为想到以后对j
2021-07-21 20:35:37
697
原创 项目实战系列——使用python实现AHP层次分析法
0 前言最近在做一个集群的项目,涉及到负载均衡问题,其中节点的综合负载评价部分采用经典的层次分析法,项目需要用C++复现。鉴于Python成熟、方便的矩阵操作,先用Python简单复现一下该算法。1 理论基础关于AHP层次分析法的材料很多,可以自行查阅,推荐参考文献《高可用集群系统关键技术的研究与实现》第4.2和4.3节关于层次分析法的理论介绍和实例说明。概括来说,AHP层次分析法主要分为三大步骤:求判断矩阵的特征值和特征向量;证明判断矩阵的一致性;将判断矩阵的特征向量归一化,得到各指标权重
2021-07-21 19:38:40
1876
1
原创 机器学习系列——关于torch.nn.DataParallel的测试
0 前言前几天把服务器上训练好的模型转移到Jeston开发板上跑测试,加载模型时报错:no module named "model"后来经过一番折腾,终于搞明白原因。是因为在服务器上跑训练时使用了torch.nn.DataParallel进行加速,所以保存后的模型在Jeston开发板上进行torch.load()时报错。今天有时间了解了一下torch.nn.DataParallel这个模型,并进行简单测试。1 torch.nn.DataParallel参考https://zhuanlan.zh
2021-06-03 22:10:21
1541
转载 【转】机器学习系列——深度学习框架Caffe的C++源码解析
参考链接:https://zhuanlan.zhihu.com/p/24343706
2021-04-30 17:32:33
260
1
转载 【转】POI推荐系列——近似熵理论相关知识与代码实现
0 转载声明本博文转载自https://blog.csdn.net/Cratial/article/details/79707169。1 个人补充补充一种近似熵的实现方式:import numpy as npclass BaseApEn(object): """ 近似熵基础类 """ def __init__(self, m, r): """ 初始化 :param U:一个矩阵列表,for example:
2021-03-31 16:59:04
387
原创 论文阅读——An Interactive MultiTask Learning Framework for NextPOIRecommendation with Uncertain Check-ins
00 文章基本信息01 摘要以前方法存在的问题:以前的方法都是对certain的historicalcheck-ins进行学习,得到用户的访问模式,但是对于uncertain的用户historicalcheck-ins(比如模糊和不完整,具体原因为inaccuracy of indoor GPS devices and personal privacy)就不奏效了。our contributions:提出一套framework:interactive multi-task learnin
2021-03-08 17:27:05
894
1
原创 论文阅读——Discovering Subsequence Patterns for Next POI Recommendation
00 文章基本信息01 摘要以往方法存在的不足:当前主流方法在学习用户的check-in序列中的POI-level POI级(如何理解POI-level:比如一个学生一年到头都在学校里不出校门,他的所有的POIs无非就是教室、宿舍、食堂、图书馆,这样的单个POI连起来很难判断出用户的行为模式(有点不太好解释))序列时忽略了那些代表用户的社会经济活动和用户偏好一致性的子序列模式(下面介绍什么是子序列模式)。但是由于很难定义那些complex but meaningful的子序列的granularity粒
2021-03-06 19:34:54
911
原创 论文阅读——Where to Go Next: A Spatio-Temporal Gated Network for Next POI Recommendation
00 文章基本信息01 摘要当前RNNs在处理neighbor check-ins时存在的弊端:rarely consider the spatio-temporal intervals between neighborcheck-ins, which are essential for modeling user check-in behaviorsin next POI recommendation.our contributions:we propose a new Spatio-
2021-03-01 16:07:55
2085
7
原创 论文阅读——Contextualized Point-of-Interest Recommendation
00 文章基本信息01 摘要1 IntroductionPoint of interest (POI) recommendation的目标:aims to find new places for users that they might be interested in.应用场景:help users find interesting spots that will make them enjoy theirvacations when they are in unfamiliar reg
2021-02-28 17:20:13
1126
原创 推荐系统系列学习——推荐系统理论学习框架
0 前言最近系统地看了两本推荐系统方面的数,然后查阅资料并根据自己对这方面的了解,整理了一份推荐系统的理论学习框架。1 推荐系统理论学习框架下图所示为推荐系统理论学习的技术路线图。2 推荐系统架构浅析以下来自https://zhuanlan.zhihu.com/p/270014161一、结构推荐系统的目标是更有效率的连接用户和内容,主要由数据、算法、架构三个部分组成。数据提供信息。数据决定算法的上限算法提供逻辑。算法一方面从数据中挖掘可用的信息,另一方面提供逻辑,用于根据新数据的特征进行
2021-02-22 10:20:12
857
原创 论文阅读——Recommender System: Review
00 文章基本信息文章来源:International Journal of Computer Applications作者:Akshita II year, M.Tech PDM College Of Engineering For Women,Haryana, India;Smita Associate Professor PDM College Of EngineeringFor Women, Haryana, India;01 摘要This paper discuss variou
2021-02-21 21:48:32
269
原创 读书笔记--项亮《推荐系统实践》第七章
第七章 推荐系统实例如何设计一个真实的推荐系统处理不同的数据,根据不同的数据设计算法,并将这些算法融合到一个系统当中是本章讨论的主要问题。本章将首先介绍推荐系统的外围架构,然后介绍推荐系统的架构,并对架构中每个模块的设计进行深入讨论。7.1 外围架构这一节主要讨论推荐系统是如何和网站的其他系统接口的。下图表示了推荐系统和网站其他系统的关...
2021-02-16 22:27:03
647
原创 读书笔记--项亮《推荐系统实践》第六章
第六章 利用社交网络数据基于社交网络的推荐可以很好地模拟现实社会。在现实社会中,很多时候我们都是通过朋友获得推荐。调查显示好友的推荐对于增加用户对推荐结果的信任度非常重要。本章将详细讨论如何利用社交网络数据给用户进行个性化推荐。本章不仅讨论如何利用社交网络给用户推荐物品,而且将讨论如何利用社交网络给用户推荐好友。6.1 获取社交网络数据的途径...
2021-02-15 21:46:12
631
1
原创 读书笔记--项亮《推荐系统实践》第五章
第五章 利用上下文信息本章之前提到的推荐系统算法主要集中研究了如何联系用户兴趣和物品,将最符合用户兴趣的物品推荐给用户,但这些算法都忽略了一点,就是用户所处的上下文(context)。这些上下文包括用户访问推荐系统的时间、地点、心情等,对于提高推荐系统的推荐系统是非常重要的。本章我们主要讨论时间上下文,并简单介绍一下地点上下文,讨论如何将时间信息和地点信息建模到推荐算法中,从...
2021-02-14 20:02:27
827
原创 读书笔记--项亮《推荐系统实践》第四章
第四章 利用用户标签数据背景:推荐系统的目的是联系用户的兴趣和物品,这种联系需要依赖不同的媒介。目前流行的推荐系统基本上通过3种方式联系用户兴趣和物品。基于物品的算法;基于用户的算法;通过一些特征(feature)联系用户和物品,给用户推荐那些具有用户喜欢的特征的物品。这里的特征有**不同的表现方式,**比如可以表现为物品的属性集合(比如对于图书,属性...
2021-02-10 21:24:16
367
原创 读书笔记--项亮《推荐系统实践》第三章
第三章 推荐系统冷启动问题问题背景:推荐系统需要根据用户的历史行为和兴趣预测用户未来的行为和兴趣,因此大量的用户行为数据就成为推荐系统的重要组成部分和先决条件。冷启动问题的定义:在没有大量用户数据的情况下(前提)设计个性化推荐系统并且让用户对推荐结果满意从而愿意使用推荐系统(这是目的),就是冷启动的问题。3.1 冷启动问题简介冷启动问题(cold start)主要分3...
2021-02-08 17:28:36
336
1
原创 读书笔记--项亮《推荐系统实践》第二章
第二章 利用用户行为数据为了让推荐结果符合用户口味,我们需要深入了解用户。通过用户注册时提交的信息来推断用户兴趣存在的缺点:现在的自然语言理解技术很难理解用户用来描述兴趣的自然语言(还存在一种情况:给定的词汇可能不能准确表达/涵盖用户的实际兴趣)用户的兴趣是不断变化的,但用户不会不停地更新兴趣描述很多时候用户并不知道自己喜欢什么,或者很难用语言描述自己喜欢什么因此,我们需要通过算法自动发掘用户行为数据,从用户的行为中推测出用户的兴趣,从而给用户推荐满足他们兴趣的物品。基于用户行为分析的推荐算
2021-02-07 16:46:31
648
原创 读书笔记--项亮《推荐系统实践》第一章
第一章 好的推荐系统1.1 前言推荐系统的基本任务是联系用户和物品,解决信息过载的问题分类目录和搜索引擎各自存在的问题:分类目录:搜索引擎:搜索引擎需要用户主动提供准确的关键词才能寻找信息推荐系统:帮助用户快速发现有用信息,和搜索引擎不同的是,推荐系统不需要用户提供明确的需求,而是通过分析用户的历史行为给用户的兴趣建模,从而主动给用户推荐能够满足他们兴趣和需求的信息。索索引擎和推荐系统的区别:搜索引擎:用户有明确的查找需求–>用户需要推荐系统:用户没有明确的查找需求–>用户可能
2021-02-03 17:12:00
368
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人