操作系统面试八股文整理

1.操作系统

操作系统的本质是一种软件,它管理计算机的资源和进程以及所有的硬件和软件。它为计算机硬件和软件提供了一种中间层。通常情况下,计算机上会运行着许多应用程序,它们都需要对内存和 CPU 进行交互,操作系统的目的就是为了保证这些访问和交互能够准确无误的进行。

2.操作系统的主要目的

1)管理计算机资源,包括 CPU、内存、磁盘驱动器、打印机等。

2)提供一种图形界面,它提供了用户和计算机之间的桥梁。

3)为其他软件提供服务,操作系统与软件进行交互,以便为其分配运行所需的任何必要资源。

3. 操作系统分类

操作系统一般分为:批处理操作系统、分时操作系统、实时操作系统。

若一个操作系统 兼顾批操作和分时 的功能,称该系统为通用操作系统。

常见的通用操作系统:Windows、Linux、MacOS等。

4. 多处理系统的优势

随着处理器的不断增加,计算机系统由单机系统变为了多处理系统,多处理系统的吞吐量比较高,多处理系统拥有多个并行的处理器,这些处理器共享时钟、内存、总线、外围设备等。多处理系统由于可以共享资源,因此可以开源节流,省钱。整个系统的可靠性也随之提高。

5.多线程模型

  1. 多对一模型。将多个用户级线程映射到一个内核级线程上。该模型下,线程在用户空间进行管理,效率较高。缺点:一个线程阻塞,整个进程内的所有线程都会阻塞。
  2. 一对一模型。将内核线程与用户线程一一对应。优点:一个线程阻塞时,不会影响到其它线程的执行,该模型具有更好的并发性。缺点:内核线程数量一般有上限,会限制用户线程的数量。更多的内核线程数目也给线程切换带来额外的负担。(linux 和 Windows操作系统使用一对一模型)
  3. 多对多模型。将多个用户级线程映射到多个内核级线程上。

6.虚拟内存

虚拟内存是一种内存分配方案,是一项可以用来辅助内存分配的机制。比如应用程序是按页装载进内存中的,但并不是所有的页都会装载到内存中,计算机中的硬件和软件会将数据从 RAM 临时传输到磁盘中来弥补内存的不足。如果没有虚拟内存的话,一旦将计算机内存填满后,计算机会无法再加载任何应用程序,需要关闭另一个应用程序以加载新的应用程序。对于虚拟内存,计算机可以执行操作是查看内存中最近未使用过的区域,然后将其复制到硬盘上,复制是自动进行的。

7.按需分页

根据虚拟内存的概念,要执行某个进程,只需要在主内存中存在一部分过程,这意味着在任何时候只有少数几页出现在主内存中。但决定哪些页面需要保存在主存储器中,哪些页面需要保存在辅助存储器中很难确定,因为不能预先说明某个过程在特定时间需要哪些特定的页面。

按需分页:表示在需要之前不要在主内存中加载任何页面。它建议将所有帧的页面保留在辅助存储器中,直到它们被需要为止。每当首次在主存中引用任何页面时,该页面将在辅助存储器中找到。后续是否可能存在于主内存中取决于 页面替换算法。

页面错误:如果引用的页面不存在于主内存中,那么将会有一个未命中的概念被称为页面遗漏或页面错误。CPU必须从辅助存储器访问遗漏页面。 如果页面错误的数量非常多,系统的有效访问时间会变得非常高。

抖动:指当内存中已无空间并发生缺页中断时,需要从内存中调出一页程序或数据送磁盘的对换区中,如果算法不适当,刚被换出的页很快被访问,需重新调入,因此需再选一页调出,而此时被换出的页很快又要被访问,因而又需将它调入,如此频繁更换页面,使得系统把大部分时间用在了页面的调进换出上,而几乎不能完成任何有效的的工作,这种现象为“抖动”。
产生抖动的原因:由于CPU的利用率多道程序度的对立统一矛盾关系引起的,为了提高CPU利用率,可提高多道程序度。但如果只提高多道程序度又会造成缺页率的急剧上升,导致CPU的利用率下降,而系统的调度程序又会为了提高CPU利用率而继续提高多道程序度,形成恶性循环,这时的进程处于“抖动”状态。

8.内核态和用户态

为了避免操作系统和关键数据被用户程序破坏,将处理器的执行状态分为内核态和用户态。

内核态:操作系统管理程序执行时所处的状态,能够执行包含特权指令在内的一切指令,能够访问系统内所有的存储空间

用户态:用户程序执行时处理器所处的状态,不能执行特权指令,只能访问用户地址空间

