2.1 操作系统的目标和功能

操作系统是控制应用程序执行的程序, 并充当应用程序和计算机硬件之间的接口。
它有三个主要目标

  • 方便
  • 有效
  • 扩展能力

2.1.1 作为用户/计算机接口的操作系统


计算机接口

典型计算机系统中的三种重要接口

指令系统体系结构(ISA)
定义了计算机遵循的机器语言指令系统,该接口是硬件与软件的分界线。注意,应用程序和公用程序都可直接访问ISA,这些程序使用ISA的一个子集(用户级ISA)。操作系统能使用其他一些处理系统资源的机器语言指令(系统级ISA)

应用程序二进制接口(ABI)
定义了程序间二进制可移植性的标准。

应用程序编程接口(API)
允许应用程序访问系统的硬件资源和服务。这些服务用户级ISA和高级语言库(HLL)调用来提供

用户接口

命令接口

由一组“命令”集组成,分为联机脱机用户接口

1.联机用户接口

  • 由一组键盘操作命令及命令解释程序Shell所组成

2.脱机(批处理用户接口)

  • 用JCL写作业说明书

程序接口

  • 系统调用,操作系统提供的应用程序接口(API),提供给用户在编程时使用
  • 高级语言的库函数,例如:读磁盘操作,在C程序代码里将加入语句result=read (fd, buffer, nbytes);

图形接口

如 win的copy文件,采用“拖”来完成,生动,不需记忆

操作系统提供的服务

  • 程序开发
  • 程序运行
  • I/O设备访问
  • 文件访问控制
  • 系统访问
  • 错误检测和响应
  • 记账

2.1.2 作为资源管理器的操作系统

操作系统的作用

  1. 一台计算机就是一组用于移动、存储和处 理数据的资源
  2. 操作系统负责管理这些资源

从软件视角看操作系统

  1. 操作系统与普通计算机软件的作用相同, 即它是由处理器执行的一段程序或一组程序
  2. 操作系统经常会释放控制,而且必须依赖 处理器才能恢复控制

下图显示了由操作系统管理的主要资源

2.1.3 操作系统的易拓展性

重要的操作系统应能不断发展,原因如下:

  • 硬件升级和新型硬件出现
  • 新的服务
  • 纠正错误

2.2 操作系统的发展史

操作系统为什么改变
主要功能: 硬件抽象和协调管理
原则: 设计随着各种相关技术的改变而做出一定的改变,在过去二十年底层技术有极大的改变 !!

发展阶段

2.2.1 串行处理

串行处理时期(20世纪40年代后期到50年代中期),没有操作系统,用户必须顺序访问计算机。

存在两个主要问题:

  • 调度
  • 准备时间
操作系统=装载器+通用子程序库

问题: 昂贵组件的低利用率

2.2.2 简单批处理系统

产生原因

早期计算机非常昂贵,同时由于调度和准备而浪费的是件令人难以接受,因此最大限度利用处理器是非常重要的。

中心思想

使用一个称为监控程序的软件。通过使用这类操作系统,用户不再直接访问机器,相反用户把卡片或磁带中的作业提交给计算机操作员,由操作员把这些作业按顺序组织成批,并将整个批作业放到输入设备上,供监控程序使用。每个程序完成处理后返回到监控程序,同时监控程序自动加载下一个程序。

第一个操作系统(第一个批处理操作系统):20世纪50年代中期,General Motors开发,用于IBM 701

顺序执行与批处理

想要理解这一方案如何运作,可以从以下两个角度分析

监控程序视角

监控程序控制事件的顺序。常驻监控程序总是处于内存中 并且可以执行。其他部分包括一些实用程序和公用函数,他们作为用户程序的子程序,在需要用到他们的作业开始执行时才被载入。
监控程序每次从输入设备(通常是卡片阅读机或磁带驱动器)中读取一个作业,并把控制权交给这 个作业。作业完成后,它将控制权返回给监控程序,监控程序立即读取下一个作业。每个作业的结果被发送到输出设备,交付给用户。

处理器视角

处理器执行内存中存储监控程序区域部分的指令,这些指令读入下一个作业并存储到内存中的另一部分。处理器继而执行用户程序中的指令,直到遇到一个结束指令或错误条件。
“控制权交给作业” 意味着处理器当前取的和执行的都是用户程序中的指令
“控制权返回给监控程序” 意味着处理器当前从监控程序取指令并执行指令

作业控制语言JCL

