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

《操作系统导论》第14章读书笔记:插叙:内存操作API

《操作系统导论》第14章读书笔记:插叙:内存操作API

效果图

效果图

—— 杭州 2024-03-30 夜


文章目录

  • 《操作系统导论》第14章读书笔记:插叙:内存操作API
    • 1.内存类型
      • 1.1.栈内存:它的申请和释放操作是编译器来隐式管理的,所以有时也称为自动(automatic)内存。
      • 1.2.堆(heap)内存:其中所有的申请和释放操作都由程序员显式地完成。
    • 2.malloc()调用
    • 3.free()调用
    • 4.常见错误
      • 4.1.忘记分配内存
      • 4.2.没有分配足够的内存:缓冲区溢出(buffer overflow)
      • 4.3.忘记初始化分配的内存
      • 4.4.忘记释放内存:内存泄露(memory leak)
      • 4.5.在用完之前释放内存:悬挂指针(dangling pointer)
      • 4.6.反复释放内存
      • 4.7.错误地调用free()
      • 4.8.补充:为什么在你的进程退出时没有内存泄露
    • 5.底层操作系统支持
    • 6.其他调用和小结
    • 7.补充笔记:malloc()、calloc()、realloc()比较

1.内存类型

1.1.栈内存:它的申请和释放操作是编译器来隐式管理的,所以有时也称为自动(automatic)内存。

void func() {int x; // declares an integer on the stack...
}

1.2.堆(heap)内存:其中所有的申请和释放操作都由程序员显式地完成。

void func() {int *x = (int *) malloc(sizeof(int));...
}
  • 关于这一小段代码有两点说明。首先,你可能会注意到栈和堆的分配都发生在这一行:首先编译器看到指针的声明(int * x)时,知道为一个整型指针分配空间,随后,当程序调用malloc()时,它会在堆上请求整数的空间,函数返回这样一个整数的地址(成功时,失败时则返回NULL),然后将其存储在栈中以供程序使用。

在这里插入图片描述

2.malloc()调用

  • malloc 函数非常简单:传入要申请的堆空间的大小,它成功就返回一个指向新申请空间的指针,失败就返回NULL。man 手册展示了使用malloc 需要怎么做,在命令行输入man malloc,你会看到:
#include <stdlib.h>
...
void *malloc(size_t size);
  • 你也可以传入一个变量的名字(而不只是类型)给sizeof(),但在一些情况下,可能得不到你要的结果,所以要小心使用。例如,看看下面的代码片段:
int *x = malloc(10 * sizeof(int));
printf("%d\n", sizeof(x));
  • 在第一行,我们为10个整数的数组声明了空间,这很好,很漂亮。但是,当我们在下一行使用sizeof()时,它将返回一个较小的值,例如4(在32位计算机上)或8(在64 位计算机上)。原因是在这种情况下,sizeof()但为我们只是问一个整数的指针有多大,而不是我们动态分配了多少内存。
    但是,有时sizeof()的确如你所期望的那样工作:
int x[10];
printf("%d\n", sizeof(x));
  • 在这种情况下,编译器有足够的静态信息,知道已经分配了40个字我。另一个需要注意的地方是使用字符串。如果为一个字符串声明空间,请使用以下习惯用法:malloc(strlen(s) + 1),它使用函数strlen()获取字符串的长度,并加上1,以便为字符串结束符留出空间。这里使用sizeof()可能会导致麻烦。
  • 你也许还注意到malloc()返回一个指向void类型的指针。这样做只是C中传回地址的方式,让程序员决定如何处理它。程序员将进一步使用所谓的强制类型转换(cast),在我们上面的示例中,程序员将返回类型的malloc()强制转换为指向double的指针。强制类型转换实实上没干什么事,只是告诉编译器和其他可能正在读你的代码的程序员:“是的,我知道我在做什么。”通过强制转换malloc()的结果,程序员只是在给人一些信心,强制转换不是程序正确所必须的。

在这里插入图片描述

在这里插入图片描述

3.free()调用

  • 事实证明,分配内存是等式的简单部分。知道何时、如何以及是否释放内存是困难的部分。要释放不再使用的堆内存,程序员只需调用free():
int *x = malloc(10 * sizeof(int));
...
free(x);
  • 该函数接受一个参数,即一个由malloc()返回的指针。因此,你可能会注意到,分配区域的大小不会被用户传入,必须由内存分配库本身记录追踪。

