操作系统——输入输出IO管理

news2024/10/7 9:22:13

文章目录

  • **1 I/O管理概述**
    • **1.1 I/O设备**
    • **1.2 I/O控制方式**
      • **1.2.1 程序直接控制方式**
      • **1.2.2 中断驱动方式**
      • **1.2.3 DMA方式**
      • **1.2.4 通道控制方式**
    • **1.3 I/O软件层次结构**
    • **1.4 应用程序I/O接口**
  • **2 设备独立性软件**
    • **2.1 高速缓冲与缓冲区**
    • **2.2 设备分配和回收**
    • **2.3 SPOOLing技术(假脱机技术)**
  • **3 磁盘和固态硬盘**
    • **3.1 磁盘的管理**
    • **3.2 磁盘调度算法**

1 I/O管理概述

1.1 I/O设备

分类

按信息交换单位分:

(1)块设备:以数据块为单位,属于有结构设备,如磁盘,传输速率较高,可寻址,可随机读写

(2)字符设备:以字符为单位,属于无结构类型,如交互式终端机,打印机等,传输速率低,不可寻址,时常采用中断I/O方式

按传输速率分类:

(1)低速设备:如键盘,鼠标

(2)中速设备:如激光打印机

(3)高速设备:磁盘机,光盘机等

I/O接口

设备控制器位于CPU与设备之间

在这里插入图片描述

(1)设备控制器与CPU的接口,有三类信号线:数据线,地址线和控制线

(2)设备控制器与设备的接口,每个接口都存在数据,控制和状态三种类型的信号

(3)I/O逻辑,实现对设备的控制,对地址进行译码,并相应的对所选设备进行控制

主要功能:接收和识别CPU发来的命令;数据交换,如设备和控制器之间的数据,控制器和主存之间的数据;标识和报告设备的状态供CPU处理;地址识别;数据缓冲;差错控制

I/O端口

指设备控制器可被CPU直接访问的寄存器

  • 数据寄存器:实现CPU和外设之间的数据缓冲
  • 状态寄存器:获取执行结果和设备的状态信息
  • 控制寄存器:CPU写入,启动命令或更改设备模式

为实现CPU与I/O端口进行通信,有两种方法:

(1)独立编址:每个端口分配一个端口号,所有I/O端口形成I/O端口空间,普通用户程序不能访问

(2)统一编址(内存映射I/O):每个端口被分配唯一的内存地址,且不会有内存被分配这一地址,通常分配给端口的地址靠近地址空间的顶端

在这里插入图片描述

1.2 I/O控制方式

http://t.csdn.cn/tEgy1

设备管理主要任务之一是控制设备和内存或CPU之间的数据传送,外围设备和内存之间的输入输出控制方式有4种

在这里插入图片描述

1.2.1 程序直接控制方式

从外部设别读取的每个字,CPU需要对外设状态进行循坏检查,直到确定该字已经在I/O控制器的数据寄存器中

导致CPU长时间等待,效率低

1.2.2 中断驱动方式

一旦数据读入数据寄存器就通过控制线给CPU发送中断信号,表示数据准备好,然后等待CPU请求该数据

但是数据中的每个字在存储器和I/O控制器之间的传输都要经过CPU,还是会消耗CPU时间

1.2.3 DMA方式

在I/O设备和内存之间直接开辟数据交换通路,彻底解放CPU

特点:基本单位是数据块;传输数据直接从设备送入内存或相反;尽在传输数据的开始和结束CPU才干预,数据传送在DMA控制器的控制下完成

  • 命令/状态寄存器:接收从CPU发来的I/O命令,有关控制信息,或设备状态
  • 内存地址寄存器MAR:输入时存放把数据从设备传送到内存的起始目标地址;输出时,存放由内存到设备的内存源地址
  • 数据寄存器DR:暂存数据
  • 数据计数器DC:存放背刺传送的字节数

CPU会在开始时设备MAR和DC初值,然后继续其他工作

在这里插入图片描述

1.2.4 通道控制方式

I/O通道是指专门负责输入/输出的处理机,是DMA方式的发展,进一步减少CPU的干预,把对一个数据块的读写为单位的干预,减少为对一组数据块的读写及有关控制和管理为单位的干预,又可以实现CPU,通道和I/O设备三者的并行操作,有效的提高系统的资源利用率

