深入了解linux系统—— 基础IO(上)

文件

在之前学习C语言文件操作时,我们了解过什么是文件,这里简单回顾一下:

文件存在磁盘中,文件有分为程序文件、数据文件;二进制文件和文本文件等。

详细描述见文章:文件操作——C语言

  • 文件在磁盘里,磁盘是永久性存储介质,因为文件在磁盘上的存储是永久性的;
  • 磁盘是外设(是输入设备也是输出设备);
  • 本质上对磁盘是文件的所有操作,都是对外设的输入和输出;也就是I/O

对于文件的认识:

  • 文件 = 文件内容 + 文件属性
  • 文件大小是0KB的文件也是占用磁盘空间的
  • 所有对于文件的相关操作都是对文件内容和文件属性就行操作。

在系统层面理解

  • 我们操作文件(打开,关闭文件),本质上是进程对于文件的操作;
  • 磁盘的管理者是操作系统;
  • 我们在C/C++使用库函数来对文件进行读写操作,本质上是通过文件相关的系统调用去完成的。

C文件操作

打开和关闭文件

C语言当中,我们通过fopen来打开文件,fclose来关闭文件;

  1. fopen:打开文件,如果打开成功返回一个FILE*类型的指针,执行被打开的文件;打开失败则返回NULL
  2. fclose:关闭文件,传参FILE*类型的指针,关闭指定文件。
#include <stdio.h>
int main()      
{      FILE* fp = fopen("log.txt","w");//以读方式打开,文件不存在就新建      if(fp == NULL){      perror("fopen");      return 1;      }      //....      fclose(fp);//关闭文件                                                              return 0;                                             
}  

打开文件的方式

在这里插入图片描述

我们知道在C语言的fopen接口打开文件是有很多打开方式

r:以读方式打开、w以写方式打开、a以追加方式打开。

r方式,当文件不存在时就打开文件失败;

w方式,当文件不存在时就新建文件(在当前工作路径下创建,进程当中存放了当前工作路径);如果文件存在会清空当前文件的内容;然后在进入写入。

a方式,追加,当文件不存在就新建文件;如果文件已经存在,打开时不会清空文件内容,而是在文件末尾进行写入

写文件

当我们以w/r方式打开一个文件,我们要将内容写到文件当中;

img

我们可以使用fputcfputsfwritefprintf进行文件的写入;

#include <stdio.h>
int main()      
{      FILE* fp = fopen("log.txt","w");//以读方式打开,文件不存在就新建      if(fp == NULL){      perror("fopen");      return 1;      }      for(char ch = 'a';ch <= 'z';ch++){    fputc(ch,fp);    }    char* str = (char*)"I love you\n";    fputs(str,fp);    int x = 100;    fprintf(fp,"x = %d\n",x); fclose(fp);//关闭文件                                                              return 0;                                             
}  

在这里插入图片描述

文件读取

我们以r方式打开一个文件,我们要像读取这个文件的内容,我们可以使用fgetcfgetsfscanf进入文件内容的读取操作:

#include <stdio.h>
int main()      
{      FILE* fp = fopen("log.txt","w");//以读方式打开,文件不存在就新建      if(fp == NULL){      perror("fopen");      return 1;      }for(int i = 0;i<26;i++){    printf("%c",fgetc(fp));    }    printf("\n");    char buff[20];    fgets(buff,12,fp);    //buff[11] = '\0';    printf("%s",buff);    int x;    fscanf(fp,"x = %d",&x);    printf("x = %d\n", x);  fclose(fp);//关闭文件                                                              return 0;                                 
}  

在这里插入图片描述

stdin/stdout/stderr

在我们程序运行时,C语言它会默认打开三个文件:stdinstdoutstderr

我们可以发现这三个都是文件类型指针

在这里插入图片描述

系统文件I/O

在上述C语言的文件操作fopenfclose都是语言层提供给我们的文件操作接口;以及C语言的stdinstdoutstderr;C++中的cincoutcerr都是语言层提供给我们的方案;

我们知道文件的管理者是操作系统,所以我们对文件操作都要经过操作系统;

那也就是说语言层的文件操作接口,其底层都封装了系统调用。

1. 传递多个标志位的方法

