当前位置: 首页 > news >正文

Linux进程地址空间(12)

文章目录

  • 前言
  • 一、进程空间地址
    • 基本概念
    • 代码分析
  • 二、如何理解地址空间
  • 三、进一步理解页表和写实拷贝
    • 对虚拟地址的进一步深入
    • fork() 的两个返回值?
  • 总结


前言

  融会贯通!
  本篇会让你再次对计算机世界里面的大智慧感到汗颜!

  本篇研究环境基于 Linux kernel 2.6.32 的32位平台


一、进程空间地址

基本概念

  • 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。
  • 初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据。
  • 未初始化过的数据(BSS):在程序运行初未对变量进行初始化的数据。
  • 栈 (Stack):存储局部、临时变量,函数调用时,存储函数的返回指针,用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈。
  • 堆 (Heap):存储动态内存分配,需要程序员手工分配,手工释放.注意它与数据结构中的堆是两回事,分配方式类似于链表。

代码分析

在这里插入图片描述
  多的不说,我们通过以下代码来感受以下:

在这里插入图片描述
  结果如下:
在这里插入图片描述
  但我们所见的地址就是内存里面真实的物理地址吗?请看下面代码:
在这里插入图片描述

在这里插入图片描述
从上面的测试结果我们可以看到发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:

  • 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量。
  • 但地址值是一样的,说明,该地址绝对不是物理地址!
  • 在Linux地址下,这种地址叫做 虚拟地址。
  • 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理。

OS必须负责将 虚拟地址 转化成 物理地址,怎么做到的?如下图:

在这里插入图片描述

  使用系统调用接口创建新的进程时,fork后的数据代码,父子进程将会同时执行,同时增加新的进程控制块(tast_struct),父子进程通过刚开始相同的页表指向相同的物理空间,其所使用的进程地址空间对应的位置也是相同的,父子进程指向同一个g_val,因此,父进程和子进程对应的g_val的地址是相同的,但是,当子进程尝试修改g_val变量时,为保证进程的独立性,操作系统识别到当前子进程通过页表找到g_val,想修改g_val,此时,操作系统会重新开辟一段空间,将上述值拷贝下来,修改映射关系,因此使用不同的物理内存地址,互不影响,互相独立

  其实,这就是我们前面一直提到过的 写实拷贝 !!!

  由此,我们自然而然地会想出以下问题:

一、为什么要写时拷贝呢?写时拷贝的效率会不会很低呢?

  通过调整拷贝的时间顺序,达到有效节省空间的效果。

  写时拷贝的效率并不会很低,因为如果不写时拷贝,需要将父进程的所以数据拷贝一份,而写时拷贝只需要将需要修改的数据拷贝一份,最坏情况也是跟不写时拷贝的效率一样。

二、可不可以直接将父进程的数据全部拷贝到新的空间呢?

  可以,但是没有必要这么做。

  因为子进程是能够访问父进程的数据的,大部分情况下,是不需要进行全部拷贝过来,那样太浪费空间了;我们通常是要进行写入的时候,OS才会要写入的变量复制一份,重新开一个大小一样的空间,在新开的空间内写入数据,再将新空间的地址交给页表。这是按需申请。通过调整拷贝的时间顺序,达到节省空间的目的。

二、如何理解地址空间

  举个例子,如果需要将桌子划分为两块该如何划分,假设桌子长度为100厘米。我们可以将桌子划分为左边区域和右边区域,左边区域为[1,50],右边区域为[50,100]。用计算机语言描述则可以通过两个结构体来描述,一个描述区域宽度,一个描述哪个区域

struct area
{int start;int end;
}struct desktop
{struct area left;struct area right;
}struct desktop d;//me(我比较霸道,占的多一些)
d.left.start=1;
d.left.end=70;//同桌
d.right.start=71;
d.right.end=100;
struct task_struct
{/*...*/struct mm_struct* mm; //对于普通的⽤⼾进程来说该字段指向他的//虚拟地址空间的⽤⼾空间部分,对于内核线程来说这部分为NULL。struct mm_struct* active_mm; // 该字段是内核线程使⽤的。当该// 进程是内核线程时,它的mm字段为NULL,表⽰没有内存地址空间,可也并不是真正的没有,这是因为所// 有进程关于内核的映射都是⼀样的,内核线程可以使⽤任意进程的地址空间。/*...*/
}