I/O通道与一般处理机:通道指令的类型单一,没有自己的内存,通道程序放在主机的内存中,与CPU共享内存

I/O通道与DMA方式:DMA需要CPU控制传送的数据块大小和传送的内存位置,通道方式这些信息由通道控制;每个DMA控制器对应一台设备与内存传送数据,一个通道可以控制多台设备和内存的数据交换

1.3 I/O软件层次结构

在这里插入图片描述

(1)用户层I/O软件

实现与用户交互的接口,用户直接调用库函数对设备进行操作

(2)设备独立性软件

实现用户程序与设备驱动器的统一接口,设备命令,设备的保护及设备的分配与释放等,同时为设备管理和数据传送提供必要的存储空间

设备独立性也称设备无关性,应用程序独立于具体使用的物理设备,引入了逻辑设备和物理设备的概念

使用逻辑设备名的优点:增加设备分配的灵活性;易于实现I/O重定向,指I/O操作的设备可以更换,不必改变应用程序

设备独立性软件的主要功能:执行所有设备的公有操作;向用户层或文件层提高统一接口

(3)设备驱动程序

与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序

(4)中断处理程序

用于保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完毕再恢复被中断进程的线程后,返回到被中断的进程

1.4 应用程序I/O接口

I/O系统与高层之间的接口,根据设备类型不同,进一步分为若干接口

(1)字符设备接口

get:从缓冲区获取字符

put:将字符输出到缓冲区

in-control:提供一种通用的指令处理类型繁多的字符设备

还需要提供打开和关闭操作,实现互斥共享

(2)块设备接口

隐藏了磁盘的二维接口,变为一种线性徐磊

将抽象命令映射为低层操作

内存映射接口通过内存的字节数组来访问磁盘,而不提供读写磁盘操作

(3)网络设备接口

提供相应的网络软件和网络通信接口

通常为网络套接字接口

(4)阻塞/非阻塞I/O

系统的I/O接口还设计两种模式:阻塞和非阻塞

阻塞:进程调用I/O操作,进程就被阻塞,需要等待I/O操作完成,进程才唤醒继续执行

非阻塞:不阻塞进程,I/O调用返回一个错误返回值,轮询方式来查询I/O操作是否完成

大多数系统是阻塞I/O

2 设备独立性软件

2.1 高速缓冲与缓冲区

磁盘高速缓存

提高磁盘的I/O速度,指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息,因此磁盘高速缓存逻辑上属于磁盘,物理上则是驻留在内存中的盘块

高速缓存在内存中的两种形式:在内存中开辟一个单独的空间作为高速缓存,大小固定;把未利用的内存空间作为一个缓冲池,供请求分页系统和磁盘I/O时共享

缓冲区

设备管理子系统引入缓冲区的目的:

(1)缓和CPU和I/O设备间速度不匹配的矛盾

(2)减少对CPU的中断频率,放宽对CPU中断响应时间的限制

(3)解决基本数据单元大小(即数据粒度)不匹配的问题

(4)提高CPU和I/O设备之间的并行性

实现方法:

(1)采用硬件缓冲器,成本高

(2)采用内存中的缓冲区

缓冲技术的分类:

(1)单缓冲

在内存中设置一个缓冲区

假定从磁盘把一块数据输入到缓冲区的时间为T,操作洗将缓冲区的数据传送到用户区的时间为M,CPU对数据的处理时间为C

当T>C,一个数据传送工程耗时M+T

T<C,一个数据传送过程耗时M+C

所以单缓冲的每块数据处理用时为max(C,T)+M

在这里插入图片描述

(2)双缓冲

先装填到缓冲区1,满了才装填到缓冲区2

假设工作区空,一个缓冲区满,一个空

若T<C+M,一个数据传送过程耗时M+C

若T>C+M,一个数据传送过程耗时T

所以双缓冲区处理一块数据的用时为max(C+M,T)

在这里插入图片描述

在这里插入图片描述

若只有单缓冲,则任意时刻都只能实现单方面的数据传送

(3)循环缓冲