在这里插入图片描述

4.常见错误

4.1.忘记分配内存

许多例程在调用之前,都希望你为它们分配内存。例如,例程strcpy(dst, src)将源字符串中的字符串复制到目标指针。但是,如果不小心,你可能会这样做:

char *src = "hello";
char *dst; // oops! unallocated
strcpy(dst, src); // segfault and die

运行这段代码时,可能会导致段错误(segmentation fault)。

  • 仅仅因为程序编译过了甚至正确运行了一次或多次,并不意味着程序是正确的。

在这个例子中,正确的代码可能像这样:

char *src = "hello";
char *dst = (char *) malloc(strlen(src) + 1);
strcpy(dst, src); // work properly

或者你可以用strdup(),让生活本加轻松。

4.2.没有分配足够的内存:缓冲区溢出(buffer overflow)

char *src = "hello";
char *dst = (char *) malloc(strlen(src)); // too small!
strcpy(dst, src); // work properly

奇怪的是,这个程序通常看起来会正确运行,这取决于如何实现malloc 和许多其他细节。在某些情况下,当字符串拷贝执行时,它会在超过分配空间的末尾处写入一个字节,但在某些情况下,这是无害的,可能会覆盖不再使用的变量。在某些情况下,这些溢出可能具有令人难以置信的危害,实实上是系统中许多安全漏洞的来源。在其他情况下,malloc库总是分配一些额外的空间,因此你的程序实际上不会在其他某个变量的值上涂写,并且工作得很好。还有一些情况下,该程序确实会发生故障和崩溃。

  • 一个宝贵的教训:即使它正确运行过一次,也不意味着它是正确的。

4.3.忘记初始化分配的内存

4.4.忘记释放内存:内存泄露(memory leak)

另一个常见错误称为内存泄露(memory leak),如果忘记释放内存,就会发生。

  • 在长时间运行的应用程序或系统(如操作系统本身)中,这是一个巨大的问题,因为缓慢泄露的内存会导致内存不足,此时需要重新启动。因此,一般来说,当你用完一段内存时,应该确保释放它。请注意,使用垃圾收集语言在这里没有什么帮助:如果你仍然拥有对某块内存的引用,那么垃圾收集器就不会释放它,因此即使在较现代的语言中,内存泄露仍然是一个问题。
  • 在某些情况下,不调用free()似乎是合理的。例如,你的程序运行时间很短,很块就会退出。在这种情况下,当进程死亡时,操作系统将清理其分配的所有页面,因此不会发生内存泄露。虽然这肯定“有效”(请参阅后面的补充),但这可能是一个坏习惯,所以请谨慎选择这样的策略。长远来看,作为程序员的目标之一是养成良好的习惯。其中一个习惯是理解如何管理内存,并在C这样的语言中,释放分配的内存块。即使你不这样做也可以逃脱惩罚,建议还是养成习惯,释放显式分配的每个字节。

4.5.在用完之前释放内存:悬挂指针(dangling pointer)

有时候程序会在用完之前释放内存,这种错误称为悬挂指针(dangling pointer),正如你猜测的那样,这也是一件坏事。随后的使用可能会导致程序崩溃或覆盖有效的内存(例如,你调用了free(),但随后再次调用malloc()来分配其他内容,这重新利用了错误释放的内存)。

4.6.反复释放内存

4.7.错误地调用free()

4.8.补充:为什么在你的进程退出时没有内存泄露

  • 当你编写一个短时间运行的程序时,可能会使用malloc()分配一些空间。程序运行并即将完成:是否需要在退出前调用几次free()?虽然不释放似乎不对,但在真正的意义上,没有任何内存会“丢失”。原因很简单:系统中实际存在两级内存管理。

  • 第一级是由操作系统执行的内存管理,操作系统在进程运行时将内存交给进程,并在进程退出(或以其他方式结束)时将其回收。第二级管理在每个进程中,例如在调用malloc()和free()时,在堆内管理。即使你没有调用free()(并因此泄露了堆中的内存),操作系统也会在程序结束运行时,收回进程的所有内存(包括用于代码、栈,以及相关堆的内存页)。无论地址空间中堆的状态如何,操作系统都会在进程终止时收回所有这些页面,从而确保即使没有释放内存,也不会丢失内存。

  • 因此,对于短时间运行的程序,泄露内存通常不会导致任何操作问题(尽管它可能被认为是不好的形式)。如果你编写一个长期运行的服务器(例如Web 服务器或数据库管理系统,它永远不会退出),泄露内存就是很大的问题,最终会导致应用程序在内存不足时崩溃。当然,在某个程序内部泄露内存是一个更大的问题:操作系统本身。这再次向我们展示:编写内核代码的人,工作是辛苦的……

