这是一个非常普遍的问题。我对术语状态有点困惑。我想知道人们对“申请状态”的意思是什么?为什么他们将 webserver 称为“无状态”,将数据库称为“有状态”?
在实时迁移期间将VM内存从一台计算机移动到另一台计算机时,如何传输应用程序(在VM中)的状态。
是否正在传输系统的内存,缓存和注册值,以便传输正在运行的应用程序的状态?
答案 0 :(得分:13)
你肯定问过一口 - 不幸的是, state 这个词在很多不同的语境中使用,但每一个都是对这个词的有效用法。
申请状态
应用程序的状态大致是其内存的全部内容。这可能是一个难以理解的概念,直到你看到像Erlang's server loops这样的东西,它明确地将一个变量中的应用程序的所有 state 从一个函数的调用传递到下一个。在更“正常”的编程语言中,程序的“状态”是它的全局变量,静态变量,堆上分配的对象,堆栈上分配的对象,寄存器,打开文件描述符和文件偏移,开放网络套接字和相关联内核缓冲区等等。
你可以实际保存该状态并在其他地方继续执行该进程。 Linux的BLCR checkpoint tools就是这样做的。 (虽然这是一项非常罕见的任务。)
协议状态
协议的状态是一种不同的含义 - HTTP请求的无状态意味着每个Web浏览器与Web服务器的通信基本上从头开始 - 每个cookie都在两个方向上重新传输以尝试“为了用户的利益,假冒“一些”会话“。对于任何给定的客户端,服务器不会为请求保持任何资源 - 每个资源都从头开始。
网络文件系统也可能是无状态的(早期版本的NFS)或有状态的(较新版本的NFS)。早期版本假设读取,写入或元数据控制的每个单独的数据包在到达时都将提交,并且每次从文件中需要特定字节时,它将被重新请求。这使得服务器非常简单 - 它们将执行客户端数据包告诉他们要做的事情,并且如果服务器重新启动或路由器消失,则不需要努力使服务器和客户端恢复一致性。但是,这对性能不利 - 每个客户每天都要求数百或数千次静态数据。因此,较新版本的NFS允许客户端上的一些数据缓存,以及服务器和客户端之间的持久文件句柄,并且服务器必须跟踪已连接的客户端的状态 - 以及反之亦然:客户还必须知道他们对服务器的承诺。
stateful firewall将跟踪活动的TCP会话。它知道系统管理员希望允许通过哪些会话,因此它会专门查找initial packets个会话。设置会话后,它会将已建立的连接作为自己权限的实体进行跟踪。 (这是以前无状态防火墙的真正进步,它们将数据包隔离开来 - 以前防火墙上的规则集更容易实现相同级别的功能,但允许通过太多的假装会话已经激活的恶意数据包。 )
答案 1 :(得分:2)
应用程序状态是所有类都可用的数据存储库。应用程序状态存储在服务器的内存中,比在数据库中存储和检索信息更快。与会话状态(特定于单个用户会话)不同,应用程序状态适用于所有用户和会话。因此,应用程序状态是存储少量常用数据的有用位置,这些数据不会从一个用户更改为另一个用户。
资源:http://msdn.microsoft.com/en-us/library/ms178594.aspx
答案 2 :(得分:2)
应用程序状态只是应用程序所处的状态,关于程序执行的位置以及为应用程序存储的内存。网络是“无状态的”,这意味着每次重新加载页面时,页面的先前版本都不会保留任何信息。必须从服务器重新发送所有信息才能显示该页面。
从技术上讲,浏览器通过使用缓存和cookie等技术来解决网络的无状态问题。
答案 3 :(得分:2)
是否正在传输内存,缓存和注册系统的值足以传输正在运行的应用程序的状态?
应用程序是否打开文件,位于字节225?如果是这样,该文件是应用程序的状态的一部分,因为写入的下一个字节应该转到226位。
应用程序是否已使用基于时间的密钥对安全服务器进行身份验证?然后该连接是应用程序的状态的一部分,因为如果应用程序在保存内存,缓存和寄存器值后暂停24小时,则在恢复时它将不再具有有效的连接安全服务器,因为它会超时。
使应用程序有状态的事情很容易被忽视。