包含多个大小相等的缓冲区,有一个链接指针指向下一个缓冲区,最后一个缓冲区指针指向第一个缓冲区,构成一个环形

用于输入输出,还需要两个指针in,out。in指向可以输入数据的第一个空缓冲区,out指向可以提取数据的第一个满缓冲区

(4)缓冲池

多个系统公用的缓冲区组成,按使用状况分为:空缓冲队列,装满输入数据的缓冲队列,装满输出数据的缓冲队列

还有:用于收容输入数据的工作缓冲区,提取输入数据的工作缓冲区,收容输出数据的工作缓冲区,提取输出数据的工作缓冲区

在这里插入图片描述

在这里插入图片描述

2.2 设备分配和回收

设备分配是指根据用户的I/O请求分配所需的设备。设备的使用方式:

(1)独占式使用设备

(2)分时式共享使用设备

(3)以SPOOLing方式使用外部设备:实现了虚拟设备功能,可以将设备同时分配给多个进程,实质上实现了对设备的IO操作的批处理

设备分配的数据结构

设备控制表DCT:一个表就表征一个设备,表项就是设备的属性;请求设备没有得到满足的进程,其PCB按某种策略排成一个设备请求队列,设备队列队首指针指向该请求队列队首PCB

在这里插入图片描述

控制器控制表COCT:有一个表项存放指向相应通道控制表CHCT的指针,一个通道可以为多个设备控制器服务

通道控制表CHCT:有一个指针指向CHCT提供服务的设备控制器信息的表

系统设备表SDT:整个系统只有一张

在这里插入图片描述

设备分配策略

(1)设备分配原则:应根据涉笔特性,用户要求和系统配置情况

(2)设备分配方式:

静态分配:主要对独占设备的分配,在用户作业开始执行前,由系统一次性分配该作业的全部设备,不会死锁但效率低

动态分配:进程执行过程中根据执行需要进行,提高效率,但是可能造成死锁

(3)设备分配算法:常见的有先请求先分配,优先级高者优先等

设备分配的安全性

(1)安全分配方式:进程发出I/O请求后便进入阻塞态,直到I/O完成才唤醒,不会死锁,但是CPU和I/O设备是串行工作

(2)不安全分配方式:进程发出I/O请求继续工作,甚至发出多个请求,请求的设备被另一进程占用才进入阻塞态,优点是一个进程可同时操作多个设备,使进程推进迅速,缺点是可能死锁

逻辑设备名到物理设备名的映射

系统中的逻辑设备表LUT包括逻辑设备名,物理设备名和设备驱动程序入口地址;当进程用逻辑设备名请求分配设备,系统为他分配一台相应的物理设备,并在LUT中建立一个表目,当以后进程再利用该逻辑设备名请求I/O操作时,系统通过查找LUT来寻找对应的物理设备和驱动程序

LUT设置方式:

(1)整个系统一张,LUT不允许具有相同的逻辑设备名,主要适用于单用户系统

(2)每个用户一张LUT,为该用户建立一个进程,建立一个LUT也放进进程的PCB中

2.3 SPOOLing技术(假脱机技术)

缓和CPU和I/O设备速度的矛盾,引入脱机输入输出技术,是一项将独占设备改造成共享设备的技术,利用专门的外围控制机,将低速I/O设备上的数据传送到高速磁盘上

(1)输入井和输出井

在磁盘上开辟两个存储区域,输入井模拟脱机输入时的键盘,用于收容I/O设备输入的数据,输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据

一个进程的输入输出数据保存为一个文件,所有进程的数据文件链接成一个输入输出队列

(2)输入缓冲区和输出缓冲区

输入缓冲区暂存由输入设备送来的数据,再传送到输入井

输出缓冲区用于暂存从输出井送来的数据,再传送到输出设备

(3)输入进程和输出进程

用于模拟脱机输入输出时的外围控制机

CPU需要输入数据时,直接从输入井读入内存;输出数据先从内存送到输出井,等输出设备空闲再将输出井中的数据经过输出缓冲区送到输出设备

共享打印机就是SPOOLing技术的实例

假脱机管理进程完成的任务:

(1)在磁盘缓冲区中为之申请一个空闲盘块,并将要打印的数据送入其中暂存