作业控制语言JCL是一种特殊类型的程序设计语言, 用于为监控程序提供指令。

其他必要的硬件支撑

  • 内存保护机制

当用户程序正在运行时,不能改变包含监控程序的内存区域

  • 定时器

防止一个作业独占系统

  • 特权指令

某些机器指令被设计成特权指令,只能由监控程序执行

  • 中断

为操作系统在让用户程序放弃控制权或让用户程序获得控制权时,具有更大的灵活性

运行模式

用户模式

用户程序用户模式下执行,用户程序所占据的内存区域是受保护的,特权指令也不允许执行

内核模式

监控程序内核模式下执行,可以执行特权指令可以访问受保护的内存区域

简单批处理系统开销

处理器时间用于交替执行用户程序监控程序, 牺牲了一部分内存交付给监控程序使用,同时监控程序消耗了一部分处理器时间。尽管存在系统开销,简单批处理系统还是提高了计算机
的利用率

2.2.3 多道批处理系统

即便简单批处理系统提供自动作业序列,处理器仍经常处于空闲状态。但问题在于I/O设备相对于处理器而言速度太慢,下图列出了一个代表性的计算过程

单道程序设计

只有一个单独程序的情况称为单道程序设计,如下图

处理器花费一定的运行时间进行计算,直到遇到一个I/O指令,这是它必须等到该I/O指令结束后才能继续进行。
缺点:效率低

多道程序设计

当一个作业需要等待I/O时,处理器可以切换到另一个可能并不在等待I/O的作业,这种处理模式称为多道程序设计多任务处理
这种处理方式需要有足够的内存空间加载操作系统(常驻监控程序)和不少于1个用户程序。
进一步还可以扩展内存确保可加载3个、4个程序 或更多的程序,且在它们之间进行切换

多道程序设计是现代操作系统主要任务方案。它可以保持多个工作在内存中并且在各工作间 复用CPU。

多道程序设计实例

资源使用效果

多道程序设计操作系统要比单个程序或单道程序设计系统复杂。待运行的多个作业须保留在内存中,因此需要内存管理。此外,准备运行多个作业时,处理器必须决定运行哪个作业,因此需要某种调度算法

2.2.4 分时系统

为什么要有分时系统?
批处理用户不能干预自己程序的运行,无法得知 程序的运行情况,不利于程序调试和排错。

多道程序设计允许处理器同时处理多个批处理作业,还可以处理多个交互作业。对于后者而言,由于多个用户分享处理器时间,因此该技术称为分时
分时系统允许多个联机用户同时使用一个计算机系统进行交互式计算,由操作系统控制每个用户程序在很短的时间内交替执行。

分时和多道程序设计引发的新问题:

  • 作业的相互干扰
  • 文件系统的保护
  • 处理资源的竞争

在分时系统中,操作系统会定时中断用于工作对CPU的复用。

批处理多道程序设计 vs.分时

兼容分时系统CTSS
第一个分时操作系统,由MIT Project MAC项目组最初于1961年为IBM 709开发。
该系统运行在一台内存为32,000个36位字的计算机上,常驻监控程序占用了5000个字,用户程序通常在第5000个字位置开始载入,这简化了监控程序和内存管理。

系统时钟以约每隔0.2s的速度产生一个中断,在每个时钟中断处,操作系统恢复控制权,并将处理器分配给另一个用户在固定的时间间隔内,当前用户被抢占,另一个用户被载入。老用户程序和数据被写出到磁盘。随后在获得下一次机会时,老用户程序代码和数据被恢复到内存中。

2.2.5* 个人电脑/移动终端操作系统

特点

  • 单用户
  • 利用率已不再是关注点
  • 重点是用户界面和多媒体功能
  • 很多老的服务和功能不存在

演变

  • 最初: 操作系统作为一个简单的服务提供者 (简单库)
  • 现在:支持协调和沟通的多应用系统
  • 越来越多的安全问题 (如,电子商务、医疗记录)

2.2.6* 分布式操作系统

  • 网络支持成为一个重要的功能
  • 通常支持分布式服务

    跨多系统的数据共享和协调

  • 可能使用多个处理器

    松、紧耦合系统

  • 高可用性与可靠性的要求

2.3 主要成就

操作系统是最复杂的软件之一。

4个重要理论进展

  • 进程
  • 内存管理
  • 信息保护和安全
  • 调度和资源管理

2.3.1 进程

进程概念是操作系统设计的核心。
一个进程可以定义为:

