只接受发布货源信息,不可发布违法信息,一旦发现永久封号,欢迎向我们举报!
1064879863
16货源网 > 餐饮行业新闻资讯 > 网站建设资讯大全 >  软件开发人员需要记住的10个操作系统概念(译)


软件开发人员需要记住的10个操作系统概念(译)

发布时间:2019-10-12 17:46:11  来源:网友自行发布(如侵权请联系本站立刻删除)  浏览:   【】【】【
软件开发人员需要记住的10个操作系统概念James LeDec 27, 2017你知道二进制吗?你理解机器代码吗?如果给你一张满是1和0的表,你能告诉我它表示的是什么意思吗?如果到一个你从未去过的地方
软件开发人员需要记住的10个操作系统概念(译)
软件开发人员需要记住的10个操作系统概念
James Le
Dec 27, 2017
你知道二进制吗?你理解机器代码吗?如果给你一张满是10的表,你能告诉我它表示的是什么意思吗?如果到一个你从未去过的地方,当地人使用一种你从未听过的语言,或者你听过但不会用的语言交流,你该如何获得帮助与他们交流呢?
你需要一个翻译。计算机中的操作系统起着翻译的作用,它把那些1/0、是/否、开/关等值转换成你可以理解的语言。这一切都是在一个现在化的图形用户界面(GUI)中完成的,你使用鼠标进行操作,通过点击、移动等操作观看它们在你眼前的行动。
了解操作系统的工作原理对于任何一个认真的软件开发人员来说都是至关重要的。不要试图绕过它,任何告诉你没有必要了解这方面知识的人你都应该忽视他。虽然知识的扩展和深度可能受到质疑,但了解基础知识对于程序的运行情况甚至结构和流程至关重要。
为什么?当你写一个程序,它的运行速度太慢,但是你没有发现你的代码有任何问题,那你还能从哪找到解决方案呢?如果你不知道操作系统的工作原理,你该如何调试该问题?是程序打开的文件太多的原因,还是I/O阻塞的原因,或者是因内存耗尽而引起页面置换率上升的原因。或许你还不知道什么是置换呢!
你想和另一台机器交流。你如何在本地或通过互联网做到这一点?有什么区别?为什么有些程序员喜欢某个操作系统而不是另一个呢?
为了成为一名严谨的开发人员,我最近学了乔治亚理工学院的《操作系统入门》课程,它讲授基本的操作系统抽象、机制及其实现。本课程的核心内容包括并发编程(线程和同步)、进程间通信以及分布式操作系统的介绍。我想用这篇文章来分享我在课程中的收获,即10个重要的操作系统概念。如果你想成为一个优秀的软件开发者你需要懂得这些概念。
但首先让我们定义操作系统是什么。操作系统(OS)是管理计算机硬件并为程序提供服务的软件集合。具体来说,它隐藏硬件复杂性,管理计算资源,并提供隔离和保护。最重要的是它可以直接访问底层硬件。操作系统的主要组件是文件系统、调度程序和设备驱动程序。你可能之前已经使用过桌面(WindowsMacLinux)和嵌入式(AndroidiOS)操作系统。
操作系统有三个关键要素,它们是:(1) 抽象(进程、线程、文件、套接字、内存);(2) 机制(创建、调度、打开、写入、分配);(3) 策略(LRUEDF)。
操作系统设计原则有两个,它们是:(1) 机制和策略的分离。通过支持策略的灵活机制的实施来分离机制与策略;(2)常见实例的优化:操作系统将在何处使用?用户想要在该机器上执行什么?工作量需求是什么?
目前常用的3种操作系统是:(1) 单一结构操作系统。整个操作系统工作在管态且在内核空间中运行;(2)模块化操作系统。操作系统核心的某些称为模块的部分存储在独立的文件中,在系统运行时根据需要被添加到系统中;(3) 微操作系统。内核被分解为称作服务器的一个个单独的进程。一些服务器在内核空间中运行,一些服务器在用户空间中运行。
1.进程和进程管理
进程是程序的一次执行。进程的执行必须以顺序方式进行。简单来说,我们将计算机程序写入文本文件中,当我们执行该程序时,它将成为一个进程完成在程序中提及的所有任务。
当一个程序被加载到内存中并成为一个进程时,它可以分为四个部分——堆栈、堆、文本和数据。图1显示了主存中进程的简化布局。
图1进程在主存中的布局
堆栈:进程堆栈包含临时数据,如方法/函数参数、返回地址和局部变量。
堆:这是在进程运行期间动态分配给进程的内存。
文本:代码,包括由程序计数器值和处理器寄存器内容表示的当前活动。
数据:此部分包含全局变量和静态变量。
当一个进程执行时,它会通过不同的状态。这些阶段可能在不同的操作系统中有所不同,并且这些状态的名称也没有标准化。一般来说,一个进程可以同时具有以下五种状态之一:
开始:这是进程首次启动/创建时的初始状态。
就绪:进程正在等待处理器的状态。就绪的进程正在等待操作系统将处理器分配给它们,以便它们可以运行。进程可以在开始状态之后进入此状态,或运行的进程被调度程序中断而将CPU分配给其他进程时进入此状态。
运行:一旦OS调度程序分配处理器给进程,进程状态将被设置为运行,处理器执行其指令。
等待:如果进程需要等待某个资源(如等待用户输入)或等待某个文件变为可用,则它将进入等待状态。
终止或退出:一旦进程完成其任务,或被操作系统终止,则其状态变为终止状态,然后,等待操作系统将其从主内存中删除。
过程控制块(Process Control Block PCB)是由操作系统维护的数据结构,每一个进程都有一个与它相关的PCBPCB由一个整数ID标识(进程标识符PID)。PCB保留了跟踪进程所需的所有信息,如下所示:

