GPU和CPU区别?为什么挖矿、大模型都用GPU?

典型回答 GPU(图形处理单元)和CPU(中央处理单元)是计算机中两种不同类型的处理器,它们在设计和功能上有很大的区别。 CPU是计算机的大脑,专门用于执行各种通用任务,如操作系统管理、数据处理、多任务处理等。它的架构设计旨在适应多种任务,具有较少的核心,但每个核心非常强大且灵活。 GPU最初是为图形渲染和图像处理而设计的,因此其架构包含大量的小核心,适合并行处理。这些核心可以同时处理多个相似的任务,使其在某些计算任务中表现得比CPU更高效。 所以,CPU核心数少、GPU核心数多;CPU适合做各种复杂任务,GPU适合做重复性的计算任务。 GPU拥有大量的核心,可以同时处理多个任务。这使得GPU在同时进行大量相似计算时非常出色。 举个例子,CPU更像是一个诸葛亮,能文能武,什么都能做。GPU就像是一群臭皮匠,虽然没那么聪明,但是优势在于人多,能干很多重复性的劳动。比如重复性的数学计算。 而我们熟知的,挖矿和大模型训练,都符合GPU适合的那种重复性计算工作。 挖矿:加密货币挖矿通常涉及大量的计算密集型任务,这些任务可以通过并行处理来加速。GPU由于其并行处理能力,能够在挖矿过程中执行多个计算任务,从而提高挖矿效率。 大模型训练:训练深度学习模型涉及大量的矩阵运算和神经网络计算,这些计算可以有效地并行化。由于GPU在并行计算方面的出色表现,它们在加速深度学习训练过程中发挥了关键作用。大模型的训练可以分解成许多小任务,这些任务可以在GPU的多个核心上同时进行,从而显著加快训练速度。

March 22, 2026 · 1 min · santu

write和fsync的区别是什么?

典型回答 write 和 fsync 是操作系统中常用的文件 I/O 操作,它们都与数据写入磁盘有关。 write 是把数据写入内存缓存区,fsync 是把内存缓冲区数据真正刷到磁盘。 除了这两个。还有一个 fdatasync ,它将指定文件的数据部分从操作系统缓存中同步到磁盘,但可能不会刷新元数据(比如文件的修改时间、权限等)。 因为write 是把数据写入内存缓存区,如果没有来得及写入磁盘,操作系统就崩溃或者断电了,那么这个数据就丢了。 现在也可以在RAID 控制器上配备电池模块的RAID 卡。这种电池通常被称为“电池备份单元(BBU)”或“RAID 卡电池”,主要作用是在服务器断电时,为RAID 控制器上的高速缓存(RAM)提供电力,以确保缓存中的数据安全地写入硬盘,防止数据丢失。 需要注意的是,如果一个数据想要写入磁盘,可以只进行write,但是不能只进行fsync或者fdatasync,因为要先写入缓冲区才能通过fsync/fdatasync同步到磁盘。 但是如果write之后没有执行fsync/fdatasync的话,操作系统也会在后台把缓存区中的数据异步刷到磁盘(例如通过 pdflush)。 但是前提还是不断电。

March 22, 2026 · 1 min · santu

什么是Page Cache,他的读写过程是怎么样的?有什么优缺点?

