为什么是操作系统

从计算平台演进史看 Agent 时代的入口争夺与底座价值

摘要

每一次计算平台的范式转移,都会催生一个新的"操作系统级"机会。从大型机到 PC,从 PC 到移动互联网,再从移动互联网到 AI Agent 时代,硬件形态、交互方式、开发者生态和商业模式都在发生结构性重构。本文试图回答一个核心问题:为什么在 Agent 时代,最终的入口争夺与底座价值,仍然会收敛到"操作系统"这一层?

我们将从计算平台演进史出发,梳理操作系统作为"抽象层 + 调度器 + 生态入口"的三重本质,分析 Agent 时代的新变量(大模型、工具调用、多智能体协作、记忆与权限),并通过完整的代码示例展示一个"迷你 Agent 操作系统"的核心骨架,最后给出对创业者、开发者和投资人的启示。


一、引言:每一次平台迁移,都是一次"操作系统"的重定义

回顾过去 60 年,计算平台的演进可以粗略划分为四个阶段:

阶段代表硬件代表操作系统核心交互入口
大型机IBM System/360OS/360批处理、终端终端
PCIBM PC、MacintoshMS-DOS、Windows、macOS键盘 + 鼠标桌面
移动互联网iPhone、Android 手机iOS、Android触屏 + 语音App Store
AI Agent手机、PC、眼镜、机器人?自然语言 + 多模态?

每一个阶段,都有一个"操作系统"成为整个生态的底座:它定义了抽象层(API)、调度资源(CPU/内存/网络/传感器)、托管应用(App/Agent),并掌握分发入口(商店/助手)。

今天,当我们讨论 Agent 时,讨论的其实是同一个问题:谁会成为 Agent 时代的操作系统?

  • 是大模型厂商(OpenAI、Anthropic、Google)?
  • 是终端厂商(Apple、华为、小米)?
  • 是云厂商(AWS、Azure、阿里云)?
  • 还是新型的 Agent 平台(LangChain、AutoGPT、Manus 类产品)?

要回答这个问题,我们必须先理解操作系统"为什么存在"。


二、操作系统的三重本质:抽象、调度、入口

2.1 抽象层:把复杂硬件变成简单 API

操作系统最原始的价值,是把五花八门的硬件抽象成统一的接口。程序员不需要关心磁盘是哪个品牌,只需要调用 open() / read() / write()。

在 Agent 时代,这个"硬件"变成了:

  • 各种大模型(GPT、Claude、Qwen、Llama)
  • 各种工具(搜索、代码执行、浏览器、数据库)
  • 各种记忆存储(向量库、KV、文件系统)
  • 各种传感器(摄像头、麦克风、位置)

Agent 操作系统要做的第一件事,就是把这些异构能力抽象成统一接口。

2.2 调度器:决定"谁在什么时候用什么资源"

传统 OS 调度的是 CPU 时间片、内存页、IO 带宽。Agent OS 调度的是:

  • Token 预算
  • 工具调用权限
  • 上下文窗口
  • 多 Agent 之间的协作顺序
  • 人类审批的插入点

这本质上是一个资源受限下的任务调度问题,和传统 OS 惊人地相似。

2.3 入口:谁掌握分发,谁就掌握生态

Windows 靠"开始菜单 + 桌面"掌握入口,iOS 靠"App Store + 主屏"掌握入口。Agent 时代的入口可能是:

  • 系统级语音助手(Siri、小爱同学)
  • 浏览器(Chrome + Gemini)
  • 输入法 / 超级 App
  • 独立的 Agent 客户端

谁定义了入口,谁就定义了操作系统的形态。


三、Agent 时代的新变量:为什么这次不一样?

3.1 从"确定性调用"到"概率性推理"

传统 OS 的 API 是确定性的:read() 一定返回字节流。Agent OS 的 API 是概率性的:同一个 prompt,两次调用可能返回不同结果。

这意味着 Agent OS 必须内置重试、验证、回滚机制。

3.2 从"进程隔离"到"权限隔离"

传统 OS 用进程隔离保证安全。Agent OS 面对的是:一个 Agent 可能调用另一个 Agent,甚至调用外部工具,如何保证它不会越权?

