自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(171)
  • 收藏
  • 关注

原创 开发之前的操作系统相关信息介绍

其实说实话,对于这个问题,我也是不太清楚,可能会有阴阳大师说:“哎呦,连这个都不懂,还写什么内容”,那我只能对你说声抱歉了。因为操作系统并不是全部都相同的,有的操作系统复杂,功能就更多,有的操作系统呢,可能就是自己做着来玩的,实现的功能就少一点,所以我也没有找到它们的共同点,没法直接下定义。不过我很认可一种说法就是:“什么软件都可以算是操作系统”既然前面说操作系统各有各的说法,那我们就可以直接用这一点,根据自己的需求来定义操作系统,然后开发出一个满足自己定义的软件就可以了。但这样肯定会让家人们失望。

2024-02-28 11:53:55 144

原创 开发之前聊两句

但是随着我们不断学习当今时代的先进技术,心里会感觉越来越虚,回想自己到底是学到了什么,我会回答的支支吾吾,全是大牛已经搭建好的框架,我们值需要框框的往编译器上面写就可以,在学校当你想了解一些东西的底层原理时,老师可能会说的是“我们会用就可以了”。当然要想给他们一个满意的答复,让他们不再从从旁指手画脚的话,还真是得多学习,拿出点模样的简洁才行,但是如果我们作为一个初学者,没有必要去学那些麻烦的东西,当我们知道现有操作系统在各方面都考虑的如此周密的时候,就会发现发现自己的想法太过简单而备受打击没了干劲。

2024-02-28 11:01:26 150

原创 覆盖与交换

覆盖与交换技术是多道程序环境下用来扩充内存的两种方法。

2023-08-25 18:58:25 348

原创 为什么要进行内存管理

在单道系统阶段,一个系统在一个时间段只执行一个程序,内存的分配及其简单,即仅分配给当前到运行的进程。引入多道程序后,进程之间共享的不仅仅是处理机,还有主处理器。然而,共享主存会形成一些特殊的挑战、若不对内存进行管理,则容易导致内存数据的混乱,以至于影响进程的并发执行。因此,为了更好地支持多道程序并发执行。

2023-08-24 21:20:46 260

原创 内存保护

重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值。内存管理机构动态地将逻辑地址与届地址寄存器进程比较,若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存空间。重定位寄存器是用来加的,逻辑地址加上重定位寄存器中的值就能得到物理地址;界地址寄存器是用来比的,通过比较届地址寄存器中的值与逻辑地址的值来判断是否越界。内存保护可采取两种办法。1:在CPU中设置一对上、下限寄存器,存放用户作业在主存中的下限和上限地址,每当CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。

2023-08-24 19:26:07 728

原创 进程的内存映像

代码段和数据段在程序调入内存时就指定了大小,而堆和栈不一样。当调用像malloc和free这样的c标准库函数时,堆可以在运行时动态地扩展和收缩。用户栈在程序运行期间也可以动态地扩展和收缩,每次调用一个函数,栈就会增长;从一个函数返回时,栈就会收缩。不同于存放在硬盘上的可执行程序文件,当一个程序调入内存运行时,就构成了进程的内存映像,一个进程的内存映像一般有几个要素。

2023-08-24 19:14:28 367

原创 逻辑地址与物理地址

当链接程序将各个模块链接成一个完整的可执行目标程序,链接程序顺序依次按各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间(或虚拟地址空间),进程在运行时,看到和使用的地址都是逻辑地址,用户程序和程序员只需要知道逻辑地址空间,而内存管理的具体机制则是完全透明的。不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到主存的不同位置。物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。

2023-08-24 18:59:54 249

原创 程序的链接与装入

将几个目标模块装配成一个装入模块时,需要解决两个问题:1.修改相对地址,编译后的所有目标模块都是从0开始的相对地址,当链接成一个装入模块时要修改相对地址。根据内存的当前情况,将装入模块装入内存的适当位置。装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正执行时才进行。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式,其优点是便于修改和更新,便于实现对目标模块的共享。

2023-08-24 18:45:51 224

原创 死锁与饥饿

产生饥饿的主要原因是:在一个动态系统中,对于每类系统资源,操作系统需要确定一个分配策略,当多个进程同时申请某类资源时,由分配策略确定资源分配给进程的次序。有时资源分配策略可能是不公平的,即不能保证等待时间上界的存在。当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿,当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时。一组进程处于死锁状态是指组内的每个进程都在等待一个事件,而该事件只可能由组内的另一个进程产生。与死锁相关的另一个问题是无限阻塞或饥饿,即进程在信号量内无穷等待的情况。