在操作系统中,文件数据是存储在磁盘上的,而每次应用程序想要读取数据的时候,如果都和磁盘进行交互,速度会非常慢,不仅是读请求会慢,写操作也是一样的,向磁盘中直接写入数据也需要很大的时延。 为了提升磁盘的读写效率,操作系统在磁盘之上,通过了一个page cache(页缓存),页缓存其实是内存的一种,他就是可以将数据缓存到内存中,从而减少对磁盘的实际读写操作。 通过在内存中缓存数据,操作系统可以更快速地响应文件操作请求,因为访问内存的速度比访问磁盘快得多。 页缓存中的“页”(page)是指计算机内存管理中的基本单位。在大多数操作系统中,内存被分成固定大小的块,这些块通常称为“页”。页的大小通常是2的幂,例如4 KB或8 KB。 读写过程 有了page cache之后,一次读操作的过程如下: 1、当一个应用程序请求读取文件时,操作系统首先检查page cache是否已经包含了所需的数据。 2、如果数据在cache中(称为“命中”),则直接从内存中读取数据,避免了磁盘I/O操作。 + 3、如果数据不在cache中(称为“未命中”),则从磁盘读取数据,并将数据写入page cache,以便下次读取时能够更快地获取数据。 这里面读取到数据大小并不是用多少取多少,而是采用**预读**的方式,额外读取一些数据,预读的大小一般都是以页为单位的。如果请求读取的数据量小于一页(通常4k),操作系统通常仍会读取完整的一页。 如果应用程序请求的数据量大于一页,操作系统可能会一次性读取多个连续的页,以减少后续的磁盘I/O操作。 有了page cache之后,一次写操作的过程如下: 当向文件中写入数据时,,然后从文件中读取数据到页缓存,并且把新数据写入到页缓存中。对于被修改的页缓存,内核会定时把这些页缓存刷新到文件中。 1、当一个应用程序请求写入文件时,如果要写入的数据所在的页缓存已经存在,那么直接把新数据写入到页缓存即可,否则,内核首先会申请一个空闲的内存页(页缓存)。 2、操作系统通常将数据写入page cache中,而不是立即写入磁盘。这种方法被称为“延迟写”或“写回缓存”(write-back caching)。 + 3、页缓存中的数据会标记为“脏页”(dirty pages),表示这些数据需要写入磁盘 + 4、操作系统不会立即将脏页写入磁盘,而是会等待合适的时机(如系统空闲时或达到一定阈值时)将脏页批量写入磁盘。这种方式可以减少磁盘写操作的频率,提高整体系统性能。 脏页写入磁盘的触发条件一般有以下几个: 1、页缓存的大小达到一定阈值时,操作系统会触发写入操作,将部分或全部脏页写入磁盘。 ** **2、系统内存压力增大时,操作系统也可能会主动将脏页写入磁盘,以释放内存空间。 ** **3、文件系统的同步操作(如fsync、sync命令)会强制将所有脏页写入磁盘,以确保数据持久化。 操作系统将脏页中的数据写入磁盘也不是一条一条写入的,通常是按页或多个页的块进行整体写入。写入完成后,这些页会被标记为“干净页”(clean pages),表示数据已经同步到磁盘。 优缺点 page cache 的优点非常明显,也很容易理解: 提高性能:按照页去读取和写入磁盘,操作减少了对磁盘的频繁I/O操作,提高文件读取和写入的速度。 减少磁盘损耗:磁盘I/O次数少了,还能有助于延长磁盘的使用寿命。 然而,page cache 也有一些潜在的缺点: 1、内存占用:缓存数据需要占用内存资源,如果系统内存有限,可能会影响其他应用程序的性能。 2、数据丢失风险:由于数据在写入磁盘前暂时存储在内存中,如果系统在数据同步到磁盘前崩溃,未写入的数据可能会丢失。

March 22, 2026 · 1 min · santu

什么是全双工和半双工

典型回答 单工、半双工和全双工是通信中两种基本的传输模式,描述了数据在通信双方之间的流动方式。 单工**:** 单工通信只允许数据在一个方向上传输,即只能从一个点向另一个点发送数据。通信的一方只能发送,而另一方只能接收。 一般的广播电台是单工通信的例子,听众只能接收广播,无法向电台发送信息。 半双工: 在半双工通信中,数据可以在通信双方之间双向传输,但不能同时进行。换句话说,通信的两端可以交替地发送和接收数据,但不能同时进行这两个操作。类比于对讲机,一方说话时另一方只能听,不能同时说话。 全双工: 在全双工通信中,数据可以在通信双方之间双向同时传输。每一方都可以独立地发送和接收数据,而且这两个操作可以同时进行。类比于电话,两个人可以同时说话而互不干扰。 计算机之间通过网络进行通信时,可以使用全双工通信。例如,TCP连接允许数据在两个方向上同时传输。 选择半双工还是全双工通信取决于具体的应用需求和通信设备的能力。在一些场景中,例如对讲机通信,半双工可能足够满足需求。在其他场景中,例如网络通信和电话通信,通常使用全双工以提供更高的效率和实时性。

March 22, 2026 · 1 min · santu

什么是分段和分页?

