自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(882)
  • 资源 (2)
  • 收藏
  • 关注

原创 C++面向对象:重写、重载、隐藏

如果foo写错的话,就会当成一个新的函数来看,所以这时可以用override来规定这个函数就是要重写父类的一个函数,如果名字打错的话不会通过。如果不希望一个类被继承 或者 一个类被重写,直接在类或函数后面加final关键字。如果重写或继承编译器就会报错。父类定义了虚函数,子类重写父类的虚函数,以下三种方法都可以。

2024-04-25 14:27:31 199

原创 unix环境编程:文件和目录

stat函数用来获取文件的数据信息。系统中命令就是利用这个函数实现的。根据文件的路径(path)或是文件描述符(fd)得到该文件的相信息,填到struct stat类型的结构体中。例:获取指定文件路径的stat结构体并打印。3.文件类型通过 struct stat 结构体的 st_mode 成员可以获得文件类型信息。Linux 系统中的文件共分为 7 种类型: 目录、字符设备文件、块设备文件、普通文件、符号链接文件、 套接字文件、管道文件。最常见且最基本的文件类型,包含任何形式的数据。

2024-04-22 15:52:30 625

原创 深入理解计算机系统:流水线的原理

在处理器设计中,这些阶段对应于指令执行的不同步骤,如取指、译码、执行、访存和写回等。在流水线中,任务(或指令)必须按照规定的顺序依次通过各阶段,以保持系统的稳定运行。自助餐厅中仅需甜点的顾客在非流水线系统中可能更快完成,在流水线系统中,该顾客仍需遵循沙拉、主菜、甜点的顺序,即使他并不需要前两者,这会导致其个人服务时间增加,所以这种顾客花的时间会比要求更长一点。所有顾客必须按照沙拉、主菜、甜点、饮料的固定顺序依次通过各个阶段,即使个别顾客可能不需要某个阶段的食物。,即单位时间内处理的任务数(或指令数)。

2024-04-16 11:55:05 186

原创 UNIX环境编程:文件I/O

★内容概述: 本章主要讲了文件I/O,即不带缓冲的I/O,然后介绍了不带缓冲I/O函数随后介绍了文件共享实现方式,主要是使用3种数据结构实现(进程表项,文件表项,v-node和i-node)。然后从文件共享提出了一个问题,就是多个进程同时操作文件可能产生的数据一致性问题,由此又介绍了两个原子操作(pread和pwrite)。最后介绍了常用的I/O控制函数。

2024-04-15 13:11:09 802

原创 超标量处理器设计:基于竞争的分支预测&&分支预测的更新

★ 继续学习体系结构的知识。接着上一讲继续写核心概念:这种方法根据每条分支指令在过去执行状况(局部历史)进行预测。为每条分支指令分配一个分支历史寄存器(BHR),记录其局部执行历史。预测机制:使用由两位饱和计数器组成的模式历史表(PHT)来捕捉每个BHR的规律。预测时,结合BHR和PHT的信息,判断分支指令未来是否跳转。优点与适用场景:对于那些行为主要取决于自身执行历史的分支指令(如循环体内部条件判断),基于局部历史的预测方法能够准确捕捉其规律,实现较好的预测效果。核心概念。

2024-04-14 20:38:36 800

原创 超标量处理器设计:基于全局历史的分支预测

基于局部历史的方法通常会结合分支指令的PC值(程序计数器)和GHR值来生成唯一的地址,以确保即使GHR值相同,不同的分支指令也能访问PHT中不同的饱和计数器。其中,1代表分支跳转,0代表分支未跳转。这样,即使两条分支指令的GHR值相同,由于它们的PC值不同,拼接后的地址也会不同,从而指向PHT中不同的饱和计数器。此图应展示了采用单一PHT的简化分支预测结构,直观地呈现了所有分支指令如何共用一个PHT来进行预测,以及这个PHT如何存储和更新不同分支的执行模式,以实现全局范围内分支预测的资源优化。

2024-04-12 15:39:44 681

原创 超标量处理器设计:两位饱和计数器&基于局部历史的分支预测

