[Linux入门]---进程状态
文章目录
- 1.进程主要状态
- 进程运行状态
- 进程阻塞状态
- 进程的挂起状态
- 2.Linux进程状态
- Linux进程内核源代码
- ①R运行状态
- ②S睡眠状态
- ③D磁盘休眠状态
- T停止状态
- ④X死亡状态
- ⑤Z僵尸状态
- ⑥孤儿进程
- 3.总结
1.进程主要状态
进程运行状态
①内存中有一个运行队列,其中有两个指针,一个指向已经准备好且用双链表链接起来、等待被调度运行的头进程PCB地址,另一个指向尾部进程,这样便可以很好地管理好这些等待被运行的进程了;
②运行队列中存在调度器,调度器通过计算进程时间片(进程被运行的时间),挑选进程放到CPU上去运行,这样便尽可能公平地使所有进程被调度;
③一个进程把自己放到CPU上运行,是不是要执行完毕才能把自己放下来呢?答案:当然不是!例如你使用C语言写的while(1)
语句,你在显示屏上的黑框框中看到该语句一直被运行,记住不要用你的感知去揣测CPU的运行速度;实际上每个进程在CPU运行一定的时间(可能10ms左右)就会被放回内存的运行队列继续等待,直到再次被运行,因为CPU运行速度太快了,你可能感觉不到,所以才会误以为你写的进程代码一直在被运行;当你while(1)
的语句在被运行的时候,你也可以使用浏览器、QQ等进程应用,这也可以说明进程是轮流在CPU上运行的!
总结:
在内存的运行队列中等待的进程和在CPU运行的进程,都可以说这样的进程处于运行状态!
进程阻塞状态
①我们的操作系统会将各种外设的属性信息,使用PCB结构体描述起来组织起来进行管理,描述外设的PCB结构体中,有指向等待队列的头尾指针,对需要等待外设输入的进程进行管理!
②举个栗子:我们使用scanf\cin
语句,当这个代码进程运行起来的时候,不能直接被放在运行队列中,因为它还没有准备好,在键盘输入前,会被放到等待队列上排队,在键盘输入后,该进程才会被放到运行队列中。
③进程处于等待外设完成信息交互(信息的输入、输出等)的状态,叫做进程的阻塞状态。
进程的挂起状态
如果很多进程处于阻塞状态,那么操作系统的内存资源会严重不足,而处于阻塞状态中的代码和数据处于空闲,在保证操作系统能正常运行的情况下,会将PCB进程对应代码和数据放到磁盘上,只需要PCB结构体在等待队列中排队即可,当外设输入信息时,再将磁盘中的代码和数据唤出,唤入到内存中;操作系统置换出来的空间,又可以存放其他PCB结构体,提高了内存空间的利用率!(给面试官投简历,只需要你的简历等待筛选即可,不需要你个人到场)
处于进程PCB在等待队列中排队,代码和数据等资源被存放到磁盘中,该状态称为进程的挂起状态
以上是操作系统进程的主要的三种状态:运行、阻塞、挂起,其他的进程状态之后会学习,
2.Linux进程状态
Linux进程内核源代码
一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。下面的状态在kernel源代码里定义:
/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
R运行状态(running)
: 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列 里。
S睡眠状态(sleeping)
:意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))
D磁盘休眠状态(Disk sleep)
有时候也叫不可中断睡眠状态(uninterruptible sleep)
,在这个状态的进程通常会等待IO
的结束。
T停止状态(stopped)
:可以通过发送 SIGSTOP 信号给进程来停止(T
)进程。这个被暂停的进程可以通过发送SIGCONT
信号让进程继续运行。
X死亡状态(dead)
:这个状态只是一个返回状态,你不会在任务列表里看到这个状态。 进程状态查看
Z僵尸状态(zombie)
:进程结束没有被立即回收,该进程信息被维护的状态
①R运行状态
我们创建一个mypro.c
文件写入如下代码:
#include<stdio.h>
#include<unistd.h>
int main()
{ while(1) { printf("hello prosserstate\n"); } return 0;
}
代码运行结果为:
在另一个窗口如下指令进行监测
$ ps ajx | head -1 && ps ajx | grep myproc |grep -v grep
检测的结果为:
./myproc
文件一直在显示屏打印,但看到监测的结果显示./myproc
进程为睡眠状态,这是因为CPU运行速度太快,一下子就将要打印的数据输出到内存中,然后从内存中慢悠悠地输出到显示屏,大部分时间等待显示屏(外设)就绪,所以该进程一直处于睡眠状态。
我们对上面的代码稍作修改,再进行监测:
#include<stdio.h>
#include<unistd.h>
int main()
{ while(1) { // printf("hello prosserstate\n"); } return 0;
}
监测结果为:
我们这次注释掉了
printf
语句,CPU不需要和显示屏进行信息交互了,只需要运行./myproc
进程即可,所以./myproc
进程运行和处于运行队列等待的运行状态了,所以可以监测到./myproc
进程为R状态
。
状态后面有无+号的区别
①状态后面有+号,如某进程的状态为R+
,说明该进程在前台运行;状态后面无+号,如某进程状态为R
,说明该进程在后台运行;在后台运行的进程使用ctrl+C
无法终止掉,需要使用kill指令才能杀掉该进程;在运行的进程后面加上&
,进程将会在后台运行
②S睡眠状态
将myproc.c
文件代码修改为:
#include<stdio.h>
#include<unistd.h>
int main()
{ int a=0; printf("Enter# "); scanf("%d",&a); printf("echo>%d\n",a); while(1) { sleep(1); //printf("hello prosserstate\n"); } return 0;
}
键盘准备输入的时候:
在另一个窗口输入如下指令:
while :;do ps ajx | head -1;ps ajx |grep myproc |grep -v grep;sleep 1;done
键盘输入之前监测的结果为:
键盘输入数字:
键盘输入之后监测的结果为:
①运行上面的代码,需要从键盘中输入数据,
./myproc
进程在等待键盘输入时,处于S状态
(休眠状态);②在while
循环中使用了库里面的sleep
函数,也会进程处于S状态睡眠状态;③我们在xshell机器上输入命令,bash命令行等待我们输入指令的进程,就是处于S状态
(休眠状态)
使用top
指令监测机器上的各进程的状态:
可以看出来大部分的进程状态都处于
S状态
(休眠状态),Linux系统上S状态
(休眠状态)就是操作系统的阻塞状态。
③D磁盘休眠状态
小故事: 在操作系统内,每天都有许许多多的进程在被运行,有一天有一个进程是要向磁盘中写入1GB的数据,因为数据量太大的同时从内存中写入磁盘的速度太慢了,所以该进程只能空闲地等待把数据写入磁盘成功或者失败,等待磁盘反馈信息给进程,而此时刚好操作系统空间资源严重不足了,阻塞状态的进程也将代码和数据放到磁盘上处于挂起状态了,但还是杯水车薪;于是操作系统便开始观察起了在操作系统中的所有进程,这是在干嘛呢?当然是准备杀进程了!很不凑巧地是发现了一个啥事都不干的进程,看到这操作系统哪里能忍,该进程当然被杀掉了!而该进程就是等待1GB数据写入磁盘的进程,当磁盘写入失败时,磁盘屁颠屁颠地跑回来想告诉进程一声:“进程,不好意思啊,写入失败了!”却发现进程不见了,无奈地只好继续忙自己手头上的工作上去了,而丢失的数据又用户最重要的数据!于是,用户一怒之下将操作系统、进程、磁盘三者通通告上了法庭,这三者都将接收正义地审判!在法庭上,法官问操作系统:“操作系统你可治罪,为什么要杀掉进程呢?”操作系统理直气壮地说:“法律(规则)赋予了我权力,让我管理底层软硬件资源,给用户良好的体验,而这个进程什么都没干,要么我杀掉他,要么用户的界面会卡到崩溃!”法官转头问向了进程:“进程,你可知罪?"进程战战兢兢地说:”法官大人,我才是受害者,我冤枉啊!我在等待磁盘写入信息完毕后给我反馈,然后将反馈的信息汇报给用户,突然就被杀掉了,我太难了!“紧接着法官问磁盘:“磁盘,你可知罪?”磁盘哭唧唧地说:“法官大人,我昼夜不停地工作,丝毫不敢有任何懈怠,可写入数据信息慢,也不能怪我啊,写入数据失败,但是人家的空间不够了,我总不能把其他数据丢了继续写入吧?我只是一个打工的,只想好好地工作,呜呜呜!”法官皱着眉毛想:“他们三个好像都没有错误,可用户那边我怎么交差呢?”法官心生一计:“可以设置一种状态,进程在等待磁盘写入数据完毕期间,该进程不能被杀掉,该状态是针对今天这种状况,那就叫这种状态为磁盘休眠状态!”法官向用户承诺:”我已经颁布了一条法令,今后这种状况不会再出现了!“庭审结束一段时间后,操作系统资源又严重不足的,刚好看见一个进程等待大量数据写入磁盘中,该要”提刀“杀掉该进程,然而该进程不慌不忙地拿出”免死金牌“(即告诉操作系统我是处于磁盘休眠状态),操作系统只好作罢,向其他进程走去!
等待磁盘输入输出数据结束后响应的状态为D状态(磁盘休眠状态),操作系统内不能承载过多处于D状态的进程(一般只允许一两个),因为D状态的进程过多,会导致系统无法正常运转(太卡了);操作系统层面状态切换很快,如果某进程能被用户查到为D状态,说明操作系统已经卡着很久了!
T停止状态
使用如下代码文件:
#include<stdio.h>
#include<unistd.h>
int main()
{ while(1) { sleep(1); printf("hello prosserstate\n"); } return 0;
}
kill指令控制进程暂停:
指令认识:
kill -9 Pid //杀进程
kill -19 Pid//暂停进程
kill -18 Pid//重新启动进程
使用暂停进程之前,进程所处的状态:
使用暂停进程之后,进程所处的状态:
进程重启之后所处的状态:
使用kill相关指令可以使进程暂停,进程暂停后进行重启,可以发现进程被放到后台运行了,按ctrl+C无法终止该进程,需要使用kill指令终结该进程。
gdb调试观察T状态:
在另一个窗口输入如下指令:
ps ajx | grep myproc
监测结果为:
①我们平时对调试代码打断点,让代码运行到端点处就是让该代码进程暂停的结果,所以是进程处于暂停状态是为了更好的控制进程;②这里暂时认为t状态和T状态是一致的,即都是暂停状态!
进程S状态和T状态的区别:
看似处于两种状态的进程都不在CPU运行,但是处于这两种状态的进程目的可能是不一样的,处于S状态的进程是为了等待某种资源(如键盘的输入),而处于T状态的进程也可能等待某种资源就绪,还可能是为了控制该进程达到某种目的(如就是不想让该进程运行了)。
④X死亡状态
我们称进程退出,进程资源已被回收的状态称为X状态(死亡状态)。
⑤Z僵尸状态
在操作系统中有的进程执行完任务正常退出,或意外被终止进程而退出,不管以上哪种情况,只要是进程退出,都会被放到垃圾队列种,等待资源回收,而退出的进程信息资源会维持一段时间,而此时的进程状态被称为Z状态(僵尸状态),直到父进程“关心”该进程(接收到该进程的退出信息),该进程的信息资源才会被系统回收。
#include<stdio.h>
#include<unistd.h>
int main()
{ pid_t id=fork(); if(id==0) { int cnt=5; while(cnt--) { printf("i am child, pid: %d ppid:%d\n",getpid(),getppid()); sleep(1); } // exit(0); } else if(id>0) { while(1) { printf("i am father, pid: %d ppid:%d\n",getpid(),getppid()); sleep(1); } //父进程当前没有针对子进程做任何事情 } return 0;
}
代码运行的运行和监测结果为:
①使用
fork
进程创建了子进程,在5秒后,子进程正常结束,没有被创建自己的父进程回收,其中单词defunct
也有僵尸的意思,说明该进程将处于僵尸状态;②进程一般退出的时候,如果父进程没有主动回收,子进程会一直让自己处于Z状态,进程的资源尤其是task_struc
t结构体不能被释放。
僵尸进程的危害:
- 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
- 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!
- 那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的个位置进行开辟空间,会使操作系统发生内存泄漏!
⑥孤儿进程
#include<stdio.h> #include<unistd.h> int main() { pid_t id=fork(); if(id==0) { while(1) { printf("i am child procsser,pid: %d ppid: %d\n",getpid(),getppid()); sleep(1); } } else if(id>0) { int cnt=5; while(cnt--) { printf("i am father procsser,pid: %d ppid: %d %d\n",getpid(),getppid(),cnt); sleep(1); } } return 0; }
代码运行的运行和监测结果为:
查看Pid为1的进程
使用fork函数创建子进程,父进程先退出,子进程的父进程会被该改为1号进程(操作系统),即说明该进程被父进程领养,成为孤儿进程。
- 问题:父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
父进程先退出,子进程就称之为“孤儿进程”,孤儿进程被1号init进程领养,当然要有init进程回收喽
3.总结
操作系统层面上主要三种状态:运行状态、阻塞状态、挂起状态;在
Linux
操作系统中,R状态
可以对应操作系统上的运行状态,S\D\T
状态对应操作系统上的阻塞或挂起状态,X/Z
状态以此类推也有与操作系统相对应的状态,操作系统之间的状态可能实现(划分)有所不同,状态的原理(概念)是相似的。
相关文章:

[Linux入门]---进程状态
文章目录 1.进程主要状态进程运行状态进程阻塞状态进程的挂起状态 2.Linux进程状态Linux进程内核源代码①R运行状态②S睡眠状态③D磁盘休眠状态T停止状态④X死亡状态⑤Z僵尸状态⑥孤儿进程 3.总结 1.进程主要状态 进程运行状态 ①内存中有一个运行队列,其中有两个指…...

腾讯mini项目-【指标监控服务重构】2023-08-29
今日已办 Collector 指标聚合 由于没有找到 Prometheus 官方提供的可以聚合指定时间区间内的聚合函数,所以自己对接Prometheus的api来聚合指定容器的cpu_avg、cpu_99th、mem_avg 实现成功后对接小组成员测试完提供的时间序列和相关容器,将数据记录在表格…...
opencv 常用的滤波器及应用技巧
常用滤波器: 标准滤波器(邻域平均法):该滤波器是所有滤波器里最简单的一种,输出的像素值由输入的滤波核所覆盖的像素值均值决定(每个邻域像素对其贡献的权重是相同的)。高斯滤波:该…...

【PyTorch攻略(1/7)】 张量基本语法
一、说明 Tensor 是一种特殊的数据结构,与数组和矩阵非常相似。在 PyTorch 中,我们使用张量对模型的输入和输出以及模型的参数进行编码。 张量类似于 NumPy 和 ndarray,除了张量可以在 GPU 或其他硬件加速器上运行。事实上,张量和…...

什么是Jmeter ?Jmeter使用的原理步骤是什么?
1.1 什么是 JMeter Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。用于对软件做压力测试,它最初被设计用于 Web 应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚…...
Mac 通过 brew安装的 ffmpeg 切换版本
现有版本为 6.x ,想切换至 5.x 版本 先安装 5.x 版本 brew install ffmpeg5安装完成后会出现具体版本号,也可以自己指定例如 brew install ffmpeg5.1.3 配置环境变量 .zshrc vi ~/.zshrc添加如下命令 export PATH/usr/local/Cellar/ffmpeg5/5.1.3/bin:…...

【Spring Boot】实战:实现数据缓存框架
🌿欢迎来到@衍生星球的CSDN博文🌿 🍁本文主要学习【Spring Boot】实现数据缓存框架 🍁 🌱我是衍生星球,一个从事集成开发的打工人🌱 ⭐️喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路⭐️💠作为一名热衷于分享知识的程序员,我乐于在CSDN上与广大开发者…...
MySQL数据类型之JSON
MySQL数据类型之JSON SON类型是MySQL 5.7版本新增的数据类型,用好JSON数据类型可以有效解决很多业务中实际问题。 使用JSON数据类型,推荐用MySQL 8.0.17以上的版本,性能更好,同时也支持Multi-Valued Indexes; JSON数…...

nginx_0.7.65_00截断_nginx解析漏洞
nginx_0.7.65_00截断_nginx解析漏洞 文章目录 nginx_0.7.65_00截断_nginx解析漏洞1 环境搭建1 解压nginx_0.7.652 双击启动,如有闪退,端口占用的情况,在conf文件nginx.conf修改一下端口号3 查看一下进程有nginx4 启动成功访问127.0.0.1:18080…...
建站百科:HTTP返回状态码是什么?
HTTP返回状态码是用于表示HTTP响应状态的三位数字代码。HTTP状态码由6位数字组成,每3位数字代表一种状态,如200表示成功,404表示未找到资源,500表示服务器内部错误等。 常用的状态码包括: 200:正常的网页…...
人像摄影简记
文章目录 光影室外顺光室内顺光室外逆光室内逆光散射光 姿势错误姿势避免摆拍技巧场景互动抓拍利用道具 构图构图目的构图基础概念画幅:横画幅和竖画幅景别:全身、大半身及半身、特写拍摄高度:平拍、俯拍和仰拍拍摄方位:正面、前侧…...

【Java 基础篇】Java 实现模拟斗地主游戏
欢迎阅读本篇博客,在这篇博客中,我们将详细讲解如何使用Java编写一个简单的模拟斗地主游戏。这个项目将帮助您了解Java编程中的一些基本概念,如面向对象编程、集合框架的使用、随机数生成等。 引言 斗地主是一种非常受欢迎的纸牌游戏&#…...

计算机专业毕业设计项目推荐09-个人医疗系统(Spring+Js+Mysql)
个人医疗系统(SpringJsMysql) **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及…...
安卓Compose(一)
为什么学习安卓Compose? 安卓Compose是一个相对新的UI工具包,它的出现为安卓应用程序开发带来了一系列的好处。下面是一些学习Compose的理由: 声明式UI 与传统的安卓XML布局相比,Compose使用了声明式的UI编程范例。这意味着你可以…...

【Linux学习】03Linux用户和权限
Linux(B站黑马)学习笔记 01Linux初识与安装 02Linux基础命令 03Linux用户和权限 文章目录 Linux(B站黑马)学习笔记前言03Linux用户和权限认知root用户root用户(超级管理员)su和exit命令sudo命令 用户、用户…...
LeetCode 面试题 05.04. 下一个数
文章目录 一、题目二、Java 题解2.1 求大数:2.2 求小数: 一、题目 下一个数。给定一个正整数,找出与其二进制表达式中1的个数相同且大小最接近的那两个数(一个略大,一个略小)。 示例1: 输入: n…...

SDXL prompt 笔记
模型 模型有两个,分别是 stable-diffusion-xl-base-1.0、stable-diffusion-xl-refiner-1.0。 base 模型是用来做文生图,refiner 模型是用来做图生图的。 SDXL 模型之 base、refiner 和 VAE_云水木石的博客-CSDN博客 分辨率 默认是1024*1024…...
使用Redis管道进行查询接口性能优化
一、引入 在我们的正常项目开发过程中,我们会通过Redis缓存数据,来帮我们进行异步任务,分担外部的请求压力 但是Redis缓存也有一定的限制,因为我们在向请求过来时,Redis客户端都要向服务端发送一次请求,相应…...

初学vue.js
准备Vue.js环境 ① 下载环境: javaScript语言的程序包:外部js文件 对于Vue来说,导入Vue的外部js文件就能够使用Vue框架了。 Vue框架的js文件获取: 官网提供的下载地址:https://cdn.jsdelivr.net/npm/vue/dist/vue.js ②导入环境…...
React的thunk中间件
Thunk 是一种中间件,它可以在 Redux 中处理异步操作。Thunk 中间件允许你在 action 中返回一个函数,而不仅仅是一个普通的 action 对象。这个返回的函数可以接收 dispatch 和 getState 作为参数,并且可以在函数内部进行异步操作。当使用 Thun…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...