进程状态:进程的当前状态,即它是就绪、运行、等待还是其他状态。
进程权限:允许/禁止访问系统资源所必需的。
进程ID:进程的唯一标识。
指针:指向父进程的指针。
程序计数器:程序计数器是一个指针,指向要为此进程执行的下一条指令的地址。
CPU寄存器:需要存储进程以执行运行状态的各种CPU寄存器。
CPU调度信息:进程优先级和调度进程所需的其他调度信息。
内存管理信息:包括页表、内存限制、段表等信息,具体取决于操作系统使用的内存。
统计信息:包括用于进程执行的CPU数量、时间限制、执行ID等。
IO状态信息:这包括分配给进程的I/O设备列表。

2.线程和并发

线程是进程代码的执行流,它拥有用于跟踪下一条要执行的指令的程序计数器,保存当前工作变量的系统寄存器,以及包含执行历史的堆栈。
一个线程与其对等线程共享一些信息,如代码段、数据段和打开的文件。当一个线程改变代码段内存项时,所有其他线程都会看到这一点。
线程也称为轻量级进程。线程提供了一种通过并行机制提高应用程序性能的方法。线程是一种通过减少开销来提高操作系统性能的软件方法,线程相当于一个经典的进程。
每个线程只属于一个进程,进程外不能存在任何线程。每个线程代表一个单独的控制流。线程已成功用于实现网络服务器和Web服务器。它们还为并行应用程序在共享内存多处理器上的并行执行提供了合适的基础。

线程的优点:
上下文切换时间最小化。
提供了进程内的线程的并发性。
高效的通信。
线程的创建和上下文切换更加经济。
线程允许更大规模和更高效地利用多处理器体系结构。
线程通过以下两种方式实现:
用户级线程:用户管理的线程。
内核级线程:操作系统管理的线程,作用于操作系统内核中。
用户线程
在这种情况下,内核不知道线程的存在。线程库包含用于创建和销毁线程、在线程之间传递消息和数据、线程调度执行以及保存和恢复线程上下文的代码。应用程序从一个线程开始运行。
优势:
线程切换不需要内核模式特权。
用户级线程可以在任何操作系统上运行。
在用户级线程中调度可以是特定的应用程序。
用户级线程可以快速创建和管理。
缺点:
在典型的操作系统中,大多数系统调用都是阻塞的。
多线程应用程序不能利用多处理器。


内核级线程
在这种情况下,线程管理由内核完成。应用程序中没有线程管理代码。操作系统直接支持内核线程。任何应用程序都可以编程为多线程。一个应用程序中的所有线程都在一个进程中受支持。
内核维护整个进程以及进程中相互独立线程的上下文信息。内核的调度是在线程的基础上完成的。内核在内核空间中完成线程的创建、调度和管理。内核线程的创建和管理速度通常比用户线程慢。