在这里插入图片描述

  地址空间本质就是内核中的一个结构体对象

那么,为什么要有地址空间?

  1. 将无序变成有序,让进程以统一的视角看待物理内存以及自己运行的各个区域。
  2. 进程管理模块和内存管理模块进行解耦
  3. 拦截非法请求—对物理内存的保护。

  可以说,mm_struct结构是对整个⽤⼾空间的描述。每⼀个进程都会有⾃⼰独⽴的mm_struct,这样每⼀个进程都会有⾃⼰独⽴的地址空间才能互不⼲扰

三、进一步理解页表和写实拷贝

  页表还有一些其他的作用,1、判断该物理地址是否在内存中(进程挂起情况) 2、识别rwx权限(常量区不能修改值情况)

在这里插入图片描述
当操作系统判断出地址不在内存中时还会做进一步判断:

  1. 是不是数据不在物理内存
  2. 是不是数据需要写时拷贝
  3. 如果都不是才能异常处理

在这里插入图片描述

对于写实拷贝,我们再来仔细回顾下它的定义:

  父子进程创建时使用相同的虚拟地址,而进行修改时,经操作系统识别,重新复制一份,并开辟新的空间,经过页表映射的是不同的物理地址,此时修改的是不同的物理地址的数据,其虚拟地址不受影响

  写时拷贝(Copy-on-write,简称COW)是一种计算机程序设计领域的优化策略。其核心思想是,如果有多个调用者(callers)同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。这过程对其他的调用者都是透明的。此作法主要的优点是如果调用者没有修改该资源,就不会有副本(private copy)被创建,因此多个调用者只是读取操作时可以共享同一份资源

对虚拟地址的进一步深入

  在最开始的时候,进程地址空间和页表里面的数据从哪里来的呢

  是从可执行程序内部来的。程序里面本身就有地址!!!这个地址就是虚拟地址(逻辑地址)。我们的可执行程序里面已经没有变量名和函数名,都变成了地址

objdump -S 可执行程序  # 查看反汇编

在这里插入图片描述

  所以说,创建一个进程,就会创建一个task_struct,地址空间,页表和物理内存

fork() 的两个返回值?

  这个时候我们就可以再来回顾一下,通常来说,一个函数是返回一个返回值,可这个 fork() 函数怎么就那么特殊呢?

  pid_t id 是属于父进程的栈空间中定义的

  fork 内部 return 会被执行两次,return 的本质就是通过寄存器将返回值写入到接收返回值的变量中。当我们的 id = fork() 时,谁先返回,谁就要发生 写时拷贝。所以,同一个变量会有不同的返回值,本质是因为大家的虚拟地址是一样的,但大家的物理地址是不一样的

下面给出 DeepSeek 的回复

在这里插入图片描述


总结

  精妙的设计,不得不感概计算机殿堂前辈们的智慧!!!

相关文章:

Linux进程地址空间(12)

文章目录 前言一、进程空间地址基本概念代码分析 二、如何理解地址空间三、进一步理解页表和写实拷贝对虚拟地址的进一步深入fork() 的两个返回值? 总结 前言 融会贯通!   本篇会让你再次对计算机世界里面的大智慧感到汗颜! 本篇研究环境基…...

鸿蒙开发04界面渲染

文章目录 前言一、条件渲染1.1 if/else1.2 属性控制1.3 可见性 二、循环渲染三、滚动渲染3.1 下拉刷新3.2 上拉加载 前言 在声明式描述语句中开发者除了使用系统组件外,还可以使用渲染控制语句来辅助UI的构建,这些渲染控制语句包括控制组件是否显示的条…...

CANoe CAPL——Ethernet CAPL函数

