自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(129)
  • 资源 (1)
  • 收藏
  • 关注

原创 职场如何有效学习充电

学习过中,也肯定会碰到很多的疑惑或不解,会涉及到和不同人的交流与沟通。学完后,也需要进行学以致用,毕竟对于计算机这种偏向于实践性质的来说,学了不用等于没学。在现在的工作中,需要接触和了解各式各样的内容,但很多时候我自己没遇到过。而平时有感觉没什么时间,因此产生了这个疑问,看完这个课程后,对这块有了较为体系化的了解。很多时候,自己无意之间看的内容,竟然也就排上了用场,那种感觉真的是很美妙。在整体的日常工作、提炼方法(学习)、实践、总结、输出分享中,一步步强化自我,达到学习充电的目的~!

2024-04-14 11:49:08 137

原创 如何做好软件架构

期间也会涉及到和各个部门或组的人进行交流,会涉及到一些软技能。因此要把一个架构做好,需要密切的团队合作,很考验架构师的综合素质和实力。总的来说,软件架构是基于实际业务需求,无法为实际业务服务,再花哨的软件架构都无法产生任何价值。最近学习了Udemy的一个软件架构课程,在此做一个记录和分享。当需求到来,我们需要分以下几个大致步骤进行分析和拆解。

2024-03-23 11:53:49 222

转载 Native Hook 技术,天使还是魔鬼

总的来说 Native Hook 是一门非常底层的技术,它会涉及库文件编译、加载、链接等方方面面的知识,而且很多底层知识是与 Android 甚至移动平台无关的。在这一领域,做安全的同学可能会更有发言权,我来讲可能班门弄斧了。不过希望通过这篇文章,让你对看似黑科技的 Hook 有一个大体的了解,希望可以在自己的平时的工作中使用 Hook 来完成一些看似不可能的任务,比如修复系统 Bug、线上监控 Native 内存分配等。

2023-12-14 21:56:07 102

转载 PLTHook

【代码】PLTHook。

2023-12-14 21:22:46 90

转载 深入了解GOT,PLT和动态链接

上面说了很多.got, .plt啥的, 那么这些section到底是做什么用的呢. 其实这些都是链接器(或解释器, 下面统称为链接器)在执行重定向时会用到的部分, 先来看他们的定义.为了灵活利用虚拟内存空间, 所以编译器可以产生位置无关的代码.可执行文件可以是位置无关的, 也可以是位置相关的, 动态链接库绝大多数都是位置无关的. GOT表可写不可执行, PLT可执行不可写,他们相互作用来实现函数符号的延时绑定. ASLR并不随机化PLT部分,

2023-12-14 20:37:06 158

原创 Linux虚假唤醒

为什么会有虚假唤醒一说。Linux内核这么强大,怎么会出现这样的情况?一直以来也很困惑,看了下文链接中的介绍后,豁然开朗。

2023-12-06 10:00:39 510

原创 WSL2 Ubuntu安装CUDA Toolkit

目前CUDA ToolKit需要切换到WSL2,在WLS1下不支持。

2023-10-30 23:28:07 822

转载 分布式会话跟踪系统架构设计与实践

这期沙龙主要内容有:分布式服务通信框架及服务治理系统、分布式监控系统实践、分布式会话跟踪系统架构设计与实践,特邀美恰CTO讲解时下热门话题“微服务”。其中既包括关键系统设计、在美团点评内部的实践经验,也包括一些项目在业界开源的运营实践。

2023-01-16 11:03:19 149

转载 Google Dapper-大规模分布式系统的基础跟踪设施

比如GFS,会有很多用户,有的可能是直接访问GFS,有的可能是比如通过Bigtable产生对GFS的访问,如果没有Dapper,对这种共享式系统将会很难调试,通过Dapper提供的数据,共享服务的owner可以方便的对用户根据各项指标(比如网络负载,请求耗时)进行排序。比如在搜索系统中,用户的一个请求在系统中会经过多个子系统的处理,而且这些处理是发生在不同机器甚至是不同集群上的,当请求处理发生异常时,需要快速发现问题,并准确定位到是哪个环节出了问题,这是非常重要的,Dapper就是为了解决这样的问题。

2023-01-16 10:55:34 949

转载 简述同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