用户程序运行在用户态,操作系统内核运行在内核态。

9.如何实现内核态和用户态的切换

处理器从用户态切换到内核态的方法有三种:系统调用、异常和外部中断。

系统调用是操作系统的最小功能单位,是操作系统提供的用户接口,是一种软中断

异常,也叫内中断,是由错误引起的,如文件损坏、缺页故障等。

外部中断是通过两根信号线来通知处理器外设的状态变化,是一种硬中断

10.内核

在计算机中,内核是一个计算机程序,它是操作系统的核心,可以控制操作系统中所有的内容。内核通常是在 boot loader 装载程序之前加载的第一个程序。

11.boot loader

boot loader 又称为引导加载程序,能将计算机的操作系统放入内存中。在电源通电或者计算机重启时,BIOS 会执行一些初始测试,然后将控制权转移到引导加载程序所在的主引导记录(MBR) 。

12.进程

进程是资源分配的基本单位,是独立运行的基本单位。

进程是一个执行中程序的实例。系统中的每个程序都运行在某个进程的上下文(context)中。

上下文是由程序正确运行所需的状态组成的。这个状态包括存放在内存中的程序的代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。

程序:静态的 --- 存放在磁盘上的指令和数据的有序集合(文件)

进程:动态的 --- 执行一个程序所分配的资源的总称

进程一般由以下的部分组成:

  • 进程控制块PCB,是进程存在的唯一标志,包含进程标识符PID,进程当前状态,程序和数据地址,进程优先级、CPU现场保护区(用于进程切换),占有的资源清单,文件描述符表等。
  • BSS段:存放程序中未初始化的全局变量

  • 数据段:已初始化的全局变量

  • 代码段:程序执行代码

  • 堆(heap):malloc等函数分配内存

  • 栈(stack):局部变量,函数参数,函数的返回值

  • 数据段:已初始化的全局变量

进程类型:交互进程、批处理进程、守护进程

进程状态:运行态、等待态、停止态、死亡态

大多数的操作系统(包括 UNIX、Linux 和 Windows)对进程的识别采用的是唯一的进程标识符(pid),pid 通常是一个整数值。系统内的每个进程都有唯一 pid 可以用作索引,以便访问内核中的进程的各种属性。

13.进程的创建

pid_t  fork(void);

进程在执行过程中可能创建多个新的进程。创建进程称为父进程,新的进程称为子进程。每个新进程可以再创建其他进程,从而形成进程树。

新创建的子进程不完全与父进程相同。子进程得到与父进程用户级虚拟地址空间相同但独立的一份副本(包括代码和数据段、堆、共享库以及用户栈)还有与父进程任何打开文件描述符相同的副本。这意味着当父进程调用 fork 时,子进程可以读写父进程中打开的任何文件。

父进程和新创建的子进程之间最大的区别在于它们有不同的 PID。fork函数只被调用一次,却会返回两次:一次是在调用进程(父进程)中,一次是在新创建的子进程中。创建进程过程中,可以通过 fork 的返回值区分父进程和子进程,失败时返回-1,在父进程中返回子进程的 PID。在子进程中返回 0。因为子进程的 PID 一般为 非0 。

  • 子进程只执行fork之后的代码
  • 父子进程执行顺序是操作系统决定的
  • 子进程继承了父进程的内容

  • 父子进程有独立的地址空间,互不影响

若父进程先结束

  •  子进程成为孤儿进程,被 init 进程收养
  •  子进程变成后台进程

若子进程先结束

  •  父进程如果没有及时回收,子进程变成僵尸进程

进程退出:void  _exit(int  status);

14.回收子进程

pid_t wait(int *status);

当一个进程由于某种原因终止时,内核不会立即把它从系统中清除。而是进程被保持在一种已终止的状态中,直到被它的父进程回收(reaped)。当父进程回收已终止的子进程时,内核将子进程的退出状态传递给父进程,然后抛弃已终止的进程。一个进程可以通过调用 waitpid 函数来等待它的子进程终止或者停止。

成功时返回回收的子进程的进程号;失败时返回EOF

若子进程没有结束,父进程一直阻塞

若有多个子进程,哪个先结束就先回收

15.进程间通信方法

每个进程有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间必须通过在内核中开辟一块缓冲区来交换数据,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

不同进程间的通信本质:进程之间可以看到一份公共资源;因为提供这份资源的 形式或提供者 不同,从而造成通信方式不同。

进程间通信主要包括:

