完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
计算机硬件系统
组成 中央处理器 中央处理器是计算机的运算核心(Core)和控制单元( Control Unit) ,主要包括:
主存储器 DRAM外围设备 设备类型
简介 总线(Bus) 是计算机各种功能部件之间传送信息的公共通信干线, 它是CPU、 内存、输入输出设备传递信息的公用通道 计算机的各个部件通过总线相连接, 外围设备通过相应的接口电路再与总线相连接, 从而形成了计算机硬件系统 按照所传输的信息种类, 总线包括一组控制线、 一组数据线和一组地址线 总线的类型 内部总线: 用于CPU芯片内部连接各元件 系统总线: 用于连接CPU、 存储器和各种I/O模块等主要部件 系统总线也有分级,如下面的图所示通信总线: 用于计算机系统之间通信 冯诺依曼结构 存储程序计算机 冯·诺伊曼等人在1946年总结并明确提出,被称为冯·诺伊曼计算机模型存储程序计算机在体系结构上主要特点
存储器的组织层次 存储器包括CPU中的高速缓存、主存储器、外围设备中的硬盘和网络中的远程存储器等 计算机软件系统 软件开发的不同层次
操作系统 操作系统(Operating System), 简称OS OS是计算机系统最基础的系统软件, 管理软硬件资源、 控制程序执行, 改善人机界面, 合理组织计算机工作流程, 为用户使用计算机提供良好运行环境 简而言之, 操作系统是方便用户、 管理和控制计算机软硬件资源的系统程序集合
操作控制方式
计算机资源包含
驱动程序: 最底层的、 直接控制和监视各类硬件(或文件)资源的部分 职责是隐藏底层硬件的具体细节, 并向其他部分提供一个抽象的、 通用的接口资源共享方式
CPU速度与I/O速度不匹配的矛盾非常突出.只有让多道程序同时进入内存争抢CPU运行, 才可以够使得CPU和外围设备充分并行, 从而提高计算机系统的使用效率 多道程序系统的实现
脱机作业控制方式
例: 批处理OS的作业控制方式, UNIX的shell程序,DOS的bat文件联机作业控制方式
例: 分时OS的交互控制方式命令解释程序 不管是脱机控制方式还是联机控制方式都需要命令解释程序 命令解释程序: 接受和执行一条用户提出的对作业的加工处理命令 当一个新的批作业被启动, 或新的交互型用户登录进系统时, 系统就自动地执行命令解释程序, 负责读入控制卡或命令行, 作出相应解释, 并予以执行 会话语言: 可编程的命令解释程序 处理过程
前台命令:必须执行完毕后,才能继续输入命令系统接口 操作系统的程序接口——系统调用 操作系统实现的完成某种特定功能的过程; 为所有运行程序提供访问操作系统的接口 就是操作系统为一些操作提供了接口,应用程序需要执行这些操作的时候就会去调用这些接口实现
系统结构 结构设计 OS构件 内核、 进程、 线程、 管程等 内核设计是OS设计中最为复杂的部分设计概念 模块化、 层次式、 虚拟化 内核 单内核:内核中各部件杂然混居的形态, 始于1960年代, 广泛使用; 如Unix/Linux, 及Windows(自称采用混合内核的CS结构) 微内核:1980年代始, 强调结构性部件与功能性部件的分离, 大部分OS研究都集中在此 混合内核:微内核和单内核的折中, 较多组件在核心态中运行, 以获得更快的执行速度 外内核:尽可能减少内核的软件抽象化和传统微内核的消息传递机制,使得开发者专注于硬件的抽象化,部分嵌入式系统使用 处理器管理 处理器与寄存器 处理器部件 指令译码器ID:负责具体的解释指令的执行 指令暂存器IR:负责对指令的存储 程序计数器PC:指向下一跳要执行指令的地址 算术逻辑单元在完成计算之后会将内容汇总到标志寄存器Flag中 内存地址寄存器MAR、内存数据寄存器MDR:用于访问内存数据 用户程序可见寄存器 可以使程序员减少访问主存储器的次数, 提高指令执行的效率 所有程序可使用, 包括应用程序和系统程序
用于控制处理器的操作; 主要被具有特权的操作系统程序使用, 以控制程序的执行
PSW既是操作系统的概念, 指记录当前程序运行的动态信息, 通常包含:
机器指令 机器指令是计算机系统执行的基本命令, 是中央处理器执行的基本单位 指令由一个或多个字节组成, 包括操作码字段、 一个或多个操作数地址字段、 以及一些表征机器状态的状态字以及特征码 指令完成各种算术逻辑运算、 数据传输、 控制流跳转 指令执行过程 CPU根据PC(程序计数器)取出指令, 放入IR, 并对指令译码,然后发出各种控制命令, 执行微操作系列,从而完成一条指令的执行 一种指令执行步骤如下
特权指令与非特权指令 用户程序并非能够使用全部机器指令, 那些与计算机核心资源相关的特殊指令会被保护,核心资源相关的指令只能***作系统程序使用 如: 启动I/O指令、 置PC指令、 等等所以指令被分为特权指令和非特权指令
计算机通过设置处理器模式实现特权指令管理 计算机一般设置0、 1、 2、 3等四种运行模式,建议分别对应: 0操作系统内核、 1系统调用、2共享库程序、 3用户程序等保护级别 一般来说, 现代操作系统只使用0和3两种模式,对应于内核模式和用户模式 处理器模式的切换 包括“用户模式→内核模式”和“内核模式→用户模式” 的转换 中断、 异常或系统异常等事件导致用户程序向OS内核切换, 触发: 用户模式→内核模式
中断 概念 中断是指程序执行过程中, 遇到急需处理的事件时, 暂时中止CPU上现行程序的运行,转去执行相应的事件处理程序, 待处理完成后再返回原程序被中断处或调度其他程序执行的过程 操作系统是“中断驱动” 的; 换言之, 中断是激活操作系统的唯一方式 比如用户程序在运行的时候只有通过中断才能够切换中断有广义和狭义之分, 上述中断是指广义的中断 中断、 异常与系统异常
处理器硬件故障中断事件 由处理器、 内存储器、 总线等硬件故障引起 处理原则为: 保护现场, 停止设备, 停止CPU, 向操作员报告, 等待人工干预 程序性中断事件 处理器执行机器指令引起
处理器执行陷入指令请求OS服务引起; 在操作系统中, 它一般又被称作系统调用
来源于外围设备报告I/O状态的中断事件
由外围设备发出的信号引起的中断事件
中断系统是计算机系统中响应和处理中断的系统, 包括硬件子系统和软件子系统两部分 中断响应由硬件子系统完成 中断处理由软件子系统完成 中断响应处理与指令执行周期 在指令执行周期最后增加一个微操作, 以响应中断 中断装置 计算机系统中发现并响应中断/异常的硬件装置称为中断装置。由于中断源的多样性, 硬件实现的中断装置有多种, 分别处理不同类型的中断这些中断装置因计算机而异, 通常有:
CPU中的一个控制部件, 包括中断控制逻辑线路和中断寄存器
这个过程是异步的,先设置寄存器,在这条指令结束之后查看寄存器,才能进行中断陷阱与系统陷阱 陷阱与系统陷阱: 指令的逻辑和实现线路的一部分
这个过程是同步的,是在执行指令的过程中发生的中断中断响应过程
操作系统处理中断事件的控制程序, 主要任务是处理中断事 件和恢复正常操作 中断处理过程
多中断的响应与处理 中断屏蔽 当计算机检测到中断时, 中断装置通过中断屏蔽位决定是否响应已发生的中断,有选择的响应中断 中断优先级 当计算机同时检测到多个中断时, 中断装置响应中断的顺序,有优先度的响应中断 一种可能的处理次序:
不同类型的操作系统有不同的中断优先级中断的嵌套处理 当计算机响应中断后, 在中断处理过程中,可以再响应其他中断 操作系统是性能攸关程序系统, 且中断响应处理有硬件要求, 考虑系统效率和实现代价问题, 中断的嵌套处理应限制在一定层数内,如3层 中断的嵌套处理了改变中断处理次序, 导致先响应的有可能后处理 进程 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,也是操作系统进行资源分配和调度的一个独立单位 一个进程包括五个实体部分
OS无法预期进程的数目与资源需求, 计算机系统在运行过程中可能出现资源不足的情况 运行资源不足表现为性能低和死锁两种情况解决办法: 剥夺某些进程的内存及其他资源,调入OS管理的对换区, 不参加进程调度, 待适当时候再调入内存、恢复资源、参与运行,这就是进程挂起 挂起态与等待态有着本质区别, 后者占有已申请到的资源处于等待, 前者没有任何资源 进程挂起的选择与恢复
进程控制块 进程控制块PCB是OS用于记录和刻画进程状态及环境信息的数据结构 分为标识信息、现场信息、控制信息 标识信息 用于存放唯一标识该进程的信息
用于存放该进程运行时的处理器现场信息
用于存放与管理、 调度进程相关的信息
某一时刻进程的内容及其执行状态集合,是内存级的物理实体, 又称为进程的内存映像,包含:
进程上下文 进程的执行需要环境支持, 包括CPU现场和Cache中的执行信息,OS中的进程物理实体和支持进程运行的环境合成进程上下文, 包括以下:
进程的管理 关键的进程管理软件包括:
操作系统建立多个进程队列, 包括就绪队列和等待队列,按需组织为先进先出队列与优先队列。队列中的进程可以通过PCB中的队列指引元采用单/双指引元或索引连接。进程与资源调度围绕进程队列展开。 控制与管理
进程控制过程中涉及对OS核心数据结构(进程表/PCB池/队列/资源表)的修改,为防止与时间有关的错误, 应使用原语 原语是由若干条指令构成的完成某种特定功能的程序,执行上具有不可分割性。原语的执行可以通过关中断实现 进程控制使用的原语称为进程控制原语,另一类常用原语是进程通信原语 进程切换 进程切换指从正在运行的进程中收回处理器,让待运行进程来占有处理器运行 ,进程切换实质上就是被中断运行进程与待运行进程的上下文切换, 处理过程是:
模式切换 模式切换又称处理器状态切换, 包括:
进程切换一定发生在中断/异常/系统调用,处理过程中, 常见的情况是:
一些中断/异常不会引起进程状态转换, 不会引起进程切换, 只是在处理完成后把控制权交回给被中断进程, 处理流程是:多线程威廉希尔官方网站 传统进程是单线程结构进程 单线程结构进程在并发程序设计上存在的问题 :
操作系统会根据安全角度对进程之间的通信做一些限制,且进程之间的调度需要耗费的成本更高多线程结构进程 线程是进程的一条执行路径, 是调度的基本单位, 同一个进程中的所有线程共享进程获得的主存空间和资源 线程状态有运行、 就绪和睡眠, 无挂起 挂起与是否占有资源有关,而线程使用的是进程的资源OS感知线程环境下:
内核级线程KLT, Kernel-Level Threads 线程管理的所有工作由OS内核来做 特点
用户空间运行的线程库,提供多线程应用程序的开发和运行支撑环境。 线程管理的所有工作都由应用程序完成,内核没有意识到线程的存在。 特点
Jacketing威廉希尔官方网站 混合式多线程 单应用的多个ULT可以映射成一些KLT, 通过调整KLT数目,可以达到较好的并行效果 线程混合式策略下的线程状态
处理器调度 调度的层次 高级调度 又称长程调度, 作业调度决定能否加入到执行的进程池中 分时OS中, 高级调度决定:
又称平衡负载调度,决定主存中的可用进程集合
又称短程调度, 进程调度决定哪个可用进程占用处理器执行
调度算法 选择处理器调度算法的原则
根据分配给进程的优先数决定运行进程 分类
又称多队列策略, 反馈循环队列 基本思想
例子:彩票调度算法 基本思想 为进程发放针对系统各种资源(如CPU时间) 的彩票; 当调度程序需要做出决策时, 随机选择一张彩票,持有该彩票的进程将获得系统资源 合作进程之间可以进行彩票交换 存储管理 主要模式 逻辑地址 又称相对地址, 即用户编程所使用的地址空间 逻辑地址从0开始编号, 有两种形式:
又称绝对地址, 即程序执行所使用的地址空间,处理器执行指令时按照物理地址进行 主存储器的复用 按照分区复用
将逻辑地址和物理地址相对于,就会有2*2=4个存储管理的基本模式
功能 地址转换 又称重定位, 即把逻辑地址转换成绝对地址 静态重定位 在程序装入内存时进行地址转换 由装入程序执行, 早期小型OS使用动态重地位 在CPU执行程序时进行地址转换 从效率出发, 依赖硬件地址转换机构分配与去配 分配 进程装入主存时, 存储管理软件进行具体的主存分配操作, 并设置一个表格记录主存空间的分配情况 去配 当某个进程撤离或主动归还主存资源时, 存储管理软件要收回它所占用的全部或者部分存储空间, 调整主存分配表信息 空间共享 多个进程共享主存储器资源: 多道程序英国威廉希尔公司网站 使若干个程序同时进入主存储器, 各自占用一定数量的存储空间, 共同使用一个主存储器 多个进程共享主存储器的某些区域: 若干个协作进程有共同的主存程序块或者主存数据块 存储保护 为避免主存中的多个进程相互干扰, 必须对主存中的程序和数据进行保护
空间的扩充 存储扩充: 把磁盘作为主存扩充, 只把部分进程或进程的部分内容装入内存
提出
基本思想
需要建立与自动管理两个地址空间
存储管理的硬件支撑 存储管理涉及的存储对象
L1 Cache: 分为数据缓存和指令缓存;内置; 其成本最高, 对CPU的性能影响最大; 通常在32KB-256KB之间 单连续分区存储管理 每个进程占用一个物理上完全连续的存储空间(区域) 单用户连续存储管理
主存分配 主存分配表 地址转换 可变分区存储管理 按进程的内存需求来动态划分分区 创建一个进程时, 根据进程所需主存量查看主存中是否有足够的空闲空间
已分配区表与未分配区表, 采用链表 内存分配
内存零头
移动分区以解决内存外零头,需要动态重定位支撑 页式存储管理
页式存储管理中的地址 逻辑地址 页式存储管理的逻辑地址由两部分组成,页号和单元号, 逻辑地址形式: 物理地址 页式存储管理的物理地址也有两部分组成,页架号和单元号, 物理地址形式: 地址转换 代价 可变分区存储的基准地址是存储在寄存器中的,速度很快,而页表放在主存,每次地址转换必须访问两次主存
解决办法: 利用Cache存放部分页表 快表 为提高地址转换速度, 设置一个专用的高速存储器, 用来存放页表的一部分,存放在高速存储器中的页表部分就是快表 快表表项: 页号, 页架号 这种高速存储器是联想存储器, 即按照内容寻址, 而非按照地址访问 因为要找的是页号对应的页架号,知道页号,不知道地址,所以是内容寻址 eg:假定主存访问时间为200毫微秒, 快表访问时间为40毫微秒, 查快表的命中率是90%地址转换流程 按逻辑地址中的页号查快表
进程表中登记了每个进程的页表。进程占有处理器运行时, 其页表起始地址和长度送入页表控制寄存器 [tr]用户作业名页表始址页表长度[/tr]
内存分配/去配 可用一张位示图来记录主存分配情况,建立进程页表维护主存逻辑完整性 对于每个页使用1位去记录该页是否被占用 页的共享 页式存储管理能够实现多个进程共享程序和数据
把进程全部页面装入虚拟存储器, 执行时先把部分页面装入实际内存, 然后, 根据执行行为, 动态调入不在主存的页, 同时进行必要的页面调出 首次只把进程第一页信息装入主存, 称为请求页式存储管理 页式虚拟存储管理的页表 需要扩充页表项:
页式虚拟存储管理的实现 CPU处理地址
页面调度 当主存空间已满而又需要装入新页时,页式虚拟存储管理必须按照一定的算法把已在主存的一些页调出去。选择淘汰页的工作称为页面调度。选择淘汰页的算法称为页面调度算法。 页面调度算法设计不当, 会出现(刚被淘汰的页面立即又要调入, 并如此反复),这种现象称为抖动或颠簸。 缺页中断率 假定进程P共n页, 系统分配页架数m个。P运行中成功访问次数为S, 不成功访问次数为F, 总访问次数A=S+F。缺页中断率定义为: f=F/A 影响缺页中断率的因素
eg:程序将数组置为“0”, 假定仅分得一个主存页架, 页面尺寸为128个字, 数组元素按行存放, 开始时第一页在主存OPT页面调度算法 理想的调度算法是: 当要调入新页面时, 首先淘汰以后不再访问的页, 然后选择距现在最长时间后再访问的页。该算法由Belady提出, 称Belady算法, 又称最佳算法(OPT) OPT只可模拟, 不可实现 先进先出FIFO页面调度算法 总是淘汰最先调入主存的那一页, 或者说主存驻留时间最长的那一页(常驻的除外) 模拟的是程序执行的顺序性, 有一定合理性 最久未使用LRU页面调度算法 淘汰最近一段时间较久未被访问的那一页, 即那些刚被使用过的页面, 可能马上还要被使用到 模拟了程序执行的局部属性, 既考虑了循环性又兼顾了顺序性 严格实现的代价大(需要维持特殊队列) LRU算法的模拟实现最不常用LFU页面调度算法 淘汰最近一段时间内访问次数较少的页面, 对OPT的模拟性比LRU更好 基于时间间隔中断, 并给每一页设置一个计数器,时间间隔中断发生后, 所有计数器清0每访问页1次就给计数器加1选择计数值最小的页面淘汰 时钟CLOCK页面调度算法
内存管理单元MMU:CPU管理虚拟/物理存储器的控制线路, 把虚拟地址映射为物理地址, 并提供存储保护, 必要时确定淘汰页面,是为页式存储管理设置的专门硬件机构。 反置页表IPT:MMU用的数据结构 为什么需要反置页表 在分页系统中,每个进程都有一个页表。现代系统中可能存在大量进程,每个进程都允许很大的逻辑地址空间,因而进程可能拥有一个很大的页表,这些页表会占用大量的内存空间。而通过物理页向逻辑页映射就可以节省很大的存储空间。 反置页表如何实现 内存中的每一个物理页设置一个表项,表项中存放进程号和页号,最后系统只维护一张反置页表。 反置页表的页表项 进程号 页号 标志位 链指针 进程号:使用该物理页的进程号 页号: 该物理页对应的虚拟地址页号 标志位: 有效、 引用、 修改、 保护和锁定等标志信息 链指针: 哈希链(哈希冲突的时候,通过链表串在一起) 反置页表的哈希表 如果是使用页表就可以直接从该进程的页表查询到页架号,而现在采用的是反置页表,在页表到页架号的映射上需要采用哈希查询,所以要维系一个哈希表。 哈希函数输入:进程号和页号 哈希函数输出:反置页表项的指针 地址转换过程
段式存储管理 段式存储是面向开发人员的,开发人员根据自己的需要对程序进行划分,程序的不同的部分采用不同的段进行地址管理,而对内存的物理管理是基于可变分区存储管理的,只不过可变分区存储管理是一个进程一个段,而段式存储管理是一个进程多个段。 它与页式管理也不同,也是管理对于开发人员是透明的,系统自动对软件的内存按照也进行切割。而且页式管理每个页是大小相等,均匀分布的。而段式管理段的大小和位置是不确定的。 段式程序设计 每个程序可由若干段组成, 每一段都可以从“0”开始编址, 段内的地址是连续的 分段存储器的逻辑地址由两部分组成 段号单元号 段式存储管理的基本思想 段式存储管理基于可变分区存储管理实现, 一个进程要占用多个分区 硬件需要增加一组用户可见的段地址寄存器(代码段、 数据段、 堆栈段, 附加段) , 供地址转换使用 存储管理需要增加设置一个段表, 每个段占用一个段表项, 包括: 段始址、 段限长, 以及存储保护、 可移动、 可扩充等标志位 段的共享 通过不同进程段表中的项指向同一个段基址来实现 对共享段的信息必须进行保护, 如规定只能读出不能写入, 不满足保护条件则产生保护中断 段页式存储管理 段式存储管理可以基于页式存储管理实现 对于每一段进行页式管理 段页式存储管理的地址转换 设备管理 基本概念 I/O设备 现代计算机系统通常配备大量的I/O设备,用于计算机系统与外部世界(如用户、其它计算机或电子设备等)进行信息交换或存储 按设备管理划分
设备管理器 设备控制器是计算机中的一个实体,其主要职责是控制一个或多个I/O设备,以实现I/O设备和计算机之间的数据交换。它是CPU与I/O设备之间的接口,它接收从CPU发来的命令,并去控制I/O设备工作,以使处理机从繁杂的设备控制事务中解脱出来。设备控制器是一个可编址的设备,当它仅控制一个设备时,它只有一个唯一的设备地址;若控制可连接多个设备时,则应含有多个设备地址,并使每一个设备地址对应一个设备。 数据交换是指CPU与控制器之间、控制器与设备之间的数据交换。对于前者,是通过数据总线,由CPU并行地把数据写入控制器,或从控制器中并行地读出数据;对于后者,是设备将数据输入到控制器,或从控制器传送给设备。 轮询方式
中断方式
直接存储器访问(DMA)方式 DMA模块 :模仿处理器来控制主存和设备控制器之间的数据交换 流程:
特点:
当DMA和CPU同时经总线访问内存时, CPU总是将总线的占有权让给DMA一个或几个主存周期
三种方式的对比 采用轮询方式的设备控制器 CPU需要等待设备就绪,且参与数据传送 采用中断方式的设备控制器 CPU无需等待设备就绪,但响应中断后参与数据传送 通过DMA直接控制存储器 CPU在数据传送开始和结束时参与,与主存进行数据交换时不参与 [tr]CPU 作用等待 设备数据 传送[/tr]
设备控制器包含自身专用的处理器和通道程序
CPU与通道并行工作I/O通道与DMA 与DMA方式不同的是,在DMA方式中,数据的传送方向、存放数据的内存始址以及传送的数据块长度等都由CPU控制,而在通道方式中,这些都由通道来进行控制。另外,DMA方式每台设备至少需要一个DMA控制器,一个通道控制器可以控制多台设备。
详见https://www.jianshu.com/p/d1542085afde###总线与I/O 单总线 将CPU、主存和I/O模块连接到同一组总线上 优点:结构简单,易于扩充 缺点:主存需要和I/O模块共用总线;设备增多会造成总线变长,进而增加传输时延;无法适用于大量高速设备 传统的三级总线 主存和Cache通过主存总线传送数据,主存总线和扩展总线上的I/O设备之间传送数据通过扩展总线接口缓冲 优点:主存与I/O之间的数据传送与处理器的活动分离;可以支持更多的I/O设备 缺点:不适用于I/O设备数据速率相差太大的情形 采用南北桥的多级总线 通过存储总线、 PCI总线、 E(ISA)总线分别连接主存、高速I/O设备和低速I/O设备 优点:可以支持不同数据速率的I/O设备 采用I/O通道的多级总线 支持CPU、主存和多个I/O通道之间的数据传送 支持I/O通道和I/O控制器,以及I/O控制器和设备之间的数据传送 I/O软件 实现层次 设计目标
把软件组织成层次结构,低层软件用来屏蔽硬件细节,高层软件向用户提供简洁、友善的界面 主要考虑的问题
I/O软件的实现 I/O中断处理程序 位于操作系统底层,与硬件设备密切相关,与系统其余部分尽可能少地发生联系 进程请求I/O操作时,通常被挂起,直到数据传输结束后,并产生I/O中断时,操作系统接管CPU后转向中断处理程序 当设备向CPU提出中断请求时, CPU响应请求并转入中断处理程序 功能
如果数据传输有错,向上层软件报告设备的出错信息,实施重新执行设备驱动程序 包括与设备密切相关的所有代码,从独立于设备的软件中接收并执行I/O请求
每个设备驱动程序只处理一种设备,或者一类紧密相关的设备 设备驱动程序分为整体驱动程序和分层驱动程序
执行适用于所有设备的常用I/O功能,并向用户层软件提供一致性接口 功能
库函数:一部分I/O软件可以使用库函数实现放在操作系统内核之外,运行时与应用程序连接 虚拟设备软件:用一类设备模拟另一类设备的仿真I/O软件,如虚拟光驱 I/O缓冲区 目的 解决CPU与设备之间速度不匹配的矛盾,协调逻辑记录大小和物理记录大小不一致的问题,高CPU和设备的并行性,减少I/O操作对CPU的中断次数,放宽对CPU中断响应时间的要求 缓冲区 在内存中开辟的存储区,专门用于临时存放I/O操作的数据 操作 写操作:将数据送至缓冲区,直到装满,进程继续计算,同时系统将缓冲区的内容写到设备上 读操作:系统将设备上的物理记录读至缓冲区,根据要求将当前所需要的数据从缓冲区中读出并传送给进程 单缓冲 操作系统在主存的系统区中开设一个缓冲区 输入:将数据读至缓冲区,系统将缓冲区数据送至用户区,应用程序对数据进行处理,同时系统读入接下来的数据 输出:把数据从用户区复制到缓冲区,系统将数据输出后,应用程序继续请求输出 双缓冲 使用两个缓冲区 输入:设备先将数据输入缓冲区1,系统从缓冲区1把数据传到用户区,供应用程序处理,同时设备将数据传送到缓冲区2 输出:应用程序将数据从用户传送到缓冲区1,系统将数据传送到设备,同时应用程序将数据传送到缓冲区2 数据从设备输入到缓存区和缓存区输入到用户区就可以同时进行 循环缓冲 操作系统分配一组缓冲区,每个缓冲区度有指向下一个缓冲区的链接指针,构成循环缓冲 解决设备和进程速度不匹配的问题。 这些缓存区为系统公共资源,供进程共享并由系统统一分配和管理 设备独立性 用户通常不指定物理设备,而是指定逻辑设备,使得用户作业和物理设备分离开来,再通过其它途径建立逻辑设备和物理设备之间的映射 比如用户编写程序的时候需要实现打印功能,在实现打印功能的时候不去指定具体的某台打印机,而是只是声明需要打印机,由系统去调配一个打印机设备管理中需要将逻辑设备名转换为物理设备名,为此系统需要提供逻辑设备名和物理设备名的对应表以供转换使用 优点
独占设备:只能由一个进程独占式使用 分配方式
设备类表
物理结构 磁盘由多个盘片组成 每个盘片被划分为多个同心圆结构的磁道 不同盘片上位于相同位置的磁道构成的圆柱体称为柱面 每个磁道分为固定多个或不等个数的扇区 为了对大量扇区寻址,操作系统将相邻的扇区组合成簇存储文件 物理块(扇区)地址:
读写数据时, 磁头必须定位到指定的磁道上的指定扇区的开始处 过程
驱动调度 移臂调度 使移动臂的移动时间最短,从而减少寻道总时间 先进先出
使得旋转延迟的总时间最少 循环排序
通过信息在存储空间的排列方式来减少旋转延迟
使用一类物理设备模拟另一类物理设备的威廉希尔官方网站 eg:内存卡模拟磁盘,块设备模拟字符设备 一个经典的SPOOLing系统 为存放输入数据和输出数据,系统在磁盘上开辟输入井和输出井 井是用作缓冲的存储区域组成
文件管理 文件系统 文件系统是操作系统中负责存取和管理信息的模块,它用统一的方式管理用户和系统信息的存储、检索、更新、共享和保护,并为用户提供一整套方便有效的文件使用和操作方法 文件这一术语不但反映了用户概念中的逻辑结构,而且和存放它的辅助存储器(也称文件存储器)的存储结构紧密相关 功能 文件系统面向用户的功能
文件的存储 卷和块
文件的逻辑结构 文件的逻辑结构分为两种形式,流式文件和记录式文件 流式文件 指文件内的数据不再组成记录, 只是由一串依次的字节组成的信息流序列 这种文件常常按长度来读取所需信息,也可以用插入的特殊字符作为分界 记录式文件 是一种有结构的文件,它是若干逻辑记录信息所组成的记录流文件 逻辑记录是文件中按信息在逻辑上的独立含义所划分的信息单位 如,每个职工的工资信息是一个逻辑记录;整个单位职工的工资信息便组成了该单位工资信息的记录式文件 文件的物理结构 文件的物理结构和组织是指文件在物理存储空间中的存放方法和组织关系 文件的存储结构涉及块的划分、记录的排列、索引的组织、信息的搜索等许多问题 顺序文件 将一个文件中逻辑上连续的信息存放到存储介质的依次相邻的块中便形成顺序结构,这类文件叫顺序文件,又称连续文件 优点:顺序存取记录时速度较快 缺点:建立文件前需要能预先确定文件长度以便分配存储空间;修改、插入和增加文件记录有困难 类似于数组连接文件 连接文件,又称串联文件;连接结构的特点是使用连接字来表示文件中各个物理块之间的先后次序 第一块文件信息的物理地址由文件目录给出,而每一块的连接字指出了文件的下一个物理块位置;连接字内容为0时,表示文件至本块结束 类似于链表优点:
直接文件,又称散列文件,它通过计算记录的关键字建立与其物理存储地址之间的对应关系 这种变换通常采用散列法 (hash法) 类似于哈希表索引文件 索引文件为每个文件建立了一张索引表,其中,每个表目包含一个记录的键(或逻辑记录号)及其存储地址 索引表的地址可由文件目录指出,查阅索引表先找到相应记录键(或逻辑记录号),然后获得数据存储地址 访问方式 索引文件在文件存储器上分两个区:索引区和数据区 访问索引文件需两步操作:
特点 优点:索引结构可以被认为是连接结构的一种扩展,除了具备连接文件的优点外,还克服了它只能作顺序存取的缺点,具有直接读写任意一个记录的能力,便于文件的增、删、改 去点:增加了索引表的空间开销和查找时间 文件目录 文件目录结构 文件系统的基本功能之一就是负责文件目录的建立、维护和检索,要求编排的目录便于查找、防止冲突 一级目录结构 在操作系统中构造一张线性表,与每个文件的相关属性占用一个目录项, 构成了一级目录结构 二级目录机构 第一级为主文件目录,它用于管理所有用户文件目录,它的目录项登记了系统接受的用户的名字及该用户文件目录的地址 第二级为用户的文件目录,它为该用户的每个文件保存一个登记栏,其内容与一级目录的目录项相同 每一用户只允许查看自己的文件目录 树形目录结构 每一级目录可以登记下一级目录,也可以登记文件,从而,形成了层次文件目录结构 层次目录结构通常采用树形目录结构,它是一棵倒向的有根树,树根是根目录;从根向下,每一个树分叉是一个子目录;而树叶是文件 一个文件的全名包括从根目录开始到文件为止,通路上遇到的所有子目录路径,又称为路径名 目录的管理 查找 文件查找 “按名存取”文件就是系统根据用户提供的文件路径名来搜索各级文件目录,找到该文件
搜索具体目录项时,可以采用顺序查找法,依次扫描文件目录中的目录项,将目录项中的名字与欲查找的文件名相比较,可以采用一些优化办法加快查找目录的速度,如二分法,哈希 文件目录处理 树型目录结构存在的一个问题是:当一个文件经过许多目录节点时,使用很不方便;系统在沿路径查找目录时,往往要多次访问文件存储器,使访问速度大大减慢,若把所有文件的目录都复制到主存,访问速度是加快了,但又增加了主存的开销。 一种有效办法是把常用和正在使用的那些文件目录复制进主存,这样,既不增加太多的主存开销,又可明显减少目录查找时间 活动文件表 系统可以为每个用户进程建立一张活动文件表,当用户使用一个文件之前,先通过“打开”操作,把该文件有关目录信息复制到指定主存区域,有关信息填入活动文件表,以建立用户进程和该文件索引的联系 当不再使用该文件时,使用“关闭”,切断用户进程和这个文件的联系,同时,若该目录已被修改过,则应更新辅存中对应的文件目录 文件安全与保护 文件是计算机系统的重要资源,因此, 要求文件系统具有保障文件安全的手段,提供文件保密的措施,有效地实现文件的共享 文件共享 指不同用户共同使用某些文件 并发控制 在允许文件共享的系统中,操作系统应提供手段实现对共享文件的同步控制
文件保密是指文件及其内容不能被未经文件主授权的其他用户窃取 文件的保密措施有以下几种:
指防止文件被破坏 文件系统必须要有防止硬软件故障,保存信息完整性的能力,文件副本是主要实现机制 动态多副本威廉希尔官方网站 在多个介质上维持同一内容的文件,并且在更新内容时同时进行 转储、备份与恢复 定时把文件复制转储到其它介质上,当某介质上出现故障时,复原转储文件
指防止文件及其内容被其他用户窃取 文件的存取控制矩阵 系统为每个用户设置访问每个文件对象的存取属性 系统的全部用户对全部文件的存取属性就组成的一个二维矩阵,称为存取控制矩阵 存取控制表 由于操作系统拥有很多用户和众多文件,存取控制矩阵是一个稀疏矩阵,可以将其简化为一张存取控制表 每行包括:用户、文件、存取属性 存取控制表仅登记那些对文件拥有存取属性的部分 基于存取控制矩阵/表的文件保护 存取属性:可以有访问、读、写、执行、创建、删除、授权等 授权就是文件的所有者将文件的权限授权给其他用户系统通过查阅(矩阵/表)核对用户对文件的存取权限 系统管理用户(超级用户)等同于文件属主权限,并获得对系统文件的授访问权权限 文件属性 存取控制表的一种简化方法是用户分类,再针对每类用户规定文件属性
操作系统为用户程序提供的使用文件的威廉希尔官方网站 和手段,某种程度上依赖于文件的物理结构 顺序存取 按记录顺序进行读/写操作 读操作根据读指针读出当前记录,同时推进读指针,指向下一次要读出的记录 写操作则设置写指针,把一个记录写到文件未端, 同时推进写指针 允许对读指针进行前跳或后退n(整数)个记录的操作 直接存取 很多应用场合要求快速地以任意次序直接读写某个记录 例如,航空订票系统,用航班号作标识,把特定航班的所有信息存放在物理块中,用户预订某航班时,直接计算出该航班的存位置 索引存取 基于索引文件的索引存取方法 对于这种文件, 信息块的地址都可以通过查找记录键而换算出 实际的系统中,大都采用多级索引,以加速记录查找过程 文件的使用 用户通过两类接口与文件系统联系
用于创建一个文件 所需参数:文件名、设备类(号)、文件属性及存取控制信息 处理流程:在相应设备上建立一个文件目录项, 为文件分配第一个物理块,在活动文件表中申请一个项,登记有关目录信息,并返回一个文件句柄 撤销文件 用于删除一个文件 所需参数:文件名和设备类(号) 处理流程: 若文件没有关闭, 先关闭文件;若为共享文件, 进行联访处理;在目录文件中删去相应目录项;释放文件占用的文件存储空间 如果是共享文件不一定是物理的删除,可能只是对于这个用户来说文件删除了打开文件 用于建立起文件和用户进程之间的使用联系 所需参数:文件名、 设备类(号)、打开方式 处理流程: 在主存活动文件表中申请一个项,返回一个文件句柄;跟据文件名查找目录文件, 把目录信息复制到活动文件表相应栏;按存取控制说明检查访问的合法性;若打开的是共享文件,则应有相应处理 关闭文件 用于结束一个文件的读写 所需参数:文件句柄 处理流程:将活动文件表中该文件的“当前使用用户数”减1;若此值为0,则收回此活动文件表;完成“推迟写”;若活动文件表目内容已被改过,则应先将表目内容写回文件存储器上相应表目中,以使文件目录保持最新状态 读/写文件 所需参数参数:文件句柄、用户数据区地址、读写的记录或字节个数 处理流程:按文件句柄从活动文件表中找到该文件的目录项信息;根据目录项指出的该文件的逻辑和物理组织方式,把相关逻辑记录转换成物理块 定位文件 用于调整所打开文件的读写指针位置 所需参数:文件句柄,定位指针 辅存空间的使用 磁盘等大容量辅存空间被OS及许多用户共享,用户进程运行期间常常要建立和删除文件, OS应能自动管理和控制辅存空间 随着用户文件不断建立和撤销,文件存储空间会出现许多‘碎片’。OS解决‘碎片’ 的办法是整理‘碎片’;在整理过程中,往往对文件重新组织,让其存放在连续存储区中 分配方式 连续分配:存放在辅存空间连续存储区中(连续的物理块号)
位示图 使用若干字节构成一张表,表中每一字位对应一个物理块,字位的次序与块的相对次序一致。字位为“1”表示相应块已占用,字位为“0”状态表示该块空闲 其主要优点是,可以把位示图全部或大部分保存在主存中,再配合现代计算机都具有的位操作指令,可实现高速物理块分配和去配 空闲块成组连接法 把硬盘分为块来管理,然后块分为两类,一类是被占用了的(存储了数据),称为专用块,一类是没有被占用的,称为空闲块,空闲块组成组,如图所示连接在一起 每个空闲块的组最上面一行显示空闲块的数量文件系统的实现层次 并发程序设计 概念 顺序程序设计 每个程序在处理器上执行是严格有序的 程序设计的一般习惯是顺序程序设计:把一个具体问题的求解过程设计成一个程序或者若严格顺序执行的程序序列,这称为程序执行的外部顺序性 特征
多道程序设计让多个程序同时进入内存去竞争处理器以获得运行机会,OS允许计算机系统在一个时间段内存在多个正在运行的进程,即允许多个进程并发执行。OS保证按照“顺序程序设计” 方法编制的程序在并发执行时不受影响,如同独占计算机。这些按照顺序程序设计思想编制的进程在OS中并发执行属于无关的并发进程。 循环地(从输入机读78秒再计算52秒再向磁带机输出20秒)按照顺序程序设计方法,设计成如下一个程序:while(1) { input, process, output }并发程序设计 把一个具体问题求解设计成若干个可同时执行的程序模块的方法 特性
无关的并发进程:一组并发进程分别在不同的变量集合上运行, 一个进程的执行与其他并发进程的进展无关 交往的并发进程:一组并发进程共享某些变量,一个进程的执行可能影响其他并发进程的结果 与时间有关的错误 对于一组交往的并发进程,执行的相对速度无法相互控制。如果程序设计不当,可能出现各种 “与时间有关的”错误。
交互的并发进程在执行时必须进行制约,才能保证得到合理的结果 进程互斥:并发进程之间因相互争夺独占性资源而产生的竞争制约关系 进程同步: 并发进程之间为完成共同任务基于某个条件来协调执行先后关系而产生的协作制约关系 临界区 临界资源:互斥共享变量所代表的资源,即一次只能被一个进程使用的资源 临界区指并发进程中与互斥共享变量相关的程序段 多个并发进程访问临界资源时, 存在竞争制约关系。如果两个进程同时停留在相关的临界区内,就会出现与时间相关的错误。 临界区的描述 确定临界资源shared 确定临界区region 两个进程的临界区有相同的临界资源,就是相关的临界区,必须互斥进入 临界区管理的三个要求
并非临界区的嵌套使用一定会可能产生死锁,只要申请临界资源的顺序是确定的,就不会死锁 临界区管理 框内的(测试锁、建立锁)两条指令,执行过程不能中断,如果中断就可能产生同时进入临界区或者死锁的状况。 测试并建立指令 TS(x) { if (x==false) { x=true; return true; }else return false;} Boolean lock;lock = false; // 临界区可用process Pi { // i = 1,2,…,n Boolean pi; repeat pi = TS(lock) until pi; // 循环请求锁 临界区; lock = false; // 解锁} 对换指令 swap (a,b) { temp=a; a=b; b=temp; } Boolean lock;lock = false; //临界区可用process Pi { // i = 1,2,…,n Boolean pi; pi = true; repeat swap(lock, pi) until !pi; //循环请求锁 临界区; lock = false; //解锁} TS和swap指令均是忙式等待,效率低 中断 简单的解决办法是在进出临界区时开关中断,这样临界区执行就不会中断了,执行就有原子性 关中断; 临界区; 开中断操作系统原语就采用这种实现思路 但是,临界区的指令长度应该短小精悍,这样才能保证系统效率,不建议用户程序使用, 滥用是可怕的! PV操作 TS或swap指令管理临界区,采用忙式轮询,效率低 关开中断管理临界区, 不便交给用户程序使用 参考:操作系统访问硬件资源时采用“请求-等待-中断恢复”方式 记录型信号量 一种带数值的软资源 typedef struct semaphore { int value; // 信号量值 struct pcb *list; // 信号量等待进程队列指针}
P操作原语(申请资源) procedure P(semaphore:s) { s = s – 1; //信号量减去1 if (s < 0) W(s); //若信号量小于0,则调用进程被置成等待信号量s的状态} V操作原语(释放资源) procedure V(semaphore:s) { s = s + 1; //信号量加1 if (s <= 0) R(s); //若信号量小于等于0,则释放一个等待信号量s的进程} PV操作解决进程互斥问题框架 semaphore s;s = 1;cobegin process Pi { …… P(s); 临界区; V(s); …… }coend; PV操作解决进程同步 并发进程为完成共同任务基于某个条件来协调执行先后关系而产生的协作制约关系 一个进程的执行等待来自于其他进程的消息 1生产者1消费者1缓冲区问题 生产者和消费者共享缓冲区 缓冲区有空位时,生产者可放入产品,否则等待 缓冲区有产品时,消费者可取出产品,否则等待 同步关系1:消费者一开始在等待产品到来, 考虑设置一个信号量(等待产品);一开始无产品,初值为0 同步关系2:消费者则在等待缓冲区中有空位, 也可设置一个信号量(等待缓冲区);一开始缓冲区有空位,初值为1 Int B; // 共享缓冲区Semaphore sput; // 可以使用的空缓冲区数Semaphore sget; // 缓冲区内可以使用的产品数sput = 1; // 缓冲区内允许放入一件产品sget = 0; // 缓冲区内没有产品process producer { while(1){ produce a product; P(sput);// B = product; V(sget);// }}process consumer { while(1){ P(sget);// Product = B; V(sput);// consume a product; }} 1生产者1消费者n缓冲区问题 Int B[k]; // 共享缓冲区队列Semaphore sput; // 可以使用的空缓冲区数Semaphore sget; // 缓冲区内可以使用的产品数sput = k; // 缓冲区内允许放入 k 件产品sget = 0; // 缓冲区内没有产品Int putptr, getptr; // 循环队列指针putptr = 0; getptr = 0;process producer{ while(1){ produce a product; P(sput);// B[putptr] = product; putptr =(putptr+1) mod k; V(sget);// }}process consumer{ while(1){ P(sget);// product= B[getptr]; getptr=(getptr+1) mod k; V(sput);// consume a product; }} n生产者n消费者n缓冲区 Int B [k];Semaphore sput; /* 可以使用的空缓冲区数 */Semaphore sget; /* 缓冲区内可以使用的产品数 */sput = k; /* 缓冲区内允许放入 k 件产品 */sget = 0; /* 缓冲区内没有产品 */Int putptr, getptr; putptr = 0; getptr = 0;Semaphore s1,s2; /* 互斥使用 putptr,getptr */s1 = 1; s2 = 1;process producer_i { while(1){ produce a product; P(sput);// P(s1);//* B[putptr] = product; putptr =(putptr+1) mod k; V(s1);//* V(sget); // }}process consumer_j { while(1){ P(sget);// P(s2);//* Product= B[getptr]; getptr=(getptr+1) mod k; V(s2);//* V(sput);// consume a product; }} 苹果橘子问题 Int plate;Semaphore sp; /* 盘子里可以放几个水果 */Semaphore sg1; /* 盘子里有桔子*/Semaphore sg2; /* 盘子里有苹果 */sp = 1; /* 盘子里允许放入一个水果*/sg1 = 0; /* 盘子里没有桔子 */sg2 = 0; /* 盘子里没有苹果*/process father { while(1){ 削一个苹果; P(sp); 把苹果放入plate; V(sg2); }}process mother { while(1){ 剥一个桔子; P(sp); 把桔子放入plate; V(sg1); }}process son { while(1){ P(sg1); 从plate中取桔子; V(sp); 吃桔子; }}process daughter { while(1){ P(sg2); 从plate中取苹果; V(sp); 吃苹果; }} 进程通信 进程通信就是进程之间信息的传递 交往进程通过信号量操作实现进程互斥和同步,这是一种低级通信方式 进程有时还需要交换更多的信息(如把数据传送给另一个进程),可以引进高级通信方式——进程通信机制,实现进程间用信件来交换信息 进程直接通信 发送或接收信件的进程指出信件发给谁或从谁那里接收信件
发送或者接收信件通过一个信箱来进行, 该信箱有唯一标识符,多个进程共享一个信箱
信箱是存放信件的存储区域,每个信箱可以分成信箱特征和信箱体两部分
若指定的信箱未满 则把信件送入信箱中指针所指示的位置,释放等待该信箱中信件的等待者 若指定的信箱已满 发送信件者被置成等待信箱的状态 接收信件原语的处理流程 若指定信箱中有信件 则取出一封信件,释放等待信箱的等待者 若指定信箱中无信件 接收信件者被置成等待信箱中信件的状态 高级进程通信机制 基于流的进程通信 多个进程使用一个共享的消息缓冲区(可称为管道、多路转接器、套接字) 一些进程往消息缓冲区中写入字符流(send/write) 一些进程从消息缓冲区中读出字符流(receive/read) 信息交换单位基于字符流,长度任意 基于RPC的进程通信 采用客户/服务器计算模式 服务器进程提供一系列过程/服务,供客户进程调用 客户进程通过调用服务器进程提供的过程/服务获得服务 考虑到客户计算机和服务器计算机的硬件异构型,外部数据表示XDR被引入来转换每台计算机的特殊数据格式为标准数据格式 外部数据表示XDR就是一个中间格式,客户进程和服务器进程的格式不同在发送的时候用中间格式进行中转 死锁 允许多个进程并发执行共享系统资源时,系统必须提供同步机制和进程通信机制。然而,对这种机制使用不当的话,可能会出现进程永远被阻塞的现象 产生死锁的因素不仅与系统拥有的资源数量有关,而且与资源分配策略,进程对资源的使用要求以及并发进程的推进顺序有关 可从三个方面来解决死锁问题:
死锁产生的必要条件
破坏第一个条件,把独占型资源改造成共享性资源,使资源可同时访问而不是互斥使用。这是一个简单的办法,但对许多资源往往是不能做到的 采用剥夺式调度方法可以破坏第三个条件,但剥夺式调度方法目前只适用于对主存资源和处理器资源的分配,而不适用于所有资源 静态分配(预分配) 所谓静态分配是指一个进程必须在执行前就申请它所要的全部资源,并且直到它所要的资源都得到满足之后才开始执行 所有并发执行的进程要求的资源总和不超过系统拥有的资源数 采用静态分配后,进程在执行中不再申请资源,因而不会出现占有了某些资源再等待另一些资源的情况,即破坏了第二个条件 层次分配 这种分配策略将阻止第四个条件的出现在层次分配策略下,资源被分成多个层次 一个进程得到某一层的一个资源后,它只能再申请在较高层的资源 当一个进程要释放某层的一个资源时,必须先释放所占用的较高层的资源 当一个进程获得了某一层的一个资源后,它想再申请该层中的另一个资源,那么,必须先释放该层中的已占资源 死锁的避免 当不能防止死锁的产生时,如果能掌握并发进程中与每个进程有关的资源申请情况,仍然可以避免死锁的发生 只需在为申请者分配资源前先测试系统状态,若把资源分配给申请者会产生死锁的话,则拒绝分配,否则接收申请,为它分配资源 银行家算法 系统首先检查申请者对资源的最大需求量,如果现存的资源可以满足它的最大需求量时,就满足当前的申请 也就是系统像银行一样先评估你能不能归还资源,比如给进程A分配了x个资源,则进程A就可以释放所有资源,这样系统的资源数就可以增加了。再看系统里剩余的资源有没有x个,如果没有,那么分配资源给进程A的话,可能最后进程A 也获得不了x资源,则就不会去分配给A资源 eg:假设系统有三个进程P, Q, R,系统只有一类资源共10个,目前分配情况如下:死锁的检测 对资源的分配不加限制,但系统定时运行一个“死锁检测”程序,判断系统内是否已出现死锁,若检测到死锁则设法加以解除 检测的一种方法:可设置两张表格来记录进程使用资源的情况
检测 死锁检测程序定时检测这两张表, 若有进程Pi等待资源rk,且rk被进程Pj占用,则说Pi和Pj具有“等待占用关系”,记为W(Pi, Pj) 死锁检测程序反复检测这两张表,可以列出所有的“等待占用关系” 如果出现W(Pi, Pj), W(Pj, Pk), ……, W(Pm,Pn), W(Pn, Pi)时,显然,系统中存在一组循环等待资源的进程: Pi, Pj, Pk, ……, Pm, Pn,也就是说出现了死锁 [tr]进程P1P2…Pn[/tr]
然后这样一个表可以视为使用邻接矩阵表示的有向图,然后判断这个图是不是存在环路,如果存在则则存在死锁 处理 可以采用重新启动进程执行的办法,恢复工作应包含重启动一个或全部进程,以及从哪一点开始重启动 全部卷入死锁从头开始启动,但这样的代价是相当大的,在进程执行过程中定时设置校验点,从校验点开始重执行 中止一个卷入死锁的进程,以后重执行 |
||||
|
||||
只有小组成员才能发言,加入小组>>
4515个成员聚集在这个小组
加入小组3337 浏览 0 评论
航顺(HK)联合电子发烧友推出“近距离体验高性能Cortex-M3,免费申请价值288元评估板
4266 浏览 1 评论
4292 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 21:56 , Processed in 0.839814 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号