ssh远程连接
远程登录命令使用 ssh 命令可以安全地远程登录到另一台 Linux/Unix 服务器。基本格式如下: 1ssh [用户名@]主机地址 [-p 端口号] 常用示例 使用默认端口(22)登录:ssh root@192.168.1.100 指定其他端口:ssh admin@example.com -p 2222 仅执行一条命令后退出:ssh user@host 'ls -l' 常见选项 选项 说明 -p <port> 指定远程服务器的端口(默认22) -i <keyfile> 使用指定的私钥文件进行身份验证 -l <username> 指定登录用户名(等价于 user@ 语法) -v 显示详细调试信息(可加多个 v 增加详细度) -C 压缩传输数据 -X 启用 X11 图形界面转发 -N 不执行远程命令(常用于端口转发) 首次登录提示第一次连接到某台主机时,ssh 会提示您确认远程主机的指纹: 12The authenticity of host '...' c...
AI领域名词
LLMLarge Language Model,大语言模型,简称大模型。 市面上的大模型基本上都是基于 Transformer 架构设计的。 Token大模型处理数据的最基本单元。 通过 Tokenizer 来进行编码(将输入切分成 Token,然后映射成 Token ID)和解码(将 Token ID 映射成 Token)。 1 个 Tolen,约等于 0.75 个单词,约等于 1.5~2 个汉字。 输入的Token通常比输出Token要贵好几倍,看不同厂商。 Context上下文,大模型每次处理任务时接收到的信息总和(对话历史,用户问题,输出的 Token,工具列表,System Prompt等 )。 大模型的临时记忆体。 Context Window上下文窗口,大模型的 Context 最多能够存储的 Token 数量。 通过 RAG 可以减少文件无关信息对上下文窗口占用。 Prompt提示词。 User Prompt 用户给大模型下达的具体指令或问题。 System Prompt 系统给大模型下达的具体指令或问题。 现在的大部分的产品,不仅仅是个LLM了,基本都进化成 A...
服务器并发模型
服务器并发模型 并发模型决定服务器如何同时管理多个客户端连接和任务。它不是单纯的“使用线程”或“使用 epoll”,而是 I/O 等待方式、事件分发、业务执行、连接状态和资源控制的组合。 先区分两类工作一个网络服务器通常同时面对两类工作: 工作 示例 特点 I/O 工作 accept()、recv()、send()、协议缓冲和连接关闭 通常很短,但会等待网络事件 业务工作 数据库查询、文件压缩、图片处理、调用外部服务 可能耗时,甚至阻塞很久 高并发设计的核心原则是:不要让耗时业务阻塞负责大量连接 I/O 的事件循环。事件循环应尽快完成收发和状态更新;耗时任务通常交给线程池、进程池或异步后端处理。 单线程阻塞模型最简单的服务器在一个线程中顺序处理一个连接: 1234567accept 一个客户端 ↓循环 recv / 处理 / send ↓close ↓再 accept 下一个客户端 优点: 代码最直观,几乎没有共享状态和并发同步问题。 非常适合学习 Socket 基础、验证协议或编写临时工具。 缺点: ...
IO 多路复用
IO 多路复用 I/O 多路复用让一个线程同时等待多个文件描述符的就绪事件。它解决的是“如何高效等待很多连接”,并不自动解决协议拆包、业务耗时、线程安全或发送缓冲区管理问题。 基本工作方式一个事件循环通常执行以下步骤: 123456789将监听 socket 和客户端 socket 加入关注集合 ↓等待:任意 fd 可读、可写或发生错误 ↓遍历本次就绪事件 ↓accept / recv / send,并更新连接状态 ↓继续等待下一轮事件 对于 TCP 服务端,监听 socket 可读通常表示有新连接等待 accept();客户端 socket 可读可能表示有正文、收到 FIN,或出现错误,必须调用 recv() 进一步确认。 就绪不是完成多路复用接口通常给出的是就绪通知: 事件 通常表示 仍需做什么 可读 接收缓冲区有数据、收到 FIN 或有错误 调用 recv();根据返回值区分正文、关闭和错误 可写 发送缓冲区有可用空间...
IO 模型
IO 模型 本文讨论“程序如何等待和读取网络数据”。select、poll、epoll、kqueue 的具体用法集中在《IO多路复用》笔记,避免重复。 理解一次网络读取以 TCP 的 recv() 为例,读取通常包含两个阶段: 12阶段一:等待内核接收缓冲区中出现可读取的数据阶段二:把数据从内核缓冲区复制到用户提供的缓冲区 其中“等待”可能让线程睡眠,也可能立即返回;“复制”通常仍需要 CPU 执行。理解这两个阶段,才能区分阻塞、非阻塞、就绪通知和异步完成通知。 注意:TCP 是字节流。即使 recv() 返回“可读”,也只表示当前至少能读到一些数据或连接状态发生了变化,不表示收到了完整业务消息。消息边界应由应用协议处理。 同步 I/O 与异步 I/O这组概念最容易与“阻塞/非阻塞”混淆。 概念 关键问题 含义 阻塞 / 非阻塞 调用会不会立刻返回 阻塞调用会等待条件满足;非阻塞调用立即返回结果或“暂时不可做” 同步 / 异步 谁负责完成实际 I/O 同步 I/O 中,应用在就绪后自己调用 ...
Socket基础
Socket 基础 本文以 POSIX Socket API 为主,适用于 Linux、macOS 等 Unix-like 系统。Windows 使用 Winsock,函数名大多相同,但需要 WSAStartup() / closesocket() 等额外处理。 什么是 SocketSocket(套接字)是操作系统提供给应用程序的网络通信接口。对程序而言,它通常以文件描述符(int fd)的形式存在,因此可以创建、读写、关闭。 对于一条已经建立的 TCP 连接,通常用以下四元组唯一标识: 1源 IP、源端口、目的 IP、目的端口 例如,客户端 192.168.1.100:50000 连接服务器 192.168.1.10:8080。即使两个客户端连接同一台服务器的同一端口,它们的源端口不同,仍是两条不同的连接。 常见 Socket 类型: 类型 特性 常见协议 SOCK_STREAM 面向连接、可靠、有序的字节流 TCP SOCK_DGRAM 无连接、尽力而为、保留数据报边界 UDP SOCK_RAW 原始套接字,直接处理更底层的报文,通常需要高权...
协议基础
协议基础 协议(Protocol)是通信双方共同遵守的规则:数据如何组织、何时发送、收到后如何响应、出错后如何处理。没有相同的协议,两个程序即使连上同一个 Socket,也无法正确理解对方发送的数据。 网络分层与封装网络通信通常按层设计。初学网络编程时,最常接触的是下面几层: 层次 常见协议或概念 主要职责 应用层 HTTP、DNS、SMTP、自定义协议 定义业务数据的含义,例如“请求页面”“查询域名” 传输层 TCP、UDP 在进程之间传输数据;使用端口区分不同应用 网络层 IP 让数据在不同网络之间到达目标主机;使用 IP 地址 链路层 Ethernet、Wi-Fi 在同一个局域链路上传输帧;使用 MAC 地址 发送数据时,每一层都会给上层数据附加自己的控制信息,这个过程叫封装: 1234567应用数据 ↓ 加 TCP/UDP 首部TCP 段 / UDP 数据报 ↓ 加 IP 首部IP 数据报 ↓ 加以太网或 Wi‑Fi 首部链路层帧 接收方按相反顺序拆除首部,这叫解封装。应用程序通常不需要手动构造 TCP、IP 或链路层首部;操作系统的...
CAS
CASCAS(Compare-And-Swap,更准确地说是 Compare-And-Exchange,比较并交换)是一种原子读-比较-条件写入操作:仅当原子对象仍等于期望值时才写入新值。它是无锁算法的基础工具,但不是比 mutex 更通用或必然更快的替代品。 基本语义std::atomic<T> 提供以下成员函数: 123456bool compare_exchange_weak(T& expected, T desired, std::memory_order success, std::memory_order failure);bool compare_exchange_strong(T& expected, T desired, std::memory_order success, std::memory_order failur...
网络编程基础
网络编程基础网络编程是让不同进程通过网络交换数据的编程技术。两个程序可以在同一台机器、同一个局域网,或互联网的不同位置;它们通常通过操作系统提供的 Socket API 收发数据。 常见场景包括: 浏览器与 Web 服务器通信; 客户端连接游戏、聊天或数据库服务器; 微服务之间的 RPC / HTTP 调用; 文件传输、远程登录、消息队列; 局域网设备发现和实时音视频。 网络编程不等于“调用一次 send()、对方调用一次 recv()”。实际程序还要处理域名解析、连接失败、超时、部分读写、协议解析、并发、资源限制和安全问题。 网络通信的参与者最常见的模式是客户端—服务端(Client–Server): 1234567客户端 服务端创建 socket 创建 socket解析服务器地址 bind 本地地址和端口connect 发起连接 ...
异步机制
异步机制异步把“提交工作”和“取得结果”分开:调用者可以先推进其他工作,稍后再等待结果。它并不保证一定创建线程,也不能替代取消、限流和任务生命周期设计。 核心对象与关系1234产生结果的一端 使用结果的一端std::promise<T> ── set_value/exception ──> std::future<T>std::packaged_task ── 调用可调用对象 ────> std::future<T>std::async ─────── 启动/延迟任务 ────────> std::future<T> 一个 std::future<T> 通常只有一个消费者:get() 只能调用一次。需要让多个消费者读取同一结果时,将 future 转换为 std::shared_future<T>。 类型 何时使用 结果与异常 std::async 简单的一次性计算 自动建立 future 共享状态 std::promise&...