2023-08-23 20:47:13 394

原创 进程与程序的区别与联系

1:进程是程序及其数据执行的一次过程,是一个动态的概念。进程的运行实体是程序,离开程序的进程没有存在的意义。从静态角度看,进程是由程序、数据和进程控制块三部分组成。而程序时一组有序的指令集合,是一种静态的概念。2:进程是程序的一次执行过程,它是动态地创建和消亡的,具有一定的生命周期,是暂时存在的;而程序则是一组代码的集合,是永久存在的,可以长期保存的。3:一个进程可以执行一个或几个程序,一个程序也可构成多个进程。进程可创建进程,而程序不可能形成新的程序。4:进程与程序的组成不同。

2023-08-23 20:32:25 1286

原创 死锁的相关定义、产生死锁的原因和条件、处理策略

例如进程A等待进程B发的消息,进程B又在等待进程A发的消息,可以看出进程A和B不是因为竞争同一资源,而是在等待对方的资源导致死锁。进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁,例如,并发进程p1,p2,分别保持了资源R1、R2,而进程P1申请资源R2、进程P2申请资源R1时,两者都会因为所需资源被占用而阻塞,于是导致死锁。即存在一个处于等待态的进程集合{P1,P2,···,Pn},其中Pi等待的资源被Pi+1占有,Pn等待的资源被P0占有。此时若有其他进程请求该资源,则请求进程只能等待。

2023-08-21 20:10:05 112

原创 不同的进程之间会存在什么关系?

同步是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序,而等待、传递信息所产生的的制约关系。互斥是指当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才允许访问此临界资源。进程之间存在同步与互斥的制约关系、

2023-08-20 16:42:15 248

原创 为什么要引入进程同步的概念

在多道程序共同执行的条件下,进程与进程是并发执行的。不同进程之间存在不同的互相制约关系。为了协调进程之间的相互制约关系,引入了进程同的观念。

2023-08-20 16:33:51 51

原创 管程的定义和条件变量

系统中的各种硬件资源和软件资源,均可用数据结构抽象地描述其资源特性,即用少量信息和对资源所执行的操作来表征该资源,而忽略它们的内部结构和实现细节利用共享数据结构抽象地表示系统中的共享资源,而把对该数据结构实施的操作定义为一组过程。进程对共享资源的申请、释放等操作,都通过这组过程来实现,这组过程还可以根据资源情况,或接受或阻塞进程的访问,确保每次仅有一个进程使用共享资源,这样就可以统一管理对共享资源的所有访问,实现进程互斥。

2023-08-19 19:49:46 466

原创 进程切换

用户态和内核态之间的切换称为模式切换,而不是上下文切换,因为没有改变当前的进程。进程切换同样是在内核的支持下实现的,因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。上下文切换通常是计算密集型的即它需要相当可观的CPU时间,在每秒几十上百次的切换中,每次切换都需要纳秒级的时间,所以上下文切换对系统来说意味着消耗大量的CPU时间。上下文切换实质上是指处理机从一个进程的转到另一个进程上运行,在这个过程中,进程的运行环境产生了实质性的变化。

2023-08-19 16:18:50 343

原创 线程的组织与控制

当一个线程完成自己的任务后,或线程在运行中出现异常而要被强制终止时,由终止程序调用相应的函数执行终止操作。通常,线程被终止后并不立即释放它所占有的资源,只有当进程中的其他线程执行了分离函数后,被终止线程才与资源分离,此时的资源才能被其他线程利用。在创建新线程时,需要利用一个线程创建函数,并提供相应的参数,如指向线程主程序的入口指针、堆栈的大小、线程优先级等。线程也是具有生命期的,它由创建而产生,由调度而执行,由终止而消亡。与进程类似,系统也为每个线程配置一个线程控制块TCB,用于记录控制和管理线程的信息。

2023-08-19 15:51:10 369

原创 为什么说多级反馈队列调度算法能较好地满足各类用户的需要

多级反馈队列调度算法能较好地满足各种类型用户的需要。对终端型作业用户而言,由于它们提交的作业大多属于交互型作业,作业通常比较短,系统只要能使这些作业在第1级队列所规定的的时间片内完成,便可使终端型作业用户感到满意;对于短批处理作业用户来说,它们的作业开始时像终端型作业一样,若仅在第1级队列中执行一个时间即可完成,便可获得与终端型作业一样的响应时间,对于稍长的作业,通常也只需要在第2级队列和第3级队列中各执行一个时间片即可完成,其周转时间仍然较短;