POSIX同步IO、异步IO、阻塞IO、非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下。POSIX(可移植操作系统接口)把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO按POSIX的描述似乎把同步和阻塞划等号,异步和非阻塞划等号,但是为什么有的人说同步IO不等于阻塞IO呢?先来说说几种常见的IO模型吧。IO模型这里统一使用Linux下的系统调用recv作为例

2022-03-27 23:13:17 532

转载 字符串匹配问题-最长公共子串

问题给定两个字符串str1和str2,输出两个字符串的最长公共子串。问题分析利用动态规划,依次匹配str1[i]和str2[j]判断是否相同:1.相同,上一步匹配的子串长度为dp[i-1][j-1],则状态转换dp[i][j] = dp[i-1][j-1]+1,同时记录新的子串匹配的终点indxend;2.不相同,则状态dp[i][j]=0(匹配的是连续公共子串,所以当前字符不匹配,长度更新为0)注意:若匹配的字符串任意一个位于字符串的起始位置,则说明之前不可能存在匹配的子串,所以dp[i

2022-03-24 09:20:23 564

转载 C++11并发学习之六:线程池的实现

为什么要使用线程池? 目前的大多数网络服务器,包括Web服务器、Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短。 传统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出,这就是是“即时创建,即时销毁”的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于不停的创建...

2022-03-16 10:10:25 297

转载 并发编程中条件变量(condition variables)实现原理

最初想的方向错了,需要从操作系统侧考虑如何实现条件变量。操作系统是主动调用者,而条件变量其实是操作系统预留出的接口。因而这里主要是去考虑记录谁在等待、记录谁要唤醒、如何唤醒的问题。0 介绍以前只是会使用Linux下的条件变量pthread_cond_t,知道它的作用是配合互斥锁解决并发编程的同步问题,没有思考过它的实现原理,今天学习了清华大学陈渝老师的操作系统网课,总算是明白了,特此记录。1 实现条件变量是一种等待机制,每一个条件变量对应一个等待原因与等待队列。一般对于条件变量会有两

2022-03-16 09:52:29 611

原创 高性能网络编程(引自即时通讯网)

我的见解:对于高性能软件,一直认为只要在应用端做足够的性能优化就可以了。这两天看了下面的一系列文章,极大的开阔了视野。将可能的性能瓶颈,从用户态程序转移至内核态程序。固然操作系统对硬件设备做了一层处理,极大的方便了用户进行调用。但在有的场景下,这一层处理速度是否足够,其实也是要打一层问号。如果真的碰到了性能瓶颈,用户态程序、内核态程序都有很大的优化空间,要对其进行综合优化,涉及到大量知识,如操作系统设计(线程、进程、线程切换、阻塞IO、非阻塞IO、同步调用、异步调用)、应用程序开发等。如下图,从最基

2021-12-16 23:25:39 442

原创 Windows下令QProcess弹出CMD界面

需求编写一个控制台应用程序,放到CMD中可以运行。研究了快一下午,来回看了QProcess文档中,关于start、execute、statedDetached相关程序的说明。但通过在被调用程序中插入cout的打印输出观察后,发现运行的程序都是在父进程的cmd中运行。使用方法QProcess文档中有一段关于如下函数原型的描述。大意是说明在Windows平台下,QProcess的实现依靠于CreateProcess API,Qt对其进行了封装,如果需要更细粒度的控制,可以使用CreateProc

2021-10-28 16:08:45 2752 2

原创 c++ extern关键字说明

extern 修饰变量,分两种情况:非const对象当修饰一个非const对象时,它是一个全局变量,整个程序都可以访问。如:file1.cpp中定义,file2.cpp中使用。//file1.cppint num;//file2.cppextern int num;num++;const对象当有const 修饰一个变量时,该对象默认为局部变量,所以要让该变量为全局,在前面加extern。如:需在file1.cpp中的变量加extern,file2.cpp中才可以引用,否则..

2021-09-15 09:39:09 278

转载 进程、线程、协程、例程、过程的区别是什么?

首先解释下程序、进程、上下文切换和线程。然后再解释协程、例程、过程。程序程序:源代码堆起来的东西。相当于一个一动不动没有生命的机器人。虽然是没有生命的机器人,但是它被设计后就表示有了硬件,它的硬件决定了之后它有生命后是如何干活的 机器人有优劣,所以有些优秀的机器人干活很快,而有些机器人干活很慢进程进程:程序在系统上跑起来(运行)之后的东西(动态的)。相当于有了生命的机器人。生命是内核给的,动起来的能力是CPU提供的驱动力。因为在操作系统看来,它已经有了生命,会赋予它一些属性,比如它叫

2021-09-14 09:29:15 1147

原创 程序的编译、链接、装载与运行

在 Linux 操作系统中,一段 C 程序从被写下到最终被 CPU 执行,要经过一段漫长而又复杂的过程。下图展示了这个过程目录编译 目标文件的格式 链接 装载 运行1. 编译编译就是把程序员所写的高级语言代码转化为对应的目标文件的过程。一般来说高级语言的编译要经过预处理、编译和汇编这几个过程。预处理预编译过程对源代码做了如下的操作删除所有的注释信息 删除所有的 #define 并展开所有宏定义 插入所有 #include 文件注 1的内容到源文件中的对应位置,in.

2021-09-06 19:46:54 1265

转载 BitMapIndex,倒排索引原理,B-Tree索引

Bitmap索引时序数据库从抽象语义上来说总体可以概括为两个方面的基本需求,一个方面是存储层面的基本需求:包括LSM写入模型保证写入性能、数据分级存储(最近2小时的数据存储在内存中,最近一天的数据存储在SSD中,一天以后的数据存储在HDD中)保证查询性能以及存储成本、数据按时间分区保证时间线查询性能。另一方面是查询层面的基本需求:包括基本的按时间线进行多个维度的原始数据查询、按时间线在多个维度进行聚合后的数据统计查询需求以及TopN需求等。可见,多维条件查询通常是时序数据库的一个硬需求,其性能好坏也

2021-07-02 09:07:08 633

原创 DEBUG下的异常指示——地址含义

在写C++程序的时候,老实0xcdcdcdcd ,0xdddddddd ,0xfeeefeee ,0xcccccccc ,0xabababab这种提示,不知何解,google之,错误是这样产生* 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory* 0xABADCAFE : A startup to this value to i.

2021-06-19 08:44:59 241

转载 设计模式——Facade

一、模式定义门面模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。门面模式又称为外观模式,它是一种对象结构型模式。二、模式动机现代的软件系统都非常复杂,尽管我们已经想尽一切方法将其“分而治之”,把一个系统划分为好几个较小的子系统了,但是仍然可能会存在这样的问题:子系统内有非常多的类,客户端往往需要和许多对象打交道之后 才能完成想要完成的功能。在我们的

2021-05-31 10:18:28 1286

转载 Linux的gcc和g++的区别

Windows中我们常用vs来编译编写好的C和C++代码;vs把编辑器,编译器和调试器等工具都集成在这一款工具中,在Linux下我们能用什么工具来编译所编写好的代码呢,其实Linux下这样的工具有很多,但我们只介绍两款常用的工具,它们分别是gcc和g++.工具用法介绍gcc和g++的用法都是一样的,在这里我们只介绍gcc:上图介绍了相关指令和参数以及该条指令所做的对应的事情。gcc -E filename.c -o filename.i#将c文件转化成C++文件,这个过程也叫做预处理

2021-04-20 17:49:53 417

转载 分布式事务:两阶段提交与三阶段提交

在分布式系统中著有 CAP 理论,该理论由加州大学伯克利分校的Eric Brewer教授提出,阐述了在一个分布式系统中不可能同时满足一致性(Consistency)、可用性(Availability),以及分区容错性(Partition Tolerance)。一致性:在分布式系统中数据往往存在多个副本,一致性描述的是这些副本中的数据在内容和组织上的一致。 可用性:描述系统对用户的服务能力,所谓可用是指在用户能够容忍的时间范围内返回用户期望的结果。 分区容错性:分布式系统通常由多...

2021-04-14 23:38:16 203

转载 linux下添加简单的开机自启动脚本

在linux的使用过程中,我们经常会碰到需要将某个自定义的应用程序设置为开机自启动以节省操作时间,这里提供两个设置开机自启动的方法。注:博主使用的ubuntu-16.04进行实验,其它版本可能有偏差,但实现原理类似。rc.local在rc.local脚本中添加开机自启动程序ubuntu在开机过程之后,会执行/etc/rc.local(注意/etc/init.d中也有个rc.local,不要弄混了)文件中的脚本程序,初始情况下,这个文件内容是这样的:downey@ubuntu:~$ ca

2021-03-27 09:34:44 436

转载 字符编码笔记:ASCII,Unicode 和 UTF-8

作者:阮一峰日期:2007年10月28日今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料。这个问题比我想象的复杂,午饭后一直看到晚上9点,才算初步搞清楚。下面就是我的笔记,主要用来整理自己的思路。我尽量写得通俗易懂,希望能对其他朋友有用。毕竟,字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识。一、ASCII 码我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位..

2021-03-04 10:05:56 201 1

原创 MIPS架构的Linux系统安装配置Qt5.11

本文主要基于龙芯3A4000处理器、银河麒麟Linux操作系统安装Qt5.11因龙芯3A4000处理器基于MIPS指令集,大多数Intel CPU下可用的软件在3A4000下需要重新编译、安装。折腾失败的部分就省略了,只记录成功的经历。安装的Qt组件银河麒麟软件源中提供了Qt5.11.1的开发环境,不需要自己编译。通过自带源,可以直接安装Qt集成开发环境,就包含了上述组件,并且还增加了许多之前没有装上的库文件。# sudo dnf install qt5-devel运行不同软件的指令.

2021-02-23 15:58:09 2159

转载 C++ 异常 与 ”为什么析构函数不能抛出异常“ 问题

C++ 用异常使得可以将正常执行代码和出错处理区别开来。 比如一个栈,其为空时,调用其一个pop 函数,接下来怎么办? 栈本身并不知道该如何处理,需要通知给其调用者(caller),因为只有调用者清楚接下来该怎么做。 异常,就提供了一个很好机制。 但是异常需要操作系统,编译器,RTTI的特性支持。下面围绕一个问题“为什么析构函数不能抛出异常?”展开C++中异常的实现。Effective C++ 里面有一条”别让异常逃离析构函数“,大意说是Don't do that, otherwise the ..

2021-02-20 10:57:36 747 1

原创 解压.gz和.tar.gz文件

.gz压缩包(不带tar),用gzip命令即可(-d选项可以解压)格式:gzip XXX.gz -d 解压位置注意:如果不指定解压位置,将解压到当前工作文件夹里。.tar.gz压缩包,需要使用tar命令的-z和-f选项(解压需要-x)格式:tar -zxf XXX.tar.gz -C 解压位置注意:后面的-C是大写C,如果不指定解压位置需要去掉-C,系统会把压缩包中所有文件解压到当前工作文件夹...

2021-01-27 09:49:08 367

原创 设计模式——Adapter

中文名:适配器模式作用GOF中的描述:将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。描述的解释:两个不接口不同但功能相似的产品,转换为一种接口的形式。优缺点使其实用方式相似 改造的成本可能会很高,改造前需评估是否确实需要适配结构适配分为两种,一种是类适配器,利用继承的技术;另一种是对象适配器,使用组合的技术。Target类:目标接口Adaptee类:带适配的类Adapter类:将Adapte.

2021-01-14 22:04:16 114

原创 设计模式——Singleton

中文名:单例模式作用GOF中的描述:保证一个类仅有一个实例,并提供一个访问它的全局访问点。描述的解释:在有限的资源下,使用资源。如打印机,一个人在打印了,再来一个人,后续需要等待。优缺点对唯一实例的受控访问 缩小名字空间 允许可变数目的实例 缺点:需要考虑线程安全性!结构Singleton类:不能主动创建类,只提供一个具体访问的接口例子// CreateMode_Singleton.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//.

2021-01-14 21:33:42 96

原创 Ubuntu安装arm-linux-gcc交叉编译器

网上能找到很多关于arm-linux-gcc交叉编译的教程,但教程不少看起来都比较繁琐,因此在这里写更精炼版本arm-linux-gcc交叉编译工具下载地址原交叉编译器由linaro维护,现改为由ARM维护。7.5版本以前的交叉编译环境可从linaro的网站下载(如下图),即下面的第一个链接。后续版本从ARM的官网中可以获得。下载地址:https://releases.linaro.org/components/toolchain/gcc-linaro/ https://develop

2021-01-12 15:57:21 7952 1

转载 Google Test(GTest)使用方法和源码解析——概况

GTest是很多开源工程的测试框架。虽然介绍它的博文非常多,但是我觉得可以深入到源码层来解析它的实现原理以及使用方法。这样我们不仅可以在开源工程中学习到实用知识,还能学习到一些思想和技巧。我觉得有时候思想和技巧是更重要的。(转载请指明出于breaksoftware的csdn博客) 我们即将要分析的是GTest1.7版本。我们可以通过https://github.com/google/googletest.git得到代码。 官方文档见:https://github.co...

2020-12-25 21:21:17 651

原创 析构函数virtual与非virtual区别

作为通常的原则,如果一个类定义了虚函数,那么它的析构函数就应当是virtual的。因为定义了虚函数则隐含着:这个类会被继承,并且会通过基类的指针指向子类对象,从而得到多态性。 这个类可能会被继承,并且会通过基类的指针指向子类对象”,因此基类的析构函数是否为虚将决定子类的对象是否被析构示例代码:#include <iostream.h>struct A{ virtual ~A() {cout<<"~A()\n";}};struct B: public ..

2020-12-24 21:53:31 407

原创 设计模式——Prototype

Prototype的中文名:原型模式作用GOF中的描述:用原型实例指定创建对象的类,并且通过拷贝这些原型创建新的对象。描述的解释:举个老家那边的例子。老家那边以五金加工为本业,为生产出一个设备的外壳,最经济最快速的方式是使用模具(指代上文中的原型实例),有了模具,只需往模具中浇灌铁水就可以创建千千万万个外壳(即上文中的实例)。简称:都是一个模子刻出来的!主要目的:便捷的产生新的实例优缺点运行时增加和删除产品 允许方便的由部件和子部件来创建对象 减少子类的构造——本身就能产生克隆

2020-12-21 23:13:43 156

原创 win7或win10下UDP广播包收发失败

因为工作须要,需要实现一个UDP发送广播包到设备的需求。若是是linux下,那很简单,可是上位机要求是windows平台。发现没办法在设备端收到发送的广播包。使用Wireshark调试,监听对应的广播地址,也没有收到任何数据。windows都不用检查防火墙,电脑的防火墙也都关了。后来看到stackoverflow.com上面有人也遇到了一样的问题,可是没有给出具体的例子。简单来讲缘由是这样的:win7以前的系统,发送广播包是到PC全部的网卡上。 win7及之后,是要求制定广播包的源IP,简单说bin

2020-12-17 17:35:11 4794 1

原创 设计模式——Builder

Builder的中文名:生成器作用GOF中的描述:将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的标识。描述的解释:主要目的:将一个个的组件,组合成一个可以使用的产品。比如拿零件组装出一辆汽车。 组件的生成方法都集中在一个抽象类中 产品的产出由生产的“工厂”决定优缺点通过抽象接口,通过改变内在实现,但不影响外部使用; 工厂可以决定组件的组装方式,来产出不同的产品; 和抽象工厂(Abstract Factory)一样,对修改的开放性差,要对抽象接口增加新的方法

2020-12-12 23:09:50 156

转载 C++标准模板库(STL)迭代器的原理与实现

引言迭代器(iterator)是一种抽象的设计理念,通过迭代器可以在不了解容器内部原理的情况下遍历容器。除此之外,STL中迭代器一个最重要的作用就是作为容器(vector,list等)与STL算法的粘结剂,只要容器提供迭代器的接口,同一套算法代码可以利用在完全不同的容器中,这是抽象思想的经典应用。使用迭代器遍历不同容器如下所示的代码演示了迭代器是如何将容器和算法结合在一起的,其中使用了三种不同的容器,.begin()和.end()方法返回一个指向容器第一个元素和一个指向容器最后一个元素后面一个位

2020-12-09 08:45:54 839

原创 设计模式——Factory Method

Factory Mothod的中文名:工厂方法作用GOF中的描述:定义一个用于创建对象的接口,让子类决定实例化哪一类。Factory Method使一个类的实例化延迟到子类。描述的解释:创建:解除对类型的硬编码,使其支持可扩展的类型。 使用:手动给定类的类型,将对应的子类实例化。优缺点不绑定特定的类,支持进行功能扩展; 隔离了变化的部分——创建都在统一的函数中,且创建函数的实现可自行更改; 使用上稍微不方便,因类多,需要结合选择的参数,再去实例化哪个具体类;结构Pro.

2020-12-05 22:55:17 127

原创 设计模式——Abstract Factory

2020-12-02 22:22:24 105

转载 理解inode

inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念,从而大大简化用户接口。下面就是我的inode学习笔记,尽量保持简单。===================================理解inode作者:阮一峰一、inode是什么?理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Se.

2020-11-30 19:41:06 112

郭天祥单片机开发板的Protues仿真电路

这是郭天祥有名的89C51单片机开发板的仿真电路。

2013-04-11

空空如也

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

TA关注的人

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