优点
内核可以在多进程中同时调度同一进程中的多个线程。
如果进程中的一个线程被阻塞,内核可以调度同一进程中的另一个线程。
内核例程本身可以是多线程的。
缺点
内核线程的创建和管理速度通常比用户线程慢。
在同一进程中,将控制从一个线程传输到另一个线程需要切换到内核模式。
3.调度
进程调度属于进程管理的活动,它根据特定的策略剥夺运行进程的CPU,并分配给另一个进程。
进程调度是多道程序操作系统的重要组成部分。这样的操作系统允许将多个进程一次加载到内存中通过时间复用共享CPU
操作系统维护进程调度队列中的所有进程控制块(PCB)。操作系统为每个进程状态维护一个单独的队列,处于相同执行状态的所有进程的PCB都放置在同一队列中。当一个进程的状态改变时,它的PCB将从离开当前队列加入到新的状态队列中。
操作系统维护以下重要的进程调度队列:
作业队列----此队列保留系统中的所有进程。
就绪队列----此队列保留一组驻留在主存中的所有进程,准备好并等待执行。新进程总是放在这个队列中。

设备队列----由于I/O设备不可用而被阻塞的进程构成此队列。
操作系统可以使用不同的策略来管理每个队列(FIFO、循环、优先级等)。操作系统调度器决定如何在就绪队列和运行队列之间移动进程,系统上每个处理器核心只能有一个条目;在上图中,它已与CPU合并。
双状态过程模型是指运行状态和非运行状态:
运行:当创建一个新进程时,它会像运行状态一样进入系统。
非运行:非运行的进程将保持在队列中,等待轮到它们执行。队列中的每个条目都是指向特定进程的指针。队列是通过使用链表实现的。分派器的用法如下:当一个进程被中断时,该进程将被移到等待队列中。如果进程已完成或中止,则该进程被丢弃。无论哪种情况,分派器都会从队列中选择一个进程来运行。
上下文切换是将当前运行进程的状态和CPU寄存器内容存储到进程控制块中,然后将要运行的进程的状态和CPU寄存器内容从进程控制块中恢复的一种机制。利用这种机制可以实现后期在同一点恢复进程的运行。使用这种技术,上下文切换器使得多个进程共享一个单CPU。上下文切换是多任务操作系统特征的重要组成部分。
当调度程序将CPU从一个运行着的进程切换到另一个进程运行时,当前运行着的进程状态存储到进程控制块中。之后,将要运行的进程的状态从它的PCB中加载,并设置PC、寄存器等,然后开始运行。
上下文切换是计算密集型的,因为寄存器和内存状态必须保存和恢复。为了避免大量的上下文切换时间,一些硬件系统使用两组或更多的处理器寄存器。切换进程时,存储以下信息供以后使用:程序计数器、调度信息、基址和限址寄存器值、当前使用的寄存器、更改的状态、I/O状态信息和记帐信息。
4.内存管理
内存管理是操作系统的功能,它处理或管理内存,并在执行期间在内存和磁盘之间来回移动进程。内存管理跟踪每个内存位置,不管它是分配给某个进程还是空闲的。它检查要分配给进程的内存量。它决定哪个进程在什么时候获得内存。当一些内存释放或未分配时,它就会跟踪,并相应地更新状态。
进程地址空间是进程在其代码中引用的一组逻辑地址。例如,当使用32位寻址时,地址的范围可以是00x7fffffff;即2^31可能的数字,理论上总大小为2 GB
在为程序分配内存时,操作系统负责将程序的逻辑地址映射到物理地址。在分配内存之前和之后,程序中使用三种类型的地址:
符号地址:源代码中使用的地址。变量名、常量和指令标签是符号地址空间的基本元素。
相对地址:编译时,编译器将符号地址转换为相对地址。
物理地址:当程序加载到内存时,加载程序生成这些地址。
虚拟地址和物理地址在编译时和加载时地址绑定方案中是相同的。虚拟地址和物理地址在执行时间地址绑定方案上有所不同。
程序生成的所有逻辑地址的集合称为逻辑地址空间。与这些逻辑地址对应的所有物理地址的集合称为物理地址空间。
5. 进程间通信
进程可有两种类型:独立进程和合作进程。独立进程不受其他进程执行的影响,而合作进程可能受其他进程执行的影响。虽然我们可以认为那些独立执行的进程能够非常有效地执行,但是,在许多实际情况下我们可以利用合作性质来提高计算速度、便利性和模块性。进程间通信(Inter-process communication,IPC)是一种允许进程相互通信并同步其操作的机制。这些进程之间的通信可以看作是它们之间合作的一种方法。进程可以使用共享内存(Shared Memory)和消息解析(Message Parsing)这两种方式相互通信。
共享内存方法
有两个进程:生产者和消费者。生产者生产一些产品,消费者消费这些产品。这两个进程共享一个称为缓冲区的公共空间或内存位置,在缓冲区中存储生产者生产的产品,并在需要时消费者从缓冲区中取出产品进行消费。这个问题有两个版本:第一个版本被称为无边界缓冲问题,在这个问题中生产者可以继续生产产品,并且缓冲区的大小没有限制;第二个版本被称为有边界缓冲问题,在这个问题中生产者可以生产一定数量的产品,然后它开始等待消费者消费。

