自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 进程通信(5):POSIX消息队列

消息赋予一个优先级,Posix读一个消息队列总是返回最高优先级的最早消息,System V消息队列读可以返回任意指定优先级的消息。当往一个空队列放置一个消息时,Posix消息队列允许产生一个信号或者启动一个线程(Posix消息队列不提供这种机制。Posix消息队列,信号量和共享内存至少是随内核持续的,但是如果使用映射文件实现的,那就是随文件系统持续的。mq_send和mq_receive函数向队列中放置一个消息,从队列中取走一个消息。消息队列可以认为是一个消息链表,可以向消息队列发送消息和读取消息。

2024-07-19 22:13:09 244

原创 进程通信(4):System V消息队列

内核中的System V消息队列。

2024-07-17 23:54:07 76

原创 进程通信(3): System V IPC

get函数(msgget,semget,shmget)创建一个IPC对象,并指定IPC权限,get函数返回一个IPC标识符,用来表示IPC对象,System IPC包括System V消息队列,System V信号量,System V共享内存区。IPC标识符不是特定进程的标识符(文件标识符是基于进程的标识符),而是基于系统的标识符。System IPC在内核有限制,比如消息队列的最大限制,每个信号量集的最大信号量数等。包括用户id,组id,权限,槽号,键等信息。管理员可以修改这些限制。

2024-07-16 22:10:52 183

原创 进程通信(2):命名管道FIFO

在服务器端使用的公共的fifo命名管道(路径名被所有客户端知道),每个客户端创建自己的fifo文件,然后以只写的方式打开服务器的fifo文件,向fifo写自己的fifo路径名和要打开的文件名。(3)写操作的阻塞特性:FIFO的写操作是阻塞的(如果没有设置为非阻塞模式),这意味着如果没有读进程在另一端等待接收数据,写进程将被阻塞,直到有读进程出现。(2)大于PIPE_BUF的写操作:如果写入的数据量超过了PIPE_BUF的大小,那么写操作将可能被分割,也就是说,写操作可能不是原子的。

2024-07-15 23:22:36 898

原创 进程通信(1):无名管道(pipe)

首先父进程使用pipe创建两个管道pipe1和pipe2,然后使用fork创建子进程,在子进程中关闭pipe1的写端和pipe2的读端。因为父进程调用fork函数创建子进程,子进程拷贝父进程的文件表,由于父子进程文件表内容相同,指向的file相同,所有最终父子进程操作的pipe管道相同。(1)创建管道1(fdl[0]和fdl[1])和管道2(fd2[0]和fd2[1]);如果需要双向数据流,需要创建两个管道,然后关闭一个管道的读端和另一个管道的写端。(3)父进程关闭管道1的读出端(fd[0]);

2024-07-14 18:07:05 291

原创 linux内核中创建进程和线程做了什么工作?

但是线程由于共享了内存空间和其他一些资源,所以线程上下文切换的开销省去了复制父进程内存空间和其他一些资源的开销,所以使用线程可以有更高的并发度。从上面可以看到在创建线程时,有一个标志时表示创建的是线程,然后创建的线程和父进程共享虚拟内存空间,文件描述符,但是每个线程都有自己一个栈和TLS块,在线程初始化的时候设置栈指针、栈大小和TLS地址。stack_size=0x7fff00: 这个值通常表示栈大小,但在这个上下文中,它看起来像是一个无效的值(可能是输出解析的问题),因为栈大小应该是字节的数量。

2024-07-12 11:36:05 299

原创 操作系统:进程的状态

终止态:指进程完成任务到达正常结束点,或出现无法克服的错误而异常终止,或被操作系统及有终止权的进程所终止时所处的状态。当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行,进程这时的状态称为就绪状态。创建一个进程需要通过两个步骤:1.为新进程分配所需要的资源和建立必要的管理信息,设置该进程为就绪态,并等待被调度执行。当系统资源尤其是内存资源已经不能满足进程运行的要求时,必须把某些进程挂起(suspend),对换到磁盘对换区中,释放它占有的某些资源,暂时不参与低级调度。

2024-06-08 12:10:12 238

原创 操作系统笔记(1)进程相关

进程同步:多个相关进程在执行次序上进行协调,使并发执行的进程之间能按照一定的规则共享系统资源,并能很好的合作,从而使进程的执行具有可再现性。进程之间可能存在互斥或者同步的关系。访问临界资源。临界资源:一段时间内只允许一个进程访问的资源。进程合作。:临界资源必须互斥访问,访问临界资源的代码称为临界区。:每个进程在进入临界区钱,应先对临界资源进行检查,看是否正被访问。在临界区后,用于将临界区正被访问的标志恢复为未被访问的标志。(1)空闲让进:临界区无进程访问,让请求进入的进程立即进入。

2024-06-04 09:38:47 648

原创 C++笔记(1)

封装,类可以将内部数据(私有成员)隐藏起来,仅暴露有限的公共接口(公有成员函数)供外部访问,这样可以防止数据被不当修改。多态允许使用一个接口来表示不同类型的实体,从而能够在不修改现有代码的情况下,使程序能够处理多种数据类型或类的对象。这通过虚函数、重载运算符和函数重写等机制实现。继承是一种建立类与类之间关系的方式,子类可以继承父类的属性和方法,并在此基础上添加或修改,实现代码的复用和扩展。这有助于构建一个层次化的类结构,促进模块化和灵活性。6. 预处理指令有什么用?

2024-06-03 23:17:06 548

原创 超标量处理器设计:重排序缓存(ROB)

★超标量处理器的很多地方用到了重排序缓存,但是我对它不是很了解,所以我整理一下重排序缓存的知识点。重排序缓存(ROB)在确保乱序执行的指令能够正确地完成和提交(Commit),也可以用来寄存器重命名。ROB是一个先进先出的表,每个项是ROB表项,可以记录指令执行的信息。ROB表项的字段标志位,用来标记指令是否已经完成执行阶段。当指令的所有操作(包括计算、访存等)都完成,标志就会被置为“是”,指令准备好进入退休阶段。指令在程序代码中指定的目的寄存器(逻辑寄存器)。

2024-05-09 21:43:45 645

原创 超标量处理器设计:寄存器重命名(1)介绍

寄存器重命名是一种有效的解决方案,它通过映射逻辑寄存器到物理寄存器,允许逻辑上相同的寄存器在不同时间点映射到不同的物理寄存器,以此消除数据冲突。(1)循环是编程中常见的结构,循环内的寄存器使用很容易产生大量WAW相关性,即使通过循环展开减少迭代次数,最终也会受限于物理寄存器的数量。对于WAR相关性,后面的写操作的寄存器和读操作的寄存器不同,两个不会影响。:当一条指令准备执行,且需要写入寄存器时,寄存器重命名逻辑会检查映射表,为该逻辑寄存器分配一个新的物理寄存器。写的指令必须等待前读的指令完成。

2024-05-09 19:34:23 599

原创 unix环境编程:标准I/O库

继续学习《unix环境编程》。第五章 讲标准I/O库。1 引言标准I/O库提供一组通用、跨平台的输入/输出函数,确保了代码的可移植性。(1)缓存管理:标准I/O库管理读写缓冲区,减少了直接系统调用的次数。当使用fgetc从文件读取单个字符时,可能一次性从磁盘读取多个字符到缓冲区,下次读取时直接从缓冲区获取,减少了昂贵的磁盘I/O操作。(2)格式化输入输出:提供了格式化读写函数,如printf、scanf,使得数据的输入输出更加灵活和方便。

2024-05-09 16:51:27 706

原创 GPU术语

流处理器是GPU最基本的处理单元,在fermi架构开始被叫做CUDA core。一个SM由多个CUDA core组成。SM还包括特殊运算单元(SFU),共享内存(shared memory),寄存器文件(Register File)和调度器(Warp Scheduler)等。可向量化循环通常是指在编程中,能够被转换为向量操作或矩阵运算的循环结构。f可以使用向量化操作的for循环。

2024-05-07 16:18:15 825

原创 CUDA C编程:第一个程序 向量相加&点积

包括了出错的文件名(由__FILE__宏提供)、行号(由__LINE__宏提供),以及通过cudaGetErrorString(error)获取的错误描述字符串。#define CHECK(call) 定义了一个名为CHECK的宏,它接受一个参数call,这个参数是想检查的CUDA API调用。

2024-05-07 13:18:06 719

原创 SIMD指令集多媒体扩展

向量体系结构的这一特性简化了对不同长度向量操作的管理,同时减少了指令集的复杂度,因为不需要为每种可能的向量长度提供单独的指令。传统向量处理器设计有大规模的向量寄存器,可以存储和操作非常长的向量数据。相比之下,SIMD虽然也是基于向量运算的思想,但它更侧重于在通用处理器上实现低成本、高效能的并行处理能力,因此它操作的数据向量较短,使用的寄存器资源也相对有限。向量体系结构为了充分发挥其潜力,通常需要更高的存储器带宽,这是因为它们能够处理更长的向量,而这在很多现有计算机系统中难以满足,尤其是在考虑成本和能耗时。

2024-05-05 10:56:32 888

原创 向量体系结构(5):步幅&&集中一分散

笔记来源《计算机体系结构 量化研究方法》回答上一篇最后留下的问题(1)如何有效向量化多维矩阵运算?(2)向量处理器如何高效处理稀疏矩阵?步幅步幅指在内存中从一个数组元素移动到下一个元素时跨过的字节数。矩阵乘法示例(理解步幅的含义)内层循环对应矩阵B的某一行与矩阵D的某一列的逐元素乘法。由于C语言通常以行为主序存储多维数组,矩阵B和D的元素在内存中可能不是连续存放的。在C语言中,矩阵的行存储是连续的,但列之间存在较大的步幅。

2024-05-04 10:15:29 583

原创 向量体系结构(4):多条车道&&内存组

相比之下,CPU中的内存(通常指的是高速缓存和主内存)更多是指CPU直接交互的数据存储资源。在最基本的实现形式中,内存交错通常按照固定的模式,比如字节、字或更大的块大小,交错分布数据,使得内存访问请求可以被分散到多个物理内存模块上。:为了支持并行访问,内存组可能设计为多端口,即能够同时接受多个独立的读写请求,每个端口可以服务不同的处理器或计算单元,从而提高整体的内存访问带宽。简单的内存交错技术是一种内存管理策略,旨在通过将连续的内存地址映射到不同的内存模块(或内存bank)上,实现对内存的并行访问。

2024-05-03 20:39:08 38

原创 向量体系结构(3) 向量长度寄存器和向量遮罩寄存器

笔记来源《计算机体系结构 量化研究方法》第四章向量体系结构面对向量长度与处理器向量寄存器长度不匹配的情况(如VMIPS中寄存器长度为64),如何设计高效的策略来兼容和优化这类程序执行?分析如何有效处理含有条件分支(IF语句)的代码,使之能够向量化,从而扩展向量化的应用范围?解决方法就是使用向量长度寄存器(1)和 向量遮罩寄存器(2)

2024-05-02 16:19:04 997

原创 向量体系结构:向量执行时间

看《计算机体系结构 量化研究方法》做的笔记,接着上一篇写向量处理器工作的示例SAXPY或DAXPY循环。aX+YSAXPY代表“单精度a×X加Y”,进行单精度浮点数的运算,其中a是一个标量,X和Y是向量。运算过程是对向量X的每个元素乘以标量a,然后将结果加到对应位置的向量Y的元素上。DAXPY是“双精度a×X加Y”,双精度浮点数相比于单精度有更高的精度,占用更多的存储空间。这两个操作是衡量向量处理器性能的经典案例。使用MIPS指令集产生的汇编代码, 使用Loop循环,类似C语言中的for循环完成。

2024-05-02 15:32:21 965 1

原创 操作系统:磁盘交换空间

当系统的物理内存不足以存储当前所有活动进程所需的数据时,操作系统会将一部分暂时不用或使用较少的内存数据转移到磁盘的交换空间上,以此来释放物理内存供更活跃的进程使用。虽然使用磁盘作为额外的内存可以扩大系统可以同时处理的数据量,但由于磁盘的访问速度远低于RAM,频繁的交换操作会导致系统性能下降,响应变慢,这也就是为什么物理内存不足时系统会变得迟钝的原因。:磁盘上还需要保留一部分空间来存储文件系统的元数据,如文件的名称、大小、创建修改时间、权限信息等,以及文件系统的内部结构,如inode表(在某些文件系统中)。

2024-04-28 16:33:10 503

原创 计算机体系结构:并行度与并行体系结构的分类

共享内存的多处理器系统)中,通过创建并行执行的线程来开发数据级并行(如多线程并行处理同一数据集)或任务级并行(如多个线程执行不同的子任务)。这些任务通常在独立的计算节点上执行,相互间通信和同步相对较少,适用于处理大量独立、并行的任务或服务请求。向量处理器或图形处理器(GPU)设计为一次对一组数据(向量或数组)执行相同的单条指令,实现大规模数据级并行。利用编译器的帮助和硬件支持(如流水线、超标量架构、推测执行等技术),在单个处理器内同时执行多条指令,以减少指令执行的串行依赖,实现有限程度的数据级并行。