进程概念的发展

计算机系统的发展有三条主线,它们在时间安排和同步中所产生的问题推动了进程概念的发展:

多道程序批处理操作

  • 操作系统对内存中驻留的不同程序进行处理器切换

分时

  • 能及时响应单个用户的要求,但由于成本原因,又要可以同时支持多 个用户

实时事务系统

  • 很多用户都在对数据库进行查询或修改

设计出能够协调各种不同活动的系统软件非常困难

产生错误原因

不正确的同步

  • 一个程序启动了一个I/O读操 作,在继续进行前必须等到缓冲区中有数据
  • 这时需要来自其他例程的一个信号,而设计得不正确的信号机制可能导致信号丢失或接收到重复信号

失败的互斥

  • 常常会出现多个用户或程序试图同时使用一个共享资源的情况
  • 必须有某种互斥机制保证一次只允许一个例程对一部分数据执行事务处理
  • 很难证明这类互斥机制的实现对所有可能的事件序列都是正确的

不确定的程序操作

  • 当程序共享内存且处理器控 制它们交替执行时,它们可能会因为重写相同的内存区域而发生不可预测的相互干扰
  • 程序调度顺序可能会影响某 个特定程序的输出结果

死锁

  • 很可能有两个或多个程序相互挂起等待
  • 可能依赖于资源分配和释放的时机安排

一个进程由三部分构成

  • 一段可执行的程序
  • 程序所需要的相关数据(变量、工作空间、缓冲区等)
  • 程序的执行上下文(或进程状态)

执行上下文是根本,执行上下文又称进程状态

  • 操作系统用来管理和控制进程所需的内部数据
  • 包括各种处理器寄存器的内容,如程序计数器和数据寄存器
  • 还包括操作系统使用的信息,如进程优先级、进程是否在等待特定I/O事件的完成

进程管理

任何时候整个进程状态都包含在其上下文环境中。
在操作系统中可能会设计和并入一些新的特征(如优先级),这可通过扩展上下文环境以包括支持这些特征的新信息。

2.3.2 内存管理

操作系统担负着5项存储器管理职责:

  • 进程隔离

操作系统必须保护独立的进程,防止互相干扰各自的存储空间,包括数据和指令

  • 自动分配和管理

程序应该根据需要在存储层次间动态地分配,分配对程序员是透明的。因此,程序员无须关心与存储限制有关的问题,操作系统会有效地实现分配问题,可仅在需要时才给作业分配存储空间

  • 支持模块化程序设计

程序员应该能够定义程序模块,并动态地创建、销毁模块,动态地改变模块的大小

  • 保护和访问控制

不论在存储层次中的哪一级,存储器的共享都会产生一个程序访问另一个程序存储空间的潜在可能性。当某个特定的应用程序需要共享时,这是可取的。但在其他时候,它可能会威胁到程序的完整性,甚至威胁到操作系统自身。操作系统必须允许一部分内存可以由各种用户以各种方式进行访问。

  • 长期存储

许多应用程序需要在计算机关机后长时间地保存信息。

虚拟存储

虚存机制允许程序以逻辑方式访问存储器,而不考虑物理内存上可用的空间数量,虚存的构想是为满足有多个用户作业同时驻留在内存中的要求,因此在一个进程被写出到辅存中且后续进程被读入时,连续的进程执行之间将不会脱节。

分页

在分页系统中,进程由许多固定大小的组成,这些块称为
程序通过虚地址访问字

  • 虚地址由页号和该页中的偏移量组成
  • 进程的每页都可能置于内存中的任何地方

分页系统提供了程序中使用的虚地址和内存中的实地址物理地址之间的动态映射

2.3.3 信息保护和安全

环境不同,企业所面临的威胁也不同。我们更关注计算机系统 的访问控制和信息安全。

2.3.4 调度和资源管理

操作系统的一个关键任务是抽象化管理各种可用资源(内存空间、I/O设备、处理器),并调度各种活动进程来共享使用这些资源

资源分配策略必须考虑:

  • 公平性: 通常希望给竞争使用某一特定资源的所有进程提供几乎同等和公平的访问机会。对同一类作业,即有类似请求的作业,更需要如此
  • 有差别的响应性: 另一方面,操作系统可能需要区分具有不同服务要求的不同作业类别。操作系统将试图做出满足所有要求的分配和调度决策,并动态地做出决策。例如,若某个进程正在等待使用一个I/O设备,操作系统会尽可能迅速地调度这个进程,进而释放该设备以方便其他进程使用
  • 有效性: 操作系统希望获得最大的吞吐量和最小的响应时间,并在分时情形下,能够容纳尽可能多的用户。这些标准互相矛盾,在给定状态下适当折中是操作系统的一个正在研究的问题。