在有界缓冲区问题中:首先,生产者和消费者将共享一些公共内存,然后生产者将开始生产产品。如果总生产的产品等于缓冲区的大小,生产商将等待消费者消费它。同样,消费者首先检查产品的可用性,如果没有产品可用,消费者将等待生产者生产产品。如果有产品,消费者会消费。
消息解析方法
在该方法中,进程彼此通信而不使用任何类型的共享存储器。如果两个进程p1p2想要相互通信,则按以下步骤操作:
建立通信链路(如果链路已经存在,则无需再次建立)。
开始使用基本原语交换消息。我们至少需要两个原语:send(message, destination)send(message)receive(message, host)receive(message)
消息大小可以是固定大小或可变大小。如果它是固定大小的,那么它对OS设计者来说是容易的,但对程序员来说是复杂的;如果它是可变大小的,那么它对程序员来说是容易的,但对OS设计者来说是复杂的。标准消息可以有两部分:消息头和正文。
消息头部分用于存储消息类型、目标ID、源ID、消息长度和控制信息。控制信息包含的信息类似于缓冲区空间用尽该如何处理,序列号,优先级该如何处理等。通常,使用FIFO样式发送消息。
6. I/O管理
I/O系统需要接收应用程序I/O请求并将其发送到物理设备,然后接收设备返回的任何响应并将其发送到应用程序。I/O设备可分为两类:
块设备----块设备是驱动程序通过发送整个数据块进行通信的设备。例如,硬盘、USB摄像头、钥匙上的磁盘等。
字符设备----字符设备是驱动程序通过发送和接收单个字符(字节、八位字节)进行通信的设备。例如,串行端口、并行端口、声卡等。
CPU必须有一种将信息传递到I/O设备和从I/O设备接收信息的方法。有三种方法可以与CPU和设备通信。
(1) 特殊指令I/O
使用专门为控制I/O设备而制定的CPU指令。这些指令通常允许将数据发送到I/O设备或从I/O设备读取数据。
(2) 内存映射I/O
当使用内存映射的I/O时,内存和I/O设备共享相同的地址空间。该设备直接连接到某些主存储器位置,这样I/O设备就可以在不经过CPU的情况下将数据块传输到存储器或从存储器传输数据块。
在使用内存映射IO时,OS在内存中分配缓冲区,并通知I/O设备使用该缓冲区向CPU发送数据。I/O设备与CPU异步操作,当I/O设备完成I/O操作时向CPU发送中断信号。
这种方法的优点是,可以访问内存的每条指令都可以用来操作I/O设备。内存映射IO用于大多数高速I/O设备,如磁盘、通信接口。