(2)为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表挂到假脱机文件队列上

SPOOLing系统的特点:提高了I/O速度;将独占设备改造为共享设备(实际上没有为任何进程分配设备);实现了虚拟设备功能(每个进程认为自己独占设备)

在这里插入图片描述

3 磁盘和固态硬盘

http://t.csdn.cn/WPMu8

磁盘地址用“柱面号-盘面号-扇区号”表示

磁头能否移动:固定头磁盘,活动头磁盘

磁盘能否更换:固定盘磁盘,可换盘磁盘

在这里插入图片描述

3.1 磁盘的管理

磁盘初始化

低级格式化(物理格式化):把磁盘划分扇区,为每个扇区使用特殊的数据结构,填充磁盘

分区

系统还要将自己的数据结构记录到磁盘上

第一步:将磁盘分为由一个或多个柱面组成的分区(即c盘等形式的划分),每个分区的起始扇区和大小都记录在磁盘主引导记录的分区表中

第二步:对物理分区进行逻辑格式化,即创建文件系统,初始文件系统数据结构存储到磁盘上,包括空闲空间和已分配的空间以及一个初始为空的目录

为提高效率,系统把多个相邻的扇区组合在一起,形成一簇(Linux称为块),一簇只能放一个文件,文件占用的空间只能是簇的整数倍

引导块

计算机启动时需要运行一个初始化程序(自举程序),它初始化CPU,寄存器,设备控制器和内存等;接着启动操作系统;所以自举程序要找到磁盘上的操作系统内核,加载到内存,并转到起始地址开始运行

自举程序通常存放在ROM中,而ROM中又只保留很小的自举装入程序,将完整功能的引导程序保存在磁盘的启动块,具有启动分区的磁盘称为启动磁盘或系统磁盘

即顺序是:

ROM的自举装入程序—>磁盘的启动块—>操作系统

坏块

简单磁盘:可手动处理,在FAT表上标明,程序不会使用

复杂磁盘:控制器维护坏块列表,在出厂低级格式化就已经初始化,在使用过程中不断更新;还会保留一些块最为备用,控制器可以采用备用块来代替坏块,这种方案称为扇区备用

3.2 磁盘调度算法

一次磁盘读写操作由寻找时间,旋转延迟时间和传输时间决定

(1)寻找时间Ts

设有n条磁道,m为与磁盘驱动器速度有关的常数,约0.2ms,磁臂的启动时间s约为2ms

Ts=m*n+s=0.2*n+2

(2)旋转延迟时间Tr

磁头定位到磁道的扇区所需的时间,磁盘的旋转速度为r

Tr= 1 2 r \dfrac{1}{2r} 2r1

(3)传输时间Tt

磁盘读出或写入数据经历的时间,取决于每次读写的字节数b和磁盘的旋转速度,N是一个磁道上的字节数

Tt= b r N \dfrac{b}{rN} rNb

寻道时间与磁盘调度算法有关,而延迟时间和传输时间都与磁盘旋转速度有关

常见的磁盘调度算法

(1)先来先服务FCFS算法

最简单的算法,具有公平性,但是大量进程时性能较差

(2)最短寻找时间优先算法SSTF

选择与当前磁头所在磁道距离最近的磁道,但是会产生饥饿现象

(3)扫描算法SCAN/电梯调度算法

在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象,即规定了磁头运动的方向,且必须走到方向的尽头才能调换方向

在这里插入图片描述

(4)循环扫描算法C-SCAN

在扫描算法的基础上规定磁头单向移动来提供服务,回返时直接快速移动至起始端而不服务任何请求

避免了SCAN算法偏向处理接近最里或最外的磁道的访问请求

在这里插入图片描述

(5)LOOK调度和CLOOK调度

SCAN和C-SCAN必须遵循从盘面的一端到另一端

还可以改进为磁头移动只需要到达最远端的一个请求即可返回,不需要到达磁盘端点

在这里插入图片描述

在这里插入图片描述

除了减少寻找时间,减少延迟时间也是提高磁盘传输效率的重要因素,可以对盘面扇区进行交替编号,对磁盘片组中的不同盘面错位命名

因为磁头读写一个物理块后需要短暂的处理时间才能开始读写下一块