2.4 现代操作系统的特征

人们对操作系统要求的变化,不仅要求设计人员修改和增强操作系统的现有体系结构,而且要求设计人员采用新的操作系统组织方法。

设计人员采用了很多不同的方法和设计要素:

  • 微内核结构
  • 多线程
  • 对称多处理
  • 分布式操作系统
  • 面向对象设计

OS结构

  • 简单结构,宏/单体(Macro/Uni kernel)
  • 分层结构,宏/单体(Macro/Uni kernel)
  • 微内核结构(Microkernel)
  • 外核结构

简单结构

MS-DOS – 在最小的空间,设计用于提供大部分功能 (1981~1994)

  • 没有拆分为模块
  • MS-DOS 在接口和功能水平没有很好地分离,主要用汇编语言编写
  • 其它操作系统一般用C语言等高级语言编写,主要好处在于代码可以写得更快、更紧凑、更容易理解和调试,更易于移植到其他硬件

分层结构

分层结构将操作系统分为多层 (levels)

  • 每层建立在低层之上
  • 最底层(layer 0), 是硬件
  • 最高层(layer N) 是用户

每一层仅使用更低一层的功能(操作)和服务
THE系统是第一个分层结构的操作系统
缺点: 清晰定义层次间接口非常困难

微内核结构

仅给内核分配一些最基本的功能:

  • 地址空间
  • 进程间通信(IPC)
  • 基本的调度

这种方法设计简单易于实现提高灵活性,非常适用于分布式环境

微内核结构尽可能把内核功能移到用户空间,一般只包含进程间通信、进程管理与调度、存储管理,文件系统之类功能移出内核。
用户模块间的通信使用消息传递。

好处: 灵活/安全…
缺点: 性能

外核结构

设计理念
尽可能减少软件的抽象化,使 得开发者可以专注于硬件的抽象化;同时简化传统微内核的消息传递机制,以及整块核心的软件抽象层,让内核分配机器的物理资源给多个应用程序 , 并让每个程序决定如何处理这些资源。程序能链接到操作系统库(libOS) 实现了操作系统抽象,保护与控制分离

VMM(虚拟机管理器)

虚拟机管理器将单独的机器接口转换成很多的虚拟机,每个虚拟机都是一个原始计算机系统的有效副本, 并能完成所有的处理器指令。

多线程

多线程技术是把执行一个应用程序的进程划分为可以同时运行的多个线程

线程
• 可分派的工作单元
• 包括处理器上下文环境(包含程序计数器和栈指针)和栈中自身的数据区域(用于启用子程序分支)
• 线程顺序执行且可以中断
进程
• 一个或多个线程和相关系统资源(如包含数据和代码的存储器空间、打开的文件和设备)的集合
• 通过把一个应用程序分解成多个线程,程序员可以在很大程度上控制应用程序的模块性及其相关事件的时间安排

对称多处理SMP

该术语不仅指计算机硬件体系结构,也指采用该体系结构的操作系统行为
若干进程可以并行运行,多处理器的存在对用户是透明的。

  • 这些处理器共享内存和I/O设备
  • 所有处理器可以执行相同的功能

操作系统负责在多个处理器中调度线程或进程,并负责处理器间的同步

对称多处理SMP优势

性能 多个进程可分别在不同的处理器上同时运行
可用性 单个处理器的失效不会导致系统停机
增量/增长 用户可通过添加额外处理器的数量来提高系统的性能
可扩展性 厂商可以提供一系列不同价格和性能指标的产品,其中产品性能可通过系统中的处理器数量来配置

操作系统设计

分布式操作系统

分布式操作系统会使用户产生错觉,多机系统好像具有:

  • 单一的内存空间
  • 单一的外存空间
  • 统一的存取措施

分布式操作系统的技术发展水平仍落后于单处理器操作系统和对称多处理操作系统

面向对象设计

用于给小内核增加模块化的扩展,基于对象的结构可使程序员定制操作系统,而不会破坏系统的完整性。
面向对象技术还使得分布式工具和分布式操作系统的开发变得更容易。

2.5 容错性

