操作系统笔记、面试八股(三)—— 系统调用与内存管理

文章目录

  • 3. 系统调用
    • 3.1 用户态与内核态
    • 3.2 系统调用分类
    • 3.3 如何从用户态切换到内核态(系统调用举例)
  • 4. 内存管理
    • 4.1 内存管理是做什么的
      • 4.1.1 为什么需要虚拟地址空间
      • 4.1.2 使用虚拟地址访问内存有什么优势
    • 4.2 常见的内存管理机制
    • 4.3 分页管理
      • 4.3.1 基本概念
      • 4.3.2 地址转换(由逻辑地址访问内存的过程)
      • 4.3.3 快表
        • 4.3.3.1 为什么引入快表
        • 4.3.3.2 快表的访问流程
      • 4.3.4 多级页表
        • 4.3.4.1 为什么引入多级页表
    • 4.4 分段管理
      • 4.4.1 段表
      • 4.4.2 地址转换
      • 4.4.3 分页和分段的对比
    • 4.5 段页式管理
      • 4.5.1 逻辑地址结构
      • 4.5.2 段表与页表
      • 4.5.3 地址转换
    • 4.6 由逻辑地址访问内存的次数
    • 4.7 虚拟内存
      • 4.7.1 传统存储管理方式的特征及缺点
      • 4.7.2 局部性原理
      • 4.7.3 什么是虚拟内存
      • 4.7.4 虚拟内存的特征
      • 4.7.5 如何实现虚拟内存
    • 4.8 页面置换算法
      • 4.8.1 最佳置换算法(OPT)
      • 4.8.2 先进先出置换算法(FIFO)
      • 4.8.3 最近最久未使用置换算法(LRU)
      • 4.8.4 最少使用置换算法(LFU)
      • 4.8.5 时钟置换算法(CLOCK,NRU)
      • 4.8.6 改进型的时钟置换算法

3. 系统调用

3.1 用户态与内核态

进程在系统上的运行分为两个级别,用户态和内核态。

用户态的进程可以直接读取用户程序的数据,系统态的进程可以直接访问计算机的任何资源,不受限制。

运行的应用程序基本都是运行在用户态,如果调用操作系统提供的系统态的子功能,就需要系统调用。

3.2 系统调用分类

系统调用,按功能大致分为:

  1. 设备管理。完成设备的请求、释放、启动等功能。
  2. 文件管理。完成文件的读、写、创建及删除等功能。
  3. 进程控制。完成进程的创建、撤销、阻塞及唤醒功能。
  4. 进程通信。完成进程之间的消息传递或信号传递等功能。
  5. 内存管理。完成内存的分配、回收,以及获取作业占用内存区大小及地址等功能

3.3 如何从用户态切换到内核态(系统调用举例)

  1. 用户态进程主动要求切换到内核态的系统调用
  2. 异常,比如缺页异常
  3. 外围设备的中断,比如硬盘读写操作完成。

4. 内存管理

4.1 内存管理是做什么的

  1. 负责内存空间的分配与回收(C++中的malloc函数申请内存,free函数释放内存)

  2. 从逻辑上对内存空间进行扩充(如4GB内存运行60GB大小的游戏)

  3. 负责进行地址转换,也就是把逻辑地址转换成相应的物理地址

  4. 内存保护。保证各进程在各自存储空间内运行,互不干扰。

4.1.1 为什么需要虚拟地址空间

如果没有虚拟地址空间,程序直接访问和操作的都是物理内存。这样会带来两个主要问题:

  1. 用户程序可以访问任意内存,寻址内存的每个字节,这样就很容易破坏操作系统,造成操作系统崩溃。
  2. 想要同时运行多个程序特别困难。举个例子:微信在运行的时候给内存地址 1xxx 赋值后,QQ 音乐也同样给内存地址 1xxx 赋值,那么 QQ 音乐对内存的赋值就会覆盖微信之前所赋的值,这就造成了微信这个程序就会崩溃。

4.1.2 使用虚拟地址访问内存有什么优势

  1. 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
  2. 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。
  3. 不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。