答案是能力(Capability)模型:每个 Agent 只持有它被授予的能力令牌。

3.3 从"人操作机器"到"机器替人操作"

这是最根本的变化。传统 OS 的调用者是程序员;Agent OS 的调用者是 Agent 本身。操作系统必须为"非人类用户"设计接口。


四、动手:实现一个迷你 Agent 操作系统

下面我们用 Python 实现一个简化的 Agent OS 骨架,包含四个核心模块:

  1. Kernel:注册 Agent 和 Tool,负责任务调度
  2. Capability:权限令牌系统
  3. Memory:短期 + 长期记忆
  4. Scheduler:基于 Token 预算的调度

代码完整可运行,依赖仅标准库。

"""
mini_agent_os.py
一个迷你 Agent 操作系统的骨架实现
包含:Kernel / Capability / Memory / Scheduler
"""

from __future__ import annotations
import time
import uuid
from dataclasses import dataclass, field
from typing import Callable, Any


# ============================================================
# 1. Capability:能力令牌系统
# ============================================================
@dataclass(frozen=True)
class Capability:
    """一个不可伪造的能力令牌,代表对某资源的访问权限"""
    name: str
    token: str = field(default_factory=lambda: uuid.uuid4().hex)


class CapabilityManager:
    """管理能力令牌的发放与校验"""

    def __init__(self) -> None:
        self._granted: dict[str, set[str]] = {}  # agent_id -> {cap_name}

    def grant(self, agent_id: str, cap: Capability) -> None:
        self._granted.setdefault(agent_id, set()).add(cap.name)

    def check(self, agent_id: str, cap_name: str) -> bool:
        return cap_name in self._granted.get(agent_id, set())


# ============================================================
# 2. Memory:短期 + 长期记忆
# ============================================================
class Memory:
    """极简记忆系统:短期用列表,长期用字典模拟向量库"""

    def __init__(self, short_term_limit: int = 10) -> None:
        self.short_term: list[str] = []
        self.short_term_limit = short_term_limit
        self.long_term: dict[str, str] = {}

    def remember(self, content: str) -> None:
        self.short_term.append(content)
        if len(self.short_term) > self.short_term_limit:
            # 溢出时压缩进长期记忆
            oldest = self.short_term.pop(0)
            key = f"mem_{len(self.long_term)}"
            self.long_term[key] = oldest

    def recall(self, top_k: int = 3) -> list[str]:
        """模拟检索:返回最近的 top_k 条短期记忆"""
        return self.short_term[-top_k:]


# ============================================================
# 3. Tool:可被 Agent 调用的工具
# ============================================================
@dataclass
class Tool:
    name: str
    required_cap: str
    func: Callable[..., Any]

    def invoke(self, *args, **kwargs) -> Any:
        return self.func(*args, **kwargs)


# ============================================================
# 4. Agent:最小的智能体
# ============================================================
@dataclass
class Agent:
    agent_id: str
    name: str
    memory: Memory
    handler: Callable[["Agent", str, "Kernel"], str]

    def run(self, task: str, kernel: "Kernel") -> str:
        kernel.log(f"[Agent:{self.name}] 收到任务: {task}")
        result = self.handler(self, task, kernel)
        self.memory.remember(f"任务:{task} -> 结果:{result}")
        return result


# ============================================================
# 5. Scheduler:基于 Token 预算的调度器
# ============================================================
class Scheduler:
    """模拟 Token 预算调度:每个任务分配固定 token 预算"""

    def __init__(self, total_budget: int) -> None:
        self.total_budget = total_budget
        self.used = 0

    def consume(self, tokens: int) -> bool:
        if self.used + tokens > self.total_budget:
            return False
        self.used += tokens
        return True

    def remaining(self) -> int:
        return self.total_budget - self.used