1.管道(指无名管道):速度慢,容量有限,只有父子进程能通讯;

  • 半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。

  • 只能用于具有亲缘关系的进程之间的通信(即 父子进程 或者 兄弟进程 之间)。

  • 可看成是一种特殊的文件,对于它的读写也可以使用普通的 read、write 等函数。

  • 不是普通的文件,并不属于其他任何文件系统,只存在于内存中。

  • 数据能自己读,不能自己写。
  • 数据一旦被读走,便不在管道中存在,不可反复读取。

2.FIFO(也称为命名管道,是一种文件类型):任何进程间都能通讯,但速度慢;

  • FIFO可以在无关的进程之间交换数据,与无名管道不同。
  • FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

3.消息队列:可以实现消息的随机查询,容量受到系统限制;

是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。

  • 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
  • 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
  • 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

4.信号量:不能传递复杂消息,只能用来同步;

是一个计数器,信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

  • 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
  • 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
  • 每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
  • 支持信号量组。

5.共享内存区:指两个或多个进程共享一个给定的存储区。

指两个或多个进程共享一个给定的存储区。

  • 共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。
  • 因为多个进程可以同时操作,所以需要进行同步。
  • 信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

16.进程通过管道进行通信

调用pipe系统函数即可创建一个管道,管道有如下特质:

  1. 其本质是一个伪文件(实为内核缓冲区)
  2. 由两个文件描述符引用,一个表示读端,一个表示写端。
  3. 规定数据从管道的写端流入管道,从读端流出。

管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区实现。

17.进程通过共享内存通信

它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。共享内存通信 需要依靠进程同步操作。

18.信号

信号用于通知进程系统中发生了一个某种类型的事件。每种信号类型都对应于某种系统事件,低层的硬件异常是由内核异常处理程序处理的,正常情况下,对用户进程来说,是不可见的。信号提供了一种机制,通知用户进程发生了这些异常。

发送信号:内核通过更新目的进程上下文中的某个状态,发送一个信号给目的进程。

发送信号可有两种原因:

  • 内核检测到一个系统事件,比如除零错误或者子进程终止。
  • —个进程调用了 kill 函数, 显式地要求内核发送一个信号给目的进程。(一个进程可以发送信号给它自己。)

接收信号:当目的进程被内核强迫以某种方式对信号的发送做出反应时,它就接收了信号。进程可以忽略这个信号,终止或者通过执行一个称为信号处理程序的用户层函数捕获这个信号。

19.进程调度

进程调度的时机

  • 当前运行的进程结束。
  • 当前运行的进程由于某种原因阻塞。
  • 执行完系统调用等系统程序后返回用户进程。
  • 在使用抢占调度的系统中,具有更高优先级的进程就绪。
  • 分时系统中,分给当前进程的时间片用完。

不能进程调度的情况

  • 在中断处理程序执行时。
  • 在操作系统的内核程序临界区内。
  • 其它需要完全屏蔽中断的原子操作过程中。

进程的调度策略

  • 先到先服务调度算法
  • 短作业优先调度算法
  • 优先级调度算法
  • 时间片轮转调度算法
  • 高响应比优先调度算法
  • 多级队列调度算法
  • 多级反馈队列调度算法

进程调度策略的基本设计指标

1.CPU利用率

2.系统吞吐率,即单位时间内CPU完成的作业的数量。

3.响应时间。

4.周转时间。是指作业从提交到完成的时间间隔。

  • 平均周转时间
  • 带权周转时间
  • 平均带权周转时间

进程的状态与状态转换

进程运行时的基本状态:就绪态、运行态和阻塞态

1.运行态:进程占有处理器正在运行的状态。进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态; 在多处理机系统中,则有多个进程处于执行状态。

2.就绪态:进程具备运行条件,等待系统分配处理器以便运行的状态。 当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行,进程这时的状态称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。

3.阻塞态:进程不具备运行条件,正在等待某个时间完成的状态。

各状态之间的转换:

  • 就绪→执行 处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程由就绪状态转变成执行状态。
  • 执行→就绪 处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完从而让出处理机,进程从执行状态转变成就绪状态。
  • 执行→阻塞 正在执行的进程因等待某种事件发生而无法继续执行时,从执行状态变成阻塞状态。
  • 阻塞→就绪 处于阻塞状态的进程,若其等待的事件发生,进程由阻塞状态转变为就绪状态。

20.进程和线程

  • 线程是进程划分的任务,是一个进程内可调度的实体,是CPU调度的基本单位,用于保证程序的实时性,实现进程内部的并发。
  • 线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。
  • 每个线程完成不同的任务,但是属于同一个进程的不同线程之间共享同一地址空间,打开的文件队列和其他内核资源。