在这里插入图片描述

在这里插入图片描述

5.底层操作系统支持

  • 你可能已经注意到,在讨论malloc()和free()时,我们没有讨论系统调用。原因很简单:它们不是系统调用,而是库调用。因此,malloc库管理虚拟地址空间内的空间,但是它本身是建立在一些系统调用之上的,这些系统调用会进入操作系统,来请求本多内存或者将一些内容释放回系统。

  • 最后,你还可以通过mmap()调用从操作系统获取内存。通过传入正确的参数,mmap()可以在程序中创建一个匿名(anonymous)内存区域——这个区域不与任何特定文件相关联,而是与交换空间(swapspace)相关联,稍后我们将在虚拟内存中详细讨论。这种内存也可以像堆一样对待并管理。阅读mmap()的手册页以获取本多详细信息。

在这里插入图片描述

6.其他调用和小结

在这里插入图片描述

7.补充笔记:malloc()、calloc()、realloc()比较

当涉及到动态内存分配时,malloc(), calloc(), 和 realloc() 是 C 语言标准库中的三个重要函数。以下是这三个函数的比较表格:

特征/函数malloc()calloc()realloc()
功能分配指定大小的内存块分配指定数量的连续内存块,并将每一块初始化为 0改变先前分配的内存块的大小
参数需要分配的内存块大小(以字节为单位)内存块的数量和每个块的大小(以字节为单位)指向先前分配的内存块的指针以及新的内存大小
返回值指向分配的内存块的指针,如果分配失败则返回 NULL指向分配且初始化的内存块的指针,如果分配失败则返回 NULL指向重新分配的内存块的指针,如果分配失败则返回 NULL
初始化不初始化内存块,内存块的内容不确定将内存块的每个字节都初始化为 0不初始化新分配的内存部分,旧内存内容保持不变至新大小
性能通常比 calloc() 快,因为不初始化内存可能比 malloc() 慢,因为初始化内存性能依赖于给定的内存块和分配大小
适用性当不需要初始化内存时使用当需要初始化数组或多个相同类型的对象时使用当需要调整先前分配的内存大小时使用
示例代码int *ptr = (int*)malloc(sizeof(int) * n);int *ptr = (int*)calloc(n, sizeof(int));ptr = (int*)realloc(ptr, sizeof(int) * n);

注意

  • malloc()calloc() 在失败时都会返回 NULL,因此在使用这些函数后应该检查返回值以确认内存分配是否成功。
  • realloc() 在扩大内存块时,可能会移动内存块到新的位置,如果是这样,它会复制旧内存内容到新位置并释放旧内存。
  • 如果 realloc() 的第一个参数是 NULL,它等价于 malloc()
  • 在使用完分配的内存后,你应该使用 free() 函数释放它,以避免内存泄漏。

相关文章:

《操作系统导论》第14章读书笔记:插叙:内存操作API

《操作系统导论》第14章读书笔记&#xff1a;插叙&#xff1a;内存操作API —— 杭州 2024-03-30 夜 文章目录 《操作系统导论》第14章读书笔记&#xff1a;插叙&#xff1a;内存操作API1.内存类型1.1.栈内存&#xff1a;它的申请和释放操作是编译器来隐式管理的&#xff0c;所…...

HAProxy + Vitess负载均衡

一、环境搭建 Vitess环境搭建&#xff1a; 具体vitess安装不再赘述&#xff0c;主要是需要启动3个vtgate&#xff08;官方推荐vtgate和vtablet数量一致&#xff09; 操作&#xff1a; 在vitess/examples/common/scripts目录中&#xff0c;修改vtgate-up.sh文件&#xff0c;…...

2024年京东云主机租用价格_京东云服务器优惠价格表

2024年京东云服务器优惠价格表&#xff0c;轻量云主机优惠价格5.8元1个月、轻量云主机2C2G3M价格50元一年、196元三年&#xff0c;2C4G5M轻量云主机165元一年&#xff0c;4核8G5M云主机880元一年&#xff0c;游戏联机服务器4C16G配置26元1个月、4C32G价格65元1个月、8核32G费用…...