4.2 常见的内存管理机制

内存管理机制分为连续管理方式(指为一个用户程序分配一个连续的内存空间)和非连续管理方式(指允许一个程序使用的内存有着不相邻的分布)

  • 连续分配管理方式

    1. 分块管理

      把内存分为大小相等且固定的几个块,每个进程占用其中的一个。如果进程很小的话,会浪费大量的空间。块式管理已经被淘汰。

  • 非连续分配管理方式

    1. 分页管理

      把内存分为若干个很小的页面,相比分块,划分的力度更大。分页管理提高了内存利用率,减少内存碎片。

      分页管理通过页表对应逻辑地址和物理地址。

      分页管理虽然提高了内存利用率,但是“页”无实际意义。

    2. 分段管理

      把内存分为几个大小不固定的、有意义的段,每个段定义了一组逻辑信息。例如,主程序段Main、子程序段X、数据段D、栈段S等。

      分段管理通过段表对应逻辑地址和物理地址。

    3. 段页式管理

      段页式管理结合了分段管理和分页管理的优点。把主存先分成若干段,每个段又分成若干页。段与段之间、段的内部(因为是页)都是离散的。

4.3 分页管理

4.3.1 基本概念

  1. 页框:将内存空间分为一个个大小相等的分区(比如每个分区4KB),每个分区就是一个“页框”,或者称为“页帧”、“内存块”、“物理块”

  2. 页框号:每个页框有一个编号,称为“页框号”,或者“页帧号”、“内存块号”、“物理块号”。页框号从0开始

  3. 页/页面:

    将用户进程的地址空间也分为与页框大小相等的一个个区域,称为“页”或“页面”。每个页面也有一个编号,即“页号”,页号也是从0开始。

    一个进程的最后一个页可能并没有页框那么大(这样最后一个页放在页框中会有内部碎片)。因此页框不能太大,避免产生过大的内部碎片。

操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的页面与内存的页框有一一对应的关系。

各个页面不必连续存放,也不必按照顺序,可以放到不相邻的页框中。

  1. 分页管理的虚拟地址分为两部分,一部分是存储页面号,一部分是存储偏移量

  • 如果有K位表示“页内偏移量”,则说明该系统中一个页面的大小是2^K个内存单元。
  • 如果有M位表示“页号”,则说明该系统中,一个进程最多允许有2^M个页面。
  1. 页表

分页管理中,每个页表项由“页号”和“内存块号”组成。

4.3.2 地址转换(由逻辑地址访问内存的过程)

内存管理单元(MMU)管理着逻辑地址和物理内存的转换,其中页表(Page Table)存储着页(程序地址空间)与页框(物理内存)的映射表。

下图页表存放着16个页,这16个页要用4个比特位来进行索引定位。

例如,对于虚拟地址(0010 0000 0000 0100),前4位是存储页面号(0010)2,后12位(0000 0000 0100)是存储偏移量。

根据页面号读取页表中对应表项(2)的内容(1101)。页表项内容的前3位表示内存块号,最后一位表示是否存在于内存中(0表示不存在,1表示存在)。

拼接页表项内容的前三位(内存块号,110)和虚拟地址中的后12位(存储偏移量,0000 0000 0100),得到物理地址(110 0000 0000 0100)。

根据得到的物理地址访问内存空间。

4.3.3 快表

4.3.3.1 为什么引入快表

快表的引入,是为了加快逻辑地址(虚拟地址)到物理地址转换的速度。

在引入快表之前,由逻辑地址访问内存的过程如下:

  1. 根据逻辑地址的高位拿到页号
  2. 根据页号访问内存中的页表,根据页表的映射拿到实际的内存块号(一次访问)
  3. 把内存块号和逻辑地址的低位拼接,得到物理地址
  4. 访问物理地址对应的内存(二次访问)

这个过程是需要两次直接访问内存的,所以为了加快这个访问速度,引入了快表。

快表可以认为是一个高速缓冲存储器(Cache),内容是页表的一部分或者全部内容,和页表的功能是一样的,只不过比在内存中的页表访问速度要快很多。