所以盘面上按扇区交替编号连续存放,则连续读写多条记录时能减少磁头的延迟时间;同柱面不同盘面的扇区若能错位编号,连续读写相邻两个盘面的逻辑记录时也能减少磁头延迟时间

在这里插入图片描述

寻找时间和延迟时间是能减少的,但是传输时间无法改变

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

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

相关文章

车牌识别--http协议

文章目录 libcurl车牌识别 前言 基于https协议访问网址实现车牌识别 http是超文本传输协议&#xff0c;它可以在B/S模式下解决tcp传输格式的问题&#xff0c;处于tcp之上在应用层 https是http加密版本&#xff0c;通过httpssl实现加密版http 我们车牌识别通过http协议调用翔云…

Django_admin数据管理后台

目录 一、基础操作 二、自定义后台操作数据行为 源码等资料获取方法 admin数据管理后台是django内置的一个后台管理界面&#xff0c;能查看已注册模型类的数据结构&#xff0c;以及对数据的增删改。 一、基础操作 1.1 检查项目目录下的urls.py有没有如下配置 1.2 创建djan…

使用U盘在无系统的机器上安装Ubuntu

1、在Bios中选择将USB 作为Boot Option #1 2、插入制作好的系统盘&#xff08;系统盘制作可以看上一篇博客&#xff09; 3、save & exit选择 save change and reset 4、 开始安装系统 如果出现安装窗口过大无法点击下一步&#xff0c;可以使用ALTF7拖动窗口。

java中的BIO NIO AIO

多路复用IO模型是目前使用的比较多的模型。java中的NIO常用的理解是在 网络IO中&#xff0c;那么在网络IO中为什么NIO比BIO效率更高&#xff1f;我们的web项目中是用的哪种呢&#xff1f;可以往下看。 JavaNIO实际上就是多路复用IO。在多路复用IO模型中&#xff0c;会有一个线程…

【Unity】Unity2022设置2D动画的sample

首先在主页面选择Animation 出现这样的一个框 点击红点行&#xff0c;最右侧的三个点 将Show Sample Rate勾选上即可

Fiddler工具 — Fiddler常用插件(Willow)

Fiddler已有的功能已经够我们日常工作中使用了&#xff0c;为了更好的扩展Fiddler&#xff0c;Fiddler也是支持一些插件的安装&#xff0c;也支持用户自己开发插件并安装。 Fiddler插件下载地址&#xff1a;https://www.telerik.com/fiddler/add-ons 1、Traific Difer插件 Tr…

【Java】Map(包括HashMap)

Map HashMap 和 Hashtable 的区别HashMap 和 HashSet 区别HashMap 的底层实现JDK1.8 之前JDK1.8红黑树 HashMap 的长度为什么是 2 的幂次方HashMap 多线程操作导致死循环问题HashMap 为什么线程不安全&#xff1f; ConcurrentHashMapConcurrentHashMap 和 Hashtable 的区别JDK …

常见面试题之JVM实践(调优)

1. JVM调优的参数可以在哪里设置参数值&#xff1f; 1.1 tomcat的设置vm参数 修改TOMCAT_HOME/bin/catalina.sh文件&#xff0c;如下图&#xff1a; JAVA_OPTS"-Xms512m -Xmx1024m" 1.2 springboot项目jar文件启动 通常在linux系统下直接加参数启动springboot项…

在Pandas中处理缺失数据

当没有为一个或多个项目或整个单元提供信息时&#xff0c;可能会出现数据缺失。缺失数据在现实生活中是一个非常大的问题。缺失数据在pandas中也可以称为NA&#xff08;不可用&#xff09;值。在DataFrame中&#xff0c;有时许多数据集只是缺少数据&#xff0c;因为它存在而未被…

52 # 二叉树的前中后遍历

二叉树的遍历 线性数据结构遍历比较简单&#xff0c;可以采用正序遍历、逆序遍历。 遍历树的目的一般是修改树&#xff0c;比如修改树的节点&#xff0c;采用访问者模式 前序遍历 前序遍历&#xff08;preorder traversal&#xff09;&#xff1a;先访问根节点&#xff0c;…

Go语言struct要使用 tags的原因解析