CANoe CAPL——CAN CAPL函数 事件过程(Event Procedures) 函数名简要描述on ethernetErrorPacket收到错误的以太网数据包时调用。on ethernetMacsecStatus当物理端口的以太网 MACsec 连接状态变化时调用。on ethernetPacket接收到以太网数据包后调用。…...

语法: setup_lcd (mode, prescale, [segments]);

SETUP_LCD( ) 语法: setup_lcd (mode, prescale, [segments]); 参数: mode可能是来自devices.h头文件如下常数: LCD_DISABLED, LCD_STATIC, LCD_MUX12, LCD_MUX13, LCD_MUX14 下面的参数:STOP_ON_SLEEP, USE_TIMER_1可同上面的LCD_DISABLED, LCD_STATIC, LCD_MUX12, LCD…...

微前端随笔

✨ single-spa: js-entry 通过es-module 或 umd 动态插入 js 脚本 ,在主应用中发送请求,来获取子应用的包, 该子应用的包 singleSpa.registerApplication({name: app1,app: () > import(http://localhost:8080/app1.js),active…...

实操(不可重入函数、volatile、SIGCHLD、线程)Linux

1 不可重入函数 为什么会导致节点丢失内存泄露?main函数在执行insert,但是没执行完就被信号中断了,又进了这个函数里,所以这个insert函数在不同的执行流中,同一个函数被重复进入,如果没有问题,…...

如何在Linux系统上通过命令调用AI大模型?

如何在Linux系统上通过命令调用AI大模型? 文章目录 如何在Linux系统上通过命令调用AI大模型?一、准备工作二、编写API调用脚本三、配置命令行工具 使用AI命令帮我做一个文档总结提问技术问题编写简单的shell脚本帮我写一个docker-compose 在这个AI技术飞…...

数据分析-Excel-学习笔记Day1

Day1 复现报表聚合函数:日期联动快速定位区域SUMIF函数SUMIFS函数环比、同比计算IFERROR函数混合引用单元格格式总结汇报 拿到一个Excel表格,首先要看这个表格的构成(包含了哪些数据),几行几列,每一列的名称…...

负载均衡是什么,Kubernetes如何自动实现负载均衡

负载均衡是什么? 负载均衡(Load Balancing) 是一种网络技术,用于将网络流量(如 HTTP 请求、TCP 连接等)分发到多个服务器或服务实例上,以避免单个服务器过载,提高系统的可用性、可扩…...

洞察 Linux 进程管理

一、进程和线程的概念 1.进程 (1)概念 进程是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位。进程是程序的执行实例,拥有独立的资源(如内存、文件描述符等)。每个进程在创建时会被…...

http协议版本的区别 -- 2和3

目录 http2和http3的区别 传输层协议 QUIC协议 介绍 连接建立与握手 建立安全连接的过程 RTT 建连为什么需要两个过程 原因 解决 QUIC协议的1-RTT 建连 必要性 连接过程 第一次握手(Client Hello) 版本号 key_share 其他 第二次握手 介绍 Server Hello 身…...

Vue2-实现elementUI的select全选功能

文章目录 使用 Element UI 的全选功能自定义选项来模拟全选 在使用 Element UI 的 el-select组件时,实现“全选”功能,通常有两种方式:一种是使用内置的全选功能,另一种是通过自定义选项来模拟全选。 使用 Element UI 的全选功能…...

Spring Boot 与 TDengine 的深度集成实践(四)

优化与扩展 批量插入数据 在实际应用中,当需要插入大量数据时,逐条插入会导致性能低下,因为每次插入都需要建立数据库连接、解析 SQL 语句等操作,这些操作会带来额外的开销 。为了提高数据插入效率,我们可以采用批量…...

2025年【山东省安全员C证】考试题及山东省安全员C证考试内容

在当今建筑行业蓬勃发展的背景下,安全生产已成为企业生存与发展的基石。安全员作为施工现场安全管理的直接责任人,其专业能力和资质认证显得尤为重要。山东省安全员C证作为衡量安全员专业水平的重要标准,不仅关乎个人职业发展,更直…...

提升Spring Boot开发效率的Idea插件:Spring Boot Helper

一、Spring Boot Helper插件介绍 Spring Boot Helper是一款专为Spring Boot开发者设计的IntelliJ IDEA插件,它提供了丰富的功能来简化和加速Spring Boot应用程序的开发过程。 该插件能够智能识别Spring Boot项目结构,提供专属的代码生成、配置辅助和运…...

【USTC 计算机网络】第三章:传输层 - 面向连接的传输:TCP

本文介绍了面向连接的传输协议:TCP,首先介绍 TCP 报文段的结构以及如何设置超时定时器,接着介绍 TCP 如何实现可靠数据传输以及流量控制,最后介绍 TCP 中最重要的三次握手与四次挥手的连接建立与关闭过程。 1. TCP 概述与段结构 …...

Linux主要开发工具之gcc、gdb与make

此系列还有两篇,大家想完整掌握可以阅读另外两篇 Linux文本编辑与shell程序设计-CSDN博客 Linux基础知识详解与命令大全(超详细)-CSDN博客 1.gcc编译系统 1.1 文件名后缀 文件名后缀 文 件 类 型 文件名后缀 文 件 类 型 .c C源…...

23种设计模式-行为型模式-观察者

文章目录 简介问题解决代码关键实现说明 总结 简介 观察者是一种行为设计模式, 允许你定义一种订阅通知机制, 可在事件发生时通知多个“观察/订阅”该对象的其他对象。 问题 假如你有两种类型的对象: 顾客和商店。顾客对某个新品非常感兴趣&#xff0…...

去中心化预测市场

去中心化预测市场 核心概念 预测市场类型: 类别型市场:二元结果(YES/NO),例如“BTC在2024年突破10万美元?” 多选型市场:多个选项(如总统候选人),赔付基于…...

springboot-ai接入DeepSeek

1、引入pom依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId> </dependency><dependencyManagement><dependencies><dependency><groupId>o…...

【C语言】数据在内存中的储存(整形)

目录 前言&#xff1a; 预备知识 整数在内存中的储存 原码 反码 补码 总结&#xff1a; 前言&#xff1a; 在上两章中讲解了五大内存函数&#xff0c;其中memchr函数&#xff0c;这个函数考察到数据内存的存储。 接下来为大家讲解整数在内存中的储存。 预备知识 认识…...

PCL 树木树干粗提取(地基数据,TLS)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 主要的思路如下: 1、首先,使用之前的CSF算法提取点云的地面点,在提取的过程中我们可以得到一个布料结构(地面模型)。 2、在得到这个布料结构之后,我们也就可以得到整个地面模型的高度了,之后我们只需要遍历每…...

Spring 中的 IOC

&#x1f331; 一、什么是 IOC&#xff1f; &#x1f4d6; 定义&#xff08;通俗理解&#xff09;&#xff1a; IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09; 是一种设计思想&#xff1a;对象不再由你自己创建和管理&#xff0c;而是交给 Spring 容器…...

尚硅谷2019版Java集合和泛型

第十一章 Java集合框架 集合框架全景图 mindmaproot((Java集合))Collection单列List有序可重复ArrayListLinkedListVectorSet无序唯一HashSetLinkedHashSetTreeSetMap双列HashMapLinkedHashMapTreeMapHashtablePropertiesToolsCollectionsArrays三大核心接口对比 特性ListSe…...

车载诊断架构 --- 整车重启先后顺序带来的思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...

华为eNSP:实验 配置单区域集成ISIS

单区域集成ISIS是一种基于中间系统到中间系统&#xff08;IS-IS&#xff09;协议的网络架构优化方案&#xff0c;主要用于简化网络设计并提升数据传输效率。其核心特点包括&#xff1a; ‌单一区域部署‌ ISIS协议在单一逻辑区域内运行&#xff0c;消除多区域间的分层复杂性&am…...

常见框架漏洞(五)----中间件IIS6

一、【PUT漏洞】 漏洞描述&#xff1a;IIS Server 在 Web 服务扩展中开启了 WebDAV &#xff0c;配置了可以写⼊的权限&#xff0c;造成任意⽂件上传。 版本&#xff1a;IIS 6.0 1. 环境 fofa搜素环境&#xff1a;"IIS-6.0" 或者环境搭建&#xff1a;本地搭建2003…...

leetcode221.最大正方形

class Solution {public int maximalSquare(char[][] matrix) {int result 0; // 记录正方形边长int m matrix.length, n matrix[0].length;int[][] dp new int[m 1][n 1];// 动态规划for (int i 1; i < m; i) {for (int j 1; j < n; j) {if (matrix[i - 1][j - …...

C++实现AVL树

一 AVL树的概念 上上节我们学习了二叉搜索树&#xff0c;他的理想查找的时间复杂度是o(log n)&#xff0c;但是如果是下面这种情况&#xff0c;那么它的时间复杂度就会变成o(n). 这种情况就是出现一边高的那种&#xff0c;它的个数和它的高度相差不大。 那么这样就会把二叉搜索…...

Linux系统安全及应用

目录 一.账号安全措施 1.1系统账号清理 1.1.1将非登录用户的shell设为无法登录 1.1.2删除无用用户 userdel 1.1.3锁定账号文件 1.1.4锁定长期不使用的账号 1.2密码安全控制 1.2.1 对新建用户 1.2.2对已有用户 1.3命令历史限制 1.3.1临时清除历史命令 1.3.2限制命令…...

JAVA反序列化深入学习(十三):Spring2

让我们回到Spring Spring2 在 Spring1 的触发链上有所变换&#xff1a; 替换了 spring-beans 的 ObjectFactoryDelegatingInvocationHandler使用了 spring-aop 的 JdkDynamicAopProxy &#xff0c;并完成了后续触发 TemplatesImpl 的流程 简而言之&#xff0c;换了一个chain&am…...

迭代器运算详解(四十二)

1. 迭代器的随机访问运算 对于 vector 和 string 这样的容器&#xff0c;它们的迭代器支持以下随机访问运算符&#xff1a; 运算符说明iter n返回一个新的迭代器&#xff0c;该迭代器比原来的迭代器 iter 向前移动了 n 个位置&#xff08;即指向后面的第 n 个元素&#xff0…...

Linux中Squid服务常用操作

在 Linux 中 Squid 服务常用操作介绍 1. Squid 基础操作 启动 Squid # 前台启动&#xff08;调试用&#xff09; squid -N -d 1# 后台启动&#xff08;-s 表示将日志输出到 syslog&#xff09; squid -s停止 Squid # 安全停止&#xff08;需配置 pid_file&#xff09; squid…...

Linux操作系统--进程的概念

目录 1.了解进程前的前景知识 冯诺依曼体系结构 操作系统(OS) 2.进程 2.1进程的概念 2.2描述进程-PCB 2.2.1task_struct 2.3查看进程 2.4通过系统调用获取进程的标识符 2.5认识fork()--创建进程 该专栏会持续更新 更新时间一周一更。下周更新内容进程状态 1.了解进程前…...

C++假期练习

思维导图 牛客练习...

HTML零基础入门笔记:狂神版

前言 本笔记是学习狂神的java教程&#xff0c;建议配合视频&#xff0c;学习体验更佳。 【狂神说Java】HTML5完整教学通俗易懂_哔哩哔哩_bilibili 第1-2章&#xff1a;Java零基础入门笔记&#xff1a;(1-2)入门&#xff08;简介、基础知识&#xff09;-CSDN博客 第3章&…...

算法竞赛备赛——【图论】链式前向星

图论 图的存储方式&#xff1a; 通用的三种&#xff1a;邻接矩阵、邻接表、边集数组 有向图&#xff1a;十字链表 无向图&#xff1a;多重邻接表 刷题常用&#xff1a;邻接矩阵、链式前向星&#xff08;邻接表变形&#xff09; 链式前向星 算法题常用: 邻接矩阵、二维vector模…...

JAVA_类和对象

目录 1.面向对象的初步认知 1.1.什么是面向对象 1.2.面向对象与面向过程 2.类的定义和使用 2.1.简单认识类 2.2类的定义格式 2.3.练习 学生类 动物类&#xff08;可爱猫猫&#x1f431;&#xff09; 3.类的实例化 3.1.什么是实例化 3.2.类和对象的说明 4.this引用…...

高频面试题(含笔试高频算法整理)基本总结回顾65

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…...

数据库系统-数据库控制

并发控制 事务的ACID特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务包含的所有操作要么全部成功&#xff08;commit提交&#xff09;&#xff0c;要么全部失败&#xff08;rollback回滚&#xff09;一致性&#xff08;Consistency&#xff09;&a…...

Python Cookbook-5.3 根据对象的属性将对象列表排序

任务 需要根据各个对象的某个属性来完成对整个对象列表的排序。 解决方案 DSU方法仍然一如既往地有效: def sort_by_attr(sed,attr):intermed [ (getattr(x,attr),i,x) for i,x in enumerate(seg)]intermed.sort()return [ x[-1] for x in intermed def sort_by_attr_inpl…...

Java MCP SDK 开发笔记(一)

MCP 简介 AI 大模型诞生之初&#xff0c;其高度模拟人的对话之能力惊为天人。但我们肯定不希望止步于此—— 工具化就是我们希望 AI 能够完成的目标&#xff0c;由此可以从单纯的对话发展为代替繁复人力的“干活”。这条道路上毋庸置疑 AI 大模型任重道远。而 MCP(Model Contr…...

AF3 OpenFoldDataLoader类_prep_batch_properties_probs方法解读

AlphaFold3 data_modules 模块的 OpenFoldDataLoader 类的 _prep_batch_properties_probs 方法是为每个批次数据准备 recycling 维度 的概率分布。它将根据配置文件中的设定为每个批次数据生成 recycling 轮次的概率分布,并存储到 prop_probs_tensor 中,用于后续抽样选择特定…...

寻找字符串数组中的最长共同前缀字符串

问题描述&#xff1a;给定一个字符串数组 strs&#xff0c;编写一个函数来找到这些字符串的最长公共前缀字符串&#xff0c;如果没有则返回空字符串"" 算法思路 横向扫描法&#xff1a; 从数组的第一个字符串开始&#xff0c;逐个和后面的字符串比较&#xff0c;逐…...

leetcode_数组 56. 合并区间

56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;int…...

Jenkins学习(B站教程)

文章目录 1.持续集成CI2.持续交付CD3.持续部署4.持续集成的操作流程5.jenkins简介6.后续安装部署&#xff0c;见视频 bilibili视频 Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要用…...

学习笔记—C++—类和对象(一)

目录 类和对象 类的定义 类定义格式 访问限定符 类域 实例化 实例化概念 对象的大小 this指针 C和C语言实现Stack对比 类和对象 类的定义 类定义格式 ● class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后…...

PyTorch 深度学习 || 6. Transformer | Ch6.3 Transformer 简单案例

1. 简单案例 这个代码是一个简单的 Transformer 模型的实现,这个例子展示了一个基本的序列到序列(seq2seq)任务,比如将一个数字序列转换为另一个数字序列。可以用于学习和理解 Transformer 的基本结构和工作原理。 import torch import torch.nn as nn import math# 位置…...

体育风暴篮球足球体育球员综合资讯网站模板

源码名称&#xff1a;篮球足球体育球员综合资讯网站模板 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 带软件采集&#xff0c;可以挂着自动采集发布&#xff0c;无需人工操作&#xff01; 演示地址&#xff1a;https://www.52muban.com/shop/184016.html …...

Visual Studio Code SSH 连接超时对策( keep SSH alive)

文章目录 问题解决方法一&#xff1a;配置服务端关于ClientAliveInterval和ClientAliveCountMax1、打开终端&#xff0c;打开SSH配置文件&#xff1a;输入以下命令&#xff1a;2、打开配置文件后&#xff0c;添加以下内容&#xff1a;3、添加后&#xff0c;Esc按 <Enter>…...