由于采用页表做地址转换,读写内存数据时 CPU 要访问两次主存。有了快表,有时只要访问一次高速缓冲存储器,一次主存,这样可加速查找并提高指令执行速度。

4.3.3.2 快表的访问流程

被访问的内存块很可能在短时间内再次被访问,可能程序在一段时间内会多次访问同一个页表项。

所以在每次访问页表项时,先在快表里查询是否有该页表项,如果没有再去页表中查询,并把查询的页表项存入快表。

如果快表满了,就根据一些策略把其中的一些页表项淘汰掉,再把新查询的页表加进去。

总结:使用快表之后的地址转换流程如下:

  1. 根据虚拟地址中的页号查快表;
  2. 如果该页在快表中,直接从快表中读取相应的物理地址;
  3. 如果该页不在快表中,就访问内存中的页表,再从页表中得到物理地址,同时将页表中的该映射表项添加到快表中;
  4. 当快表填满后,又要登记新页时,就按照一定的淘汰策略淘汰掉快表中的一个页。

4.3.4 多级页表

4.3.4.1 为什么引入多级页表

多级页表主要是为了避免把全部页表一直放在内存中占用过多空间的问题,特别是那些根本就不需要的页表就不需要保留在内存中。属于时间换空间。

单级页表存在的问题:

  1. 页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。——多级页表解决
  2. 整个单级页表都会常驻内存,这是没有必要的,因为进程在一段时间内可能只要访问某几个特定的页面。——虚拟存储技术解决

两级页表,将全部的页表项分组,使得每组的页表项刚好能够装入一个内存块,让各组页表项(二级页表)可以离散地分配在各个内存块中,同时为了记录二级页表的顺序,通过一个“页目录表”来映射二级页表的页号和二级页表存放的内存块号。

两级页表的引入,使得虚拟地址的结构也要发生相应的变化:一级页号+二级页号+页内偏移量

两级页表的地址转换:

注意,采用多级页表机制时,各级页表的大小不能超过一个页面。

4.4 分段管理

4.4.1 段表

4.4.2 地址转换

段长大小是不固定的,但是段表项长度是固定的,不要混淆。

4.4.3 分页和分段的对比

  1. 单位
    • 页是信息的物理单位
    • 段是信息的逻辑单位
  2. 目的
    • 分页的目的是为了实现离散匹配,提高内存利用率。
    • 分段的目的是更好地满足用户的需求。
  3. 层面
    • 分页仅仅是系统管理的需要,完全是系统行为,对用户是不可见的。
    • 一个段通常包含着一组属于一个逻辑模块的信息,分段对用户是可见的,用户编程时需要显式地给出段名。
  4. 大小
    • 页的大小是固定的,且由系统决定。页表由页号(可隐含)和页框号组成
    • 段的长度不固定,由用户编写的程序大小决定。段表由段号(可隐含)、段长、基址组成。
  5. 地址转换过程
    • 分段管理相比于分页管理,需要进行两次越界检查:
      • 段号与段表寄存器中的段表长度比较,检查是否越界
      • 根据段表中记录的段长,检查段内地址是否越界
  6. 地址空间
    • 分页的用户进程地址空间是一维的,程序员只需要给出一个记忆符指出页号即可表示一个地址。
    • 分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址。

  1. 分段比分页更容易实现信息的共享和保护(不可更改的代码可以共享)
  2. 内存碎片
    • 分页管理内存空间利用率高,不会产生外部碎片,只会有少量的页内碎片
    • 分段管理会产生外部碎片。如果采用“紧凑”的方式来解决外部碎片,会付出较大的时间代价。

4.5 段页式管理

4.5.1 逻辑地址结构

4.5.2 段表与页表

段页式管理中,每个段对应一个段表项,每个段表项由段号、页表长度、页表存放块号(页表起始地址)组成。每个段表项长度相等,段号是隐含的。

分段管理中,每个段表项由段号、段长、基址组成

段页式管理中以及分页管理中,每个页面对应一个页表项,每个页表项由页号、页面存放的内存块号组成。