容错性指系统或部件在发生软/硬件错误时,能够继续正常运行的能力。通常会涉及一定程度的冗余,它旨在提高系统的可靠性,通常需要在经济层面或性能层面付出一定的代价。 在多大程度上采取容错措施必须要由所消耗资源的重要程度来决定

基本概念(基本度量指标)

可靠性

  • R(t)
  • 从时刻t=0开始系统正确运行,到时刻t时该系统正确运行的概率

平均失效时间(MTTF)
平均修复时间(MTTR)

指修复或替换错误部分所花费的平均时间

可用性A

  • 系统能够有效服务用户请求的时间段
  • 系统不可用的时间称为宕机时间(downtime)
  • 系统可用的时间称为正常运行时间(uptime)

操作系统机制

操作系统软件中采用了许多技术来提高容错性:

  • 进程隔离
  • 并发控制
  • 虚拟机
  • 检测点和回滚机制

2.6 多处理器和多核操作系统设计考虑因素

多处理器操作系统不仅要提供多道系统的所有功能,而且必须提供适应多处理器需要的额外功能
关键设计问题:

众核系统的设计挑战是,如何有效利用多核计算能力以及如何智能且有效地管理芯片上的资源,核心关注点在于如何将众核系统固有的并行能力与应用程序的性能需求相匹配
可以从三个层次开发其潜在的并行能力:

  • 每个核内部的硬件并行,即指令级并行
  • 每个处理器上多道程序或多线程程序的执行能力
  • 在多核上一个应用程序以并发多进程或多线程形式执行的潜在并行能力

多线程优化技术GCD

应用层并行

必须由开发者来判断应用的哪部分应异步执行,哪部分应并行执行,最有效的方法是Grand Central Dispatch (GCD)

在Mac Os X 10.6上实现
虽然GCD不能帮助开发者决定如何将任务或应用分解成单独的并发部分,但一旦开发者标识出可独立运行的子任务,GCD将使其尽可能更容易实 现
本质上,GCD是一种线程池机制
GCD的新意在于对编程语言的扩展,这使得匿名方法(称为块)成为指 定任务的一种方式

虚拟机方法

如果为一个进程分配一个或更多的核,并让处理器只去处理该进程,就能避免很多由任务切换及调度引起的开销。多核操作系统就成为了管理程序,负责为应用程序分配“核”资源的高层次决策,而不用过多地关注其他资源的分配

2.7 微软Windows系统简介

历代版本

  • MS-DOS
  • Windows 3.0
  • Windows 95
  • Windows 98
  • Windows Me
  • Windows NT 3.1
  • NT 4.0
  • Windows 2000
  • Windows XP
  • Windows Vista
  • Windows Server 2008
  • Windows 7
  • Windows 10
  • 面向云计算的NT版本Windows Azure

2.8 传统的UNIX系统

2.9 现代UNIX系统

2.10 Linux操作系统

Linux是由芬兰藉科学家Linus Torvalds于1991年编写完成的操作系统内核。 许多人对Linux进行改进、扩充、完善,做出了关键性贡 献。Linux由最初一个人写的原型变成在Internet上由无数志同道合的程序高手们参与的一场运动。

Linux操作系统的技术特点

  • 自由软件(开源软件)
  • 内核质量高
  • 高度模块化
  • 易于配置

操作系统演变中的计算机系统

参考教材

《操作系统——精髓与设计原理(第九版)》 [美] William Stallings 著 陈向群 陈渝 译 电子工业出版社

课堂笔记,如有错误之处,敬请指正!

