建立一个SPADES模拟器Word格式.docx
- 文档编号:16706660
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:12
- 大小:37.44KB
建立一个SPADES模拟器Word格式.docx
《建立一个SPADES模拟器Word格式.docx》由会员分享,可在线阅读,更多相关《建立一个SPADES模拟器Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
Agent数据库允许一个外部类型的agent去定义:
用于agent输入输出的文件描述符;
用到的时间模块进程;
(see4.7.1)
Agent的运行目录;
带参数的可执行的函数。
4.5.2综合类型的agents
综合类型的agent是从动态库加载的并且存在于通信server的同一进程。
这将使得通信server和一些时间机制不能被agent很好的接受。
但是,综合类型的agent有比外部类型的agent运行得更快的优点。
同时,如果综合类型的agent运行在综合的通信server中,agent将能访问worldmodel的内部数据,减少了所需要的信息。
Agent数据库允许一个综合类型的agent去定义:
包含agent的动态库的路径;
是否agent必须在综合类型的server中执行;
Agent何时起动的参数。
4.5.3placeholder(占位)agents
Placeholderagent是只有一个名字的agent,它不能被通信server起动。
它只在仿真引擎中有用,使得仿真引擎知道一个agent类型存在但不要去定义这个agent是如何起动的,因为负责agent起动的通信server会给出placeholderagent的完整描述。
4.5.4agent数据库的工作原理
Worldmodel的设计者起动agent时必须访问agent数据库。
这一节将讲述agent数据库是如何被访问的。
首先,agent数据库是可以通过SimEngine类的函数getAgentTypeDB访问的,它将返回一个指向agent类型数据库对象的AgentTypeDB型指针。
类AgentTypeDB包含类AgentTypeIterator和类AgentTypeConstIterator,这两个类是用来访问agent数据库中的agent类型的。
下面的类AgentTypeDB中成对出现的方法在agent类型的判别中也很有用,它们返回一个常数值的iterator:
isIteratorValid返回所给的iterator是否合法;
nullIterator返回null类型的iterator;
deref以一个iterator为参数返回相应的agent类型。
它不能排除非法的iterator。
getAgentType以agent的名字为参数,返回在agent数据库中的相应的iterator,如果在agent数据库中没有这个名字将返回一个非法的iterator。
getBeginIterator取得数据库中的第一个agent类型的iterator。
4.6Agent接口
这一节用一般的术语描述agent和worldmodel的接口。
精确的格式和其它的细节将在6.4节讨论。
4.6.1ExernalAgentPerspective
一个agent进程是通信server用agent数据库的信息初始化的。
与通信server通信的管道将在6.4节中介绍。
初始化数据信息将交给Agent。
如果你用agentmigration(5.3节)并且agent是一个migratedagent,那么这些初始化数据将会包括migration的信息,但若你不用agentmigration或者你是第一次运行agent,关于migration的信息为空(省略)。
一旦agent完成所有的初始化时它就返回一个初始化完成的信息。
这意味着起动时agent能做任意多的初始化工作。
当agent完成它自己所有的初始化信息时,它只要等待从通信server传来的信息就可以了。
从通信server传来的信息有很多种类,我们可以把它分为两类:
能够“思考”的和不能“思考”的。
当agent可以对信息作出动作时,感知和时间戳可以起动agent的思考周期。
思考周期结束信息将中断所有的思考周期,并将通知服务器agent已经结束了思考周期。
所有其它信息都是无思想的感知,agent不能对它们作出任何反应。
所有用于处理这些信息的计算时间将再被算在下一个思考周期内(thinkingcycles)。
当SPADES起作用时agent将有两个主要的操作。
第一个操作信息的格式将被worldmodel完整的解释;
第二个是必需的时间戳,它是在特定的时间传给agent的时间。
在思考周期的末期,agent必须发出一个思考周期结束的信息。
在agent接口中有两个重要的参数必须提到。
由于有跟踪agents的计算时间,这将使agent的信息更新落后。
比如,agent原计划在时间x得到一个感知信息,但由于对上一个周期的动作的继续思考,使得agent的空闲时间推到x+1。
如果agent比感知到达时间提前了多于max_agentq_trailing_time,那么他的感知将被告知为非“思维”性的感知,这是通过改变元素ThinkingType为TT_Not实现的。
Max_agentq_trailing_time以时间戳的形式执行相同的函数,而不是以感知的形式。
如果agent函数带有参数send_agent_think_times,agent将接收到思考时间的信息,这信息指出上个思考周期所用的模拟时间。
这个信息只是一个说明性的信息,不能起动agent的新一轮思考周期。
由于agent的种种违反规则的行为或者传送不符合要求的信息,它将收到很多错误的信息。
在6.4.1节中有详细的列表。
我们可以设置很多时间界限来控制agent的思考时间,这在检测出错的agent和阻止出错的agent防碍其余的agent的模拟实验方面起到很大的作用。
这将在4.7.3中详细讨论。
SPADES为每个agent提供了标准输出和标准错误的日志(记录),我们也可以通过参数create_agent_logfiles来决定是否为一个agent记录日志。
参数agent_stdout_log_fpat和agent_stderr_log_fpat定义了日志文件的名字和位置。
所以Agents可以通过标准输出记录日志或其它需要记录的信息,我们可以通过检查每个agent的日志文件来检查是否它们在模拟实验中是否出错。
4.6.2IntegratedAgentPerspective
综合类型的agent可以和外部类型的agent一样与server交换信息(在4.6.1中详细描述),而它们的区别是:
1.综合类型的agent是通过调用函数实现和server交换信息的,而不是通过管道(pipe);
2.综合类型的agent通过agent数据库中给出了字符串,并在初始化时通过初始化函数传递给具体的agent,而外部类型的agent是在命令行中输入参数的方法给具体的agent传递信息;
3.综合类型的agent提供一个IntegratedAgent的子类,类IntegratedAgent的函数为agent提供从server传来的信息;
4.而综合类型的agent要传递信息给server时,它通过调用类IntegratedAgent对象中的子类IntegratedAgentActions的函数来实现;
5.标准输出和标准错误显然都是server的标准输出和标准错误,因此每个agent应该打开自己的日志文件;
6.在4.6.1中讨论的时间界限对综合类型的agent不起任何作用。
相关的类在6.5节中有详细的讨论。
4.6.3WorldModelPerspective
Worldmodel通过事件和函数调用来和agent交换信息。
图4.2显示了agent从Worldmodel的信息中感知-思考-行动的周期,它以一个被感知的事件类型为CreateSenseEvent的事
图4.2感知-思考-行动周期中的各个事件和相应的函数调用
件为起点,接下来是SenseEvent事件。
介于CreateSenseEvent和SenseEvent的是agent的感知周期。
当SenseEvent实现后,agent将接收到一个信息而且它的思考周期就此开始。
Agent基于分配的计算时间作出一些动作。
SenseEvent的时间和对返回动作信息所需的模拟时间是思考周期。
通过调用WorldModela对象中的parseAct函数把动作信息转换为ActEvent类型的事件,那么ActEvent将认识到整个周期的结束。
介于发出动作信息和发生ActEvent事件的时间称为反应周期。
要注意CreateSenseEvent不是SenseEvent发生(加入动作队列)的必要条件,但是我们在任何时候都还是要创建一个CreateSenseEvent类的。
同时,SPADES会对CreateSenseEvent做更多的检查,这可以避免一些很难发现的因果错误。
CreateSenseEvent可以轻松的用于创建频繁出现的感知信息。
当CreateSenseEvent被认知时,createSense的函数将被调用以产生SenseEvent的对象,因此在后面适当的时候你可以定义类realizeEventWorldModel中的函数把CreateSenseEvent加入队列中。
4、7Agent监视
这部分涉及到一个SPADES的通讯server怎样监视它所负责的agent。
4、7、1Agent计时器
SPADES提供了各种估计agent思考时间的方法,也要注意世界模型能产生不定时的感觉,当它开始思考周期时,常常有0的思考缓冲。
不管哪种方法,SPADES能记录模拟的时间缓冲,参数record_think_times控制是否进行记录。
每一个agent的思考时间存在各自的文件里,参数think_times_file_pattern指定这个文件的名字。
具体的文件格式(以二进制,而不是文本)在6、7、3中介绍。
Perl脚本show_ttimes.pl能读二进制格式并能以一种人们能易读的形式输出。
它显示这个文件的名字和一行有多少的思考时间,它的值在文件里面是按从左到右然后从上到下的形式存储的。
一些计时器可以被一个完整的agent(从动态库中得到)利用,而有些不行,这些被记录如下:
一个计时器被放在一个agent型数据库中,或被列为默认的参数process_timer,在这两种情况下,分析一个字符串可以得到计时器的类型和它的值,根据如下:
‘fixedtime’
这是fixedtime计时器,每一次思考时间都要求统一的时间time,这个计时器可以用来为综合agent服务。
‘replayfilepattern’
这是replay计时器。
Filepattern指定要读的文件,就像think_times_file_pattern,字符串‘%N’被agent数字所代替。
6、7、3介绍这个文件格式,但只是代替SPADES以前记录的时间,这个并不一定要理解。
在代替时,replay_think_buffer_size值每次都从文件中读得,这可以增加效率,通过改变这个参数可能会在表现上有一些小小的效果。
这个计时器可以用来为综合agent服务。
‘jiffieskinst’
这是一个jiffies计时器,jiffy是在过程中的一段时间,就像linuxkernel中所传闻的一样。
整数参数kinst将意为(多少)kilo-instructions每模拟周期,具体见6、7、1。
这个计时器不能用来为综合agent服务。
‘perfctr_instrkinst’
这是perfctr计时器。
通过利用perfctr系统提供的一些性质,agent用的处理器的指令的数目就被追踪下来了。
整数参数kinst将意为(多少)kilo-instructions每模拟周期,具体见6、7、2。
‘default’
这是default计时器。
无论哪个计时器都列为和参数default_process_timer一起使用。
如果default被赋予default_process_timer的值,’fixed0’将被调用。
如果一个综合agent可以接受与default相关联的计时器,这个计时器也可以和综合agent一起使用。
4、7、2agnet处理跟踪
SPADES在外部agent处理其它的步骤时,为了适时记录像4、7、1所说的agent的时间,它也在试着处理追踪,这部分就是描述怎样实现这一步和相关的参数。
然而,得注意的是这个方案既不是很完整也不是很安全,它的设计是为了让agent设计者的工作更容易一些和避免意外的错误。
它还可能替agent设计者愚弄系统,同时也得注意,这个仅仅适合外部agent,并不适合综合agent。
SPADES利用linux的LD_PRELOAD机构来加载动态库,这个动态库能截取动态库的调用。
所有调用fork,vfork和clone的动态库都被库截取了来通报给commserver,注意,在调用pthread_create是利用clone来实现的的,因此它也能被跟踪。
参数不清agent_intercept_library控制哪个库被预调用。
总之,SPADES会自动运行这个,因此你不用为这个担心。
注意,这意味着一些不要用到动态链接库的agent(如一个被静态链接的agent实体)在调用新的子过程时将不能对分支进行正确的跟踪。
通常,SPADES不做任何事去试验和检验agent是否是动态链接,它很难试验和检验所有对fork的调用的都是动态调用。
通过SysVIPCMessageQueue方案实现分支的启示:
一个暗示是仅仅通讯server每个机构每个使用者都可以运行,另一方面,如果一个通讯server正常退出,在下一个周期你将看到这样的错误:
TheIPCmessagequeueseemedtoalreadyexist.
如果你用了参数ipc_force_remove,信息队列将在通讯server启动前被移除。
你可以使IPC信息丧失接收参数enable_ipc_message_reception的能力。
4、7、3检验agents
在每一个信息处理周期后期,通讯server会“检验”agents,主要是为了获得像crashedagents这样的错误,但也允许一些家务管理运行。
注意这仅仅提供给外部agent
检验步骤是:
检验构成agent的所有进程仍然存在。
如果不存在,它不是一个错误。
这些进程刚好从agent所追踪的进程列表里移除,然而,如果所有agent的进程都不见了,agent处于关闭状态:
ALR_ProcessVanished。
估计agent将要思考所花的时间。
如果它比max_aecs_for_agent_think大,agent则会处于关闭状态伴随着ALR_ThinkTooLongWallClock。
推荐你在设计参数max_secs_for_agent_think时,把它设为远远大于agent期望的思考时间,这样,检验就理想的得到agent的无限循环或哪个agent发送完成思考信息失败。
例如:
我当前的配置是worldmodel和agent,我期望agent的思考时间最大为50ms,但是我设置max_secs_for_agent_think时设为10s。
在估计出思考时间的基础上,决定是否要进行进一步的检验。
如果agent_check_use_randomness是off状态的,思考时间又比agent_check_threshold_sec大,则进行进一步的检验。
如果agent_check_use_randomness是on状态的,则估算出参数agent_check_gumbel_dist_A、agent_check_gumble_dist_B和wallclocktime的输入值的Gumbel分布的极限。
如果有那种可能性的话,进一步检验是必要的。
进程定时器参考于估算的在模拟时期agent思考的时间,如果这个时间大于max_simtime_for_agent_think,则agent将关闭并告知出错ALR_ThinkTooLongSim。
如果在模拟时期agent思考的时间增加,一条时间修正信息被送到模拟引擎。
这个对worldmodel和agent来说完全是透明的。
时间修正对模拟结果不产生任何影响,但是会影响对无因相关事件排序的效率。
6.2agent数据库
Agent数据库描述了agent的类型(参见4_.5)_.
这些数据来自于XML格式的文件(agent_db_fn参数指定了文件的位置)。
在SPADES的发行和安装中,一个agent.xsd图表被提供,这章我们将对其进行详细的阐述。
所有元素参见http:
//spades-
该数据库中的核心元素是agentdb_。
它必须有一个版本特性,指出这个文件是为哪个版本的SPADES所写的,其值是一个十进制数。
大部分情况下允许向下兼容。
所有的名字属性必须仅包含字母,数字,’-‘和’_’并且没有空格。
下面的子元素能够反复的使用:
Agent_type_external:
说明了一个作为外部进程启动的angent。
它有如下子元素:
1,inputfd:
(可选)给出了文件标示符,通过它agent能够从信息服务器上读取信息。
默认为值default_agent_input_fd。
2,outputfd:
(可选)给出了文件标示符,通过它agent发送信息信息到服务器上。
默认为值default_agent_output_fd。
3,timer:
(可选)给出timer类型的描述字符(参见4.7.1)。
4,workingdir:
(可选)给出agent的工作路径。
程序执行前,当前目录改为这个值,所有的关于agent数据库文件位置的相对路径都会做相应更改。
5,commandline:
(必须)给出了agent的全部命令行。
要注意的是这个元素的特征和分解规则在将来的版本中会有所改变。
现在的分解规则如下:
1,值必须放在’{}’中。
2,空格分隔在命令行中的参数或名词。
如:
foo-ab–code\\
3,如果命令行中的名词中间有空格,用双引号引起来。
如bar-a"
SomeName"
4,如果命令行中的名词中间有’“’,例如some”some,放两个连着的双引号,它将被看作一个。
表示为:
baz-a"
Some"
"
Name"
5,没有其他字符有特殊意思,这意味着‘\‘也无特殊含义’<
’和’>
’也不能作为shell的重定向符。
Agent_type_integrated:
说明agent从动态库引导并和信息服务程序存在于同一进程中。
这个元素要求给出特征名。
其子元素为:
1,lib_path:
(必须)给出了定义angent的动态库的相关路径。
2,init_arg:
(可选)如果指定,所给字符串将传给整个agent类的构造函数。
如果不指出,将使用默认值。
注意,一些timer类型将不被整型agent接受。
4,require_integrated_commserver:
(可选)boolean型,true指出agent只能在内部服务器上运行,false指出可在外部服务器上运行。
默认为false。
Agent_type_placeholder:
这个元素要求给出名字属性。
它没有子元素和正文。
这种类型的agent将不会真实启动,但它对仿真引擎是有用的(尽管不实际工作)。
它给出了一个完整类型的描述到信息服务器。
6.3输入/输出信息格式的长度前缀
为了避免一些死板的信息长度和格式的限制,SPADES为各种信息采用前缀式输入/输出形式。
先发送信息长度然后再是数据。
注意到SPADES可能会发送超过长度的数据,因而整个信息可能不是马上可用,因此读者必须去读缓冲区。
ReadBuffFD类正好提供了这种功能,并且对于agents,这一类被集成在了SPADES的agent库中。
对于每个信息来说,表示数据长度的四个字节被发送(按网络字节顺序),然后再是数据。
6.4外部agent的输入与输出
这一节给出了agnet_及外部agent输入与输出的详细资料。
这里的输入指agent从信息服务器接受信息;
输出是agent发送信息到信息服务器。
首先,全部信息是通过管道传送。
当agent启动时,被agent类型给出的文件描述符(默认为default_agent_input_fd和default_agent_output_fd)应该是用来读取/发送数据从/到信息服务器。
如6.3所说,所有的信息都使用信息长度前缀的格式。
6.4.1Agent的输入格式
这一节描述了agent从信息服务器读进的信息格式,第一个字节给出了信息的类型,接下来是信息的论据和数据。
第一个字节后面并不立即跟有空格。
在下面的介绍中:
1,time表示仿真时间(整型),后面必须跟有空格。
2,data表示特定的数据字符串。
注意到长度前缀符的使用,因此这里没有专门的数据格式和长度。
特别地,任意的二进制数据都能被发送。
3,token表示中间无空格的文本字符串。
传送到agnet信息有:
1,‘Stimetimedata’
S表示是感觉(sensation)信息,伴随着思考周期。
第一个time是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 建立 一个 SPADES 模拟器
![提示](https://static.bdocx.com/images/bang_tan.gif)