在之前的习惯中,我们通常使用一个参数来作为一个标记位;这样我们在传递多个标志位时就需要传递多个参数。

现在来了解一种使用一个参数来传递多个标志位的方法:

使用一个bit为来作为一个标识符,这样使用一个参数就可以表示多个标志位了。

#include <stdio.h>
#define ONE 0001   //0000 0001
#define TWO 0002   //0000 0010
#define THREE 0004 //0000 0100   
void func(int flag){    if(flag & ONE)  printf("ONE ");    if(flag & TWO)  printf("TWO ");    if(flag & THREE)  printf("THREE ");    printf("\n");    
}    
int main()    
{    func(ONE);    func(ONE | TWO);    func(ONE | THREE);    func(ONE | TWO | THREE);  return 0;
}

在这里插入图片描述

这样就可以使用一个参数,传递多个标志位了。

Linux操作系统open接口就使用了一个参数来传递多个标志位。

2. 打开文件open

在语言层面,我们使用的fopen,它本质上就是对系统调用的封装;

在这里插入图片描述

可以看到open是一个系统调用;它的作用就是打开一个文件,也可能会创建一个新的文件。

我们可以看到open函数它存在一个两个参数的,也存在一个三个参数的;

  1. pathname:表示要打开文件的文件名(不带路径就默认在当前工作路径下)
  2. flags:表示文件的打开方式,存在多个标志位
  3. mode:表示新建文件时,文件的默认权限

文件名pathname

这个想必就不用多说了,表示要打开文件的文件名;