qt-C++笔记之QSpinBox控件

qt-C笔记之QSpinBox控件 code review! 文章目录 qt-C笔记之QSpinBox控件1.运行2.main.cpp3.main.pro4.《Qt6 C开发指南》&#xff1a;4.4 QSpinBox 和QDoubleSpinBox 1.运行 2.main.cpp #include <QApplication> #include <QSpinBox> #include <QPushButton&g…...

Linux(CentOS)/Windows-C++ 云备份项目(服务器网络通信模块,业务处理模块设计,断点续传设计)

此模块将网络通信模块和业务处理模块进行了合并 网络通信通过httplib库搭建完成业务处理&#xff1a; 文件上传请求&#xff1a;备份客户端上传的文件&#xff0c;响应上传成功客户端列表请求&#xff1a;客户端请求备份文件的请求页面&#xff0c;服务器响应文件下载请求&…...

【QQ版】QQ群短剧机器人源码 全网短剧机器人插件

内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 QQ版本可以兼容两个框架&#xff08;HTQQ&#xff0c;MYQQ这两个的vip版也可以使用) 支持私聊与群聊&#xff0c;命令是 搜剧影视关键词 如果无法搜索到影视资源&#xff0c;请使用下方命令&…...

矩阵间关系的建立

参考文献 2-D Compressive Sensing-Based Visually Secure Multilevel Image Encryption Scheme 加密整体流程如下: 我们关注左上角这一部分: 如何在两个图像之间构建关系,当然是借助第3个矩阵。 A. Establish Relationships Between Different Images 简单说明如下: …...

【C++】C到C++的入门知识

目录 1、C关键字 2、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 2.2.1 加命名空间名称及作用域限定符 2.2.2 使用using将命名空间中某个成员引入 2.2.3 使用using namespace 命名空间名称引入 3、C输入&输出 4、缺省参数 4.1 缺省参数的概念 4.2 缺省参数的…...

【c++】简单的日期计算器

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好啊&#xff0c;在我们学习了默认成员函数后&#xff0c;我们本节内容来完成知识的实践&#xff0c;来实现一个简易的日期计算器 目录 头文件声明函数函数的实现1.全缺省默认构…...

基于easyx库的C/C++游戏编程实例-飞机大战

飞机大战游戏设计 首先创建飞机/子弹结构&#xff1a; struct Plane {int x;int y;bool live;int width;int height;int type;int hp; }player,bul[BUL_NUM],enemy[ENE_NUM];你需要加载图片&#xff1a; void ImageLoad() {//背景loadimage(&bg[0], "./image/飞机大…...

stitcher类实现多图自动拼接

效果展示 第一组&#xff1a; 第二组&#xff1a; 第三组&#xff1a; 第四组&#xff1a; 运行代码 import os import sys import cv2 import numpy as npdef Stitch(imgs,savePath): stitcher cv2.Stitcher.create(cv2.Stitcher_PANORAMA)(result, pano) stitcher.st…...

Ubuntu下udp通信

一、知识准备阶段 socket是什么&#xff1f;套接字是什么&#xff1f; https://blog.csdn.net/m0_37925202/article/details/80286946 Socket程序从Windows移植到Linux下的一些注意事项 sockaddr和sockaddr_in详解 bzero和memset函数 函数原型&#xff1a;void bzero&…...

拌合楼管理软件开发(十三) 对接耀华XK3190-A9地磅(实战篇)

前言: 实战开整 目前而言对于整个拌合楼管理软件开发,因为公司对这个项目还处于讨论中,包括个人对其中的商业逻辑也存在一些质疑,都是在做一些技术上的储备.很早就写好了串口与地磅对接获取代码,也大概知道真个逻辑,这次刚好跟库区沟通,远程连接到磅房电脑,开始实操一下. 一、地…...

FastAPI+React全栈开发10 MongoDB聚合查询

Chapter02 Setting Up the Document Store with MongoDB 10 Aggregation framework FastAPIReact全栈开发10 MongoDB聚合查询 In the following pages, we will try to provide a brief introducton to the MongoDB aggregation framework, what it is, what benefits it of…...

python 报错问题汇总