2023-08-18 19:30:14 761

原创 为什么要进程处理机调度

若没有处理机调度,意味着要等到当前运行的进程执行完毕后,下一个进程才能执行,而实际情况中,进程时常需要等待一些外部设备的输入,而外部设备的速度与处理机相比是非常缓慢的,若让处理机总是等待外部设备,则对处理机的资源是极大的浪费。而引进处理机调度后,可在运行进程等待外部设备时,把处理机调度给其他进程,从而提高处理机的利用率。就是为了合理地处理计算机的软硬件资源。

2023-08-18 18:51:40 121

原创 为什么要引入进程

在多道程序同时运行的背景下,进程之间需要共享系统资源,因此会导致各程序在执行过程中出现相互制约的关系,程序的执行会表现出间断性的特征。这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的执行情况,即我们无法从程序的字面上看出它何时执行、何时停顿,也无法看出它与其他执行程序的关系,因此,程序这个静态概念已不能如实反映程序并发执行过程的特征。为了深刻描述程序动态执行过程的性质乃至更好地支持和管理多道程序的迸发执行,人们引入了进程。

2023-08-18 18:38:03 148

原创 线程和多线程模型、线程和进程的区别和联系

线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。在单CPU的计算机系统中,各线程可交替地占用CPU,在多CPU的计算机系统中,各线程可以占用不同的的CPU,若各个CPU同时为一个进程内的各线程服务,则可缩短进程的处理时间。在引入线程的操作系统中,不仅进程之间可以并发执行,而且一个进程中的多个线程之间亦可并发执行,甚至不同进程中的线程也能并发执行,从而使操作系统具有更好的并发性。

2023-08-18 18:26:36 145

原创 进程的状态与转换

运行态—>阻塞态:进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如IO操作的完成)时,它就从运行态转换为阻塞态,进程以系统调用的形式请求操作系统提供服务,这是一种特殊的、由运行用户态程序调用操作系统内核过程的形式。运行态—>就绪态:处于运行态的进程在时间片用完后,不得不让出处理机资源,从而由运行态转换为就绪态。在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程序将正在执行的进程转换为就绪态,让更高优先级的进程执行。进程获得了除处理机外的一切所需资源,一旦得到处理机,便可立即运行。

2023-08-15 20:54:40 121

原创 进程的概念和特征

要准确的理解这里所说的系统资源,它指处理机、存储器和其他设备服务于进程的“时间”,例如把处理机资源理解为处理机的时间片才是准确的。因为进程是这些资源分配和调度的独立单位,即“时间片”分配的独立单位,这就决定了进程一定是一个动态的,过程性的概念。为此引入了进程(process)的概念,以便更好的描述和控制程序的并发执行,实现操作系统的并发性和共享性(最基本的两个特征)引入进程的概念后,我们可以把传统操作系统中的进程定义为:“进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位”

2023-08-15 20:24:53 247

原创 定义微内核结构的四个方面

3:应用“机制与策略分离”原理。机制是指实现某一功能的具体执行机构。策略则是在机制的基础上借助于某些参数和算法来实现该功能的优化,或达到不同的功能目标。在传统的OS中,将机制放在OS内核的较低层中,把策略放在内核的较高层中。而在微内核OS汇总,通常将机制放在OS的微内核中。4:采用面向对象技术。基于面向对象技术的“抽象”和“隐藏”原则能控制系统的复杂性,进一步利用“对象”“封装”和“继承”等概念还能确保操作系统的正确性、可靠性、易扩展性等。正因如此,面向对象技术被广泛应用于现代操作系统的设计之中。

2023-08-14 21:31:54 113

原创 访管指令和访管中断

访管指令是一条可以再用户态下执行的指令,在用户程序中,因要求操作系统提供服务而有意思地使用访管指令,从而产生一个中断时间(自愿中断),将操作系统转换为核心态,称为访管中断。访管中断由访管指令产生,程序员使用访管指令向操作系统请求服务。访管指令本身不是特权指令,其基本功能是让程序拥有“自愿进管”的手段,从而引起访管中断。处于用户态的用户程序使用访管指令时,系统根据访管指令的操作执行访管中断处理程序,访管中断处理程序将按系统调用的操作数和参数转到相应的例行子程序。为什么要在程序中引入访管指令呢?

2023-08-14 21:23:23 1113