Note:段页式管理中的段表项结构与分段管理中的段表项结构不同,但段页式管理中的页表项结构与分页管理中的页表项结构相同。

一个进程对应一个段表,但是一个进程有可能对应多个页表。

4.5.3 地址转换

4.6 由逻辑地址访问内存的次数

  1. 分页

    1. 单级页表

      • 第一次访问内存——查内存中的页表
      • 第二次访问内存——访问目标内存单元
    2. 多级页表(n级)

      • 逐级访问页表(n次)
      • 第n+1次,访问
  2. 分段

    • 第一次访问内存——查内存中的段表
    • 第二次访问内存——访问目标内存单元
  3. 段页式

    • 第一次访问内存——查内存中的段表
    • 第二次访问内存——查页表
    • 第三次访问内存——访问目标内存单元
  4. 快表

    • 分页管理、分段管理中,都可以引入快表,将近期访问过的页表项/段表项放到快表中。若快表命中,则仅需一次访问内存。
    • 段页式管理中,也可以引入快表,将近期访问过的段号和页号作为查询快表的关键字。若快表命中,则仅需一次访问内存。

4.7 虚拟内存

4.7.1 传统存储管理方式的特征及缺点

4.7.2 局部性原理

4.7.3 什么是虚拟内存

4.7.4 虚拟内存的特征

4.7.5 如何实现虚拟内存

实现虚拟内存,操作系统需要在传统的非连续分配存储管理方式的基础上,再增加两个主要功能:

  • 请求调页/请求调段——解决访问的信息不在内存时的问题
  • 页面置换/分段置换——解决内存空间不够的问题

实现虚拟内存的三种主要方式为:

  1. 请求分页存储管理

    • 请求分页存储管理建立在传统分页管理之上,为了支持虚拟内存而增加了请求调页功能和页面置换功能。
    • 请求分页是目前最常用的一种实现虚拟内存的方法。
    • 在作业开始运行时,仅装入当前要执行的部分页面即可运行;
    • 假如在作业运行的过程中发现要访问的页面不在内存,则由处理器通知操作系统将相应的页面调入到内存。
    • 如果发现在把页面调入内存时,内存已满,操作系统也可以将暂时不用的页面置换到外存中。
  2. 请求分段存储管理

    原理和请求分页存储管理相似,不过是把页面换成段

  3. 请求段页式存储管理

不管是上面哪种实现方式,一般都需要:

  1. 一定容量的内存和外存:在载入程序的时候,只需要将程序的一部分装入内存,而将其他部分留在外存,然后程序就可以执行了;
  2. 缺页中断/缺段中断:如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页面或段调入到内存,然后继续执行程序;
  3. 虚拟地址空间:都需要把逻辑地址转换为物理地址。

4.8 页面置换算法

请求分页存储管理中的页面置换算法。

页面的换入、换出需要磁盘IO,会有较大的开销,因此好的页面置换算法应该追求更少的缺页率

4.8.1 最佳置换算法(OPT)

最佳置换算法,每次选择淘汰的页面将是以后永不使用或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。

实际上,只有在进程执行的过程中才能知道接下来会访问到的是哪个页面,无法提前预判页面访问序列。因此,最佳页面置换算法是无法实现的。

4.8.2 先进先出置换算法(FIFO)

先进先出置换算法,每次选择淘汰的页面是最早进入内存的页面。

实现算法:把调入的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面换出即可。

队列的最大长度限制取决于系统为进程分配了多少个内存块。

4.8.3 最近最久未使用置换算法(LRU)

最近最久未使用置换算法,每次淘汰的页面是最近最久未使用的页面。

实现方法:LRU赋予每个页面一个访问字段,用访问字段记录该页面自上次被访问以来所经历的时间T。当需要淘汰一个页面时,选择现有页面中T值最大的,即最近最久未使用的页面。

4.8.4 最少使用置换算法(LFU)

最少使用页面置换算法(LFU,Least Frequently Used),选择在之前时期使用最少的页面作为淘汰页。

