- 博客(38)
- 收藏
- 关注
原创 C++并发编程
第1章:C++的并发世界1.1 何谓并发最简单和最基本的并发,是指两个或更多独立的活动同时发生。并发在生活中随处可见,我们可以一边走路一边说话,也可以两只手同时作不同的动作,还有我们每个人都过着相互独立的生活——当我在游泳的时候,你可以看球赛,等等。1.1.1 计算机系统中的并发计算机领域的并发指的是在单个系统里同时执行多个独立的任务,而非顺序的进行一些活动。计算机领域里,并发不是一个新事物:很多年前,一台计算机就能通过多任务操作系统的切换功能,同时运行多个应用程序;高端多处理器服务
2022-04-01 22:55:10
6005
6
原创 进程管理详解
1.进程进程就是出于执行期的程序。但是进程并不仅仅局限于一段可执行的代码。通常进程还要包括其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程,当然还包括用来存放全局变量的数据段等。实际上进程就是正在执行的程序代码的实时结果。内核需要有效而又透明地管理所有细节。执行线程,简称线程,是在进程中活动的对象。每个线程都拥有一个独立的程序计数器、线程栈和一组进程寄存器。内核调度的对象是线程,而不是进程。在现在操作系统中,进程提供两种虚拟机
2022-03-14 23:09:24
1079
转载 面试---计算机基础
1.C/C++内存有哪几种类型?C中,内存分为5个区:堆(malloc)、栈(如局部变量、函数参数)、程序代码区(存放二进制代码)、全局/静态存储区(全局变量、static变量)和常量存储区(常量)。此外,C++中有自由存储区(new)一说。全局变量、static变量会初始化为缺省值,而堆和栈上的变量是随机的,不确定的。2.堆和栈的区别?1).堆存放动态分配的对象——即那些在程序运行时动态分配的对象,比如 new 出来的对象,其生存期由程序控制;2).栈用来保存定义在函数内的非static对象,
2022-03-01 14:17:51
334
原创 堆排序详解
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。二叉树特点:每个节点最多只有2个子节点(不存在度大于2的节点)满二叉树特点:叶子节点全部都在最底层;除叶子节点外,每个节点都有左右孩子;完全二叉树特点:叶子节点全部都在最底的两层;最后一层只缺少右边的叶子节点,左边一定有叶子节点;除了最后一层,其他层的节点个数均达到最大值;最大...
2022-01-04 23:03:42
2108
原创 快速排序详解
快速排序基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。步快速排序的具体步骤:(1) 首先设定一个分界值,通过该分界值将数组分成左右两部分。(2) 将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。(3) 分别对左右两边的数据进行独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分...
2021-12-14 23:34:04
3356
原创 归并算法详解
归并算法的本质是将待排序序列分为两部分,依次对分得的两个部分再次使用归并排序,之后再对其进行合并。接下来对待排序列A[0],A[1],A[2],...,A[n-1],用归并排序思想进行排序。算法实现:1.将序列分为两部分,其中一部分对应的索引区间为[start1,end1];另一部分的对应的索引区间为[start2,end2]。其中,start1 = 0,end1 = (n - 1)/ 2 (向下取整);start2=(n - 1)/ 2 + 1,end2 = n - 1;...
2021-12-07 23:35:00
6454
转载 归并排序详解
转自:图解排序算法:归并排序归并排序那我们借用 cs50 里的例子,比如要把一摞卷子排好序,那用并归排序的思想是怎么做的呢? 首先把一摞卷子分成两摞; 把每一摞排好序; 把排好序的两摞再合并起来。 感觉啥都没说?那是因为上面的过程里省略了很多细节,我们一个个来看。 首先分成两摞的过程,均分,奇偶数无所谓,也就是多一个少一个的问题; 那每一摞是怎么排好序的? 答案是用同样的方法排好序。 排好序的两摞是怎么合并起来的? 这里需要借助两个指针和
2021-12-05 22:14:21
774
原创 希尔排序详解
希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后,对各组内的元素进行直接插入排序。 这一趟排序完成之后,每一个组的元素都是有序的。然后减小gap的值,并重复执行上述的分组和排序。重复这样的操作,当gap=1时,整个数列就是有序的。详细例子见下图:图中10个元素,gap = 5,则对应下标的元素组成一个组:下标为0和5组成一个组,...
2021-12-04 00:05:24
2931
原创 插入排序详解
插入排序思想: 一个元素表中,前面为有序表(元素按一定顺序排列),后面为无序表(元素为没有顺序的表)。将无序表中从第一个元素开始与有序表中的每个元素进行比较,直到有序表中某个元素大于它,然后将它插入该元素的位置,有序表中的从大于它的元素全部后移动一位。依次按此方法将无序表中的所有元素与有序表中的每个元素进行比较,然后插入到特定位置。 例如:元素表为1, 3, 8, 9, 2, 0, 4, 6, 5, 7。则1, 3, 8, 9为有序表;2, 0, 4, 6, 5, 7为无...
2021-12-01 22:46:59
1812
转载 伸展树详解及实现
转载:伸展树详解及实现 - 简单爱_wxg - 博客园我们讨论过,树的搜索效率与树的深度有关。二叉搜索树的深度可能为n,这种情况下,每次搜索的复杂度为n的量级。AVL树通过动态平衡树的深度,单次搜索的复杂度为log(n)。我们下面看伸展树(splay tree),它对于m次连续搜索操作有很好的效率。伸展树会在一次搜索后,对树进行一些特殊的操作。这些操作的理念与AVL树有些类似,即通过旋转,来改变树节点的分布,并减小树的深度。但伸展树并没有AVL的平衡要求,任意节点的左右子树可以相差任意深度。与二叉搜索树
2021-11-24 22:21:17
334
原创 虚拟内存详解
1. 物理和虚拟寻址2. 地址空间3. 虚拟内存作为缓存工具3.1 DRAM缓存地组织结构3.2 页表3.3 页命中3.4 缺页3.5 分配页面4. 虚拟内存作为内存管理地工具5.虚拟内存作为内存保护地工具6.地址翻译6.1 结合高速缓存和虚拟内存6.2 利用LTB加速地址翻译6.3 多级页表6.4 端到端地地址翻译7. 内存映射7.1 共享对象8. 动态内存分配8.1 malloc和free函数8.2 使用动态内存分配的原因..
2021-10-27 23:01:40
134
原创 链接相关内容详解
1. 静态链接为了构造可执行文件,链接器必须完成两个主要任务:(1)符号解析(symbol resolution)目标文件定义和引用符号,每个符号对应于一个函数,一个全局变量或一个静态变量符号解析的目的是将每个符号引用正好和一个符号定义关联起来;(2)重定位(relocation)编译器和汇编器生成从地址0开始的代码和数据节。链接器通过把每个符号定义与一个内存位置关联起来,从而重定位这些节,然后所有对这些符号的引用,使得它们指向这个内存位置。链接器使用汇编器产生的重定位条目(...
2021-10-25 23:06:42
402
原创 异常控制流详解
现代系统通过使控制流发生突变来对这些情况做出反应。一般而言,我们把这些突变称为异常控制流(Exceptional Control Flow,ECF)。异常控制流发生在计算机系统的各个层次。比如,在硬件层,硬件检测到的事件会触发控制突变转移到异常处理程序。在操作系统层,内核通过上下文切换将控制流从一个用户进程转移到另一个用户进程。在应用层,一个进程可以发送信号到另一个进程,而jie's1.异常...
2021-10-23 21:57:40
383
原创 程序性能优化
编写高效的程序需要做到一下几点:第一:选择一组适当的算法和数据结构;第二:编写出编译器能够有效优化以转换成高效可执行代码的源代码;第三:针对处理运算量特别大的计算,将一个任务分成多个部分,这些部分可以在多核和多处理器的某种组合上并行地计算。 程序优化地步骤:第一:消除不必要的工作,让代码尽可能有效地执行所期望地任务。这包括消除不必要的函数调用,条件测试,内存引用。这些优化不依赖于目标机器的任何具体属性。(编译器收到妨碍优化的因素的阻碍,妨碍优化的因素就是程序...
2021-10-21 22:35:43
611
原创 访问信息详解
1.数据传送指令源操作数指定的值是一个立即数,存储在寄存器中或者内存中。目的操作数指定一个位置,要么是一个寄存器,要么是一个内存地址。注释:x86-84加了一条限制,传送指令的两个操作数不能都指向内存位置。将一个值从一个内存位置复制到另一个内存位置需要两条指令-----第一条指令将源值加载到寄存器中,第二条将寄存器值写入目的位置。 这些指令的寄存器操作数可以是16个寄存器有标号部分中的任意一个,寄存器部分的大小必须与指令最后一个字符('b','w','l','...
2021-10-19 22:54:13
297
原创 程序编码流程详解
总结:1.C预处理器扩展源代码,插入所有用#include命令指定的文件,扩展所有用#define声明指定的宏;2.编译器产生源文件的汇编代码,文件名为filename.s;3.汇编器将汇编代码转为二进制目标代码文件,文件名为filename.o;4.链接器将目标代码文件与实现库函数的代码合并,产生最终的可执行代码文件。...
2021-10-18 22:41:25
1710
原创 C语言中的移位运算
注意:逻辑右移和算术右移的区别C语言标准并没有明确定义对于有符号数使用哪种类型的右移-----算术右移或者逻辑右移都可以。这就意味着任何假设一种或者另一种右移形式的代码都可能会遇到可移植性问题。然而,实际上,几乎所有的编译器和机器组合都对有符号数使用算术右移,且许多程序员也都假设机器会使用这种右移。另一方面,对于无符号数,右移必须是逻辑的。...
2021-10-16 19:47:19
263
原创 信息存储理解
1.字节大小----针对32位系统和64位系统注释:ISO C99引入了一类数据类型,其数据大小是固定的,不随编译器和机器设置而变化,其中就有数据类型int32_t和int64_t,分别表示4字节和8字节。2.寻址和字节顺序----大端法和小端法 对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在内存中如何排列这些字节。在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为使用字节中最小的地址。注意:在字0x0123456...
2021-10-16 15:24:42
132
原创 虚拟内存理解
虚拟内存概念 虚拟内存是一个抽象的概念,它为每个进程提供一个假象,即每个进程都在独立地使用主存。每个进程看到的内存都是一致的,成为虚拟内存地址空间。在linux中,地址空间最上面的区域是保留给操作系统中的代码和数据的,这对所有进程来说都是一样的。地址空间的底部区域存放用户进程定义的代码和数据。 每个进程看到的虚拟内存地址空间由大量准确定义的区构成,每个区都有专门的功能。1. 程序代码和数据 对所有的进程来说,代码是从同一固定...
2021-10-13 22:36:25
296
原创 进程与线程中涉及的相关概念的理解
1.进程进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程看上去是独占地使用硬件。2.并发运行指一个进程的指令和另一个进程的指令是交错执行的。在多数系统中,需要运行的进程数是多余可以运行它们的CPU个数的。传统系统在一个时刻只能执行一个程序,而先进的多核处理器同时能够执行多个程序。无论是单核还是多核系统中,一个CPU看上去都像是在并发的执行多个进程,这是通过处理器在进程间切换来实现的。3.上下文切换 操...
2021-10-12 22:55:18
74
原创 主存中的数据组织
1.存储字长主存的一个存储单元所包含的二进制位数; 目前大多数计算机的主存按字节编址,存储字长也不断加大,如16位字长、 32位字长和64位字长;ISA设计时要考虑的两个问题:a)如何根据字节地址读取一个32位的字?- 字的存放问题b)一个字能否存放在主存的任何字节边界?- 字的边界对齐问题2.数据存储与边界关系1)按边界对齐的数据存储2)为按边界对齐的数据存储注释:虽节省了空间,但增加了访存次数!需要在性能与容量间权衡!3.边界.
2021-10-12 22:15:55
261
原创 多进程与多线程区别
我们知道,在一台计算机中,我们可以同时打开许多软件,比如同时浏览网页、听音乐、打字等等,看似非常正常。但仔细想想,为什么计算机可以做到这么多软件同时运行呢?这就涉及到计算机中的两个重要概念:多进程和多线程了。1. 全局解释器锁全局解释器锁 (英语:Global Interpreter Lock,缩写 GIL)是 计算机程序设计语言解释器 用于 同步线程 的一种机制,它使得任何时刻仅有 一个线程 在执行,即便在 多核心处理器 上,使用 GIL 的解释器也只允许同一时间执...
2021-10-11 23:38:57
1382
原创 原码一位乘法
注释:逻辑左移和算术左移操作是一样的,只是算术左移相当于乘2;逻辑右移和算术右移操作不一样,逻辑右移是数据整体右移,算术右移是数据位右移,但是最高位仍然被符号位占用(符号位保持不变);...
2021-10-11 22:49:57
1402
原创 定点与浮点数据表示
http://www.cs.berkeley.edu/~wkahan/关于浮点异常,见Kahan教授的《Lecture Notes on IEEE 754》
2021-09-27 22:37:41
109
原创 机器数及其特点
1.机器内数据的表示1)真值:符号用“+”,“-”表示的数据表示方法;2)机器数:符号数值化的数据表示方法,用0,1表示符号;3)三种常见的机器数:设定点数的形式为X0 X1 X2 X3 … Xn答案:补码:111111 模:2^6 = 64...
2021-09-26 23:05:49
759
转载 Python中super的使用
1.如何使用super一开始照着示例代码去用super的时候,觉得这个东西很简单,就像其他的单继承机制的语言中的super一样好用,好理解。可是,当你试着混合诸如bound super object,与unbound super object,metaclass,proxy object,descriptor,MRO,multiple inheritance 这样的概念一起来理解的时候,
2017-08-17 20:18:43
651
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人