# ============================================================
# 6. Kernel:操作系统内核
# ============================================================
class Kernel:
    """Agent OS 内核:注册 Agent/Tool,调度任务,校验权限"""

    def __init__(self, token_budget: int = 1000) -> None:
        self.agents: dict[str, Agent] = {}
        self.tools: dict[str, Tool] = {}
        self.caps = CapabilityManager()
        self.scheduler = Scheduler(token_budget)
        self._logs: list[str] = []

    # ---------- 注册 ----------
    def register_agent(self, agent: Agent) -> None:
        self.agents[agent.agent_id] = agent
        self.log(f"注册 Agent: {agent.name}")

    def register_tool(self, tool: Tool) -> None:
        self.tools[tool.name] = tool
        self.log(f"注册 Tool: {tool.name} (需要能力 {tool.required_cap})")

    # ---------- 调度 ----------
    def dispatch(self, agent_id: str, task: str, token_cost: int = 50) -> str:
        if agent_id not in self.agents:
            raise ValueError(f"未注册的 Agent: {agent_id}")

        if not self.scheduler.consume(token_cost):
            raise RuntimeError(
                f"Token 预算不足,剩余 {self.scheduler.remaining()},需要 {token_cost}"
            )

        agent = self.agents[agent_id]
        return agent.run(task, self)

    # ---------- 工具调用(带权限校验) ----------
    def call_tool(self, agent_id: str, tool_name: str, *args, **kwargs) -> Any:
        if tool_name not in self.tools:
            raise ValueError(f"未注册的 Tool: {tool_name}")

        tool = self.tools[tool_name]
        if not self.caps.check(agent_id, tool.required_cap):
            raise PermissionError(
                f"Agent {agent_id} 缺少能力 {tool.required_cap},无法调用 {tool_name}"
            )

        self.log(f"[Tool:{tool_name}] 被 {agent_id} 调用")
        return tool.invoke(*args, **kwargs)

    # ---------- 日志 ----------
    def log(self, msg: str) -> None:
        ts = time.strftime("%H:%M:%S")
        line = f"[{ts}] {msg}"
        self._logs.append(line)
        print(line)

    def dump_logs(self) -> list[str]:
        return list(self._logs)


# ============================================================
# 7. 演示:构建一个"研究 + 搜索 + 总结"的多 Agent 系统
# ============================================================
def demo() -> None:
    kernel = Kernel(token_budget=500)

    # --- 注册工具 ---
    def web_search(query: str) -> str:
        # 模拟搜索
        return f"搜索结果: 关于 '{query}' 的 3 条链接"

    def write_file(path: str, content: str) -> str:
        return f"已写入 {path}: {content[:30]}..."

    kernel.register_tool(Tool("web_search", "net.read", web_search))
    kernel.register_tool(Tool("write_file", "fs.write", write_file))

    # --- 注册 Agent ---
    def researcher_handler(agent: Agent, task: str, k: Kernel) -> str:
        # 使用搜索工具
        search_result = k.call_tool(agent.agent_id, "web_search", task)
        agent.memory.remember(search_result)
        # 汇总
        snippets = agent.memory.recall(top_k=3)
        return f"研究完成,基于 {len(snippets)} 条记忆: {search_result}"

    def writer_handler(agent: Agent, task: str, k: Kernel) -> str:
        # 使用写文件工具
        content = f"报告: {task}"
        k.call_tool(agent.agent_id, "write_file", "/tmp/report.md", content)
        return f"写作完成: {content}"

    researcher = Agent(
        agent_id="agent_researcher",
        name="Researcher",
        memory=Memory(),
        handler=researcher_handler,
    )
    writer = Agent(
        agent_id="agent_writer",
        name="Writer",
        memory=Memory(),
        handler=writer_handler,
    )

    kernel.register_agent(researcher)
    kernel.register_agent(writer)

    # --- 授予能力 ---
    kernel.caps.grant("agent_researcher", Capability("net.read"))
    kernel.caps.grant("agent_writer", Capability("fs.write"))

    # --- 调度任务 ---
    print("\n=== 调度 Researcher ===")
    r1 = kernel.dispatch("agent_researcher", "AI Agent 操作系统趋势", token_cost=100)
    print("结果:", r1)

    print("\n=== 调度 Writer ===")
    r2 = kernel.dispatch("agent_writer", "撰写 Agent OS 报告", token_cost=80)
    print("结果:", r2)

    # --- 演示权限拒绝 ---
    print("\n=== 演示权限拒绝 ===")
    try:
        kernel.call_tool("agent_writer", "web_search", "越权测试")
    except PermissionError as e:
        print("预期错误:", e)

    # --- 演示预算耗尽 ---
    print("\n=== 演示 Token 预算耗尽 ===")
    try:
        for _ in range(10):
            kernel.dispatch("agent_researcher", "大量任务", token_cost=100)
    except RuntimeError as e:
        print("预期错误:", e)

    print(f"\n剩余 Token 预算: {kernel.scheduler.remaining()}")