这篇文章主要介绍了为什么 Go 语言 struct 要使用 tags,在本文中&#xff0c;我们将探讨为什么 Go 语言中需要使用 struct tags&#xff0c;以及 struct tags 的使用场景和优势&#xff0c;需要的朋友可以参考下 在 Go 语言中&#xff0c;struct 是一种常见的数据类型&#xf…

由于找不到vcomp100.dll,无法继续执行代码,解决方法

为什么会由于找不到vcomp100.dll,无法继续执行代码问题呢&#xff1f; 文件被误删除&#xff1a;有时候&#xff0c;在进行系统清理或卸载应用程序时&#xff0c;可能会不小心删除了vcomp100.dll文件。如果某个程序依赖于该文件&#xff0c;并且文件被删除&#xff0c;那么该程…

ESP32开发:IDFV4.4配置LVGL8.3

配置LVGL8.3源码 LVGL GITHUB代码仓库如下&#xff1a;https://github.com/lvgl/lvgl/tree/release/v8.3 官方已经在ESP32上移植好的代码demo&#xff0c;目前最新版是LVGL 7.9&#xff1a;https://github.com/lvgl/lv_port_esp32 我们可以将LVGL官方配置好的ESP32 LVGL仓库下…

超详细的学习笔记:CSS盒子模型(附代码示例)

目录 一、CSS三大特性 1、继承性 2、层叠性 3、优先级 4、权重叠加的计算 二、PxCook的基本使用 三、盒子模型 1、盒子模型的介绍 2、内容的宽度和高度 3、边框 (border) 1、连写形式 2、单方向设置 3、单个属性 8、内边距&#xff08;padding&#xff09;和外边…

arm学习stm32之spi总线数码管倒计时

由于时间没有用时间计时器操作&#xff0c;有些误差&#xff0c;后续有空会翻新计时器版本 main.c #include "spi.h" extern void printf(const char *fmt, ...); void delay_ms(int ms) {int i,j;for(i 0; i < ms;i)for (j 0; j < 1800; j); } int num[10…

钉钉提示 redirect_url的域名不在appid的安全域名内

钉钉提示 redirect_url的域名不在appid的安全域名内 1、需要在《钉钉开放平台》- 开发者后台设置《钉钉扫码登陆功能》 2、如果钉钉界面没有钉钉扫码登陆功能-》点击浏览器右下角-》《返回旧版》 3、备注&#xff1a;当前访问的IP地址跟钉钉扫码登陆功能填写的IP地址需保持一致…

代码审计工具Fortify基本使用

最近接触到一款代码审计的工具 — Fortify SCA and Applications 22.2.0&#xff0c;现就其基本使用做一简单介绍&#xff01; Fortify是一个应用安全测试软件&#xff0c;是Micro Focus旗下AST&#xff08;应用程序安全测试&#xff09;产品。 Fortify能够提供静态和动态应用…

Acwing 853.有边数限制的最短路

Acwing 853.有边数限制的最短路 链接:853. 有边数限制的最短路 - AcWing题库 /* 题解:bellman_ford算法 可以算是一种暴力的算法了 他可以解决有复权边的单源最短路径 也可以解决图是否存在负环的问题 还可以求出 不超过k条边的最短路径问题 但是效率低下 时间复杂度为o(nk)n…

超有趣的linux命令2

超有趣的linux命令2 此次实验命令均在Ubuntu16.04版本上测试 注意有些命令需要在图形化界面才能显示效果 温馨提示&#xff1a;可能有人是第一次接触Ubuntu&#xff0c;所以下面详细写了如何配置源和网络&#xff0c;以及安装命令的方式 1. 首先配置软件源 以命令行方式配置…

Comate代码助手推出,现场生成了贪吃蛇游戏,我们距离AI自动编程还有多远?

Comate代码助手推出&#xff0c;现场生成了贪吃蛇游戏&#xff0c;我们距离AI自动编程还有多远&#xff1f; 百度智能云推出“Comate”代码助手&#xff0c;并正式开放邀测&#xff0c;不算很意外。 毕竟让AI写代码&#xff0c;跑一跑贪吃蛇&#xff0c;算是传统艺能。 不过你…