不带路径时,就表示在当前工作路径下打开文件。(进程中存在当前工作路径cwd

标志位flags

通过查看open函数说明可以看到,flags存在非常多的标志位;这里列举一些常用的选项

O_RDONLY只读、O_WRONLY只写、O_RDWR读写;

O_CREAT:文件不存在时就新建文件

O_TRUNC:打开文件时,文件存在就清空文件内容

O_APPEND:打开文件时,以追加形式打开。

这里flags表示的就是文件的打开方式;

首先就是:只读、只写和读写;在我们打开文件时必须指定一个且只能指定一个。

O_CREAT

在我们打开一个文件时,如果这个文件不存在,那open函数就会直接返回-1表示文件打开失败;

而我们带了O_CREAT选项,就表明当文件不存在时,就新建文件;(这里新建文件要指明新建文件的权限,否则创建出来文件的权限就是乱码

#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>
int main()      
{      int fd = open("love.txt",O_CREAT | O_WRONLY,0666);      if(fd < 0){      perror("open");      return 1;                                                                                                 }                                                                                                            return 0;                                                                                                    
}    

在这里插入图片描述

一般情况下,在以写方式打开文件,文件不存在就新建,就要指明文件的权限。

(以只读读方式O_RDONLY,文件不存在新建出的文件是空的,没有什么意义)

O_TRUNC

当我们打开一个文件时,如果这个文件已经存在了,那就打开这个已有的文件;

如果我们带了O_TRUNC选项,就表示清空这个文件的内容;

#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>
int main()      
{      int fd = open("love.txt",O_CREAT | O_WRONLY | O_TRUNC,0666);      if(fd < 0){      perror("open");      return 1;                                                                                                 }                                                                                                            return 0;                                                                                                    
}

在这里插入图片描述

O_APPEND

在C语言的文件操作中,fopen打开文件,w就是以写方式打开、文件不存在就新建、文件存在就清空文件的内容;(这就对应了上述选项的O_WRONLYO_CREATO_TRUNC

但是我们fopen还可以以a方式打开文件,也就是追加方式;这里的O_APPEND就是以追加的方式打开文件。

这里我们先看一种现象:

#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>
int main()      
{      int fd = open("love.txt",O_CREAT | O_WRONLY,0666);      if(fd < 0){      perror("open");      return 1;                                                                                                 }char buff[] = "abcdef";write(fd,buff,strlen(buff));  return 0;                                                                                                    
}

在这里插入图片描述

可以看到,我们不带O_APPEND选项,写入的时候是在文件的开头位置进行写入的。

#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>
int main()      
{      int fd = open("love.txt",O_CREAT | O_WRONLY | O_APPEND,0666);      if(fd < 0){      perror("open");      return 1;                                                                                                 }char buff[] = "abcdef";write(fd,buff,strlen(buff));  return 0;                                                                                                    
}

在这里插入图片描述

文件权限mode

当打开文件,文件不存在,我们还带了O_CREAT选项时;如果我们不带文件的权限,那新建文件的权限就是乱码;

而新建的文件的权限:文件权限 = 默认权限 &(~umask)

3. 关闭文件

关闭文件的系统调用close,根据文件描述符,关闭指定文件。

在这里插入图片描述

对于这里的fd,它指的是文件描述符,当我们打开文件成功时,会返回给我们该文件的文件描述符;

我们对指定文件的读写操作,以及关闭文件都要使用指定文件的文件描述符。

4. 文件写入write

在C语言中,我们进行文件写入时,我们有非常多的接口;

但是在系统层面,我们对文件进行写入只有一个接口,就是write

在这里插入图片描述

write有三个参数,分别是fdbuf、和count

其中fd指的是文件描述符,表示我们要向哪一个文件进行写入;

buf表示我们要进行写入的内容,它是void*类型的指针,可以写入任何数据

count就表示,我们要写入内容的长度。

这里值的注意的是:这里write主要用于字符写入

当然,我们之前听过文本写入和二进制写入,那都是语言层的概念;

再这里我们操作系统不管这些,write就将给定的内容写入到文件缓冲区中。

5. 文件读取read

和写入一样,在语言层我们有非常多的函数接口,但是在系统层面,就只有read

在这里插入图片描述

这样存在三个参数;

fd文件描述符,表示要从哪一个文件读取数据;

buf,表示我们要将文件中的数据读取到buf中;

count表示要读取内容的长度。

文件描述符

在上面描述中,我们了解了文件操作相关的系统调用;

openwritereadclose这些系统调用中,都用到了一个fd来指明一个文件;那这个fd究竟是什么呢?

open函数的返回值

在上述使用open函数时,我们并没有关心open函数的返回值,也没有说明文件描述符到底是什么?

在这里插入图片描述

当我们使用open打开一个文件时:

如果打开成功,那就返回这个新打开文件的文件描述符;

如果打开失败,就返回-1,并且设置错误码。

什么是文件描述符

那我们知道了,文件描述符就是标识一个文件的整数,每一个文件的文件描述符都不一样;

#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>
int main()      
{      int fd = open("log.txt",O_CREAT | O_WRONLY | O_APPEND,0666);if(fd < 0)	return -1;printf("fd : %d\n",fd);close(fd);return 0;                                                                                                    
}

在这里插入图片描述

我们可以看到打开的一个文件的文件描述符是3

这里打开一个文件我们看不出来什么,我们多打开一些文件

#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>
int main()      
{      int fd1 = open("log1.txt",O_CREAT | O_WRONLY | O_APPEND,0666);int fd2 = open("log2.txt",O_CREAT | O_WRONLY | O_APPEND,0666);int fd3 = open("log3.txt",O_CREAT | O_WRONLY | O_APPEND,0666);int fd4 = open("log4.txt",O_CREAT | O_WRONLY | O_APPEND,0666);//这里就不做错误判断了printf("fd1 : %d\n",fd1);printf("fd2 : %d\n",fd2);printf("fd3 : %d\n",fd3);printf("fd4 : %d\n",fd4);//不关闭文件,进程结束会自动关闭return 0;                                                                                                    
}

在这里插入图片描述

这里,我们可以发现我们打开多个文件,这些文件的文件描述符是线性增长的。

文件描述符0/1/2

在上述中,我们发现,我们的文件描述符它是线性增长的,而且我们打开第一个文件它的文件描述符是3

012文件描述符去哪里了呢?

还记得在程序运行时,C语言会默认给我们打开三个文件stdinstdoutstrerr

Linux操作系统中,进程默认情况下会有三个缺省打开的文件描述符(012),分别是标准输入、标准输出和标准错误。

那这里进程默认打开的标准输入、标准输出和标准错误和C语言中的stdinstdoutstderr有什么区别呢?

这里0标准输入、1标准输出、2标准错误;

一般情况下0,1,2对应的物理设备是键盘、显示器、显示器。

所以,我们从键盘中读取数据就是从0文件中读取数据;将数据输出到显示器中就是将数据输出到1文件当中。

文件描述符的分配规则

当我们打开一个文件时,它的文件描述符是3;我们打开多个文件时,我们可以发现它的文件描述符是线性增长的;

那文件描述符是如何分配的呢?是一直在增长的吗?

#include <stdio.h>      
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>      
#include <unistd.h>      
#include <string.h>      
int main()          
{       int fd1 = open("log1.txt",O_CREAT | O_WRONLY | O_TRUNC, 0666 );    if(fd1 < 0)  return -1;    printf("fd1 : %d\n",fd1);    close(0);    close(2);    int fd2 = open("log2.txt",O_CREAT | O_WRONLY | O_TRUNC, 0666 );    if(fd2 < 0)  return -1;    printf("fd2 : %d\n",fd2);    int fd3 = open("log3.txt",O_CREAT | O_WRONLY | O_TRUNC, 0666 );    if(fd3 < 0)  return -1;    printf("fd3 : %d\n",fd3);return 0;           
}  

在这里插入图片描述

可以看到,我们关闭02文件之后,新打开文件的文件描述符是02

在这里插入图片描述

所以,这里我们文件描述符分配时,会从0开始去找到一个最小且没有被使用的文件描述符,再进行分配。

操作系统对于打开的文件的管理

对于上面的文件描述符,可以说很抽象,为什么可以使用一个整数来表示一个打开的文件呢?

现在来看操作系统是如何对被打开的文件进行管理的。

要想进行管理,那一定是先描述,再组织

**先描述:**操作系统要像对被打开文件进行管理,那就要先描述这些被打开文件;在Linux操作系统中就存在struct file结构体来描述这些被打开的文件(struct file里就可能有文件描述符等等一些关于文件的信息)。

所以,在打开一个文件时,就只需根据文件的相关属性构建相对应的struct file即可(还存在文件缓冲区,也会将部分内容拷贝到文件缓冲区中

再组织: 操作系统要将这些被打开文件(struct file)进行管理;在Linux操作系统中就存在一个全局链表,所以被打开文件的struct file都在这个链表当中。

这样操作系统就将所有被打开的文件管理起来的,但是现在还有一个问题,程序打开文件也就是进程要打开文件,那进程是如何打开的呢?

这个问题就比较简单了,我们的进程不是有对应的task_struct吗,那我们进程打开了哪些文件就肯定在tasj_struct中存储着相对应的信息。

task_struct中,存在着一个指针struct file_struct* files,这个指针指向进程相对应的文件描述符表

而在文件描述符表中,存在着一个数组struct file* fd_array

而我们的文件描述符就和这个fd_array数组的下标一一对应。

那么,也就是说我们文件描述符表在的fd_array数组,下标01…和我们文件描述符一一对应。

那么,在进程执行的过程中,只需要访问task_struct中的文件描述符表中的fd_array数组,就可以知道我们进程打开了哪些文件。

在这里插入图片描述

了解了操作系统对于被打开文件的管理,现在再来看文件描述符

它就是进程文件描述符表中fd_array的数组下标;

在新建文件时,操作系统就会遍历进程的描述符表中fd_array数组,找到一个最小且没有被使用的数组下标来作为新打开文件的文件描述符。

stdin/stdout/stderr和文件描述符0/1/2的区别

我们知道,在C语言程序启动时,它会默认打开三个文件stdin/stdout/stderr,这是语言层面的概念;

而文件描述符0/1/2这是操作系统层面的概念。

在C语言中stdin/stdout/stderr的类型都是FILE*,我们只知道FILE*是文件类型的指针,但是FILE它是什么呢?

其他的我们不懂,但是这里我们可以肯定在FILE中肯定存在文件对应的文件描述符;(因为C语言文件操作是封装了系统调用,而系统调用是使用文件描述符来访问文件的,所以在FILE肯定存在文件所对应的文件描述符)

并且我们也可以确定,stdin对应的文件描述符肯定是0stdout对应的文件描述符肯定是1stderr对应的文件描述符肯定是2

这里提出一个问题?

我们知道文件描述符的分配规则是找一个最小且没有被使用的文件描述符进行分配。

那如果我们关闭了0/1/2文件,再创建文件那0/1/2还是标准输入、标准输出和标准错误吗?

答案是的,在语言层我们标准输入stdin中的文件描述符就是0、标准输出stdout中的文件描述符就是1、标准错误stderr中的文件描述符就是2

我们关闭0/1/2文件,这一操作是系统层的操作,我们语言层C它并不知道;

那也就是说,在程序往标准输出中输出数据时,它只会拿着stdout中的文件描述符1去调用系统调用;

那也就是说在系统层:文件描述符0指向哪个文件,哪个文件就是标准输入;文件描述符1指向哪个文件,哪个文件就是标准输出;文件描述符2指向哪个文件,哪个文件就是标准错误。

本篇文章到这里就结束了,感谢各位的支持。
继续加油!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink CDC—实时数据集成框架

Flink CDC 是一个基于流的数据集成工具&#xff0c;旨在为用户提供一套功能更加全面的编程接口&#xff08;API&#xff09;&#xff0c;它基于数据库日志的 CDC&#xff08;变更数据捕获&#xff09;技术实现了统一的增量和全量数据读取。 该工具使得用户能够以 YAML 配置文件…

ES(ES2023/ES14)最新更新内容,及如何减少内耗

截至2023年10月,JavaScript(ECMAScript)的最新版本是 ES2023(ES14)。 ES2023 引入了许多新特性,如findLast、toSorted等,同时优化了性能。通过减少全局变量、避免内存泄漏、优化循环、减少DOM操作、使用Web Workers、懒加载、缓存、高效数据结构和代码压缩,可以显著降低…

常见的 Python 环境配置问题及解决方案

1. Python 环境配置的常见问题 初学者在配置 Python 环境时&#xff0c;可能会遇到以下几类问题&#xff1a; 1.1 不同版本的兼容性 Python 目前有两个主要版本系列&#xff1a;Python 2.x 和 Python 3.x。Python 2.x 已于 2020 年 1 月 1 日停止维护&#xff0c;因此强烈建…

day20-线性表(链表II)

一、调试器 1.1 gdb&#xff08;调试器&#xff09; 在程序指定位置停顿 1.1.1 一般调试 gcc直接编译生成的是发布版&#xff08;Release&#xff09; gcc -g //-g调式版本&#xff0c;&#xff08;体积大&#xff0c;内部有源码&#xff09;&#xff08;DeBug&#…

基于Spring Boot+Layui构建企业级电子招投标系统实战指南

一、引言&#xff1a;重塑招投标管理新范式 在数字经济浪潮下&#xff0c;传统招投标模式面临效率低、透明度不足、流程冗长等痛点。本文将以Spring Boot技术生态为核心&#xff0c;融合Mybatis持久层框架、Redis高性能缓存及Layui前端解决方案&#xff0c;构建一个覆盖招标代理…

uniapp -- uCharts 仪表盘刻度显示 0.9999999 这样的值问题处理。

文章目录 🍉问题🍉解决方案🍉问题 在仪表盘上,23.8变成了 23.799999999999997 🍉解决方案 formatter格式化问题 1:在 config-ucharts.js 或 config-echarts.js 配置对应的 formatter 方法 formatter: {yAxisDemo1: function (

git 对于已经追踪,但没有git add 的文件,撤回修改的方法

要撤销对已追踪文件的修改&#xff08;但尚未使用git add添加到暂存区&#xff09;&#xff0c;你可以使用以下几种方法&#xff1a; 1. 使用 git restore (Git 2.23.0及更高版本) 这是较新版本Git中推荐的方式&#xff1a; # 撤销单个文件的修改git restore <file># …

脚本语言Lua

本文来源 &#xff1a;腾讯元宝 Lua是一种轻量级、可嵌入的脚本语言&#xff0c;由巴西里约热内卢天主教大学的Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo于1993年开发。其设计目标是嵌入应用程序中&#xff0c;提供灵活的扩展和定制功能。 主要特性…

ThingsBoard使用Cassandra部署时性能优化

1、概述 当遇到ThingsBoard设备数量特别多的时候,并且传输数据遥测点量特别大的时候,我们需要调整一下参数来进行优化,使其性能达到最佳的进行快速写入。 注意:以下这些参数再系统部署的时候就需要规划好配置,不能安装好了再二次来进行配置。 2、Cassandra配置参数优化 …

Git Worktree 使用

新入职了一家公司&#xff0c;发现不同项目用的使用一个 git 仓库管理。不久之后我看到这篇文章。 Git 的设计部​​分是为了支持实验。一旦你确定你的工作被安全地跟踪&#xff0c;并且存在安全的状态&#xff0c;以便在出现严重错误时可以恢复&#xff0c;你就不会害怕尝试新…

维智定位 Android 定位 SDK

概述 维智 Android 定位 SDK是为 Android 移动端应用提供的一套简单易用的定位服务接口&#xff0c;为广大开发者提供融合定位服务。通过使用维智定位SDK&#xff0c;开发者可以轻松为应用程序实现极速、智能、精准、高效的定位功能。 重要&#xff1a;为了进一步加强对最终用…

【CSS】使用 CSS 绘制三角形

一、Border 边框法&#xff08;最常用&#xff09; 原理&#xff1a;通过设置元素的宽高为 0&#xff0c;利用透明边框相交形成三角形。 .triangle {width: 0;height: 0;border-left: 50px solid transparent; /* 左侧边框透明 */border-right: 50px solid transparent; /* …

RabbitMQ 快速上手:安装配置与 HelloWorld 实践(一)

一、引言 在当今分布式系统大行其道的技术浪潮下&#xff0c;各个服务之间的通信与协同变得愈发复杂。想象一下&#xff0c;一个电商系统在大促期间&#xff0c;订单服务、库存服务、支付服务、物流服务等众多模块需要紧密配合。如果没有一种高效的通信机制&#xff0c;系统很容…

【deekseek】TCP Offload Engine

是的&#xff0c;TOE&#xff08;TCP Offload Engine&#xff09;通过专用硬件电路&#xff08;如ASIC或FPGA&#xff09;完整实现了TCP/IP协议栈&#xff0c;将原本由CPU软件处理的协议计算任务完全转移到网卡硬件中。其延迟极低的核心原因在于 硬件并行性、零拷贝架构 和 绕过…

JavaScript 的编译与执行原理

文章目录 前言&#x1f9e0; 一、JavaScript 编译与执行过程1. 编译阶段&#xff08;发生在代码执行前&#xff09;✅ 1.1 词法分析&#xff08;Lexical Analysis&#xff09;✅ 1.2 语法分析&#xff08;Parsing&#xff09;✅ 1.3 语义分析与生成执行上下文 &#x1f9f0; 二…

WORD个人简历单页326款模版分享下载

WORD个人简历模版下载&#xff1a;WORD个人简历模版https://pan.quark.cn/s/7e79a822c490

Android 中 显示 PDF 文件内容(AndroidPdfViewer 库)

PDFView 是一个用于在 Android 应用中显示 PDF 文档的库。它提供了丰富的功能和灵活的配置选项&#xff0c;使得开发者能够轻松地在应用中嵌入 PDF 阅读器。 一、 添加依赖 在模块的 build.gradle 文件中添加以下依赖&#xff1a; // pdfimplementation("com.github.bar…

微信小程序学习之搜索框

1、第一步&#xff0c;我们在index.json中引入vant中的搜索框控件&#xff1a; {"usingComponents": {"van-search": "vant/weapp/search/index"} } 2、第二步&#xff0c;直接在index.wxml中添加布局&#xff1a; <view class"index…

OpenCL C++ 常见属性与函数

核心对象与属性 对象/属性描述示例cl::Platform表示OpenCL平台cl::Platform::get(&platforms)cl::Device表示计算设备cl::Device::getDefault()cl::Context管理设备、内存和命令队列的上下文cl::Context(contextDevices)cl::CommandQueue命令队列,用于提交命令cl::Command…

Milvus 视角看重排序模型(Rerankers)

在信息检索和生成式人工智能领域&#xff0c;重排序器是优化初始搜索结果顺序的重要工具。重排序器与传统的嵌入模型不同&#xff0c;它将查询和文档作为输入&#xff0c;并直接返回相似度得分&#xff0c;而不是嵌入。该得分表示输入查询和文档之间的相关性。 重排序器通常在…