if __name__ == "__main__":
    demo()

运行上述代码,你会看到类似输出:

[10:00:00] 注册 Tool: web_search (需要能力 net.read)
[10:00:00] 注册 Tool: write_file (需要能力 fs.write)
[10:00:00] 注册 Agent: Researcher
[10:00:00] 注册 Agent: Writer

=== 调度 Researcher ===
[10:00:00] [Agent:Researcher] 收到任务: AI Agent 操作系统趋势
[10:00:00] [Tool:web_search] 被 agent_researcher 调用
结果: 研究完成,基于 1 条记忆: 搜索结果: 关于 'AI Agent 操作系统趋势' 的 3 条链接
...

这个 200 行的迷你系统,已经包含了 Agent OS 的四大核心:

模块对应传统 OS 概念
Capability权限 / 用户组
Memory文件系统 / 页缓存
SchedulerCPU 调度器
Kernel内核 + 系统调用

这就是为什么"操作系统"是正确的类比:Agent 平台最终都会演化出这四个模块。


五、入口争夺:谁会赢?

5.1 三种可能的路径

路径 A:模型厂商向上做 OS
OpenAI、Anthropic 已经在做 Tool Use、Memory、MCP(Model Context Protocol)。它们天然掌握"大脑",只需要补齐"手脚"和"权限"。

路径 B:终端厂商向下做 OS
Apple 的 Apple Intelligence、华为的鸿蒙 + 小艺,把 Agent 直接嵌入系统层,掌握最真实的用户入口。

路径 C:独立 Agent 平台
Manus、LangGraph、Dify 等,从开发者工具切入,逐步向上做入口。

5.2 决定胜负的三个关键

  1. 协议标准:谁能定义 Agent 之间的通信协议(类似 HTTP、POSIX),谁就掌握底座。MCP 是一个有力候选。
  2. 权限模型:用户敢不敢把支付、邮件、日程交给 Agent?谁能解决信任问题,谁就掌握入口。
  3. 开发者生态:有多少开发者愿意为你的平台写 Agent?这决定了长尾能力。

5.3 一个可验证的预测

未来 3 年,会出现以下现象:

  • 主流 OS 都会内置一个"系统级 Agent 运行时"
  • 会出现跨设备的 Agent 协议标准(类似 USB-C 之于充电)
  • “Agent Store” 会像 App Store 一样成为分发入口
  • 权限管理会成为 Agent OS 的核心竞争力,而非模型能力

六、底座价值:为什么"操作系统"是最厚的护城河

6.1 网络效应

App 越多 → 用户越多 → 开发者越多 → App 越多。Agent 时代同理:Agent 越多 → 被调用越多 → 数据越多 → Agent 越强。

6.2 切换成本

用户不会轻易换操作系统,因为数据、习惯、生态都在里面。Agent OS 的切换成本只会更高,因为它掌握你的个人上下文。

6.3 定价权

操作系统层可以收"过路费":App Store 30%、云厂商的算力溢价。Agent OS 的过路费可能是:Token 分成、工具调用抽成、Agent 分发费用。

6.4 数据飞轮

每一次 Agent 调用,都是一次真实世界的反馈。这些数据是模型厂商拿不到的,只有 OS 层能拿到。


七、总结

回到标题的问题:为什么是操作系统?

因为每一次计算平台的迁移,最终都会收敛到一个"抽象 + 调度 + 入口"的底座。Agent 时代不会例外:

  1. 抽象层:把异构模型、工具、记忆抽象成统一 API —— 这就是 Agent OS 的系统调用。
  2. 调度层:
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