原创 特权指令与非特权指令

所谓特权指令,是指有特殊权限的指令,由于这类指令的权限最大,使用不当将导致整个系统崩溃,如清内存、置时钟、分配系统资源、修改虚存的段表和页表权限等。形象的说,特权指令是那些少儿不宜的东西,而非特权指令是老少皆宜的东西。为了防止用户程序中使用特权指令,用户态下只能使用非特权指令,核心态下可以使用全部指令。在用户态下使用特权指令时,将产生中断以阻止用户使用特权指令。所以把用户程序 放在用户态下运行,而操作系统中必须使用特权指令的那部分程序在核心态下运行,保证了计算机系统的安全可靠。

2023-08-14 21:13:03 1392

原创 并发性与并行性的区别和联系

在多道程序环境下,并发性是指在一段时间内,宏观上有多个程序同时运行,但在单处理器系统中每个时刻却仅能有一道程序执行,因此微观上这些程序只能分时的交替执行。若在计算机系统中有多个处理器,则这些可以并发执行的程序便被分配到多个处理器上,实现并行执行,即利用每个处理器来处理一个可并发执行的程序。并行性个并发性是既相似又有区别的两个概念。并行性是指两个或多个事件在同一时刻发生,并发性是指两个或多个事件在同一时间间隔内发生。

2023-08-14 21:00:08 257

原创 操作系统引导

操作系统引导是指计算机利用CPU运行特定程序,通过程序识别硬件,识别硬件分区,识别硬件分区上的操作系统,最后通过程序启动操作系统,一环扣一环地完上述过程。硬件自检后,BIOS开始读入Boot Sequence(通过CMOS里保存的启动顺序,或者通过与用户交互的),把控制权交给启动顺序排在第一位的存储设备,然后CPU将该存储设备引导扇区的内容加载到内存中。4:加载主引导记录MBR。读取活动分区的第一个扇区,这个扇区称为分区引导记录(PBR),其作用是寻找并激活分区根目录下用于引导操作系统的程序(启动管理器)

2023-08-14 20:39:05 630

原创 处理器为什么要区分核心态和用户态两种操作方式? 在什么情况下进行两种方式的切换

区分执行态的主要目的是保护系统程序。用户态到核心态的转换发生在中断产生,而核心态到用户态的转换则发生在中断返回用户程序时。

2023-08-13 21:27:20 119

原创 操作系统结构

在划分模块时,如果将模块划分的很小,虽然能降低模块本身的复杂性,但会使得模块之间的联系过多,造成系统比较混乱;微内核是指将精心设计的、能实现操作系统最基本核心功能的小型内核,通常包含:1) 与硬件处理紧密相关的部分 2)一些较基本的功能 3)客户和服务器之间的通信。每个模块具有某方面的管理功能,并规定好各模块间的接口,是各模块之间能够通过接口进行通信。微内核构架,是指将内核中最基本的功能保留在内核,而将那些不需要要核心态执行的功能移到用户态执行,从而降低内核的设计复杂性。2:增强了操作系统的可适应性,

2023-08-13 20:24:48 449

原创 批处理操作系统、分时操作系统和实时操作系统各有什么特点

2:分时操作系统可让多个用户同时使用计算机,人机交性较强,具有每个用户独立使用计算机的独占性,系统响应及时。1:批处理操作系统的用户脱机使用计算机,作业是成批处理的,系统内多道程序并发执行,交互能力差。3:实时操作系统能对控制对象做出及时反应,可靠性高,响应及时,但资源利用率低。

2023-08-12 21:27:02 1432

原创 库函数与系统调用的区别和联系

库函数是语言或应用程序的一部分,可以运行在用户空间中。而系统调用时曹总做系统的一部分,是内核为用户提供的程序接口,运行在内核空间中,而且许多库函数都会使用系统调用来实现功能。未使用系统调用的库函数,其执行效率通常要比系统调用的高,因为使用系统调用时,需要上下文的切换及状态的转换(由用户态转向核心态)

2023-08-12 20:48:55 59

原创 并发和并行的概念

例如如果你在9:00-9:10 仅吃面包,在9.10-9.20 仅写字,在9.20-9.30仅吃面包,在9.30-10.00 仅写字,那么在9.00- 10.00 吃面包和瞎子这两种行为就是并发执行的;操作系统的并发性是指计算机系统中同时存在多个运行的程序,因此它具有处理和调度多个程序同时执行的能力。在操作系统中,引入进程的目的是使程序能够并发执行。并发性:在多道程序环境下,一段时间内,宏观上有多道程序在同时执行,而在每个时刻,单处理机环境下实际上仅能有一道程序执行,因此微观上这些程序扔是分时交替的。

