进程与磁盘管理相关
进程创建(或者存在的)的唯一标志===》进程控制块
PCB是进程存在的唯一标志,当进程被创建时,操作系统为当前进程创建PCB,当进程结束时,会回收PCB
PCB
.进程描述信息
-
。进程控制和管理信息
-
。资源分配清单
-
。处理机相关信息
程序段
- 程序的代码(指令序列集合)
数据段
- 运行过程中的各种数据
PCB+程序段+数据段==进程(进程实体,进程映像)
进程的特性
1. 动态性:程序的一次执行过程
2.并发性:多个进程实体并行运行
3.独立性:进程间独立运行 独立获取资源
4.异步性:个进程各自独立 进程同步机制
5.结构性:每个进程都会分配一个PCB 结构上看有PCB+数据段+代码段构成
进程的状态
-
1.创建态
-
2.就绪态:很多就绪的进程,操作系统就会选择一个就绪进程让它在处理机上运行
-
3.阻塞态:进程运行过程中可能等待某个事件的发生(等待系统资源的分配,或者其他进程的响应)操作系统剥夺CPU使用权让它停滞
-
4.终止态:一个进程可以执行eixt系统调用请求操作系统终止该进程
-
运行态到阻塞态的切换一般来说是进程的主动切换:进程使用系统调度的方式申请某钟系统资源或者请求某个事件的发生
-
阻塞态转换到运行态乃是被动的选择,被动行为,
三态间的关系
在操作系统的进程管理中,进程的状态变化是理解进程调度和资源分配的关键。主要的状态有运行态(Running)、阻塞态(Blocked)和就绪态(Ready)。
- 运行态(Running):
进程处于运行态意味着它正在处理器上执行。在任何给定时刻,单个处理器只能执行一个进程(在单核处理器上),因此,如果系统中有多个进程,操作系统会通过时间片轮转或其他调度算法来轮流执行这些进程,使每个进程都有机会运行。 - 阻塞态(Blocked):
当一个进程因为等待某种事件的发生而无法继续执行时,它就会进入阻塞态。例如,一个进程可能在等待I/O操作完成(如读写磁盘)、等待其他进程释放资源(如信号量或互斥锁)或等待外部输入等。在阻塞状态下,进程不会消耗CPU时间,而是等待特定条件满足后才能被唤醒。 - 就绪态(Ready):
进程处于就绪态意味着它已经准备好执行,但尚未获得CPU时间片。当一个进程从阻塞态被唤醒,或者新创建的进程初始化完成后,它们都会进入就绪态。就绪态的进程位于就绪队列中,等待被调度程序选中并分配到CPU上执行。
关系关联:
- 运行态 -> 就绪态:
当前正在执行的进程如果时间片用尽,或者更高优先级的进程到达,它会被暂停执行并放入就绪队列,状态变为就绪态。 - 就绪态 -> 运行态:
调度器选择一个就绪队列中的进程并分配给它CPU时间片,使其状态变为运行态。 - 运行态 -> 阻塞态:
如果正在执行的进程需要等待某个事件(如I/O完成),它会主动放弃CPU并进入阻塞态。 - 阻塞态 -> 就绪态:
当阻塞进程等待的事件发生时(如I/O操作完成),它会被操作系统唤醒并放入就绪队列,状态变为就绪态,等待下一次调度。
通过这些状态的转换,操作系统可以有效地管理和调度进程,确保系统的高效运行。
进程的组织方式
。链式方式(队列)
。索引方式
进程控制
- 概念:对系统中的所有进程实施有效的管理,创建以及进程间的状态的转换等功能
— 简而言之:实现进程间的状态转换
进程间通信
-
概念:两个进程之间产生数据交互
-
需要操作系统内核的支持,通过增加页表项或者段表项可将同一片共享内存区映射到各个进程的地址空间中
进程间通信(IPC, Inter-Process
Communication)是操作系统中一个重要的概念,它允许不同的进程之间交换数据和同步执行。共享存储(Shared
Memory)是IPC机制中的一种高效方式,它允许多个进程访问同一块内存区域,从而实现数据的共享和传递。
共享存储的原理
-
- 内存映射:
共享存储通常通过内存映射技术实现。操作系统创建一段物理内存,然后将这段内存映射到参与通信的每个进程的地址空间中。这样一来,虽然每个进程看到的是自己的虚拟地址空间,但实际上它们共享了同一段物理内存。
- 内存映射:
-
- 同步机制:
由于多个进程可以同时访问共享内存,如果没有适当的同步机制,可能会导致数据竞争和不一致。因此,共享内存往往需要结合互斥锁、信号量等同步原语使用,以确保数据的完整性和一致性。这些同步机制用于控制对共享内存的访问,防止同时写入或读取造成的混乱。
- 同步机制:
-
- 内存一致性模型:
在多处理器或多核系统中,共享内存的访问还需要考虑内存一致性模型。不同的架构可能有不同的内存一致性模型,如顺序一致性(Sequential Consistency)、释放一致性(Release Consistency)等,以确保不同处理器看到的内存状态是一致的。
- 内存一致性模型:
应用场景
共享存储在以下几种场景中特别有用:
- 高速数据交换:当进程之间需要频繁且大量地交换数据时,共享存储比传统的消息传递机制更高效,因为后者涉及数据的复制和解包过程。
- 多线程应用:在多线程环境中,共享存储是一种常见的线程间通信方式,线程可以直接访问同一进程内的共享内存,无需进行额外的数据复制。
- 图形和多媒体应用:在图形渲染和视频处理等应用中,共享存储可用于在多个进程或线程之间快速传递图像帧或缓冲区。
实现细节
在不同的操作系统和编程环境中,共享存储的实现细节可能有所不同。例如,在POSIX兼容的系统(包括Linux和Unix)中,可以使用shmget和shmat系统调用来创建和映射共享内存段;而在Windows系统中,则可以使用CreateFileMapping和MapViewOfFile函数来实现。
总之,共享存储作为一种进程间通信机制,通过让多个进程直接访问同一块内存区域,实现了高效的数据共享和传递,但同时也要求开发者在设计时考虑到同步和内存一致性的问题,以避免潜在的数据竞争和死锁。
消息传递
消息传递(Message Passing)是进程间通信(IPC)的一种常见机制,它允许独立的进程通过发送和接收消息来相互通信。相比于共享存储,消息传递提供了一种更加封装和灵活的通信方式,它不需要进程共享相同的内存空间,而是通过操作系统或中间件在进程间传递数据。以下是消息传递的基本原理和特点:
基本原理
- 消息队列:
每个进程都有一个或多个消息队列,用于接收其他进程发送的消息。这些队列通常由操作系统管理,确保消息的可靠传递和顺序。 - 发送与接收:
发送方进程构造消息并通过系统调用将其发送到接收方进程的消息队列。接收方进程则通过相应的系统调用从其队列中取出消息。 - 同步与异步:
消息传递可以是同步的也可以是异步的。在同步模式下,发送者会阻塞直到消息被接收者接收;而在异步模式下,发送者发送完消息后立即返回,不管接收者是否已经接收。
特点与优势
- 封装性:
消息传递提供了高程度的封装性,发送方和接收方不必关心对方的内部状态或内存布局,只需要遵循预定义的消息格式即可。 - 灵活性:
消息传递允许进程在不知道对方具体位置(例如,在分布式系统中)的情况下进行通信。进程可以通过网络发送消息给远程主机上的进程。 - 可靠性与安全性:
操作系统通常会提供机制确保消息的可靠传递,防止消息丢失或重复。此外,消息传递还可以通过身份验证和加密来增强安全性。 - 资源隔离:
由于进程不需要共享内存,因此每个进程的资源(如内存、文件描述符等)都是独立的,这有助于提高系统的稳定性和安全性。
实现方式
- 管道(Pipes):
管道是早期Unix系统中引入的最简单的消息传递机制,它允许具有亲缘关系的进程(如父子进程)进行单向通信。 - 消息队列(Message Queues):
消息队列是更通用的消息传递机制,允许多个无亲缘关系的进程进行双向通信。消息队列通常由操作系统管理,提供了一种更为灵活和可靠的通信方式。 - 套接字(Sockets):
套接字不仅适用于本地进程间通信,也适用于网络通信。它提供了一个抽象层,使得进程可以通过网络像本地一样进行通信。 - 远程过程调用(RPC, Remote Procedure Call):
RPC提供了一种高级接口,允许一个进程调用远程主机上另一个进程的函数,就好像它们在同一进程中一样,隐藏了底层的通信细节。
总之,消息传递作为一种进程间通信机制,提供了灵活、封装和安全的通信方式,尤其适用于分布式系统和需要强隔离性的环境。
RPC
远程过程调用(RPC, Remote Procedure Call)是一种进程间通信(IPC)机制,它允许一个计算机程序(客户端)在不同的地址空间(通常是不同的计算机)上调用另一个程序(服务器)的功能,而无需了解底层网络细节。RPC的设计目标是尽可能地隐藏远程通信的复杂性,使远程调用看起来像在本地调用函数一样简单。
RPC的工作原理
- 客户端调用:
当客户端想要调用远程服务器上的函数时,它就像调用本地函数一样发起调用。这个调用实际上触发了RPC机制。 - RPC代理/存根:
客户端和服务器端都有RPC代理或存根(Stub)。客户端的存根接收到调用请求后,负责将参数序列化(编码)成网络传输格式,并通过网络发送给服务器。 - 服务器接收与处理:
服务器端的RPC存根接收到请求后,将参数反序列化(解码),然后调用实际的服务器函数。服务器函数执行完毕后,结果同样被序列化并通过网络返回给客户端。 - 客户端接收响应:
客户端的RPC存根接收到服务器返回的结果,进行反序列化处理,然后将结果传递给最初的调用点,就像函数调用的正常返回一样。
RPC的关键组件
- RPC协议:
RPC协议定义了客户端和服务器之间的通信规则,包括如何封装和解封数据、错误处理、超时和重试机制等。 - 序列化/反序列化:
数据在网络上传输时需要转换成字节流,这就是序列化的过程;接收端再将字节流转换回原始数据结构,即反序列化。 - RPC存根:
存根是客户端和服务器端的代理代码,它们处理序列化、网络传输和反序列化工作,隐藏了网络通信的细节。
RPC的优缺点
优点:
- 透明性:
RPC使远程调用看起来就像本地调用一样,简化了开发者的编程工作。 - 封装性:
RPC封装了网络通信的所有细节,包括数据的序列化、网络传输和错误处理。 - 灵活性:
RPC可以跨不同的平台和语言实现,只要双方遵守相同的RPC协议。
缺点:
- 性能开销:
RPC的序列化、网络传输和反序列化过程可能会带来额外的延迟和开销。 - 调试难度:
由于RPC调用跨越了网络边界,调试问题可能比较困难。 - 依赖性:
客户端对服务器的依赖性强,服务器的不可用会导致客户端的相应功能失效。
实现RPC的技术
- gRPC:
Google开发的一个高性能、开源的远程过程调用框架,支持多种编程语言,使用Protocol Buffers作为接口定义语言。 - Thrift:
Apache Thrift是一个跨语言的服务开发框架,它提供了RPC服务的构建工具和库。 - XML-RPC:
使用XML作为数据编码格式的RPC协议,主要用于早期的Web服务。 - JSON-RPC:
使用JSON作为数据编码格式的RPC协议,比XML-RPC更轻量级。
总之,RPC提供了一种方便、抽象的方式来实现分布式系统中的远程功能调用,尽管它存在一些固有的限制和挑战,但在很多场景下仍然是构建分布式系统的重要工具。
附加知识
磁盘初始化
-
step1.进行低级格式化(物理格式化)将磁盘划分为扇区。一个扇区通常分为头尾数据
-
管理扇区所需要的各种数据结构主要存放在头以及尾部两个部分,包括扇区效验码(奇偶校验码,CRC循环冗余校验码) 校验码用于校验扇区中的数据是否发生错误
-
step2.将磁盘分区,每个分区由若干个柱面组成(C,Dpanfu)
-
step3.进行逻辑格式化,创建文件系统,包括创建文件系统的根目录。初始化存储空间管理所用的数据结构
1.完整的自举程序存放在磁盘的启动块(启动分区上) 启动块位于磁盘的固定位置
2.ROM(只读存放区)只存放很小的“自举装入程序”
3.开机时计算机先运行“自举装入程序” 通过执行该程序就可以找到引导块 并将完整的“自举程序”读入内存 完成初始化
磁盘的坏块管理
在磁盘管理中,操作系统和磁盘固件都会采取措施来处理磁盘上的坏块,以确保数据的完整性和系统的稳定性。坏块是磁盘上无法可靠读写的小区域,可能是由于物理损伤、电子故障或制造缺陷等原因造成的。下面是一些操作系统和磁盘设备如何处理坏块的常见策略:
磁盘固件的处理
- 重映射:
当磁盘的固件检测到坏块时,它会自动将坏块重新映射到预留的备用扇区。这些备用扇区在磁盘生产时就已经预留好,用于替换坏块。这个过程对用户和操作系统是透明的。 - SMART监控:
自我监测、分析和报告技术(SMART)是现代硬盘的一项功能,它可以持续监控磁盘的健康状况,包括坏块的数量。当SMART检测到坏块增加时,它会提醒用户磁盘可能存在问题。
操作系统的处理
- 文件系统检查:
操作系统通常提供文件系统检查工具(如Linux下的fsck,Windows下的chkdsk),用于扫描文件系统并修复损坏的块。当这些工具检测到坏块时,它们会尝试将受影响的文件或目录移动到健康的扇区,并更新文件系统元数据。 - 坏块标记:
文件系统会维护一个坏块列表,一旦检测到坏块,就会将这些块标记为不可用。这样,文件系统就不会再试图使用这些块存储数据,从而避免数据丢失。 - 日志和镜像:
某些文件系统(如ext4、ZFS)采用日志记录和数据镜像技术,可以在检测到坏块时从备份或镜像副本中恢复数据,从而减少数据丢失的风险。 - 定期维护:
定期运行磁盘维护工具,比如碎片整理和坏块扫描,可以帮助提前发现并处理坏块,避免在关键时刻出现问题。
用户的处理
- 备份数据:
用户应该定期备份重要数据,以防磁盘出现无法预见的故障。 - 更换磁盘:
如果磁盘上的坏块数量过多,或SMART监控显示磁盘健康状况不佳,最好的做法是更换新的磁盘以避免数据丢失。
总之,操作系统和磁盘固件共同协作,通过重映射、坏块标记、文件系统检查和日志记录等手段来处理坏块,以保护数据的安全性和磁盘的可用性。然而,这些措施并不能完全避免数据丢失的风险,因此定期备份数据是非常重要的。
固态硬盘以及闪存技术
固态硬盘(Solid State Drive,SSD)是一种基于半导体存储技术的非易失性存储设备,与传统的机械硬盘(HDD)相比,SSD没有旋转的磁盘和移动的读写头,而是使用闪存(Flash Memory)作为存储介质,这使得SSD在速度、耐用性和能耗方面具有显著的优势。
固态硬盘的特点
- 高速读写:
SSD使用闪存进行数据存储,数据存取速度远高于HDD,因为没有机械寻址的时间延迟。 - 耐用性:
由于没有移动部件,SSD在遭受震动或物理冲击时,数据丢失的风险远低于HDD。 - 低功耗:
SSD在工作时的功耗较低,特别适合移动设备和服务器集群。 - 安静:
没有旋转的磁盘和移动的机械臂,SSD在运行时几乎无声。 - 抗震性:
固态硬盘在物理冲击下不容易损坏,适合在恶劣环境下使用。
闪存技术
闪存是SSD的核心存储技术,主要分为以下几种类型:
- NAND Flash:
NAND Flash是最常见的闪存类型,广泛应用于SSD。NAND Flash以页为单位进行读取和写入,以块为单位进行擦除,数据保存在由晶体管构成的单元格内。 - NOR Flash:
NOR Flash主要用于小容量的存储,如存储启动代码,它的读取速度比NAND快,但成本较高,容量较小,不适合大容量存储,因此在SSD中较少使用。 - 3D NAND:
为了增加存储密度和降低单位成本,现代SSD采用3D NAND技术,通过在垂直方向堆叠存储单元,实现更高的存储容量。
SSD的内部结构
SSD内部主要包括:
- 闪存芯片:
用于存储数据的NAND Flash芯片。 - 控制器:
控制器管理闪存的读写操作,包括垃圾回收、磨损均衡、错误校正等算法,以优化性能和延长使用寿命。 - 缓存:
SSD通常配备DRAM缓存,用于临时存储频繁访问的数据,加速读写速度。 - 接口:
SSD通过SATA、PCIe、M.2等接口与主板通信,其中PCIe NVMe接口因其高速率和低延迟,成为高端SSD的首选。
闪存的特殊管理
由于闪存的擦写次数有限,SSD控制器会采用以下几种技术来延长寿命和保持性能:
- 磨损均衡:
控制器会平均分配写入操作到不同的闪存块,避免某些块过早损耗。 - 垃圾回收:
当闪存块中包含无效数据时,控制器会清理这些块,以便再次使用。 - 错误校正代码(ECC):
用于检测和纠正读取数据时可能发生的位错误,提高数据的可靠性。 - 静态和动态读取重定向:
当检测到某个存储单元性能下降时,控制器会将读写操作重定向到健康的单元,以避免数据丢失。
总之,固态硬盘利用闪存技术提供了高速、低能耗、高耐用性的存储解决方案,通过内部的智能控制器和算法优化,克服了闪存的一些局限性,成为现代计算设备中不可或缺的一部分。
闪存的擦除原理
闪存(Flash Memory)是一种非易失性存储技术,意味着即使在断电的情况下,它也能保留数据。闪存的基本存储单元是浮动栅极晶体管,这些晶体管被组织成阵列,构成了闪存芯片。下面我们简要介绍闪存如何完成数据的存储和擦除:
数据存储
- 编程(写入):
在编程阶段,数据以比特的形式写入闪存单元。每个闪存单元可以存储一个或多个比特。编程操作通常是以页为单位进行的,一页包含了多个比特。- 单层单元(SLC, Single-Level Cell):
每个单元只存储1比特数据,通过晶体管栅极电压的不同状态表示0或1。 - 多层单元(MLC, Multi-Level Cell):
每个单元可以存储2比特或更多比特的数据,通过不同的电压水平表示更多的状态。 - 三层单元(TLC, Triple-Level Cell)和四层单元(QLC, Quad-Level Cell):
分别存储3比特和4比特数据,提供更高的存储密度。
编程时,对晶体管施加高电压,使得电子穿过氧化层进入浮动栅极,从而改变晶体管的导电性,以此来表示数据的“1”或不同的电压状态。
- 单层单元(SLC, Single-Level Cell):
数据读取
读取数据时,控制器会对晶体管施加一个读取电压,根据晶体管的导通状态判断其存储的比特值。由于晶体管的阈值电压决定了其是否导通,控制器可以根据不同的阈值电压区分不同的数据状态。
数据擦除
- 擦除:
闪存的一个重要特性是,它必须先被擦除才能被重新编程。擦除操作是以块为单位进行的,一个块包含了多个页。擦除时,对整个块施加高电压,迫使电子离开浮动栅极,回到源极,使得所有单元都恢复到未编程(通常表示为“0”)的状态。
- 擦除操作是闪存中最耗时的步骤之一,也是导致闪存有限寿命的原因,因为每个单元可以承受的擦写循环次数是有限的。这也是为什么闪存控制器会实施磨损均衡算法,以均匀分配写入操作,避免某些块过度磨损。
总之,闪存通过编程和擦除操作来存储和清除数据,利用晶体管的导电性变化来表示不同的数据状态。与传统磁盘存储不同,闪存的读写操作不依赖于机械运动,因此具有更快的速度和更高的可靠性。