4.8.5 时钟置换算法(CLOCK,NRU)

时钟置换算法,又称最近未用算法(NRU,Not Recently Used),是一种性能和开销较均衡的算法。

CLOCK算法的实现方法:为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位 置1。当需要淘汰一个页面时,只需检查页的访问位。如果是0,则选择该页换出;如果是1,则将其置为0,暂不换出,继续检查下一个页面。如果第一轮扫描中所有页面都是1,则将这些页面的访问位依次置0后,再进行第二轮扫描(第二轮扫描中一定会有访问位为0的页面),因此简单的CLOCK算法选择淘汰一个页面最多会经过两轮扫描

4.8.6 改进型的时钟置换算法

简单的时钟置换算法,仅考虑到一个页面最近是否被访问过。事实上,如果被淘汰的页面没有被修改过,就不需要执行I/O操作写回外存

只有被淘汰的页面被修改过时,才需要写回外存。

因此,改进型的时钟置换算法,除了考虑一个页面最近是否被访问过之外,还应考虑该页面是否被修改过。在其他条件都相同时,应优先淘汰没有被修改过的页面,避免I/O操作。

  • 访问位:访问位=0表示最近未被访问过,访问位=1表示最近被访问过。
  • 修改位:修改位=0表示页面没有被修改过,修改位=1表示页面被修改过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/6141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kettle开发-Day40-AI分流之case/switch

前言: 前面我们讲到了很多关于数据流的AI方面的介绍,包括自定义组件和算力提升这块的,今天我们来学习一个关于kettle数据分流处理非常重要的组件Switch / Case 。当我们的数据来源于类似日志、csv文件等半结构化数据时,我们需要在…

Vmware+CentOS+KGDB内核双机调试

1.准备两台CentOS系统的vmware虚拟机 其中一台作为调试机,另一台则作为被调试机。如下图,CentOS7.9x64为被调试机,CentOS7.9x64-Debugger为调试机 2.配置串口设备 若虚拟机有串口设备(如打印机),需要先删…

黑马 pink h5+css3+移动端前端

网页概念 网页是网站的一页,网页有很多元素组成,包括视频图片文字视频链接等等,以.htm和.html后缀结尾,俗称html文件 HTML 超文本标记语言,描述网页语言,不是编程语言,是标记语言,有标签组成 超文本指的是不光文本,还有图片视频等等标签 常用浏览器 firefox google safari…

LabVIEW基础-lvlib库

文章目录 lvlib库llb库lvlib与llb的区别lvlib常见错误断开vi与库之间的连接 lvlib库 文件-新建-库,创建一个项目库文件。能在项目中创建的文件类型,都可以在库中创建。 在lvlib上右键-添加-文件,将被选中的文件放到lvlib中。被添加进lvlib的…

关于ETL的两种架构(ETL架构和ELT架构)

ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象…

【Linux】Tcp服务器的三种与客户端通信方法及守护进程化

全是干货~ 文章目录 前言一、多进程版二、多线程版三、线程池版四、Tcp服务器日志的改进五、将Tcp服务器守护进程化总结 前言 在上一篇文章中,我们实现了Tcp服务器,但是为了演示多进程和多线程的效果,我们将服务器与客户通通信写成了一下死循…

APP测试学习之Android模拟器Genymotion安装配置不上解决方法以及adb基本使用

Android模拟器Genymotion安装配置不上解决方法以及adb基本使用 Genymotion下载安装配置遇见的问题解决方法adb基本使用 Genymotion下载 1.首先进入官网 https://www.genymotion.com/ 2.在官网注册一个账号 https://www-v1.genymotion.com/account/login/ 3.下载 https://www.g…

计算机网络——应用层

这篇文章是计算机网络系列文章的第五篇 计算机网络——物理层 计算机网络——数据链路层 计算机网络——网络层 计算机网络——传输层 计算机网络——应用层 序言 计算机网络中的应用层在当今的社会起到了什么作用? 应用层在当今社会有着必不可缺的作用。是协议栈中…

8.4 利用集成运放实现的信号转换电路