操作系统原理——第2章 操作系统概述相关推荐

  1. 非零基础自学计算机操作系统 第1章 操作系统概述 1.4 操作系统的分类 1.4.1 多道批处理操作系统 1.4.2 分时操作系统

    非零基础自学计算机操作系统 文章目录 非零基础自学计算机操作系统 第1章 操作系统概述 1.4 操作系统的分类 1.4.1 多道批处理操作系统 1.4.2 分时操作系统 第1章 操作系统概述 1.4 ...

  2. 关于客户机服务器与微内核结构操作系统,第1章 操作系统概述1

    <第1章 操作系统概述1>由会员分享,可在线阅读,更多相关<第1章 操作系统概述1(41页珍藏版)>请在人人文库网上搜索. 1.操作系统概述 苏锐丹 操作系统概述 n操作系统的 ...

  3. 非零基础自学计算机操作系统 第1章 操作系统概述 习题一

    非零基础自学计算机操作系统 第1章 操作系统概述 习题一 [1]什么是操作系统?操作系统有哪些特性? 答:操作系统是管理计算机硬件与软件资源的计算机程序,它的主要特性有并发性.易用性.稳定性和异步性. ...

  4. 操作系统原理第七章:死锁

    目录 1 死锁的基本概念 2 死锁的必要条件 3 死锁预防 3.1 抑制死锁发生的必要条件 4 死锁避免 4.1 资源分配图法 4.2 银行家算法 5 死锁的检测 5.1 每一种资源类型只有一个实例 ...

  5. 计算机操作系统原理第四章习题

    计算机操作系统原理第四章习题 1.什么是静态链接.装入时动态链接和运行时的动态链接? 2.简述分页系统和分段系统的异同点 3.什么情况下需要重定位?为什么要引入重定位? 4.在具有快表的段页式存储管理 ...

  6. 计算机考研408 - 操作系统 - 核心知识点总结 - 第一章操作系统概述(23考研408大纲)

    操作系统概述 (结合王道知识点/课后习题/真题总结而来,概念选择题为主) 1.操作系统的分类 1)批处理操作系统:作业成批处理,交互能力较差 2)分时操作系统:主要使用时间片轮转调度算法,进行进程/作 ...

  7. 【第一章 | 操作系统概述】《操作系统 慕课版》课后答案 + 复习

    目录 | 本章概念 | 本章算法 单道批与多道批的图像绘制 利用率的计算与分析 | 课后简答题 | 本章概念 1.OS的作用 作为用户与计算机硬件系统之间的接口 | 计算机系统资源的管理者 | 对计算 ...

  8. 操作系统原理第十一章:大容量存储

    目录 1 磁盘结构 2 磁盘调度 2.1 先来先服务(FCFS) 2.2 最短寻道时间优先(SSTF) 2.3 扫描算法(SCAN) 1 磁盘结构 文件是放在磁盘上的,因此磁盘的性能是对操作文件有很大 ...

  9. 操作系统原理——第五章:虚拟内存

    文章目录 1. 起因 2. 覆盖技术 3. 交换技术 4. 虚存技术 4.1 目标 4.2 程序局部性原理 4.3 基本概念 4.4 基本特征 4.5 虚拟页式内存管理 1. 起因 增长迅速的存储需求 ...

最新文章

  1. java8新特性学习笔记链接
  2. [Termux]给Termux安装一个发行版Linux
  3. MySQL中的binlog日志
  4. 在DialogFragment中显示大图片
  5. VMware上安装Linux镜像CentOS
  6. Spring + Ibatis + MySql实例详解
  7. A Simple but Tough-to-Beat Baseline for Sentence Embeddings阅读笔记
  8. USB协议详解第29讲(USB设备状态及数据交互条件)
  9. 主角把异能开发计算机,不容错过的超能力游戏,最厉害的甚至能操控时间!
  10. 商城源码+分销版+破j版+企业版+虚拟商品+第三方对接
  11. 【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器 DirectInput专场
  12. iphone 日历 灰色_将iPhone假期日历更改为本地日历
  13. 力扣(350.121)补9.3
  14. YZ-9846时间同步装置 “四统一、四规范”,确保各时间同步设备时间高精度统一
  15. 取带runas的一些优秀小工具介绍
  16. 网络安全如何进行培训才有效
  17. JDK自带工具查看内存
  18. java 鱼刺图_Java JSR-133 因果关系中 6.3.1的例子为什么会出现r1==r2==1呢?
  19. 惊呆了!电脑换电池,居然只需这3步!
  20. 真人手办没法实现网购?我有一个好办法!

热门文章

  1. 【广告系列一】广告相关名词 CTR/CVR/eCPM...
  2. 用python解矩阵方程_用Python的Numpy求解线性方程组
  3. 将域控服务器添加到现有域,将域控制器添加到现有 Active Directory 域时无法选择 DNS 服务器角色...
  4. 桌面文件夹不见了怎么恢复?4招教你找回消失的文件夹
  5. 苹果怎么换行打字_2周内将你的打字速度提高3倍的方法
  6. 小米设备跨版本降级后相机打不开陀螺仪无法工作解决办法
  7. 高德地图marker屏蔽Label
  8. keil警告 LED.C(38): warning C276: constant in condition expression
  9. MQTT C Client实现消息推送(入门指南)
  10. python进阶数据分析_数据分析--Part 2: Python进阶