2024-04-27 17:37:49 225

原创 计算机体系结构:向量体系结构介绍

通过这种方式,程序员可以在循环中根据特定条件动态选择向量中的部分元素进行处理,无需中断向量流水线,从而保持高效的向量计算性能。第一个操作数是要载入数据的目标向量寄存器,即将从存储器中读取的双精度数据向量存储到该向量寄存器中。这种情况下,向量功能单元在执行指令时会获取标量值的一个副本,并将其与向量寄存器中的每个元素进行相应操作。尽管单次向量载入或存储可能需要较长的存储器延迟时间,但由于这些操作能够并行启动和独立执行,所以在等待某一批数据载入的同时,处理器可以继续处理已载入的数据或者启动下一批数据的载入。

2024-04-27 12:01:37 1172

原创 关于算法时间复杂度的一些理解

如果一个算法仅涉及对整个向量应用一条向量指令(如向量加法、乘法等),且该指令能在一个固定的、与向量长度无关的时钟周期数内完成对向量所有元素的并行处理,则该操作的时间复杂度可以视为O(1)。这些操作可能需要遍历整个向量,即使在向量处理器上并行执行,其时间复杂度仍可能与向量长度成正比,即O(n),其中n为向量长度。正常的话时间复杂度是O(logn),但是在linux操作系统中使用一个数据结构来缓存这个节点,在更新红黑树的时候维护这个节点,所以要访问的时候就是O(1)。算法复杂度的分析需要结合实际问题来看。

2024-04-27 11:54:36 151

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

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

2024-04-25 14:27:31 356

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

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

2024-04-22 15:52:30 662

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

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

2024-04-16 11:55:05 212

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

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

2024-04-15 13:11:09 817

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

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

2024-04-14 20:38:36 850

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

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

2024-04-12 15:39:44 844

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

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

2024-04-12 13:13:42 1255

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

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

2024-04-11 15:42:17 658

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

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

2024-04-11 14:58:15 1285

原创 计算机体系结构(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 247

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

定义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 1016

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

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

2024-04-08 13:25:05 296

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

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

2024-04-08 13:23:51 26

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

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

2024-04-04 23:08:56 582

原创 算法整理:二分查找

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

2024-04-01 19:24:02 471 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 576

原创 算法整理:排序

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

2024-03-31 18:35:51 557

二叉树和链表.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

空空如也

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

TA关注的人

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