进程和线程的区别:

一个进程可以包含多个线程,不同进程间数据很难共享,同一进程下不同线程间数据很易共享;

进程要比线程消耗更多的计算机资源;

进程间不会相互影响,一个线程挂掉将导致整个进程挂掉;

进程可以拓展到多机,进程最适合多核;

进程使用的内存地址可以上锁,即某一线程使用某些共享内存时,其他线程必须等它结束才能用。

线程产生的原因:

进程可以使多个程序能并发执行,以提高资源的利用率和系统的吞吐量,但缺点:

  1. 进程在同一时刻只能做一个任务,很多时候不能充分利用CPU资源。
  2. 进程在执行的过程中如果发生阻塞,整个进程就会挂起,即使进程中其它任务不依赖于等待的资源,进程仍会被阻塞。

引入线程有以下优点:

  1. 从资源上来讲,进程要比线程消耗更多的计算机资源;
  2. 从切换效率上来讲,运行于一个进程中的多个线程,它们之间使用相同的地址空间,而且线程间彼此切换所需时间也远远小于进程间切换所需要的时间(这种时间的差异主要由于缓存的大量未命中导致)。
  3. 从通信机制上来讲,对不同进程来说,它们具有独立的地址空间,要进行数据的传递只能通过进程间通信的方式进行。但一个进程可以包含多个线程,不同进程间数据很难共享,同一进程下不同线程间数据很易共享(属于同一个进程的不同线程之间共享同一地址空间),线程间可以直接读写进程数据段(如全局变量)来进行通信(需要采取同步措施)。

21.死锁

原因:

竞争不可抢占资源引起死锁。竞争可消耗资源引起死锁。进程推进顺序不当引起死锁

必要条件:

互斥条件:进程/线程 所申请的资源在一段时间内只能被一个进程/线程占用

请求和保持条件:进程/线程已经占用至少一个资源,但又提出新的资源请求,该资源正被其他进程/线程占用

不可抢占条件:已获得的资源在未使用完之前不能被抢占

环路等待条件:发生死锁时,必然存在一个资源的循环链

预防:

破坏四个必要条件

解决方法:

破坏请求条件:资源一次性分配。

破坏占有并等待条件:只要有一个资源得不到分配,也不给这个进程分配其他的资源。

破坏不可抢占条件:即当进程新的资源未得到满足时,释放已占有的资源。

破坏环路等待条件:系统给每类资源赋予一个序号,每个进程按编号递增请求资源,释放则相反。

22.进程同步

当多个进程需要对同一个内核资源进行操作时,这些进程产生竞争关系,操作系统必须协调各个进程对资源的占用,进程的互斥是解决进程间竞争关系的方法。 进程互斥指若干个进程要使用同一共享资源时,任何时刻最多允许一个进程去使用,其他要使用该资源的进程必须等待,直到占有资源的进程释放该资源。 当多个进程协同完成一些任务时,不同进程的执行进度不一致,会产生进程的同步问题。需要操作系统干预,在特定的同步点对所有进程进行同步,这种协作进程之间相互等待对方消息或信号的协调关系称为进程同步。进程互斥本质上也是一种进程同步。

进程同步的方法:

  1. 互斥锁
  2. 读写锁
  3. 条件变量
  4. 记录锁
  5. 信号量
  6. 屏障

23.线程同步

属于同一进程的线程之间具有相同的地址空间,线程之间更易共享数据。遇到竞争的线程同时修改同一数据或是协作的线程设置同步点时,需要使用线程同步的方法来解决。

线程同步的方法:

  1. 互斥锁
  2. 读写锁
  3. 条件变量
  4. 信号量
  5. 自旋锁
  6. 屏障

24.进程同步与线程同步的区别

进程之间地址空间不同,不能感知对方的存在,同步时需要将锁放在多进程共享的空间。统一进程中的线程之间共享同一地址空间,同步时只需把锁放在所属的同一进程空间。

25.什么是实时系统

实时操作系统对时间做出了严格的要求,实时操作系统分为两种:硬实时和软实时。

硬实时操作系统规定某个动作必须在规定的时刻内完成或发生,比如汽车生产车间,焊接机器必须在某一时刻内完成焊接,焊接的太早或者太晚都会对汽车造成永久性伤害。

软实时操作系统虽然不希望偶尔违反最终的时限要求,但是仍然可以接受。并且不会引起任何永久性伤害。

26.使用多线程的好处

1)提高对用户的响应顺序

2)在流程中的资源共享