error: [WinError 32] 另一个程序正在使用此文件&#xff0c;进程无法访问。: d:\\anaconda\\envs\\yolov5\\lib\\site-packages\\ISR-2.2.0-py3.7.egg 解决方法&#xff1a;重启pycharm python-contrib 无法安装 opencv-contrib-python 安装包网址&#xff1a;安装包下载链接…...

6.5物联网RK3399项目开发实录-驱动开发之LCD显示屏使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接&#xff1a;https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f LCD使用 简介 AIO-3399J开发板外置了两个LCD屏接口&#xff0c;一个是EDP&#xff0c;一个是LVDS&#xff0c;接口对应板…...

「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K

C、 com.android.provider.contact D、 com.android.provider.contacts 11.下面关于ContentProvider描述错误的是&#xff08;&#xff09;。 A、 ContentProvider可以暴露数据 B、 ContentProvider用于实现跨程序共享数据 C、 ContentProvider不是四大组件 D、 ContentP…...

【算法】基数排序

简介 基数排序&#xff08;*Radix sort&#xff09;是一种非比较排序算法&#xff08;non-comparative sorting algorithm&#xff09;。现代计算机的基数排序算法由 计数排序 算法的开发人哈罗德H西华德&#xff08;Harold H. Seward&#xff09;于1954年于麻省理工大学开发。…...

2核2G服务器优惠价格轻量61元一年,CVM价格313元15个月

腾讯云2核2G服务器多少钱一年&#xff1f;轻量服务器61元一年&#xff0c;CVM 2核2G S5服务器313.2元15个月&#xff0c;轻量2核2G3M带宽、40系统盘&#xff0c;云服务器CVM S5实例是2核2G、50G系统盘。腾讯云2核2G服务器优惠活动 txybk.com/go/txy 链接打开如下图&#xff1a;…...

不同Python版本和wxPython版本用pyinstaller打包文件大小对比

1、确定wxPython和Python版本的对应关系 在这里可以找到Python支持的所有wxPython版本&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/wxpython/ 由于Python从3.6版本开始支持f字符串、从3.9版本开始不支持Windows7操作系统&#xff0c;所以我仅筛选3.6-3.8之间的版本…...

【C语言】结构体详解(一)

目录 1、什么是结构体? 2、结构体成分 3、结构体变量的定义与初始化 3.1、结构体变量的三种定义方式 3.2、结构体变量的初始化 4、结构体成员的访问&#xff08;两种方式&#xff09; 4.1、直接访问 4.2、间接访问 5、结构的特殊声明 5.1、不完全声明&#xff08;匿…...

AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion)

AI时代-普通人的AI绘画工具对比&#xff08;Midjouney与Stable Diffusion&#xff09; 前言1、基础对比Stable Diffusion&#xff08;SD&#xff09;SD界面安装与使用SD Midjouney&#xff08;MJ&#xff09; 2、硬件与运行要求对比Stable Diffusion硬件要求内存硬盘显卡 Midjo…...

【蓝桥杯】矩阵快速幂

一.快速幂概述 1.引例 1&#xff09;题目描述&#xff1a; 求A^B的最后三位数表示的整数&#xff0c;A^B表示&#xff1a;A的B次方。 2&#xff09;思路&#xff1a; 一般的思路是&#xff1a;求出A的B次幂&#xff0c;再取结果的最后三位数。但是由于计算机能够表示的数字…...

C语言使用STM32开发板手搓高端家居洗衣机

目录 概要 成品效果 背景概述 1.开发环境 2.主要传感器。 技术细节 1. 用户如何知道选择了何种功能 2.启动后如何进行洗衣 3.如何将洗衣机状态上传至服务器并通过APP查看 4.洗衣过程、可燃气检测、OLED屏显示、服务器通信如何并发进行 小结 概要 本文章主要是讲解如…...

【Hello,PyQt】QTextEdit和QSplider

PyQt5 是一个强大的Python库&#xff0c;用于创建图形用户界面&#xff08;GUI&#xff09;。其中&#xff0c;QTextEdit 控件作为一个灵活多用的组件&#xff0c;常用于显示和编辑多行文本内容&#xff0c;支持丰富的格式设置和文本操作功能。另外&#xff0c;QSlider 控件是一…...

【力扣】191.位 1 的个数、485.最大连续 1 的个数