程序中有一种叫做分支指令的指令,如果在取指令阶段就可以预知本周期所取指令中是否存在分支指令,并且知道其方向(跳转/不跳转)以及目标地址,就可以从在下个周期从分支指令的目标地址开始取指,让流水线正确进行,提高处理器的执行效率。(1)静态分支预测:预测分支指令总是不执行的,处理器总是顺序地取指令。(2)动态分支预测:并不简单预测分支指令一直跳转或不跳转,而是根据分支指令在过去一段时间的执行情况来决定预测结果。

2024-04-12 13:13:42 931

原创 超标量处理器设计:ARM指令集

参考《超标量处理器设计》第五章。

2024-04-11 15:42:17 619

原创 超标量处理器设计:精简指令集MIPS指令介绍

指令长度:MIPS指令集中的所有指令(除特殊情况下的MIPS16e扩展指令外)均为固定长度的32位(即4字节),这简化了指令解码和流水线操作。指令分类:MIPS指令被划分为三种基本类型:I-Type、J-Type和R-Type。

2024-04-11 14:58:15 1004

原创 计算机体系结构(2)组合逻辑

下面讲decoder,multiplexer,full adder,PLA(Programmable logic Array)S是选择输入,当 S = 0 时,输出Y和输入D0相同;8-1选择器可以实现任意一个3输入的函数(FPGA就是这样构成的。解码器 n 个输入,2^n 个输出,只有一个输出为1,其余都是0。时序逻辑电路可以存储值,输出是由输入和上一个状态决定。由3个关键部分: 计算,通信,存储。可以写出最小项,然后使用PLA实现全加器的功能。不同的逻辑组合可以得到功能更复杂的块。

2024-04-10 11:16:39 225

原创 动态规划:背包问题合集

定义dp[i][j]:在前i件物品中选出若干件,放入容量为j的背包,能获得的最大价值。考虑第i件物品拿还是不拿。讨论c[i]与背包容量的关系:(1)j < c[i] 时,背包容量为j,而第i件物品重量大于j只能选择不拿:f[i][j] = f[i-1][j]( 2) j >= c[i] 时,背包可以拿可以不拿第i个物品。

2024-04-08 16:44:06 931

原创 计算机体系结构(1) 介绍和基础

为了跟上我们组学习的进度,打好体系结构的基础,接下来我会持续的学习计算机体系结构的知识。比如,特斯拉自动驾驶的芯片,是根据汽车的工作负载设计的,可以支持机器学习推理加速,行人识别等任务。现在的体系结构,能效是一个非常非常大的制约因素。(2)energy-feeicient(低功耗),符合可持续发展的目标。GPU是一个特殊的系统,针对图形处理设计的。设计根据目标不同实现的方法也不同,设计不同的体系结构原则是相同的。以内存为中心的计算架构 和以 数据为中心的架构是不同的。可以设计更好的硬件,软件,系统,思维。

2024-04-08 13:25:05 272

翻译 Deep Learning’s Carbon Emissions Problem(人工智能造成碳排放问题)

本月早些时候,OpenAI宣布构建了史上最大的AI模型GPT-3,这是一项令人惊叹的技术成就,但同时也凸显出人工智能领域一个令人担忧且有害的趋势,即现代AI模型消耗巨大的能源,且这种需求正以惊人的速度增长。尽管该估计针对的是特别耗能的模型,但值得注意的是,当时进行分析时,GPT-2是可供研究的最大模型,被视作模型尺寸上限。例如,自动驾驶车辆的AI底层神经网络首先需要在前期学习驾驶,训练完成后,在车辆投入使用期间,模型会持续进行推理以实时导航环境,日复一日,只要车辆在使用就不停止。这本身并没有科学上的进步。

2024-04-08 13:23:51 14

原创 机器学习模型:决策树笔记

决策树有过拟合的风险,理论上可以完全分得开数据(如果树足够庞大,每个叶子节点就一个数据)决策树判断顺序比较重要。可以使用信息增益、信息增益率、后剪枝:当建立完决策树后进行剪枝操作(用的不多)。预剪枝:边建立决策树边进行剪枝的操作(更实用)。

2024-04-04 23:08:56 566

原创 算法整理:二分查找

在集合搜索特定值的过程,每次比较之后将查找空间。要查找的值当前位置维持查找空间的指标用来确定向左查还是向右查的索引二分查找维护left,right,mid,并将target和索引为mid的值进行比较;如果条件不满足或值不相等,则清除目标不可能存在的那一半,并在剩下的一半继续查找,直到成功为止第二种情况:右面第一个符合条件的下标。注意讨论r=n-1的情况。如果没有数符合条件,那么r最终就停在n-1的位置。给定一个数组,需要判断数组长度。比如访问到idx-1和idx+1时,长度必须大于等于3.

2024-04-01 19:24:02 459 1

原创 算法整理:滑动窗口

每次for循环,i++,表示i指针向后移动一位,while是找和 i 匹配,在i左面最远的合法 的下标 j。(如果求最小值,那 么 while 就是找和 j 匹配,在i左面最近的合法下标 j)所以 while 循环的作用是在i向右移动一位后,使滑动窗口合法,在滑动窗口合法后更新答案。先把这个模板写下来,然后再想每道题目如何做。双指针算法的本质:优化循化O(n2)优化为O(n)性质:i,j的移动一般具有单调性。i向后移动时,j只能向后移动或者时不动,不能向前移动。

2024-03-31 21:31:37 569

原创 算法整理:排序

快速排序首先不妨以第一个数为基准数,在一轮遍历后,使基准数左边的数都小于基准数,基准数右边的数都大于基准数。当然也可以取中间的数为基准数。i,j相遇时,枢轴通常会被放置在两个指针相遇的位置上。

2024-03-31 18:35:51 552

原创 算法整理:链表

注意:1.删除节点需要dummyNode 2.最后返回的是dummyNode.next而不是head.while停止后,p为null,cnt为对应到最后一个节点上面。//cnt与p不同步对应。规律:开始的时候同步和结束时候的同步规律是一致的。(2)长的链表走|n1-n2|步,使两个链表长度相同。(3)两个链表一起走,相等返回,走到头返回null。(1)fast和slow置头结点,速度为2,1。(1)求两个链表长度n1,n2。

2024-03-31 13:20:54 589

原创 linux进程通信:信号

信号(软中断信号 signal)是一种更高层的软件形式的异常,它允许进程和内核中断其他进程。一个信号就是一条小消息,它通知进程 系统中发生一个某种类型的事件。每种信号对应某种系统事件,低层的硬件异常是由内核异常处理程序处理的,正常情况下,对用户进程而言是不可见的,信号提供一种机制,通知用户进程发生了异常。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。

2024-03-31 10:56:19 801

原创 操作系统:fork函数

当fork函数被当前进程调用时,内核为新进程创建各种数据结构,并分配给它一个唯一的PID,为了给这个新进程创建虚拟内存,它创建了当前进程的mm_struct、区域结构和页表的原样副本,它将两个进程的每个页面都标记为只读,并将两个进程中的每个区域结构都标记为私有的写时复制。当fork在新进程返回时,新进程现在的虚拟内存刚好与调用fork时存在的虚拟内存相同,当两个进程中的任意一个后来进行写操作时,写时复制就会创建新页面,因此,也就为每个进程保持了私有地址空间。如果使用了fork,就产生了另一个进程。

2024-03-30 17:37:05 341

原创 C++面向对象:C++的垃圾回收

垃圾收集是编程语言中 使用的内存管理技术之一。它是一种自动内存管理技术,作为许多编程语言的功能添加。垃圾收集器收集或回收分配给变量或对象但不再被程序使用的内存;这也称为垃圾。引用技术算法是唯一一种不用用到根集概念的垃圾回收算法。基本思路是为每个对象加一个计数器,计数器记录的是所有指向该对象的引用数量。每次有一个新的引用指向这个对象时,计数器加一;反之,如果指向该对象的引用被置空或指向其它对象,则计数器减一。当计数器的值为0时,则自动删除这个对象。

2024-03-28 19:57:57 609

原创 深入理解计算机系统:链接

如 #define a b 这种伪指令,预编译所要做的是将程序中的所有 a 用 b 替换,但作为字符串常量的 a 则不被替换。还有 #undef,则将取消对某个宏的定义,使以后该串的出现不再被替换(2)

2024-03-28 17:26:05 496

原创 算法题整理:bfs

对于100%的数据N

2024-03-27 23:02:58 275

原创 C语言: 指针讲解

C语言中,定义变量时,在变量名 前 写一个 * 星号,这个变量就变成了对应变量类型的指针变量。必要时要加( ) 来避免优先级的问题。

2024-03-25 16:51:16 983

原创 深入理解计算机系统:虚拟内存

程序的内存分配一个由C编译的程序占用的内存分为以下几个部分:1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(静态区)(static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

2024-03-25 16:28:51 950

原创 C++面向对象:智能指针讲解

C++中动态内存的管理是通过new和delete来完成的,保证new和delete的配对使用。但是有时候会忘记释放内存,甚至有时候我们根本就不知道什么时候释放内存。特别时在多个线程间共享数据时,更难判断内存该何使释放。这种情况下就机器容易产生引用非法内存的指针。由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见。

2024-03-24 21:40:34 1037

原创 算法题:dfs总结

记忆化递归:(1)参数个数为n,申请一个n维数组(哈希表),确保能够根据参数直接访问数组(哈希表)的值(2)函数体:如果数组(哈希表)已经记录过参数对应的函数值,直接返回该值在所有出现return前,return的值记录到数组(哈希表)中普通的递归可能会重复求解某一值,类似斐波那契数列。这样就会很慢很慢很慢我们把历史求解(子问题)记录下来,如果下次需要求解子问题,那么直接取出就好。其时间复杂度为O(1)根据n-1的状态推出第n个状态。当n=1时,返回()

2024-03-22 14:31:31 592

原创 C++面向对象:const的使用

对于非内置类型(例如自定义的类或结构体),它们通常包含多个数据成员,构造、拷贝和析构过程可能会涉及复杂的操作,尤其是在类中包含指针、动态分配的内存或其他资源时,拷贝的成本会相对较高。枚举常量在编译时就被赋予了固定的值,它们不占用对象的存储空间,适用于定义一些固定数值(如数组大小等),但要注意枚举常量的隐式类型为整型,且所能表示的最大值有限制,无法直接表示浮点数。,返回值被声明为const Rational,是因为乘法运算的结果通常是新的Rational对象,我们期望这个新产生的对象是不可变的。

2024-03-22 12:21:05 1182

原创 C语言:volatile关键字讲解

易变”是因为外在因素引起的,像多线程,中断等。中修改的供其它程序检测的变量,需要加volatile:当变量在触发某中断程序中修改,而编译器判断主函数里面没有修改该变量,因此可能只执行一次从内存到某寄存器的读操作,而后每次只会从该寄存器中读取变量副本,使得中断程序的操作被短路。volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,告诉编译器对该变量不做优化,都会直接从变量内存地址中读取数据,从而可以提供对特殊地址的稳定访问。

2024-03-21 11:43:12 928

原创 C++面向对象:static的使用

C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。面向过程程序设计中static的用法主要可以总结:限制作用域,自动初始化为0,具有持久性。static可以修饰全局变量,局部变量,函数。对应的叫静态全局变量、静态局部变量、静态函数初始化:未经初始化的全局静态变量会被自动初始化为0作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。

2024-03-19 21:55:41 559

原创 C++面向对象:virtual关键字的使用

1.如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,那么即使加上了virtual关键字,也是不会进行滞后联编的。2.只有类的成员函数才能说明为虚函数,因为虚函数仅适合用与有继承关系的类对象,所以普通函数不能说明为虚函数。3.静态成员函数不能是虚函数,因为静态成员函数的特点是不受限制于某个对象。4.内联(inline)函数不能是虚函数,因为内联函数不能在运行中动态确定位置。即使虚函数在类的内部定义定义,但是在编译的时候系统仍然将它看做是非内联的。

2024-03-19 11:32:36 785

原创 算法复习:二叉树合集

二叉树复习

2024-03-19 11:09:16 258

原创 操作系统: 异常控制流(1)异常的讲解

本文讲了操作系统中异常控制流的概念和分类。包括中断、陷阱、故障、终止。

2024-03-08 17:32:53 425

原创 记录第一次使用QT

今晚和舍友准备搞一个QT网盘的项目,我之前也没有用过QT。在舍友的指导下,我安装了QT creator,然后完成了第一次的QT的编译运行,记录一下这激动的感觉(2024-03-07)。使用qmake进行的编译。qDebug进行输出调试hello qt。

2024-03-06 21:15:58 612

原创 python绘制特殊的柱状图

python绘制特殊的柱状图

2024-03-03 15:48:20 249

原创 C++常见问题:this指针做什么用的?

类中用const修饰的函数通常用来防止修改对象的数据成员,函数末尾的const是用来修饰this指针,防止在函数内对数据成员进行修改,而静态函数中是没有this指针的,无法访问到对象的数据成员,与C++ static语义冲突,所以不能。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。一个类中的不同对象在调用自己的成员函数时,其实它们调用的是同一段函数代码,那么成员函数如何知道要访问哪个对象的数据成员呢?

2024-02-27 20:33:48 274

原创 C++ STL:hashtable源码分析

当hashtable中插入的元素个数大于当前vector的容量时,会新建一个vector,新vector的容量是之前vector容量所在质数表里的下一个质数,如53的后一个是97,新vector的容量为97。函数将不同类型的key数据转换成统一的数值格式(如:const char *转换成特定的数值),以便hash函数进行取模处理,取模用的模值就是桶的数量值,也就是vector的容量。m不应该是进制数的幂,比如十进制的时候,m如果是10^n,那么结果总是和原始值的后n位相关的,这样冲突的概率会更大。

2024-02-27 15:18:55 993

原创 C++ STL:set/multiset、map/multimap源码剖析

对于一个map容器,每次插入、删除或者查找返回的迭代器,其指向的红黑树中node节点,对其使用迭代器,解出的值的类型是value_type,这是一个pair的包装类,红黑树中定义了它的Key为const Key,而其值的类型为T,这样对于每次返回的迭代器就可以实现,其中Key为const类型不能修改,对于实值不是const,可以修改。其中set跟multiset不一样的是,set插入的时候调用的是insert_unique(),而multiset调用的是insert_equal()。具体可以参考这篇文章。

2024-02-27 09:59:05 435

原创 C++ STL :红黑树rb_tree源码剖析

STL关联式容器map、set、multimap、multiset,绝大部分操作如插入、修改、删除、搜索,都是由其内含的红黑树来完成的。我下面会总结 STL中rb_tree怎么实现的。首先,rb_tree是红黑树,所以需要定义红色和黑色。然后需要定义 红黑树的节点。_Rb_tree_node_base定义了红黑树的节点类,从类中可以看出一个节点有颜色、父指针、左孩子指针、右孩子指针4个属性。然后定义了几个函数,可以找到以这个节点为根节点的红黑树的最大节点和最小节点。

2024-02-25 22:14:15 1043

原创 数据结构与算法:红黑树讲解

1.节点非红即黑。2.根节点是黑色。3.所有NULL结点称为叶子节点,且认为颜色为黑。4.所有红节点的子节点都为黑色。5.从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点。

2024-02-25 20:33:17 687

二叉树和链表.docx

二叉树和链表.docx

2024-03-19

eclipse连接hadoop

eclipse连接hadoop所需的配置文件和jar包。 使用说明: 参考博文:https://www.cnblogs.com/supiaopiao/p/7240308.html Tips: 上面网站中的第六步,打开eclipse的右上角有个田字格,选择Map/Reduce。 可能存在没有Map/Reduce字样的情况 解决方法: https://www.cnblogs.com/2016-zck/p/10298631.html

2022-05-16

南邮程序设计周作业_图书管理系统.zip

程序设计周作业

2021-11-12

空空如也

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

TA关注的人

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