2023-08-12 20:07:33 369

原创 操作系统的发展历程

因此,实现分时系统最大问题是如何使用户能与自己的作业进行交互,即当用户在自己的终端上键入命令时,系统应能及时接收并及时处理该命令,再将结果返回用户,分时系统也是支持多道程序设计的系统,但它不同于多道批处理系统。为了能在某个时间限制内完成某些紧急任务而不需要时间片排队,诞生了实时操作系统,这里的时间限制可以分为两种情况:若某个动作必须绝对地在对顶的时刻(或规定的时间范围)发生,则称为硬实时系统,如飞行器到的飞行自动控制系统,这类系统必须提供绝对保证,让某个特定的动作在规定的时间内完成。

2023-08-12 19:32:00 210

原创 循环队列的判满和判空方法

前面指出了顺序队列的缺点,这里引出循队列的概念。将顺序队列臆造为一个环状的空间,即把存储队列元素的表从逻辑上视为一个环,称为循环队列。

2023-08-11 19:04:48 1598

原创 栈和队列的基本概念;栈和队列的顺序存储结构、链式存储结构及其存储特点

队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针:对头指针front指向对头元素,队尾指针rear指向队尾元素的下一个位置(这里的front和rear的定义也可以不一样)队列的链式表示为链队列,他实际上一个同事带有队头指针和队尾指针的单链表,头指针指向对头节点,尾指针指向队尾节点,即单链表的最后一个节点(注意与顺序存储的不同)需要注意的是,栈和队列是操作受限的线性表,因此不是任何对线性表的操作都可以作为栈和队列的操作。栈底【Bottom】:固定的,不予许进行插入和删除的另一端。

2023-08-11 18:27:18 282

原创 各种变形链表(循环链表、双向链表、带头结点的链表等)的表示和基本操作的实现

其原因是,若设的是头指针,对表尾进行操作需要O(n)的时间复杂度,而若设置的是尾指针r,r->next即为头指针,对于表头与表尾进行操作都只需要o(1)的时间复杂度。循环单链表中的插入、删除算法与单链表的几乎一样,所不同的是若操作是在表尾进行,则指向的操作不同,以让单链表继续保持循环的性质。静态链表借助数组来描述线性表的链式存储结构,节点也有数据域data和指针域next,与前面所讲的链表中的指针不同的是,这里的指针是节点的相对地址(数组下标),又称游标,静态链表也要预先分配一块连续的内存空间。

2023-08-10 21:05:15 137

原创 线性表的基本操作及在顺序存储及链式存储的实现

他是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理元素上也相邻。第1个元素存储在线性表的起始位置,第i个位置的存储位置后面紧接存储着的是i+1个元素,称 i 为元素的 αi 在线性表的位序。而在动态分配时,存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间,用以替换原来的存储空间,从而达到扩充存储数组空间的目的,而不需要为线性表一次性地划分所有空间。以为数组可以是静态分配的,也可以是动态分配的。

2023-08-10 19:19:55 292

原创 数据的逻辑结构和存储结构

数据的存储结构是用计算机语言实现的逻辑结构,它依赖于计算机语言。索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。不要求逻辑上相邻的元素在物理位置上也相邻,借助指示元素存储指针来表示元素元素之间的逻辑关系,其优点是不会出现碎片现象,能充分利用所有存储单元;它与数据的存储无关,是独立于计算机的。运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。

2023-08-09 20:33:14 378

原创 蓝桥杯:数列求值

题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。给定数列 1,1,1,3,5,9,17,⋯1,1,1,3,5,9,17,⋯,从第 44 项开始,每项都是前 33 项的和。求第 2019032420190324 项的最后 44 位数字。运行限制最大运行时间:1s最大运行内存: 128M。

2023-03-16 20:55:03 149 1

原创 蓝桥杯:年号字串

题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。小明用字母 �A对应数字 11,�B对应 22,以此类推,用 �Z对应 2626。对于 2727 以上的数字,小明用两位或更长位的字符串来对应,例如 ��AA对应 2727,��AB对应 2828,��AZ对应 5252,��LQ对应 329329。请问 20192019 对应的字符串是什么?运行限制最大运行时间:1s最大运行内存: 128M。

2023-03-16 20:30:05 128

空空如也

空空如也

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

TA关注的人

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