典型回答 在操作系统中,分段和分页是两种不同的内存管理技术,用于管理和分配进程的内存空间。它们的主要目标是提供对物理内存的有效和安全访问,但它们采用了不同的方法来实现这一目标。 分页 大部分虚拟内存系统都会使用分页技术。分页技术把物理内存按照固定大小分为页面(一般是4KB)。通过分页,我们可以更细粒度的管理物理内存和虚拟空间的映射,也可以更高效的利用物理内存。对于一个64KB的虚拟地址和32KB的物理地址来说,如下图所示: 如果用户访问到的虚拟地址还没有分配物理地址,那么系统就会发生缺页中断。将需要访问的页面装载到页框中,修改MMU中的映射关系,重新返回。 页表 对于虚拟地址和物理地址的映射关系的存储,我们一般是通过页表来完成的。页表中会记录虚拟地址的虚拟页号和偏移量,以及其对应的实际页框号。从数学角度说,页表是一个函数,它的参数是虚拟页号,结果是物理页框号。 同时,因为增加了页表的映射,中间就一定会有空间和时间的损耗,有两个问题: 虚拟地址到物理地址的映射需要时间,这个时候就需要引入快表(TLB)加速页表的访问。 如果虚拟地址空间很大,页表也会很大,可能会浪费空间。假设64bit的操作系统,虚拟地址的大小为2^64,如果每页是4KB,那么需要的记录数就是2^64/2^12=2^52项。同时,因为每个进程都有一个独立的虚拟地址,所以每个进程都有自己独立的页表,那么这种情况下,记录的项目就会变得非常多 对于第二种情况,我们可以采用多级页表和倒排页表的方式来解决。 多级页表的核心就在于避免把所有的页表全部保存在内存中,如果是不需要的页表,就不会保留。 倒排页表常用于64bit的计算机中,往往需要和TLB结合使用才可以。 分段 有了分页之后,一个进程就可以享受很大的,独立的虚拟地址了。但是有一个问题我们没有考虑到,一个进程中一定会包含代码,常量,以及代码在运行时所产生的变量。那么,用户的程序如何保证这些代码所在的空间不和代码运行时候的堆栈空间冲突呢? 如果我们只是简单的将虚拟内存按照一维的方式将空间分给这些堆栈,代码片段等,就很难保证空间的有效利用,如下图所示: 此时,我们发现,程序的堆栈空间已经用完了,但是代码段还有很多没有用。这个时候就需要程序手动管理这些一维空间,无疑的比较复杂且困难的。 所以就有了分段技术的产生。它可以让每个段独享一部分可以自然增长的空间,且和其他段相互隔离,如下所示: 分段分页的区别 关联点 分页 分段 程序猿是否感知 否 是 地址空间是否可以超过物理空间 是 是 不同用户是否方便共享 否 是 是否定长 是 否 发明原因 获得更大的线性地址空间 使程序和数据被划分为逻辑上独立的空间

March 22, 2026 · 1 min · santu

什么是操作系统的多级缓存

典型回答 我们应该都知道,计算机在执行程序的时候,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道。而计算机上面的数据,是存放在主存当中的,也就是计算机的物理内存啦。 刚开始,还相安无事的,但是随着CPU技术的发展,CPU的执行速度越来越快。而由于内存的技术并没有太大的变化,所以从内存中读取和写入数据的过程和CPU的执行速度比起来差距就会越来越大,这就导致CPU每次操作内存都要耗费很多等待时间。 可是,不能因为内存的读写速度慢,就不发展CPU技术了吧,总不能让内存成为计算机处理的瓶颈吧。 所以,人们想出来了一个好的办法,就是在CPU和内存之间增加高速缓存。缓存的概念大家都知道,就是保存一份数据拷贝。他的特点是速度快,内存小,并且昂贵。 那么,程序的执行过程就变成了: 当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。 而随着CPU能力的不断提升,一层缓存就慢慢的无法满足要求了,就逐渐的衍生出多级缓存。 按照数据读取顺序和与CPU结合的紧密程度,CPU缓存可以分为一级缓存(L1),二级缓存(L2),部分高端CPU还具有三级缓存(L3),每一级缓存中所储存的全部数据都是下一级缓存的一部分。 这三种缓存的技术难度和制造成本是相对递减的,所以其容量也是相对递增的。 那么,在有了多级缓存之后,程序的执行就变成了: 当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。 单核CPU只含有一套L1,L2,L3缓存;如果CPU含有多个核心,即多核CPU,则每个核心都含有一套L1(甚至和L2)缓存,而共享L3(或者和L2)缓存。 下图为一个单CPU双核的缓存结构。

March 22, 2026 · 1 min · santu

什么是零拷贝?