3)经济适用

4)对多线程架构有深入的理解

27. RR 调度算法

RR调度算法主要针对分时系统,RR 调度算法会把时间片以相同的部分并循环的分配给每个进程,RR调度算法没有优先级的概念。这种算法的每个线程都会占有时间片,不存在线程饥饿的问题。

28. DMA

DMA (直接内存访问),即DMA 不需要 CPU 的参与即可读取或写入内存。这个过程由 DMA 控制器(DMAC)的芯片管理。由于 DMA 设备可以直接在内存之间传输数据,而不是使用 CPU 作为中介,因此可缓解总线上的拥塞。DMA 通过允许 CPU 执行任务,同时 DMA 系统通过系统和内存总线传输数据来提高系统并发性。

29. 设备驱动程序

在计算机中,设备驱动程序是一种计算机程序,它能够控制或者操作连接到计算机的特定设备。驱动程序提供了与硬件进行交互的软件接口,使操作系统和其他计算机程序能够访问特定设备,不用需要了解其硬件的具体构造。

30.竞态条件

即两个或多个线程同时对一共享数据进行修改,从而影响程序运行的正确性。

31.临界区

共享资源、共享文件、共享内存会造成竞态条件。

解决方法:禁止一个或多个进程在同一时刻对共享资源(包括共享内存、共享文件等)进行读写。即需要一种互斥条件,如果一个进程在某种方式下使用共享变量和文件的话,除该进程之外的其他进程就禁止做这种事(访问统一资源)。

解决方案的四种条件:

1)任何时候两个进程不能同时处于临界区

2)不应对 CPU 的速度和数量做任何假设

3)位于临界区外的进程不得阻塞其他进程

4)不能使任何进程无限等待进入临界区

32. 页面置换算法

33. 影响调度程序的指标

1)CPU 使用率:CPU 正在执行任的时间百分比

2)等待时间:进程轮流执行的时间,也就是进程切换的时间

3)吞吐量:单位时间内完成进程的数量

4)响应时间:从提交流程到获得有用输出所经过的时间

5)周转时间:从提交流程到完成流程所经过的时间

34.优先级反转

由于多进程共享资源,具有最高优先权的进程被低优先级的进程阻塞,反而使具有中优先级的进程先于高优先级的进程执行,导致系统的崩溃。即优先级反转。

解决优先级反转的2种方法:

优先级继承:指将低优先级任务的优先级提升到等待它所占有的资源的最高优先级任务的优先级。当高优先级任务由于等待资源而被阻塞时,此时资源的拥有者的优先级将会自动被提升。

优先级天花板:指将申请某资源任务的优先级提升到可能访问该资源的所有任务中最高优先级任务的优先级。

35.虚拟内存

虚拟内存的作用是为了更加有效地管理内存并且少出错。虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美结合,为每个进程提供了一个大的、一致的和私有的地址空间。

虚拟内存提供了三个重要的能力:

  1. 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要,在磁盘和主存之间传送数据,从而高效使用主存。
  2. 它为每个进程提供一致的地址空间,从而简化内存管理。
  3. 它保护每个进程的地址空间不被其他进程破坏。
  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
操作系统与计算机基础面试八股文主要包括以下内容: 1. 计算机基础:包括计算机网络、数据结构、排序算法、操作系统、数据库等方面的知识。例如,计算机网络中的协议结构可以采用五层体系结构,其中应用层对应 OSI 的上三层,下四层和 OSI 相同。\[2\] 数据结构中的二叉树有不同的种类和遍历方式。排序算法可以包括冒泡排序、插入排序、选择排序等。 2. 操作系统:涉及操作系统的基本概念、进程管理、内存管理、文件系统等内容。例如,操作系统中的死锁及条件可以使用银行家算法来解决。\[1\] 3. 计算机语言:包括 C/C++、Java、Python 等编程语言的相关知识。例如,C++中的 struct 和 class 的区别,Java中的线程安全和多线程编程等。 4. 网络安全:涉及网络安全攻击的种类和防范措施。例如,安全攻击可以包括网络钓鱼、拒绝服务攻击、SQL 注入等。\[3\] 综上所述,操作系统与计算机基础面试八股文主要涵盖计算机基础知识、操作系统、计算机语言和网络安全等方面的内容。 #### 引用[.reference_title] - *1* [计算机基础面试备考知识点(八股文)](https://blog.csdn.net/weixin_44934424/article/details/115066562)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [计算机网络面经八股文](https://blog.csdn.net/XiaoFengsen/article/details/125940951)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

低保和光头哪个先来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值