计算机操作系统还能这样玩?这一篇计算机操作系统的总结为你保驾护航(零风险高质量万字长文建议收藏)
Posted IT挖掘机y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机操作系统还能这样玩?这一篇计算机操作系统的总结为你保驾护航(零风险高质量万字长文建议收藏)相关的知识,希望对你有一定的参考价值。
操作系统目录
1、什么是操作系统
计算机操作系统是管理计算机硬件与软件资源的计算机程序
❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤
2、计算机操作系统的基本特征
2.1、并发
容易混淆的概念:并发和并行
并发:多个任务在同一时间间隔内发生,注意在宏观上是同时发生,但在微观上实际是交替发生的
并行:多个任务在同一时刻同时发生
2.2、共享
系统中的资源可以被多个并发执行的进程一起使用
互斥共享方式:某一个时间段内,只允许一个进程对该资源进行访问(例如摄像头)
同时共享方式:某一个时间段内,允许多个进程对该资源进行访问(例如磁盘)
注意“同时”其实本质上是在该时间段内,多个进程对资源交替访问(即分时共享)
2.3、虚拟
什么是虚拟:虚拟就是将一个物理实体变为若干个逻辑上的对应物
怎么理解呢?
虚拟存储器技术:虚拟存储器技术用来解决内存不够的问题(空分复用技术)
比如我电脑上一共4GB的运行内存,IDEA占用了2个G、py占用2个G…且不说系统占用的内存,加起来肯定超过了4个G;所以这就用到了虚拟存储器技术(此处不做过多深入了解)
虚拟处理器技术:CPU的虚拟化技术可以使单CPU模拟多CPU并行(时分复用技术)
微观上是处理机在各个微小的时间内交替的为各个程序服务(时间的微化处理);比如我能够同时打开idea、chrome、vx等等
如果丢失了并发,那么虚拟就无任何意义(因为如果没有并发,没次只运行一个程序即可)
2.4、异步
在多道程序的环境下,系统是允许多个程序并发执行的,由于资源的有限性,不可能所有的程序都能一贯到底的
比如进程A和进程B都要使用打印机,当进程A先获得打印机的使用权时,那么进程B只能等待;只有当进程A归还打印机,进程B才能继续执行。就像这样程序中间可能有间断,受到其他程序的影响,不知道何时执行结束,这就是程序的异步性。
❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤
3、操作系统的发展
1、手工操作阶段
人机速度不匹配,资源利用极低
2、批道处理阶段
Ⅰ、单批道处理系统:
引入脱机输入\\输出技术(磁带完成),缓解人机速度不匹配问题,提高了资源的利用率;但只允许一个程序运行,cpu大部分时间仍在等待IO,资源利用率依旧很低
Ⅱ、多批道处理系统:
每次向内存中输入多道程序,并发执行
提高了资源利用率,但无人机交互功能)
3、分时操作系统
增加了人家交互功能,以时间片为单位为各个人作业服务
缺点是不能及时处理紧急任务
4、实时操作系统
能够优先响应一些紧急任务,不需要时间片排队
硬实时操作系统:必须在严格的时间内完成处理(防空系统)
软实时操作系统:可以偶尔违反时间规定
5、网络操作系统
6、分布式操作系统
7、个人操作系统
❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤
4、OS的运行机制和体系结构
4.1、运行机制
4.1.1、两种指令
指令就是cpu能够执行的最基本的单位,一行代码可能转换多条指令
那么cpu是怎么判断执行哪条指令呢?请看4.1.2
4.1.2、两种状态
处于用户态时,cpu只能执行非特权指令
处于和心态时,cpu可以执行特权指令和非特权指令
使用程序状态寄存器来标识当前处理器处于什么状态
4.1.3、两种程序
4.2、体系结构
大内核:将系统的主要功能作为内核,运行在核心态
优点:高性能
缺点:代码里庞大、结构混乱、难以维护
微内核:只把最基本的留在内核
优点:代码量小、结构清晰、容易维护
缺点:需要在用户态和核心态之间来回切换,性能低
❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤
5、中断和异常
5.1、中断机制的由来
由于串行效率极低,所有引入了中断机制,从而实现了并发执行
一旦发送中断,就意味着需要操作系统的介入;因为用户程序是不允许直接执行特权指令的。
5.2、中断机制的流程
我们知道在并发执行的过程中,是以时间片轮转法来实现的
比如2个程序一同执行
1、当程序1在用户态执行完一个时间片时,cpu就会收到计时器发出的中断信号,然后cpu就会切换到核心态将cpu的使用权限交给操作系统管理
2、此时操作系统内核开始对中断信号进行处理,发现是过了一个时间片,然后操作系统会把cpu的使用权交还给用户进程,然后程序2就会在用户态下执行
3、程序2执行过程序可能需要进程输出操作,但是输入\\输出属于特权指令,程序是没法进行直接使用的;所以需要通过内中断的方式请求操作系统完成输出工作;此时和第一步一样-》cpu切换到和心态-》将使用权交给操作系统
5.3、中断机制的重点
1、当中断发生时,cpu立即进入核心态
2、当中断机制发生后,当前进程会进入暂停状态,交由操作系统内核对中断信号进行处理
3、不同的中断信号,会进行不同的中断处理
发生了中断,意味着需要操作系统的介入管理;而管理工作一般要包含输入输出、进程切换等特权指令;因此cpu需要从用户态切换为核心态,使得操作系统获得了计算机的控制权,有了中断机制才能实现程序的并发执行
用户态-》核心态 :中断是唯一途径
核心态-》用户态:只需通过一个设置程序特权字的标识为用户态即可
5.4、中断的分类
(软件中断就是比如1/0,外设就是比如IO完成就会发送中断信号)
核心:内中断和外中断怎么进行区分
内中断是发生在cpu内部,是当前执行的指令有关
外中断是发生在cpu外部,与当前执行的指令无关
外中断的处理流程
1、执行完每个指令之后,cpu都会检查是否有外中断信号
2、如何有则保护中断进程的环境(程序状态字、寄存器、计数器等)
3、根据中断信号转入执行相应的中断处理程序
4、恢复原进程的环境
❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤
6、系统调用
什么是系统调用?
系统调用是操作系统提供给应用程序的接口
系统调用的作用是什么?
系统中的各种共享资源由操作系统统一掌管,所以在应用程序当中,所有与资源相关的操作都必须以系统调用的方式请求操作系统进行处理;这样可以保证系统的安全性和稳定性。
由于需要一些特权指令,所以系统调用是在核心态下完成的
比如我们高级语言里面的Read(“a.txt”)函数,这个Read底层封装了系统调用复杂的实现细节
❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤
7、进程
7.1、进程的定义和组成
1.为什么会产生进程?
1.1.最初的计算机每次只能执行一个指令,这样的效率非常低下
1.2.后来出现了批处理系统,程序员可以将一串指令一次性交给计算机,这样虽然相比最初的计算机提高了效率,但是内存中始终只允许一个程序;
1.3.所以进程的概念就诞生了
2.进程是什么?
进程是应用程序在内存中分配的空间,各个进程互不干扰,每个进程保持着程序每一时刻的运行状态
特点:此时cpu采用时间片轮转的方式运行进程
操作系统在每一个程序运行之前,都会在内存中为程序配置一个数据结构,称之为进程控制块(PCB),用来描述进程的各种信息
另外进程实体(进程映像)包含数据段、程序段、PCB组成。(操作系统相关的数据都存放在PCB中,程序运行的代码存放在程序段中,程序运行所需的相关数据存放在数据段中)
7.2、进程的组织方式
链接方式和索引方式很类似,只不过索引方式是使用了一个中间表来实现;而链接方式就相当于链表中的头节点
7.3、进程的特征
7.4、进程的状态
在计算机运行的过程中,可能有多个进程运行;此时有的进程或许正在被cpu运行,有的或许在等待;所以说进程可能处于不同的状态。
注意
在单核处理机中,每一个时刻最多有一个进程正在运行;在多核处理机中,每一个时刻可以有多个进程正在运行。
其实还有另外两种状态
7.5、进程状态的切换
7.6、进程的控制
进程控制简单了说就是完成进程状态之间的转换
使用原语完成进程控制,(原语就是必须一气呵成,中间不允许进行中断;比如如果进程在转换过程中由于中断没有进入其他相应的队列就会造成难以想象的后果)
原语采用“开中断”和“关中断”两个指令完成进程控制
进程状态转换过程中,首先会执行关中断,如果在途中遇到中断指令,则会被忽略;直到遇到开中断结束。
❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤
8、线程
8.1、线程的简介和引入后发生的变化
概述
线程是轻量级的进程,是cpu资源调度的基本单位
引入线程前后的变化
资源分配、调度:引入线程前,进程是资源分配、调度的基本单位;引入线程后,进程是资源分配的基本单位,线程是调度的基本单位
并发性:引入线程前,只能在进程间并发;引入线程后,线程间也能进行并发
系统开销:引入线程前,进程之间的切换开销大;引入线程后线程在进程内部进行切换的开销小
8.2、线程的属性
线程是cpu调度的基本单位
多核计算机中,各个线程可以占用不同的cpu
每个线程都有一个线程ID、线程控制块(TCB)
线程也有就绪、运行、阻塞三种基本状态
线程几乎不拥有系统资源
同一进程的不同线程共享进程资源
8.3、线程的实现方式和多线程模型
实现方式
在用户级线程和内核级线程中,可以采用组合的方式,将n个用户级线程映射到m个内核级线程(n>=m)
注意:内核级线程才是处理机分配的基本单位
多线程模型
多对一
一对一
多对多
❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤
9、处理机调度
简介:从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行
9.1、进程调度方式
三种调度方式
高级调度
按一定的原则从外存上处于后备队列的作业中挑选一个作业,给他们分配资源,建立相应的进程,使得它们获得处理机的权限
中级调度
利用虚拟存储器技术,将暂时不能运行的进程调到外存准备。等它具备了运行条件且内存空闲时,再重新调入内存,外存到内存(创建态-》就绪态
暂时调到外存的进程状态处于挂起状态。PCB不会被调入外存,PCB记录了进程数据在外存中存放的位置等信息。被挂起的进程的PCB被放到挂起队列中,从外存到内存(挂起态-》阻塞态)
低级调度
按照某种策略从就绪队列种选取一个进程,将处理机分配给它,从内存到cpu
9.2、进程调度时机
临界区是?访问临界资源的那段代码
临界资源是?一段时间内只允许一个进程访问,各进程互斥访问
当进程访问普通临界资源时是可以进行调度与切换的
9.3、调度算法的评价指标
1、cpu利用率:作业在外存后备队列的时间(高级调度)
2、系统吞吐量:进程在就绪队列的时间(低级调度)
3、周转时间:进程执行的时间、等待IO的时间
4、等待时间:
公式:带权周转时间=作业周转时间/作业实际的运行的时间 =(作业完成时间-作业提交时间)/作业实际运行的时间
9.4、调度算法
9.4.1、先来先服务
算法思想:从公屏上的角度考虑
算法规则:按照作业/进程先到达的先后顺序进行服务
作业/进程调度:用于作业调度时,先考虑哪个作业进入后备队列;用于进程调度时,先考虑哪个进程先到达就绪队列
是否可抢占:非抢占式算法
优点:公平
缺点:对短作业不利
模拟FCFS调度算法(先来先服务)没错,是篇好文章!:https://blog.csdn.net/Kevinnsm/article/details/115013353
9.4.2、短作业优先
算法思想:追求最少的平均等待时间
算法规则:最短的作业/进程优先得到服务(前提的进程已经到达)
作业/进程调度:都可以
是否可抢占:SJF和SPF是非抢占式算法(SRTN为抢占式算法-时间最短)
优点:最短的平均等待时间
缺点:对长作业不利
如果是一直有短作业,就会造成长作业一直等待
短作业最短时间优先原则(SRTN)为抢占式的,平均等待时间最短
9.4.3、高响应比优先
算法思想:综合考虑作业/进程的等待时间和要求服务的时间
算法规则:每次调度前计算每个作业的响应比,选择响应比最高的作业服务
是否抢占:否(只有当前作业主动放弃处理机才会进行调度)
优点:综合比较好
高响应比=(等待时间+服务时间)/服务时间
9.4.4、时间片轮转调度算法
1、算法思想:处理机轮流的为每个进程服务,每个进程在一定时间内都可以得到响应
2、算法规则:按照各个进程到达就绪队列的顺序,轮流让每个进程执行一个时间片(如100ms),如果说某个进程在这个时间内没有执行完,则会被剥夺处理机,放到就绪队列进行等待
3、是否用于作业/进程调度:用于进程调度,因为只有当作业放到内存建立了相应的进程才能被分配时间片
4、是否抢占:属于抢占式算法,当进程没执行完也会被剥夺处理机(由时钟装置发出时钟中断通知时间已到)
5、优点:公平、响应快,适用于分时操作系统
6、缺点:进程频繁切换需要一定的开销,另外不能区分任务的紧急程度
7、是否会导致饥饿:不会导致饥饿
注意事项(时间片过大或过小会有什么影响?)
如果时间片过大,每个进程都有可能在一个时间片内执行完毕,那么该算法就会退回到先来先服务算法,会增大系统响应时间,所以时间片不能过大
如果时间片过小,进程之间就会频繁的进行切换,浪费大量的时间,进程处理的时间比例就会下降,所以时间片不能过小
9.4.5、优先级调度算法
1、算法思想:根据任务的紧急程序来决定处理顺序(用于实时操作系统)
2、算法规则:每个作业/进程都有优先级,调度时选择优先级高的作业/进程
3、用于作业/进程调度:既可用于进程调度,又可以用于作业调度
4、是否抢占式:既有抢占式又有非抢占式
5、优点:区分任务紧急程度,常用于实时操作系统;可以动态的调整对各个作业/进程的偏好程度
6、缺点:若有源源不断地优先级进程进来,有可能会导致优先级较低地进程饥饿
7、是否导致饥饿:有可能导致饥饿
9.4.6、多级反馈调度算法
1、算法思想:对上面的五种调度算法进行折中
2、算法规则:设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
3、用于作业/进程调度:用于进程调度
4、是否抢占式:抢占式算法
5、优点:对各个进程公平(FCFS),每个新到达的进程都能被很快响应(RR),短进程只需要很少的时间就能够完成(SPF),可灵活调整各个对进程的偏好程度
6、是否导致饥饿:会
9.4、进程同步和进程异步
9.4.1、进程同步
进程具有异步性的特征,并发的进程总是以各自独立、不可预知的速度向前推进。
比如管道通信:写的一端向管道写入数据,读的一段从管道读取数据。因此写进程必须在读进程之前执行,否者就会造成阻塞(因此推进顺序必须是写顺序->读顺序)
9.4.2、进程互斥
进程在并发执行的过程中,不可避免的需要共享一些资源(比如摄像头、打印机)
在某一个时间段内,只允许一个进程进行访问的资源称为临界资源
实现进程互斥需要遵循以下几个条件
1、空闲让进
2、忙则等待
3、有限等待
4、让权等待
9.5、进程互斥的软件实现方式
1、单标志法
2、双标志位先检查法
3、双标志位后检查法
4、perterson算法
9.6、进程互斥的硬件实现方式
1、中断屏蔽:利用开中断/关中断指令完成(一旦某个进程执行了关中断后就不允许其他进程进行中断,也就不可能会发生进程切换;然后就可以独自的访问临界区,直到执行开中断之后。其他进程才能访问临界资源)
…
关中断
临界资源
开中断
…
优点:简单、高效
缺点:不适用于多处理机,因为有可能多个处理机上的某个进程都要访问临界资源,那么由于每个处理机都可以执行中断,所以会出现多个进程同时访问临界资源的情况;然后开中断/关中断属于特殊指令,一般用于内核级进程
2、TS指令:TSL指令是用硬件实现的,不允许被中断
3、swap指令
10、信号量
10.1、信号量机制
10.1.1、整型信号量
可以使用信号量来表示系统中某个资源的数量,通常使用原语中的wait和signal来实现
#如何使用信号量来定义系统中的资源呢?
1.初始化
2.P操作
3.V操作
初始化:
int S = 1 //(假设初始化打印机的数量为1)
P操作:
void wait(S) {
while(S<=0);
S=S-1;
}
V操作
void signal(S){
S=S+1
}
…
P操作
使用临界资源
V操作
…
由于while(S<=0)循环,如果一旦资源不够用,那么将要使用该资源的进程就会一直处于忙等的状态
10.1.2、记录型信号量
typedef struct {
int value; //记录资源的数据
struct process *L; //等待队列
}node;
void wait(node s){
s.value--;
if(s.value < 0) { //如果系统资源数据不够,则将进程由运行态切换到阻塞态,并将其挂载到队列中等待
block(s.L)
}
}
void signal(node s) {
s.value++;
if(s.value <= 0) {
wakeUp(s.L) //如果某个进程释放资源后,发现还有等待的进程,则使用wakeUp原语从队列中唤醒一个进程
}
}
一旦判断系统资源数量为0,当前进程就会使用block原语将自己从运行态切换到阻塞态,主动放弃处理机,将自己挂到队列中去;所以不会进程不会出现忙等的状态(一直占用cpu,却没做任何事情)
10.1.3、信号量机制实现进程互斥
1、设置互斥信号量(mutex =1)
2、执行P(mutext)操作
3、访问临界资源
4、执行V(mutext)操作
semaphore = 1;
P()...
临界资源
V()....
10.1.3、信号量机制实现进程同步
:TODO
10.2、生产者消费者问题
生产者每次生成生产一个产品放入缓冲区,消费者每次从缓冲区消费一个产品。
相关问题
1、缓冲满时,生产者不能放入产品
2、缓冲区空时,消费者不能消费产品
3、当生产者并发执行时,有可能向缓冲区的同一个空间放入产品,就会造成覆盖的状况,所以必须互斥地访问缓冲区
11、死锁
11.1、产生死锁的原因和必要条件
所谓死锁就是多个进程同时竞争同一种资源而陷入僵局
1、产生死锁的原因:
1.竞争资源
2.进程的推进顺序非法
详细分析
Ⅰ、竞争资源
系统中的资源分为两类:可剥夺性资源,非剥夺性资源;
1.可剥夺性资源,当进程获得可剥夺性资源时,可以被优先级较高的进程抢占;另外存储管理程序可以将一个进程从内存调到外存上;由此可以得出CPU和主存输入可剥夺性资源
2.不可剥夺性资源:这一类资源只能由进程使用完后自行释放,所以像打印机、磁带机属于不可剥夺性资源
从上面的两种资源我们就可以得出,当不可剥夺性资源数量不多时,如果多个进程同时竞争,则可能发生死锁,因为这种资源进程不能被抢占
Ⅱ、进程推进顺序不当
进程在运行中具有异步的特征
2、产生死锁的必要条件
1、互斥条件:资源必须是互斥访问的(在同一段时间内只能由一个进程访问)
2、请求和保持条件:即进程已经占有了至少一个资源,然后又去请求另外一个资源,而另外一个资源刚好被占用;此时请求陷入阻塞,然后该进程又不放弃自己占有的资源
3、不剥夺条件:即该进程获得的资源,在进程主动释放前不能被抢占(可以理解为上面的不可剥夺性资源)
4、环路等待条件:进程发生死锁时形成了一个环形阻塞(p0等p1,p1等p2,p2等p0)
3、处理死锁的基本方法
1、预防死锁
2、避免死锁
3、检测死锁
4、解除死锁
4、
Ⅰ、预防死锁
摒弃请求和保持条件:这种方式直接在所有进程运行之前,一次性的将资源分配给进程,此后不再进行申请资源。这种方法缺点是极大的浪费了系统资源,还有可能需求资源被其他进程一直占用,迟迟不能执行。
摒弃不剥夺条件:这种方式是当进程正在使用某个资源时,如果其他进程请求该资源,则占用该资源的线程立即释放当前资源。这种方式的缺点也很明显,比如不可剥夺性资源打印机,如果某个进程正在使用,如果中断一次,那么两次打印的信息可能不会连续。反复的申请和释放资源,进程运行时间比例被大大缩小。
摒弃环形等待:这种方式是将资源类型进行线性排队,给每个资源进行编号。这个缺点是每个资源的使用顺序可能不一样
Ⅱ、避免死锁
这种方式通过将系统始终处于安全状态,这种方式可以获得令人满意的性能
这种方式主要考虑资源的分配顺序,因为资源数量不一致嘛
重点:银行家算法避免死锁
Ⅲ、检测死锁
通过用例分配图检测死锁
Ⅳ、解除死锁
通过剥夺资源和撤销进程来实现
(注意这个剥夺资源是从其他进程剥夺其资源给死锁进程)
12、存储器管理
12.1、多级存储器结构
cpu寄存器:寄存器
主存:高速缓存、主存、磁盘缓存
辅存:磁盘、可移动存储介质
12.2、程序的装入和链接
程序如果想要运行,必须创建进程,而创建进程第一件事情肯定是将程序和数据加载到内存中。而如何将一个程序变成一个可以在内存中可执行的程序,通常需要完成三部:编译、链接、装入
12.2.1、程序的装入
1.绝对装入方式:这种方式逻辑地址和实际内存地址相同,故不需要对数据进行更改
2.可重定位装入方式:最后需要修改指令和数据
3.动态运行时装入方式:可以任意改变在内存中的位置
12.2.2、程序的链接
程序编译之后形成了一系列的模块,需要利用链接程序将目标块链接。形成装入模块
1.静态链接:在程序运行之前,将其链接成一个完整的模块,以后不再分开
2.装入时动态链接:在目标模块装入内存时,采用边装入边链接的方式
3.运行时动态链接:在程序运行过程中,需要某个模块时,才对对其进行链接
12.3、连续分配方式
12.3.1、单一连续分配
这种存储管理方式,把内存分为系统区和用户区;系统区处于内存的地址部分,其余的是用户区,提供给用户使用
12.3.2、固定分区分配
将内存分位几个固定大小的空间,划分位几个分区,就允许几个作业并发运行。当某个作业运行结束时,便可以从外存的后备队列中选择一个适当大小的作业装入该分区
缺乏灵活性、容易造成资源浪费
12.3.3、动态分区分配
根据实际的需要,动态的分配空间;所以这涉及到三个问题;数据结构、分区分配算法、分区的分配和回收操作
1.数据结构
空闲分区表:该表记录空闲分区中的一些数据(分区始址和分区大小等)
空闲分区链:将所有空闲分区通过前后指针链接起来
2、分区分配算法
Ⅰ.首次适应算法,该算法要去分区链以地址递增的顺序链接;分配内存时从链首开始寻找,直到找到一个符合要求得分区,选择合适的大小,余下的仍留在空闲链中。这种算法优先利用低地址部分的空间,将高地址的大空间留给后续大作业,但是会在低地址部分留下很多小的空闲分区,然后分区时又是从低地址开始的,查询开销无疑增大
…飞速总结中 ❤️ ❤️
以上是关于计算机操作系统还能这样玩?这一篇计算机操作系统的总结为你保驾护航(零风险高质量万字长文建议收藏)的主要内容,如果未能解决你的问题,请参考以下文章