(3) 直接内存访问(DMA
在每个字节传输后,键盘之类的慢设备将向主CPU发送一个中断。如果一个快速设备(如磁盘)为每个字节都有向CPU发送一个中断信号,操作系统将花费大部分时间处理这些中断。因此,典型的计算机使用直接内存访问(DMA)硬件来减少这种开销。
直接内存访问(DMA)意味着CPU授予I/O模块在不涉及内存的情况下读取或写入内存的权限。DMA模块本身控制主存储器和I/O设备之间的数据交换。CPU仅在传输的开始和结束时参与,并且仅在整个块传输后中断。
直接内存访问需要一个称为DMA控制器(DMAC)的特殊硬件,它管理数据传输并仲裁对系统总线的访问。控制器通过源指针和目标指针(在哪里读/写数据)、跟踪传输字节数的计数器和设置(包括I/O和内存类型、CPU周期的中断和状态)进行编程。
7.虚拟化
虚拟化是一种允许您从单个物理硬件系统创建多个模拟环境或专用资源的技术。称为hypervisor的软件直接连接到该硬件,并允许您将1个系统拆分为单独、不同和安全的环境,称为虚拟机(VMs)。这些虚拟机依赖于虚拟机监控程序将机器资源与硬件分离并适当地分配它们的能力。

装配hypervisor的原始物理机器称为主机,而使用其资源的许多虚拟机称为客户。这些客户将计算资源-CPU、内存和存储-视为可轻松重新定位的资源库。操作员可以控制CPU、内存、存储和其他资源的虚拟实例,因此客户在需要时可以接收到所需的资源。
理想情况下,所有相关的虚拟机都通过一个基于Web的虚拟化管理控制台进行管理,这将加快速度。虚拟化允许你指定为虚拟机提供多少处理能力、存储和内存,并且环境得到更好的保护,因为虚拟机与支持它们的硬件之间彼此隔离。简单地说,虚拟化从未充分使用的硬件之上创建所需的环境和资源。

虚拟化的类型:
数据虚拟化:遍布各地的数据可以合并到一个来源中。数据虚拟化允许公司将数据视为动态供应----提供处理功能,可以将来自多个来源的数据汇集在一起,轻松容纳新数据源,并根据用户需求转换数据。数据虚拟化工具位于多个数据源之前,允许将它们视为单一来源,以适当的时间以任何应用程序或用户的形式提供所需的数据。
桌面虚拟化:很容易与操作系统虚拟化混淆,操作系统虚拟化允许你在一台计算机上部署多个操作系统。桌面虚拟化允许中央管理员(或自动管理工具)一次将模拟桌面环境部署到数百台物理计算机上。与在每台计算机上物理安装、配置和更新的传统桌面环境不同,桌面虚拟化允许管理员对所有虚拟机执行大规模配置、更新和安全检查。
服务器虚拟化:服务器是设计用于处理大量特定任务的计算机,而其他计算机(如笔记本电脑和台式机)可以执行各种其他任务。虚拟化服务器允许它执行更多这些特定的功能,并对其进行分区,以便组件可以用于提供多种功能。
操作系统虚拟化:操作系统虚拟化发生在内核----操作系统的中央任务管理器。这是一种并行运行LinuxWindows环境的有用方法。企业还可以将虚拟操作系统推送到计算机,其中:(1)降低批量硬件成本,因为计算机不需要如此高的开箱即用功能;2)提高安全性,因为所有虚拟实例都可以监控和隔离;3)限制在IT服务(如软件更新)上的时间花费。
网络功能虚拟化:网络功能虚拟化(NFV)将网络的关键功能(如目录服务、文件共享和IP配置)分开,以便在环境中分布。一旦软件功能独立于它们曾经使用过的物理机器,特定的功能就可以打包成一个新的网络并分配给一个环境。虚拟化网络减少了物理组件(如交换机、路由器、服务器、电缆和集线器)的数量,这些组件是创建多个独立网络所需的,在电信行业尤其受欢迎。
8.分布式文件系统
分布式文件系统是一个基于客户/服务器的应用程序,它允许客户机访问和处理存储在服务器上的数据,就好像数据存储在自己的计算机上一样。当用户访问服务器上的文件时,服务器将向用户发送文件的副本,该副本在处理数据时缓存在用户的计算机上,然后返回到服务器。

理想情况下,分布式文件系统将各个服务器的文件和目录服务组织到一个全局目录中,这样使得远程数据访问不在特指某个位置,而是对任何客户端都是相同的。全局文件系统中的所有用户都可以访问所有文件,文件是以分层且基于目录组织的。
由于多个客户机可以同时访问相同的数据,因此服务器必须具有适当的机制(例如维护有关访问时间的信息)来组织更新,以便客户机始终接收最新版本的数据,并且不会出现数据冲突。分布式文件系统通常使用文件或数据库复制(在多个服务器上分发数据副本)来防止数据访问失败。
Sun Microsystems网络文件系统(Network File SystemNFS),Novell Netware,微软的分布式文件系统和IBMDFS都是分布式文件系统的一些示例。

