操作系统(Operating Systems: Internals and Design Principles)
chapter 01 计算机系统概述
-
空间局部性(spatial locality)和时间局部性(temporal locality)的区别
- 时间局部性(temporal locality)
最近被引用的存储单元在未来会被多次引用(通常在循环中)。 - 空间局部性(spatial locality)
如果一个存储单元被引用,那么将来它附近的存储单元也会被引用。
- 时间局部性(temporal locality)
-
三种I/O技术:
-
可编程I/O(Programmed I/O)
处理器执行I/O指令后,还要定期检查I/O模块的状态,以确定I/O操作是否已经完成。
-
中断驱动I/O(Interrupt-Driven I/O)
CPU给I/O模块发送I/O命令,然后继续做一些其他的工作,当I/O模块准备好与CPU交换数据时,它将打断CPU的执行并请求服务。
-
直接存储器访问(DMA)
DMA模块控制内存和I/O模块之间的数据交换。为传送一块数据,处理器给DMA模块发送请求,等到整个数据块传送结束后,DMA模块才发送中断信号给CPU。
-
-
中断产生的背景(?
大多数I/O设备比CPU慢得多,引入中断机制以提高CPU利用率。
-
中断处理流程
课本图1.10
-
中断的现场保存和恢复
现场保存:将程序状态字(PSW)、PC、一些寄存器的值 压入控制栈
key words
instruction cycle:CPU取出一条指令并执行这条指令所用的时间。
interrupt:中断是一种允许其他模块(如I/O、存储器)中断CPU正常处理过程的机制。
hit ratio:对较快存储器的访问次数与对所有存储器的访问次数的比值。
memory hierarchy:为了以较低的价格获得更高的性能,现代计算机系统采用多类型存储器的组合,称为存储器的层次结构。分为:板上存储器、板外存储体、离线存储体。
cache:高速缓存
locality:
空间局部性:访问趋向于在地址空间中聚集
时间局部性:最近访问的数据在不远的将来会被再次访问
chapter 02 操作系统概述
-
操作系统设计的三个目标
- 方便:OS使计算机更易于使用。
- 有效:OS能以更有效的方式使用计算机资源。
- 可扩展
-
操作系统提供的功能/服务
- 程序开发
- 程序运行
- I/O设备访问
- 文件访问控制
- 系统访问
- 错误检测和响应
- 审计
-
批处理系统/分时系统产生的背景
-
批处理
- 简单批处理
- 多道批处理:简单批处理系统提高了CPU资源的利用率,但是由于I/O设备相对于处理器的速度太慢(一个用户程序要使用I/O设备,CPU必须等待),处理器经常是空闲的。
-
分时
多道批处理系统已经极大地提高了计算机系统的效率,但是用户交互性并不好。所以出现了分时技术(Time-Sharing),多个用户可以同时分享处理器时间,以达到减少用户响应时间的目的。
-
-
PCB和执行上下文(execution context)or 进程状态(process state)的关系
上下文属于PCB的一部分。PCB是进程映像的一部分。
-
一个进程的执行上下文(execution context)是如何被OS使用的
-
系统调用(system call)的目的是什么?系统调用是如何与OS,以及双执行模式(dual-mode:kernel-mode & user-mode)相联系的?
- 为了管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具有更好的兼容性,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system call)的接口呈现给用户。系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序。
- 具有多任务处理的功能,通常靠进程来实现。
- 为了安全问题,一些I/O操作的指令都被限制在只有内核模式可以执行,因此操作系统有必要提供接口来为应用程序提供诸如读取磁盘某位置的数据的接口,这些接口就被称为系统调用。
- 当操作系统接收到系统调用请求后,会让处理器进入内核模式,从而执行诸如I/O操作,修改基址寄存器内容等指令,而当处理完系统调用内容后,操作系统会让处理器返回用户模式,来执行用户代码。
key terms
操作系统(Operating System):是控制应用程序执行的程序,它充当用户和计算机之间的接口,并对计算机资源进行管理。
内核(kernel):OS常驻内存的部分,包含了操作系统中最常用的功能。
多道(multiprogramming):当一个程序(作业)被中断需要等待某些事件发生时,CPU可以切换到另一个可以立即运行的程序(作业),这种处理称为多道multiprogramming。
分时系统(time-sharing system):分时系统允许多个用户通过终端同时访问系统,共享CPU时间,操作系统以时间片为单位,轮流为每个终端用户服务,提供了较好的交互性。
批处理系统(Batch Processing System):批处理是指计算机操作员将作业组织成批,提交给操作系统,由操作系统控制它们自动运行。这种采用批处理技术的操作系统称为批处理操作系统。批处理操作系统分为单道批处理系统和多道批处理系统。批处理操作系统不具有交互性,它是为了提高CPU的利用率而提出的一种操作系统。
chapter 03 进程描述和控制
-
什么是进程?为什么要引入进程的概念?
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
在操作系统中引入进程,是为了实现多个程序的并发执行。传统的程序不能与其他程序并发执行,只有在为之创建进程后,才能与其他程序(进程)并发执行。
-
有中断为什么还需要引入进程?
系统程序员在开发早期的多道程序和多用户交互系统时使用的主要工具是中断。
为了能够协调各种不同活动而进行的系统软件设计是相当困难的。
容易产生四类错误:
- 不正确的同步(Improper synchronization)
- 失败的互斥(Failed mutual exclusion)
- 不确定的程序操作(Nondeterminate program operation)
- 死锁(Deadlocks)
-
PCB的构成
- 进程标识信息
- 处理器状态信息
- 用户可见寄存器
- 控制和状态寄存器
- 栈指针
- 进程控制信息
- 。。。
-
process switching
vsmode switching
进程切换,是作用于进程之间的一种操作。OS将一个正在运行的进程中断,指定另一个进程为运行态,并把控制权交给这个进程。当分派程序(dispatcher)回收当前进程的CPU并准备把它分派给某个就绪进程时,该操作将被引用。
模式切换,是进程内部所引用的一种操作。当进程映像所包含的程序引用系统调用时,该操作将被引用。
进程切换一定引起模式切换(进程切换时会执行中断例程,中断例程要在系统模式下运行;调度程序也要在系统模式下运行),反之则不一定。
-
进程切换发生的时机
- 中断(与当前运行的进程本身无关,与某种外部事件相关)
- 时钟中断
- I/O中断
- 内存失效
- 陷阱(trap)(与当前运行的进程所产生的错误或异常条件相关)
- 系统调用
- 中断(与当前运行的进程本身无关,与某种外部事件相关)
-
进程切换的流程
- 保存处理器上下文
- 更新当前处于运行态的进程的PCB
- 把进程的PCB移到相应的队列(就绪、在事件i处阻塞、就绪/挂起)
- 选择另一个进程执行
- 更新所选进程的PCB
- 更新内存管理的数据结构
- 恢复处理器在被选择的进程最近一次切换出运行态时的上下文
-
进程创建的流程
- 给新进程分配一个唯一的进程标识号
- 给进程分配空间
- 初始化PCB
- 设置正确的连接
- 创建或扩充其他数据结构
-
为什么需要双模式?(user-mode & kernel-mode)
双模式可以保护操作系统和重要的操作系统数据表(如PCB)不受用户进程的干涉。在内核模式下,软件具有对及所有指令、寄存器和内存的控制能力,这一级的控制不是用户程序所必需的,并且为了安全起见也不是用户程序可访问的。
-
阻塞的原因
- 请求系统服务
- 启动某种操作:如I/O
- 需要的新数据尚未到达
- 无新工作可做
-
关于 五状态图 or 七状态图 中的退出态
此状态下,OS只释放了进程的指令和数据,它的PCB仍留在内存中。
key terms
进程(process):一个正在执行中的程序。
进程控制块(Process Control Block, PCB):OS用来 控制 和 管理 进程所用的数据结构。
CPU的执行模式:用户模式、系统模式(内核模式)。
进程的状态:一个进程的生命周期可以划分为一组状态,这些状态刻画了整个进程。
轨迹(trace):可以通过列出为某进程而执行的指令序列来描述单个进程的行为,这样的序列被称为进程的轨迹。可以通过给出各个进程的轨迹是如何交替的来描述处理器的行为。
分派器(dispatcher):
轮循(round-robin):依次给队列中的每个进程一定的执行时间,然后进程返回队列。阻塞情况除外。
交换(swap):将内存中暂时不能运行的进程(或暂时不用的数据和程序)转移到外存,以腾出足够的内存空间,把已具备运行条件的进程(或进程所需要的数据和程序)转移到内存。
程序状态字(PSW):
处理器状态寄存器(processor status register, psr):
chapter 04 线程、对称多处理和微内核
-
传统进程的概念中包含两个特点:
- 资源所有权(Resource ownership)
- 调度/执行(Scheduling/execution)
- These two characteristics are treated independently(独立的) by the operating system
-
进程和线程
- 拥有资源所有权(resource ownership)的单位通常称为进程(process)或任务(task)
- 分派的单位通常称为线程(thread)或轻量级进程(LightWeight Process,LWP)
-
单线程方法(single-threaded approach):每个进程中只有一个线程在执行的传统方法(还没有明确线程的概念)。
- 多线程(Multithreading):指操作系统支持在一个进程中执行多个线程的能力。
-
为什么要引入线程?(引入的原因)
有了线程以后,凡是程序涉及到多线任务时,都使用多线程来实现,使用多线程来实现时,线程间的切换和数据通信的开销非常低,正因为开销非常低,因此线程还有另一个名称,叫“轻量级的进程”。
-
从性能上看,线程的重要优点有:
- 创建一个新线程比创建一个新进程用时更少
- 终止一个线程比终止一个进程用时更少
- 同一进程内线程间切换比进程切换用时更少
- 线程之间无需调用内核就可以互相通信
-
进程的部分活动会影响该进程中的所有线程
- Suspending a process involves suspending all threads of the process since all threads share the same address space
- Termination of a process, terminates all threads within the process
-
线程的实现方法(?
用户级线程(ULT)、内核级线程(KLT)。
KLT又称为轻量级进程。
-
用户级线程(ULT)与内核级线程(KLT)的优缺点
-
并行处理器(parallel processor)体系结构图
-
为什么线程间的模式切换比进程间的模式切换开销少?
线程包含的状态信息比进程少。
-
为什么一个用户级线程(ULT)进行系统调用被阻塞时,进程中所有线程都会被阻塞?
因为对用户级线程来说,有关线程管理的工作都由应用程序完成,线程对操作系统是不可见的,此时操作系统的调度是以进程为单位的。所以当一个线程被阻塞,这个进程内的所有线程都会被阻塞。
-
微内核的优点
- 为进程请求提供一致接口(进程无须区分是内核级服务还是用户级服务)
- 可扩展性
- 灵活性
- 可移植性
- 增强了系统的可靠性(小的内核可以被严格地测试)
- 有助于对分布式系统的支持
- 适用于面向对象操作系统
key terms
进程(process):一个正在运行的程序。
线程(thread):是操作系统进行调度的最小单位。它包含在进程之中,是进程中的实际运作单位。
轻量级进程(lightweight process)
内核级线程(kernel-level thread, KLT)
用户级线程(user-level thread, ULT)
多线程(multithreading)
任务(task)
对称多处理(Symmetric MultiProcessing,SMP):是指在一个计算机上汇集了多个CPU,各CPU之间共享存储器以及总线结构。它是相对非对称多处理技术而言的、应用十分广泛的并行技术。
微内核(microkernel):仅提供一些操作系统最基本的功能,大部分的服务由用户空间的程序提供。通常包括:内存管理、进程间通信、I/O和中断管理。
宏内核(monolithic kernel):在一个操作系统程序中提供了所有必须的功能,即所有操作系统功能都运行在内核空间内。
chapter 05 并发性:互斥和同步
-
并发带来的问题:
- 全局资源的共享存在风险
- OS难以对资源分配进行最优化的管理
- 难以定位程序设计的错误
-
并发(concurrency)需要解决的四个问题
- 进程间通信
- 资源共享与竞争
- 多个进程活动的同步
- 分配给进程的CPU时间
-
信号量的类型
-
计数信号量(一般信号量)
-
二元信号量(互斥量):值只能为0或1
-
强信号量
-
弱信号量
不论是二元信号量还是一般信号量,都需要一个队列来保存当前正在等待的进程,那么就产生一个问题:进程按照什么顺序从队列中移除?
最公平的策略是先进先出:被阻塞时间最久的先从队列中移除。采用这一种策略的称为强信号量,而没有规定进程从队列中移除顺序的信号量称为弱信号量。强信号量保证不会饥饿,而弱信号量则无法保证。 -
-
实现互斥的三类方法
- 软件方法
- 硬件方法
- 中断禁用
- 专用机器指令
- 在操作系统或程序设计语言中提供某种级别的支持
- 信号量(semaphore)
- 管程(monitor)
- 消息传递(message passing)
-
硬件实现互斥的方法描述
- 中断禁用
- 专用机器指令
key terms
并行(parallel):在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
并发(concurrency):在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
交替(interleave):
覆盖技术/重叠(overlap):
互斥(mutual exclusion):当一个进程在临界区访问临界资源时,其他进程不能进入临界区。
同步(synchronize):它主要源于进程合作,是进程间共同完成一项任务时直接发生相互作用的关系。为进程之间的直接制约关系。在多道环境下,这种进程间在执行次序上的协调是必不可少的。
临界区(critical section):是一段代码,在这段代码中,进程将访问临界资源。
临界资源:一次仅允许一个进程使用的资源。
竞争条件(race condition):指多个线程或进程在读写一个共享数据时,结果依赖于它们的执行顺序的情形。
原子操作(atomic operation):原子操作是指不会被中断的操作;这种操作一旦开始,就一直运行到结束。
信号量(semaphore):是在多线程环境下使用的一种数据结构,是可以用来保证两个或多个关键代码段不被并发调用。
多道程序设计技术(multiprogramming):管理单处理器(uniprocessor)系统的多个进程。
多处理技术(multiprocessing):管理多处理器系统中的多个进程。
分布式处理技术(distributed processing):管理多台分布式计算机系统中多个进程的执行。
chapter 06 并发性:死锁和饥饿
-
死锁的必要条件
- 互斥
- 占有并等待
- 非抢占
-
死锁的充分条件
- 互斥
- 占有并等待
- 非抢占
- 循环等待
-
死锁:一组竞争系统资源或相互通信的进程间相互的永久阻塞。
-
死锁预防
- 间接:防止三个必要条件其中一个的发生
- 互斥:不可能禁止
- 占有且等待:可以要求进程一次性地请求所有需要的资源
- 非抢占:可以设置优先级
- 直接:防止循环等待的发生
- 可以通过定义资源类型的线性访问顺序来预防
- 间接:防止三个必要条件其中一个的发生
-
死锁避免(包括 进程启动拒绝 和 资源分配拒绝 )
-
允许三个必要条件的发生,但通过明智地选择,确保永远不会到达死锁点。
-
优点:不需要死锁预防中的抢占和重新运行进程,并且比死锁预防的限制少。
-
缺点:必须事先声明每个进程请求的最大资源;
进程之间必须无同步要求;
分配的资源数目必须是固定的;
占有资源时,进程不能退出。
-
-
死锁检测和死锁恢复
死锁检测:
死锁恢复:
-
退出所有的死锁进程;
-
把每个死锁进程回滚到某个检查点,再重启所有进程(原来的死锁可能再次发生);
-
连续退出死锁进程直到不再存在死锁;
-
连续抢占资源直到不再存在死锁。
对于(3)和(4),选择进程的原则可采用下面的一种:
Least amount of processor time consumed so far (耗费处理器时间最少)
Least number of lines of output produced so far (输出的行数最少)
Most estimated time remaining (预计剩下时间最长)
Least total resources allocated so far (分配的资源最少)
Lowest priority (最低优先级)
-
key terms
死锁(deadlock):两个或两个以上的进程,因每个进程都在等待其他进程做完某些事情而不能继续执行的情形。
活锁(livelock):两个或两个以上的进程,为响应其他进程中的变化而继续改变自己的状态,但不做有用的工作的情形。
饥饿(Starvation):一个可运行的进程尽管能继续执行,但被调度器无期限地忽视,而不被调度执行的情况。
chapter 07 内存管理
-
内存管理需要满足的需求:
- 重定位(relocation)
- 保护(protection)
- 共享(sharing)
- 逻辑组织(logical organization)
- 物理组织(physical organization)
-
分页与固定分区的区别
- 块的大小更小
- 进程可以加载到不连续的块中
-
分段与动态分区的区别
动态分区是进程间的分配,分段内存管理是进程内的分配,两者的分配方式十分相似。
动态分区是进程间的,一个进程的所有代码作为一块存储;分段式内存管理将一个进程的代码按逻辑分为多个段,多个段被在内存中不同的位置。
-
内存管理技术
key terms
重定位(relocation):将逻辑地址转换为物理地址的过程。
- 静态重定位:在程序执行前就完成了逻辑地址到物理地址的变换
- 动态重定位:程序执行时才进行地址转换
地址类型:
- 逻辑地址:与当前数据在内存中的实际地址无关的访问地址
- 相对地址:相对于某些已知点的存储单元
- 物理地址:数据在内存中的实际位置
覆盖(overlaying):不同的模块被指派到内存的同一块区域,主程序负责在需要时换入或换出模块。
-
覆盖的一个实例:
内部碎片(internal fragmentation):由于被装入的数据块小于分页大小,从而导致页内部有空间浪费的现象。
外部碎片(external fragmentation):指内存中还没有分配出去,但是由于大小太小而无法分配给申请空间的新进程的空闲块。
伙伴系统(buddy system):固定分区和动态分区的一种折中方案。
压缩(compaction):操作系统不时地移动进程,使得进程占用的空间连续,所有的空闲空间连成一片。
chapter 08 虚拟内存
-
简单分页和虚存分页的区别
-
什么是系统抖动(thrashing)
从内存中刚刚换出(Swap Out)某一块后,又因请求马上又换入(Swap In)该块,这种反复换出换入的现象。(马上需要的进程块被换出)
系统抖动导致CPU大部分时间用于交换块,而不是执行指令,大大降低系统效率。
-
典型的内存管理结构
-
页表结构:
-
段表结构:
-
段页式:
-
-
虚拟内存的支持(Support needed for virtual memory)
- 必须有对所采用的分页或分段方案的硬件支持
- 操作系统必须有管理页或段在主存和辅存之间移动的软件
-
用于虚拟内存的操作系统策略(Operating System Policies for Virtual Memory)
替换策略★★★ -
采用分级页表的优缺点
- 优点:减少了页表对内存空间的占用
- 缺点:进行地址转换时访问内存的次数增加了
-
纯粹的分段系统越来越少,OS面临的大多数内存管理问题都是关于分页方面的。
-
驻留集 (resident set) 管理
- 固定分配 or 可变分配
- 局部替换 or 全局替换
key terms
常驻集(resident set):进程执行中的任何时候都在主存中的部分。
系统抖动(thrashing):从内存中刚刚换出(Swap Out)某一块后(换出到Disk),根据请求马上又换入(Swap In)该块,这种反复换出换入的现象。
页表项(page table entry, PTE):页表中的行
页错误(page fault):当CPU执行进程的某个页面时,发现这个虚拟空间中的页没有映射到内存中,而导致的中断(页错误)。
注意:简单分页并不会发生 page fault,因为简单分页会将进程所有页都载入内存中。
Translation Lookaside Buffer, TLB:
反向页表( inverted page table):虚拟地址的页号通过一个哈希函数映射到表项中。反向页表的大小只与实际内存大小相关。
页缓冲(page buffering):为提高性能,被替换出的页不是被丢弃,而是分配到空闲页表或修改页表。(被替换出的页仍留在主存中)
读取策略(fetch policy):确定一页何时取入。
放置策略(placement policy):确定一个进程块驻留在内存的什么地方
替换策略(replacement policy):
- OPT
- LRU
- FIFO
- Clock
清除策略(cleaning policy):用于确定在何时将一个被修改过的页写回辅存。
装入控制(load control):确定驻留在主存中的进程数目。
进程的地址空间(系统空间和用户空间):
chapter 09 单处理器调度
-
处理器调度的目标
-
调度与进程状态转换
-
调度的层次
-
在一个进程状态转换的过程中涉及的队列(假设一个新进程直接到达就绪态,上两图中给出了就绪态和就绪/挂起态两种选择)
-
短程调度什么时候进行?
当可能导致当前进程阻塞,或可能抢占剥夺当前正在运行的进程的事件发生时,调用短程调度器(也称为分派器)。这类事件包括:
- 时钟中断
- I/O中断
- 操作系统调用
- 信号(如信号量)
-
短程调度准则(Short-Term Scheduling Criteria)
- 面向用户,面向系统
- 与性能相关(定量的),与性能无关(定性的)
-
进程调度策略
-
先来先服务(First-Come-First-Served,FCFS)
-
轮转(Round-Robin)、虚拟轮转法(VRR,对I/O密集型进程友好)
-
最短进程优先(Shortest Process Next,SPN)
-
最短剩余时间(Shortest Remaining Time,SRT)
-
最高响应比优先(Highest Response Ratio Next,HRRN)
-
反馈(Feedback)
- 惩罚运行时间较长的作业
- 无须知道进程剩余时间
-
key terms
长程调度(long-term scheduling):决定进程是否加入待执行的进程池中。
中程调度(medium-term scheduling):交换(swap)功能的一部分,决定是否将进程换入/换出内存。
短程调度(short-term scheduling):决定处理器下一次执行哪个就绪进程。
抢占(preemptive):当前运行的进程可能被操作系统中断,并转移到就绪态。
chapter 11 I/O管理和磁盘调度
-
执行I/O的三种技术
- 程序控制I/O(programmed I/O):CPU代表一个进程给I/O模块发送I/O命令,此后定期检查I/O模块的状态,I/O模块准备就绪后进程才能继续执行。
- 中断驱动I/O(interrupt-driven I/O):CPU给I/O模块发送I/O命令,然后继续做一些其他的工作,当I/O模块准备好与CPU交换数据时,它将打断CPU的执行并请求服务。
- 直接内存访问(DMA):DMA模块控制内存和I/O模块之间的数据交换。为传送一块数据,处理器给DMA模块发送请求,等到整个数据块传送结束后,DMA模块才发送中断信号给CPU。
-
操作系统设计I/O机制时的目标
- 效率
- 多道程序设计
- 交换技术
- 通用性:人们希望用一种统一的方式处理所有的I/O设备。
- 效率
-
磁盘读写时有哪些因素影响延迟
寻道时间(seek time)、旋转延迟(rotational delay)、存取时间(access time)、传输时间(transfer time)
-
引入I/O Buffer的原因
- 进行I/O时,程序被挂起,等待相对较慢的I/O完成
- 普通I/O的方法干扰的操作系统的交换决策
-
I/O Buffer的实现方式
- 单缓冲
- 双缓冲
- 循环缓冲
-
磁盘调度策略
- 随机调度(random scheduling):性能最差,用于评估其他调度策略。
- 先进先出(FIFO)
- 优先级(Priority,PRI)
- 后进先出(LIFO)
- 最短服务时间优先(Shortest-Service-Time-First,SSTF)
- SCAN(又称电梯算法)
- C-SCAN(circular SCAN, 循环SCAN)
- N-step-SCAN
- FSCAN
- 使用两个子队列
- 新请求进入空队列
key terms
面向块的设备(block-oriented device):信息保存在块中,一次传送一块。
面向流的设备(stream-oriented device):以字节流的方式输入/输出数据
独立磁盘冗余阵列(RAID):
寻道时间(seek time)
旋转延迟(rotational delay)
存取时间(access time):寻道时间 + 旋转延迟
传输时间(transfer time):向/从磁盘传送数据所需的时间。
chapter 12 文件管理
key terms
文件(File):是一组相似记录的集合,可通过名字访问。
文件系统(File System / File Management System):操作系统的重要组成部分,提供存储数据(组织为文件)的手段,并提供一系列对文件进行操作的功能接口。
文件分配表(File Allocation Table,FAT):用来记录文件所在位置的一种数据结构。
磁盘分配表(Disk Allocation Table,DAT):记录磁盘中已用和空闲块的数据结构。
相对路径(Relative Path):指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。
绝对路径(GetFullPath):目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径。