典型回答 要想理解零拷贝,首先要了解操作系统的IO流程,因为有内核态和用户态的区别,为了保证安全性和缓存,普通的读写流程如下: (对于Java程序,还会多了一个堆外内存和堆内存之间的copy) 程序发起read()系统调用,要求从磁盘读取文件数据: 上下文切换:由用户态进入内核态 DMA拷贝:通过DMA技术将磁盘中的数据copy到内核缓冲区中 CPU拷贝:当DMA完成工作后,会发起一个中断通知CPU数据拷贝完成,然后CPU再将内核缓冲区中的数据copy到应用程序缓冲区中 上下文切换:read()调用返回,系统从内核态切换会用户态。内核唤醒对应线程,同时将用户态的数据返回给该线程空间 程序发起write()系统调用,要求将应用程序缓冲区里的数据通过socket发送出去: 上下文切换:从用户态切换到内核态。 CPU 拷贝:CPU将数据从应用程序缓冲区拷贝到内核的socket缓冲区(Socket Buffer)。 DMA 拷贝:DMA引擎将数据从socket缓冲区拷贝到网卡(NIC)缓冲区,准备进行网络传输。 上下文切换:write()调用返回,系统从内核态切换回用户态。 在这个过程中,如果不考虑用户态的内存拷贝和物理设备到驱动的数据拷贝,我们会发现,这其中会涉及4次数据拷贝。同时也会涉及到4次进程上下文的切换。所谓的零拷贝,作用就是通过各种方式,在特殊情况下,减少数据拷贝的次数/减少CPU参与数据拷贝的次数。 常见的零拷贝方式有mmap,sendfile,dma,directI/O等。 扩展知识 DMA(Direct Memory Access,直接内存访问) 正常的IO流程中,不管是物理设备之间的数据拷贝,如磁盘到内存,还是内存之间的数据拷贝,如用户态到内核态,都是需要CPU参与的,如下所示 如果是比较大的文件,这样无意义的copy显然会极大的浪费CPU的效率,所以就诞生了DMA,Direct Memory Access你翻译一下也能知道,就是让硬件设备能够直接与主内存进行数据读写。 DMA控制器是一个专门的硬件单元,可以看作是CPU的一个“搬运工助理”。 CPU下达指令:CPU对DMA控制器进行配置,告诉它数据的源地址、目标地址和要传输的数据量。 DMA接管工作:配置完成后,DMA控制器会直接接管后续工作。它直接与设备(如网卡、磁盘控制器)和内存交互,开始搬运数据。(在此期间,CPU可以被解放出来去执行其他计算任务,只需等待DMA的工作完成。) DMA发出中断:当整个数据块传输完毕后,DMA控制器向CPU发送一个中断信号,通知它“任务已完成”。 所以,通过DMA,减少了CPU在I/O操作中的开销。 mmap 上文我们说到,正常的read+write,都会经历至少四次数据拷贝的,其中就包括内核态到用户态的拷贝,它的作用是为了安全和缓存。如果我们能保证安全性,是否就让用户态和内核态共享一个缓冲区呢?这就是mmap的作用。 mmap,全称是memory map,翻译过来就是内存映射,顾名思义,就是将内核态和用户态的内存映射到一起,避免来回拷贝,实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用 read、write 等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。其函数签名如下: 1 void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 一般来讲,mmap会代替read方法,模型如下图所示: mmap + write 方式: mmap(): 系统调用将内核缓冲区直接映射到用户进程的虚拟地址空间。这使得用户进程的指针可以直接指向这片内核缓冲区。 用户进程像操作普通内存一样操作这片映射区域。 write(): 数据从映射的内存区域(即内核缓冲区) -> (CPU拷贝到) Socket缓冲区 -> (DMA拷贝到) 网卡。 采用mmap + write的方式,内存拷贝的次数会变为3次(减少了一次CPU拷贝),上下文切换则依旧是4次。 ...

March 22, 2026 · 1 min · santu

你掌握哪些Linux常用命令?