9.分布式共享内存

分布式共享内存(Distributed Shared MemoryDSM)是分布式操作系统的资源管理组件,它在分布式系统中实现共享内存模型,分布式系统没有物理共享内存。在分布式系统中共享内存提供一个虚拟地址空间在所有计算机之间共享。

DSM中,从共享空间访问数据,类似于访问虚拟内存的方式。数据在辅存和主存之间移动,以及在不同节点的分布式主存之间移动。内存中页面的所有权在某些预定义状态下开始,但在正常操作过程中会发生更改。由于特定进程的访问,当数据从一个节点移动到另一个节点时会发生所有权更改。
分布式共享内存的优点:
隐藏数据移动并为共享数据提供更简单的抽象。程序员不需要像使用消息传递模型那样担心机器之间的内存传输。允许通过引用传递复杂结构,简化分布式应用程序的算法开发。
利用“引用局部性”优势通过移动包含引用数据的整个页面而不仅仅是数据来。
比多处理器系统更便宜。可以使用普通硬件实现想法,并且不需要任何复杂的连接共享内存到处理器。
通过组合所有节点的所有物理内存,程序可以使用更大的内存大小。这种大内存不会像传统的分布式系统那样由于交换而导致磁盘延迟。
可以使用无限数量的节点。多处理器系统则不可,因为分布式系统通过公共总线访问主存储器,因此限制了多处理器系统的大小。
为共享内存多处理器编写的程序可以在DSM系统上运行。
有两种不同的方式可以通知节点谁拥有哪个页面:失效和广播。失效是一种方法,当某个进程要求对该页面进行写访问并成为其新所有者时,该方法会使该页无效。这样,下次某个其他进程尝试读取或写入其认为具有的页面副本时,该页面将不可用,并且该进程将不得不重新请求访问该页面。当进程写入内存页时,广播将自动更新内存页面的所有副本。这也称为写更新。由于必须发送一个新值而不是一个无效消息,因此该方法的效率要低得多,更难实现。
10.云计算
我们越来越多地看到技术正在转向云计算。这不仅仅是一种时尚,在过去十年中,从传统软件模式向互联网的转变稳步增长。展望未来,云计算的未来十年可在任何地方通过移动设备提供进行协作的新方法。
那么什么是云计算?从本质上讲,云计算是计算机程序的一种外包。使用云计算,用户可以从任何地方访问软件和应用程序,而它是由“云”中的外部方托管的。这意味着他们不必担心存储和电源等问题,他们可以简单地享受最终结果。
传统的业务应用程序总是非常复杂和昂贵。运行它们所需的硬件和软件的数量和种类令人望而生畏。您需要一个完整的专家团队来安装、配置、测试、运行、保护和更新它们。当你将这项工作增加到数十个或数百个应用程序时,很难理解为什么拥有最好IT部门的大公司无法获得他们需要的应用程序。中小型企业没有机会。
借助云计算,你可以消除因存储自己的数据而带来的麻烦,因为你无需管理硬件和软件----这将成为SalesforceAWS等经验丰富的供应商的责任。共享的基础设施意味着它像一个实用程序:你只需支付所需的费用,升级是自动的,并且可以轻松扩展或收缩。
基于云的应用程序可以在几天或几周内启动和运行,而且成本更低。使用云应用程序,你只需打开浏览器,登录,自定义应用程序,然后开始使用它。企业正在云中运行各种各样的应用程序,如客户关系管理(CRM)、人力资源、会计等等。
随着云计算越来越受欢迎,成千上万的公司只是简单地将其非云产品和服务重新命名为“云计算”。在评估云产品时要始终深入挖掘并牢记如果你必须购买和管理硬件和软件,那么,你看的不是真正的云计算,而是虚假的云。
最后的要点
作为一名软件工程师,你将成为一个更大的计算机科学体系的一部分,包括硬件、操作系统、网络、数据管理和挖掘以及许多其他学科。每个学科的工程师对其他学科的了解越多,他们就越能有效地与其他学科互动。
由于操作系统是管理输入、处理和输出的“大脑”,因此所有其他学科都与操作系统交互。了解操作系统的工作原理对了解其他学科的工作原理提供有价值的见解,因为你与这些学科的交互是由操作系统管理的。


责任编辑:操作系统学习
热门阅读排行
© 16货源网 1064879863