191.位 1 的个数 题目描述 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中 设置位 的个数&#xff08;也被称为汉明重量&#xff09;。 示例 1&#xff1a; 输入&#xff1a;n 11 输出&#xff1…...

蓝桥杯 java 承压计算

题目: 思路&#xff1a; 1&#xff1a;其中的数字代表金属块的重量(计量单位较大) 说明每个数字后面不一定有多少个0 2&#xff1a;假设每块原料的重量都十分精确地平均落在下方的两个金属块上&#xff0c;最后&#xff0c;所有的金属块的重量都严格精确地平分落在最底层的电子…...

leetcode268-Missing Number

这道题目要求缺失的数字&#xff0c;一般解决数组的问题&#xff0c;要么往排序数组&#xff0c;要么往双指针遍历这些方向上靠&#xff0c;要么往异或方向上靠&#xff0c;总之落点无非就只有这几个。我们要求缺失的数字&#xff0c;可以依次让1&#xff5e;n和数组元素进行异…...

【jenkins+cmake+svn管理c++项目】jenkins回传文件到svn(windows)

书接上文&#xff1a;创建一个项目 在经过cmakemsbuild顺利生成动态库之后&#xff0c;考虑到我一个项目可能会生成多个动态库&#xff0c;它们分散在build内的不同文件夹&#xff0c;我希望能将它们收拢到一个文件夹下&#xff0c;并将其回传到svn。 一、动态库移位—cmake实…...

数据结构·二叉树(2)

目录 1 堆的概念 2 堆的实现 2.1 堆的初始化和销毁 2.2 获取堆顶数据和堆的判空 2.3 堆的向上调整算法 2.4 堆的向下调整算法 2.4 堆的插入 2.5 删除堆顶数据 2.6 建堆 3 建堆的时间复杂度 3.1 向上建堆的时间复杂度 3.2向下建堆的时间复杂度 4 堆的排序 前言&…...

如何在网站做投票/云搜索系统

每篇文章我们都先抛出自己的疑问&#xff0c;然后随着阅读的深入&#xff0c;我们可以逐一解答这些问题 问题抛出&#xff1a; 1.JDK,JRE,JVM区别&#xff1f; JDK:总共分为三部分&#xff0c;java程序设计语言&#xff0c;Java虚拟机&#xff0c;Java API类库&#xff0c;JD…...

沈阳学习做网站/女生学网络营销这个专业好吗

編按&#xff1a;1979年&#xff0c; 《哈佛商業評論》 刊出〈競爭作用 力如何形塑策略〉 &#xff08;How Competitive Forces Shape Strategy &#xff09;&#xff0c;這篇文章的作者是當時擔任副教授的年輕經 濟學家麥可&#xff0e;波特 &#xff08;Michael E. Porter &a…...

手机网站格式商城/互联网营销师报名入口

copy.deepcopy()的用法是将某一个变量的值赋值给另一个变量(此时两个变量地址不同)&#xff0c;因为地址不同&#xff0c;所以可以防止变量间相互干扰。大家可以猜猜下面代码第四行输出什么值例1.a [1, 2, 3]d a # a和d的地址相同&#xff0c; 看第5行的输出a[0] 2print(d)p…...

可以做bim实操题的网站/小程序推广方案

Creo5中如何进行单位的换算 提到绘图单位&#xff0c;在机械行业&#xff0c;默认的图纸单位都是:mm。因为我们国家的机械制图国家标准做了规定。但是都必须在图形右下方的标题栏中进行注明 但是作为初学者&#xff0c;有的时候&#xff0c;建立新文件的时候&#xff0c;没有…...

网站开发流程 图书/网站seo搜索引擎的原理是什么

一个开始  想起来&#xff0c;这个话题&#xff0c;犹如散文一般&#xff1b;以前写过类似的随笔&#xff0c;随着spaces的离开&#xff0c;渐渐忘却那个故事  今天&#xff0c;我想起这个&#xff0c;是因为我想用一个特定的环境来模拟一段痕迹&#xff0c;而不仅仅是一个…...

php网站建设案例教程/河南网站优化公司哪家好

自动关联包含两种机制&#xff1a; 一种是loadrunner通过对比录制和回放时服务器响应的不同&#xff0c;而提示用户是否进行关联&#xff0c;用户可自己创建关联规则&#xff0c;这个功能可以方便的使我们获得需要关联的部分&#xff0c;但同时也存在一定的问题&#xff0c;如…...