在控制、遥控、遥测、近代生物物理和医学等领域,常常需要将模拟信号进行转换,如将信号电压转换成电流,将信号电流转换成电压,将直流信号转换成交流信号,将模拟信号转换成数字信号,等等。 一、电压 - 电流转…

Spring 能解决所有循环依赖吗?

以下内容基于 Spring6.0.4。 看了上篇文章的小伙伴,对于 Spring 解决循环依赖的思路应该有一个大致了解了,今天我们再来看一看,按照上篇文章介绍的思路,有哪些循环依赖 Spring 处理不了。 严格来说,其实也不是解决不了…

在自定义数据集上微调Alpaca和LLaMA

本文将介绍使用LoRa在本地机器上微调Alpaca和LLaMA,我们将介绍在特定数据集上对Alpaca LoRa进行微调的整个过程,本文将涵盖数据处理、模型训练和使用流行的自然语言处理库(如Transformers和hugs Face)进行评估。此外还将介绍如何使用grado应用程序部署和…

论文笔记--ERNIE: Enhanced Language Representation with Informative Entities

论文笔记--ERNIE: Enhanced Language Representation with Informative Entities 1. 文章简介2. 文章概括3 文章重点技术3.1 模型框架3.2 K-Encoder(Knowledgeable Encoder)3.3 预训练任务3.4 微调 4. 文章亮点5. 原文传送门6. References 1. 文章简介 标题:ERNIE:…

从0到1完成UI自动化测试框架搭建之Pytest

上篇文章中,我们学会了如何使用UI Automator2atx编写简单的Android自动化脚本。 但是有个问题,大家可以思考下,光用自动化脚本让它自己动起来,是不是缺了点什么? 我们写测试用例的时候,是不是经常写&…

C语言第七课----------函数的定义及使用--------C语言重要一笔

作者前言 个人主页::小小页面 gitee页面:秦大大 一个爱分享的小博主 欢迎小可爱们前来借鉴 __________________________________________________________ 目录 1.函数是什么 2. 库函数 3. 自定义函数 4. 函数参数 5. 函数调用 6. 函数的嵌套调用和链式访问 7. 函数的声…

两天学会用Webpack打包前端代码-day01

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 什么是 Webpack? 使用 Webpack 体验webpack打包过程 修改 Webpack 打包入口和出口 入口 出…

一些抄袭CSDN的爬虫网站(长期收集更新)

目录 一、CodeAntenna1. 简介2. 网址 二、待更新。。。 本文由CSDN点云侠原创,爬虫网站请努力加油爬。 一、CodeAntenna 1. 简介 互联网耻辱柱排行榜Top 1。本人博客里任何一点免费可读的部分都被该网站爬得体无完肤。 2. 网址 https://codeantenna.com/a/B4cMB…

MQTT 与 Kafka|物联网消息与流数据集成实践

MQTT 如何与 Kafka 一起使用? MQTT (Message Queuing Telemetry Transport) 是一种轻量级的消息传输协议,专为受限网络环境下的设备通信而设计。Apache Kafka 是一个分布式流处理平台,旨在处理大规模的实时数据流。 Kafka 和 MQTT 是实现物…

数学建模-时间序列分析 实例

实例1销量数据预测和实例2人口数据预测实例3上证指数预测和实例4gdp增长率预测 数据-定义时间 不加置信区间清晰点 例二 实例3

json-server Node.js 服务,前端模拟后端提供json接口服务

json-server Node.js 服务,前端模拟后端提供json接口服务 背景: 前后端分离的项目,如果前端写页面的话,必须的后端提供接口文件,作为前端等待时间太久,不便于开发进行,如果前端写的过程中自己搭建一个简要的…

使用 Qt designer

使用 Qt designer 1、配置Qt designer外部工具2、Qt designer(Qt 设计师)使用2.1 创建保存文件ui2.2 pyuic5.exe 工具 转化成为py文件2.3 直接导入UI文件 2、qrc资源管理器 1、配置Qt designer外部工具 实质就是 Qt\bin 工具中 designer.exe 请查看 PyQ…