计算机基础
文章平均质量分 80
Sudouble
动静结合,持之以恒!
展开
-
Native Hook 技术,天使还是魔鬼
总的来说 Native Hook 是一门非常底层的技术,它会涉及库文件编译、加载、链接等方方面面的知识,而且很多底层知识是与 Android 甚至移动平台无关的。在这一领域,做安全的同学可能会更有发言权,我来讲可能班门弄斧了。不过希望通过这篇文章,让你对看似黑科技的 Hook 有一个大体的了解,希望可以在自己的平时的工作中使用 Hook 来完成一些看似不可能的任务,比如修复系统 Bug、线上监控 Native 内存分配等。转载 2023-12-14 21:56:07 · 167 阅读 · 0 评论 -
PLTHook
【代码】PLTHook。转载 2023-12-14 21:22:46 · 130 阅读 · 0 评论 -
深入了解GOT,PLT和动态链接
上面说了很多.got, .plt啥的, 那么这些section到底是做什么用的呢. 其实这些都是链接器(或解释器, 下面统称为链接器)在执行重定向时会用到的部分, 先来看他们的定义.为了灵活利用虚拟内存空间, 所以编译器可以产生位置无关的代码.可执行文件可以是位置无关的, 也可以是位置相关的, 动态链接库绝大多数都是位置无关的. GOT表可写不可执行, PLT可执行不可写,他们相互作用来实现函数符号的延时绑定. ASLR并不随机化PLT部分,转载 2023-12-14 20:37:06 · 467 阅读 · 0 评论 -
Linux虚假唤醒
为什么会有虚假唤醒一说。Linux内核这么强大,怎么会出现这样的情况?一直以来也很困惑,看了下文链接中的介绍后,豁然开朗。原创 2023-12-06 10:00:39 · 541 阅读 · 0 评论 -
WSL2 Ubuntu安装CUDA Toolkit
目前CUDA ToolKit需要切换到WSL2,在WLS1下不支持。原创 2023-10-30 23:28:07 · 2622 阅读 · 0 评论 -
分布式会话跟踪系统架构设计与实践
这期沙龙主要内容有:分布式服务通信框架及服务治理系统、分布式监控系统实践、分布式会话跟踪系统架构设计与实践,特邀美恰CTO讲解时下热门话题“微服务”。其中既包括关键系统设计、在美团点评内部的实践经验,也包括一些项目在业界开源的运营实践。转载 2023-01-16 11:03:19 · 174 阅读 · 0 评论 -
Google Dapper-大规模分布式系统的基础跟踪设施
比如GFS,会有很多用户,有的可能是直接访问GFS,有的可能是比如通过Bigtable产生对GFS的访问,如果没有Dapper,对这种共享式系统将会很难调试,通过Dapper提供的数据,共享服务的owner可以方便的对用户根据各项指标(比如网络负载,请求耗时)进行排序。比如在搜索系统中,用户的一个请求在系统中会经过多个子系统的处理,而且这些处理是发生在不同机器甚至是不同集群上的,当请求处理发生异常时,需要快速发现问题,并准确定位到是哪个环节出了问题,这是非常重要的,Dapper就是为了解决这样的问题。转载 2023-01-16 10:55:34 · 1017 阅读 · 0 评论 -
简述同步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 · 575 阅读 · 0 评论 -
字符串匹配问题-最长公共子串
问题给定两个字符串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 · 595 阅读 · 0 评论 -
C++11并发学习之六:线程池的实现
为什么要使用线程池? 目前的大多数网络服务器,包括Web服务器、Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短。 传统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出,这就是是“即时创建,即时销毁”的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于不停的创建...转载 2022-03-16 10:10:25 · 331 阅读 · 0 评论 -
并发编程中条件变量(condition variables)实现原理
最初想的方向错了,需要从操作系统侧考虑如何实现条件变量。操作系统是主动调用者,而条件变量其实是操作系统预留出的接口。因而这里主要是去考虑记录谁在等待、记录谁要唤醒、如何唤醒的问题。0 介绍以前只是会使用Linux下的条件变量pthread_cond_t,知道它的作用是配合互斥锁解决并发编程的同步问题,没有思考过它的实现原理,今天学习了清华大学陈渝老师的操作系统网课,总算是明白了,特此记录。1 实现条件变量是一种等待机制,每一个条件变量对应一个等待原因与等待队列。一般对于条件变量会有两转载 2022-03-16 09:52:29 · 669 阅读 · 0 评论 -
高性能网络编程(引自即时通讯网)
我的见解:对于高性能软件,一直认为只要在应用端做足够的性能优化就可以了。这两天看了下面的一系列文章,极大的开阔了视野。将可能的性能瓶颈,从用户态程序转移至内核态程序。固然操作系统对硬件设备做了一层处理,极大的方便了用户进行调用。但在有的场景下,这一层处理速度是否足够,其实也是要打一层问号。如果真的碰到了性能瓶颈,用户态程序、内核态程序都有很大的优化空间,要对其进行综合优化,涉及到大量知识,如操作系统设计(线程、进程、线程切换、阻塞IO、非阻塞IO、同步调用、异步调用)、应用程序开发等。如下图,从最基原创 2021-12-16 23:25:39 · 473 阅读 · 0 评论 -
Windows下令QProcess弹出CMD界面
需求编写一个控制台应用程序,放到CMD中可以运行。研究了快一下午,来回看了QProcess文档中,关于start、execute、statedDetached相关程序的说明。但通过在被调用程序中插入cout的打印输出观察后,发现运行的程序都是在父进程的cmd中运行。使用方法QProcess文档中有一段关于如下函数原型的描述。大意是说明在Windows平台下,QProcess的实现依靠于CreateProcess API,Qt对其进行了封装,如果需要更细粒度的控制,可以使用CreateProc原创 2021-10-28 16:08:45 · 3119 阅读 · 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 · 296 阅读 · 0 评论 -
程序的编译、链接、装载与运行
在 Linux 操作系统中,一段 C 程序从被写下到最终被 CPU 执行,要经过一段漫长而又复杂的过程。下图展示了这个过程目录编译 目标文件的格式 链接 装载 运行1. 编译编译就是把程序员所写的高级语言代码转化为对应的目标文件的过程。一般来说高级语言的编译要经过预处理、编译和汇编这几个过程。预处理预编译过程对源代码做了如下的操作删除所有的注释信息 删除所有的 #define 并展开所有宏定义 插入所有 #include 文件注 1的内容到源文件中的对应位置,in.原创 2021-09-06 19:46:54 · 1353 阅读 · 0 评论 -
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 · 468 阅读 · 0 评论 -
分布式事务:两阶段提交与三阶段提交
在分布式系统中著有 CAP 理论,该理论由加州大学伯克利分校的Eric Brewer教授提出,阐述了在一个分布式系统中不可能同时满足一致性(Consistency)、可用性(Availability),以及分区容错性(Partition Tolerance)。一致性:在分布式系统中数据往往存在多个副本,一致性描述的是这些副本中的数据在内容和组织上的一致。 可用性:描述系统对用户的服务能力,所谓可用是指在用户能够容忍的时间范围内返回用户期望的结果。 分区容错性:分布式系统通常由多...转载 2021-04-14 23:38:16 · 222 阅读 · 0 评论 -
字符编码笔记:ASCII,Unicode 和 UTF-8
作者:阮一峰日期:2007年10月28日今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料。这个问题比我想象的复杂,午饭后一直看到晚上9点,才算初步搞清楚。下面就是我的笔记,主要用来整理自己的思路。我尽量写得通俗易懂,希望能对其他朋友有用。毕竟,字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识。一、ASCII 码我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位..转载 2021-03-04 10:05:56 · 231 阅读 · 1 评论 -
C++ 异常 与 ”为什么析构函数不能抛出异常“ 问题
C++ 用异常使得可以将正常执行代码和出错处理区别开来。 比如一个栈,其为空时,调用其一个pop 函数,接下来怎么办? 栈本身并不知道该如何处理,需要通知给其调用者(caller),因为只有调用者清楚接下来该怎么做。 异常,就提供了一个很好机制。 但是异常需要操作系统,编译器,RTTI的特性支持。下面围绕一个问题“为什么析构函数不能抛出异常?”展开C++中异常的实现。Effective C++ 里面有一条”别让异常逃离析构函数“,大意说是Don't do that, otherwise the ..转载 2021-02-20 10:57:36 · 782 阅读 · 1 评论 -
win7或win10下UDP广播包收发失败
因为工作须要,需要实现一个UDP发送广播包到设备的需求。若是是linux下,那很简单,可是上位机要求是windows平台。发现没办法在设备端收到发送的广播包。使用Wireshark调试,监听对应的广播地址,也没有收到任何数据。windows都不用检查防火墙,电脑的防火墙也都关了。后来看到stackoverflow.com上面有人也遇到了一样的问题,可是没有给出具体的例子。简单来讲缘由是这样的:win7以前的系统,发送广播包是到PC全部的网卡上。 win7及之后,是要求制定广播包的源IP,简单说bin原创 2020-12-17 17:35:11 · 5376 阅读 · 1 评论 -
Dijkstra算法正确性证明
问题:求图中点1到其他各点的最短距离策略:把起点1放入初始集合Set中,从剩余的点中,选取到Set(此时Set中只有1个点)距离最近的点,并入集合Set中, 从剩余的点中,找经过集合Set,到起点1的最短距离,将最短边并入Set集合 依次循环,直到所有的边都并入Set变量的命名:Set={1,2,,,,,,x} //已找到start(本例中是1点)到1,2,,...转载 2019-09-26 10:18:15 · 4519 阅读 · 3 评论 -
UDP 组播---你需要了解这些
我的小结UDP是面向无连接的协议,不能保证数据的可靠到达,但相应的,实时性较于TCP好了不是一个数量级。这回主要得用到组播。但下午实验的时候,没有组出效果,可能得连上路由器才行吧。数据传输方式主要分为单播、广播、组播,不同的传输方式各有其优劣性。另外感觉7层OSI协议,在软件上实现其实是很简单的,现在OSI模型把每一层该做的事情都区分的清清楚楚,一层处理完交给下一层,层层递进,互不干...转载 2019-08-06 17:59:40 · 4107 阅读 · 0 评论 -
C++标准模板库(STL)迭代器的原理与实现
引言迭代器(iterator)是一种抽象的设计理念,通过迭代器可以在不了解容器内部原理的情况下遍历容器。除此之外,STL中迭代器一个最重要的作用就是作为容器(vector,list等)与STL算法的粘结剂,只要容器提供迭代器的接口,同一套算法代码可以利用在完全不同的容器中,这是抽象思想的经典应用。使用迭代器遍历不同容器如下所示的代码演示了迭代器是如何将容器和算法结合在一起的,其中使用了三种不同的容器,.begin()和.end()方法返回一个指向容器第一个元素和一个指向容器最后一个元素后面一个位转载 2020-12-09 08:45:54 · 918 阅读 · 0 评论 -
理解inode
inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念,从而大大简化用户接口。下面就是我的inode学习笔记,尽量保持简单。===================================理解inode作者:阮一峰一、inode是什么?理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Se.转载 2020-11-30 19:41:06 · 126 阅读 · 0 评论 -
TCP 的那些事儿(下)
这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇《TCP的那些事儿(上)》 上篇中,我们介绍了TCP的协议头、状态机、数据重传中的东西。但是TCP要解决一个很大的事,那就是要在一个网络根据不同的情况来动态调整自己的发包的速度,小则让自己的连接更稳定,大则让整个网络更稳定。在你阅读下篇之前,你需要做好准备,本篇文章有好些算法和策略,可能会引发你的各种思考,让你的大脑分配很多内存和计算资源,所以,不适合在厕所中阅读。TCP的RTT算法从前面的TCP重传机制我们知道Timeout的设置对于重转载 2020-10-29 23:06:21 · 708 阅读 · 0 评论 -
动态链接库简介(Windows)
简介dll结构加载机制相关加载函数原创 2020-10-29 22:00:54 · 314 阅读 · 0 评论 -
编译-编译原理C/C++ 静态链接库(.a) 与 动态链接库(.so)
1.库的分类根据链接时期的不同,库又有静态库和动态库之分。静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。(TODO:链接动态库时链接阶段到底做了什么)2 静态库和动态库的比较链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已。因为静态库被链接后库就转载 2020-10-22 09:32:04 · 904 阅读 · 0 评论 -
TCP 的那些事儿(上)
TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获。关于TCP这个协议的细节,我还是推荐你去看W.Richard Stevens的《TCP/IP 详解 卷1:协议》(当然,你也可以去读一下RFC793以及后面N多的RFC)。另外,本文我会使用英文术语,这样方便你通过这些英文关键词来查找相关的技术文档。之所以想写这篇文章,目的有三个,一个是想锻炼一下自己是否可以用简单的篇幅把这么复杂的TCP协议转载 2020-09-14 20:58:12 · 242 阅读 · 0 评论 -
C++总结:C++中的const和constexpr
C++中的const可用于修饰变量、函数,且在不同的地方有着不同的含义,现总结如下。const的语义C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象的常量性的操作都视为error。对象的常量性可以分为两种:物理常量性(即每个bit都不可改变)和逻辑常量性(即对象的表现保持不变)。C++中采用的是物理常量性,例如下面的例子: 1 2 3 4 5 6 7 str原创 2020-08-22 22:03:59 · 616 阅读 · 0 评论 -
32位与64位下各类型长度对比
64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂);可以访问大型数据库。本文介绍的是64位下C语言开发程序注意事项。1. 32 位和 64 位C数据类型32和64位C语言内置数据类型,如下表所示:上表中第一行的大写字母和数字含义如下所示:I表示:int类型L表示:long类型P表示:pointer指针类型32...转载 2020-04-27 17:49:53 · 1321 阅读 · 0 评论 -
TCP握手与分手
TCP全名Tranmission Control Protocol,是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。TCP主要解决了UDP通信数据传输不可靠问题,即建立在不可靠通讯的基础之上,并辅之以自动窗口大小、重传、拥塞控制等机制。建立连接和断开连接,本质上是TCP的状态位不停变化,在不同的连接状态下进行数据操作。其中,建立连接和断开连接是资源能正确使用和释放的前提,分为三次握手和四次分手,那么为什么是三次和四次这样的一种形式,而不是其他形式?本文将针对此问题,.原创 2020-07-19 11:36:47 · 377 阅读 · 0 评论 -
Linux | 为什么用户态和内核态的切换耗费时间?
思考这个问题的导火线是,看到java中的synchronized关键字。经过编译,synchronized标注的函数会加一个读写锁,一般不推荐使用,因为加锁解锁设计到内核态与用户态的转换,有时转化耗时比函数体执行时间还长,所以不推荐使用。这个观点在学操作系统的时候作为常识被认知,那背后具体的原理是什么呢?一句话回答问题:上面涉及的内核态与用户态切换时系统调用,内核也相当于一个软件,...转载 2020-03-26 18:29:45 · 898 阅读 · 0 评论 -
KMP算法原理详解_论文解读版
1. KMP算法是什么,解决了什么问题,及其不足之处(算法最坏情况)2. KMP原理3. KMP实例4. 引用文献原创 2020-03-25 00:08:12 · 3116 阅读 · 2 评论 -
最短路径算法——Dijkstra介绍
个人心得体会:理解这种或这类算法,可以先从小规模的问题入手,并逐渐推广到问题变复杂的情况,这样理解起来也可以更方便和透彻。——和数学归纳法很相似。图简介以使用地图APP为例,假设你想前往某个目的地,此间有很多条线路可以选,如地铁、不同的公交换乘方案。而不同的方案所需换乘的次数不同。那么怎么才能选出换乘次数最少的方案呢?有向图:节点和节点之间的连接是有方向的。无向图:节点和节点之...原创 2019-04-27 08:56:07 · 11297 阅读 · 2 评论 -
Traits编程技法
照顺序,这次应该是迭代器Iterator的内容了,然而Iterator涉及到一个重要的技巧就是Traits编程技法。一 获取Iterator的相应类型(associate type)在使用Iterator时,可能需要知道它的相应类型,也就是Iterator指向的变量的类型,在C/C++语言中,如果要获取一个变量的大小可以使用sizeof()操作符。然而如果想要获取一个指针指向的变量类型该如...原创 2019-12-03 14:21:07 · 280 阅读 · 0 评论 -
一致性 hash 算法( consistent hashing )
我的理解和思考:一致性Hash主要为了解决在节点变化(增或删)后,会造成的大量的Cache Miss。因而提出了此算法,为节点的增删提供极大的帮助。用新方法解决了一个问题后,还有新的问题产生,Cache分布不均匀呢?因而又引入虚拟节点的概念,对原有分布不均匀的节点进行Balance。不得不说这是操作系统是一门很深的学问,格式格式的问题扑面而来。一致性 hash 算法( consistent...转载 2019-12-03 09:51:15 · 218 阅读 · 0 评论 -
Linux写时拷贝技术(Copy on Write)
我的总结:为发挥计算机的计算优势,不惜一切代价压榨着对计算机资源的使用。Page Table Entry(PTE)的使用案例之一,这里的Copy是一种浅拷贝。以Linux的fork为例,fork时只简单的创建新的描述信息,并将PTE中的描述信息标志为只读,对于物理内存中的数据段、代码段、堆、栈则保留不变,且指向完全相同的物理地址,只有当开始读写的时候,创建去开辟新的物理内存。COW技术...转载 2019-11-20 09:08:15 · 278 阅读 · 0 评论 -
Coursera 计算机组成——期末考试
1.第 1 个问题以下人物中,没有参与电子计算机ENIAC研发工作的是约翰•埃克特约翰•冯•诺依曼约翰•阿塔纳索夫约翰•莫克利Correct1/1 分2.第 2 个问题指令执行的四个基本步骤为取指、发射、执行、访存取指、读数、运算、完成取指、分派、计算、提交取指、译码、执行、写回Correct1/1 分3.第 3 个问题以下属于冯...原创 2019-11-02 20:02:14 · 2523 阅读 · 0 评论 -
MIPS汇编程序设计——Cousera
第一题:用系统功能调用实现简单输入输出利用系统功能调用从键盘输入,转换后在屏幕上显示,具体要求如下:如果输入的是字母(A~Z,区分大小写)或数字(0~9),则将其转换成对应的英文单词后在屏幕上显示,对应关系见下表若输入的不是字母或数字,则在屏幕上输出字符“*”每输入一个字符,即时转换并在屏幕上显示支持反复输入,直到按“?”键结束程序第一题代码: .datasuc: .as...原创 2019-10-14 22:48:56 · 736 阅读 · 0 评论