典型回答 列一下我觉得我们比较常用的Linux命令。需要注意的是,本文并不是命令详解,所以并不包含每个命令的所有参数的详细展开介绍,这里只介绍我自己工作中常用的一些用法。相信大家在工作中也基本都是会这么用。如果想要了解具体某个命令,可以单独学习即可。 系统信息 top:实时显示系统进程和资源使用情况。当线上报警CPU占用率过高,load飙高的时候,我们通常会先上去使用top命令看一下具体哪些进程耗费了资源。 df:显示磁盘空间使用情况。当线上服务器报警磁盘满的时候,需要上去查看磁盘占用情况,可以使用这个命令 -h(–human-readable):以易于阅读的格式(如MB、GB)显示信息。 du:显示目录或文件的磁盘使用量。 这个命令可以查看目录的磁盘占用情况,常用的几个命令如下图: date:查看和设置系统的日期和时间 系统管理 ps:查看当前进程。通常用来查看Java进程的情况以及检查JVM参数: 1 2 3 4 //查找java进程,相当于jps命令,但是有的时候线上服务器没办法执行jps,可以用以下命令代替 ps aux|grep java //查询java进程,并高亮显示Xmx参数部分 ps aux|grep java | grep --color Xmx kill:杀死进程,慎用,尤其是在生产环境中,尤其是kill -9。 ✅对JDK进程执行kill -9有什么影响? chmod:更改文件或目录权限。 chown:更改文件或目录的所有者和群组。 ...

March 22, 2026 · 1 min · santu

操作系统的IO模型有哪些?

典型回答 为了保护操作系统的安全,通过缓存加快系统读写,会将内存分为用户空间和内核空间两个部分。如果用户想要操作内核空间的数据,则需要把数据从内核空间拷贝到用户空间(数据会放到内核空间的page cache中,这种也叫缓存IO)。 举个栗子,如果服务器收到了从客户端过来的请求,并且想要进行处理,那么需要经过这几个步骤: 服务器的网络驱动接受到消息之后,向内核申请空间,并在收到完整的数据包(这个过程会产生延时,因为有可能是通过分组传送过来的)后,将其复制到内核空间; 数据从内核空间拷贝到用户空间; 用户程序进行处理。  我们再详细的探究服务器中的文件读取,对于Linux来说,Linux是一个将所有的外部设备都看作是文件来操作的操作系统,在它看来:everything is a file,那么我们就把对与外部设备的操作都看作是对文件进行操作。而且我们对一个文件进行读写,都需要通过调用内核提供的系统调用。 而在Linux中,一个基本的IO会涉及到两个系统对象:一个是调用这个IO的进程对象(用户进程),另一个是系统内核。也就是说,当一个read操作发生时,将会经历这些阶段: 通过read系统调用,向内核发送读请求; 内核向硬件发送读指令,并等待读就绪; DMA把将要读取的数据复制到指定的内核缓存区中; 内核将数据从内核缓存区拷贝到用户进程空间中。 正是由于上面的几个阶段,导致了file中的数据被用户进程消费是需要过程的,这也就延伸出了五种IO方式,分别是同步阻塞型IO模型、同步非阻塞型IO模型、IO复用模型、信号驱动模型以及异步IO模型 扩展知识 ...

March 22, 2026 · 1 min · santu

软链接和硬链接的区别?

典型回答 在 Linux 文件系统中,一个文件由多个部分组成,主要可以分为以下几部分: 数据内容(Data Blocks) 元数据(Metadata,存储在 **inode** 中) 文件名(存储在目录结构中) 权限信息 时间信息 扩展属性(Extended Attributes) 以上,比较关键的就是数据内容、元数据和文件名三部分。 inode 上面提到一个重要的属性——inode,在 Linux/Unix 文件系统中,文件是通过 inode 进行管理的。当你创建一个文件时,系统会为它分配一个 **inode**,这个 **inode** 记录了文件的各种信息(但不包括文件名)。 所以,我们可以认为inode(索引节点)是文件的“身份信息”,用于存储文件的元数据。每个文件都有一个唯一的 inode 号,它指向文件存储的数据块。 每个 inode 主要存储以下信息: 文件类型(普通文件、目录、符号链接等) 权限(如 rwxr-xr-x) 文件所有者(UID) 文件所属组(GID) 文件大小 创建时间(ctime)、修改时间(mtime)、访问时间(atime) 文件的硬链接数 文件数据所在的磁盘块指针 inode 号(唯一标识该文件) 注意:inode 不存储文件名,文件名存储在目录结构中,而目录本质上是文件名到 inode 号的映射。 在 Linux 中,可以使用 ls -i 命令查看文件的 inode 号: 1 ls -li 软链接和硬链接 Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln 命令产生硬链接。 1 2 3 4 5 # 创建硬链接 ln original.txt hardlink.txt # 创建软链接 ln -s original.txt softlink.txt 软连接可以理解为 Windows 中的“快捷方式”,它本身是一个特殊的文件,存储的内容是目标文件的路径。当我们访问软连接时,系统会自动跳转到目标文件。 ...

March 22, 2026 · 1 min · santu

留言给博主