Linux操作系统学习:day08

内容来自:Linux介绍

视频推荐:Linux基础入门教程-linux命令-vim-gcc/g++ -动态库/静态库 -makefile-gdb调试

目录

    • day08
      • 53、命令和编辑模式之间的切换
      • 54、命令模式到末行模式的切换与末行模式下的保存退出
        • 命令模式到末行模式的切换
        • 保存退出
      • 55、末行模式下的替换操作
      • 56、末行模式下的分屏操作
      • 57、在末行模式下进行行的跳转和执行shell命令
        • 行跳转
        • 执行shell命令
      • 58、vim 的配置文件
      • 59、gcc 的安装和版本查看
        • 安装 GCC
      • 60、gcc 的工作流程和多文件编译
        • gcc 的工作流程
        • 多文件编译
          • 1、准备工作
          • 2、编译运行
      • 61、gcc 参数简介和参数 (`-o`):指定生成的文件名使用举例
        • 指定生成的文件名 (-o)
      • 62、gcc 的 `-l`(大i)参数的使用举例
      • 63、gcc 的 `-D` 参数的使用举例
      • 64、gcc 和 g 加加的区别

day08

53、命令和编辑模式之间的切换

如果要编辑文件,需要从命令模式切换到文件编辑模式,切换模式的快捷键有很多,不同的快捷键对应的效果有所不同,效果如下表所示:

快捷键功能
i从光标前边开始输入
a从光标的后边开始输入
o在光标下边创建新行,在新行中输入
s删除光标后边的字符(盖住的字符),从删除的字符位置开始输入
I (大写的i)从当前行行首开始输入
A从当前行行尾开始输入
O在光标上边创建新行,在新行中输入
S删除当前行,在当前行开始输入

文件编辑完成之后,从编辑模式回到命令模式只需要按键盘上的 Esc 即可。


54、命令模式到末行模式的切换与末行模式下的保存退出

命令模式到末行模式的切换

从命令模式切换到末行模式只需要在键盘上输入一个 :,同时这个符号也会出现在窗口的最下端,这时候我们就可以在最后一行输入我们执行的命令了。

# 命令模式切换到末行模式
在命令模式下键盘输入一个 冒号  -> :# 从末行模式 -> 命令模式
1. 按两次esc
2. 在末行模式下执行一个完整指令, 执行完毕, 自动回到命令模式

在这里插入图片描述

从末行模式切换回命令模式有两种方式:

  1. 按两次 Esc
  2. 在末行模式下执行一个完整指令,执行完毕,自动回到命令模式
保存退出

使用 vim 对文件编辑完成之后,需要保存或者退出 vim 一般都是在末行模式下完成的,不管是进行那种操作都有对应的操作命令,如下表:

末行模式下输入的命令功能
q退出, 如果退出的时候文件没有保存, vim会提示是否要保存
q!直接退出, 不保存 (强制退出)
w保存, 不退出 (相当在windows中于按了ctrl+s)
wq保存退出
x保存退出


55、末行模式下的替换操作

末行模式下的替换比命令模式下的替换功能要强大的多,在末行模式下可以指定将什么样的内容替换为什么样的内容,并且可以指定替换某一行或者某几行或者是全文替换。

替换对应的命令是 s 并且可以给其指定参数。默认情况下只替换相关行的第一个满足条件的关键字, 如果需要整行替换需要加参数 /g

末行模式下的替换命令说明
s/被替换的关键字/新的关键字/g只对光标所在行进行替换
行号1, 行号2s/被替换的关键字/新的关键字/g[行号1 , 行号2] 是一个从小到大的范围, 对这个范围进行替换
%s/被替换的关键字/新的关键字/g%代表对所有行进行替换

在这里插入图片描述


56、末行模式下的分屏操作

分屏就是将当前屏幕中的窗口以水平或者垂直的方式拆分成多个, 在不同的子窗口中可以显示同一个文件或者不同文件中的内容,下边介绍一下相关的分屏命令:

末行模式命令或者快捷键说明备注
sp水平分屏 , 多个窗口垂直排列多个窗口中显示同一个文件里的内容
vsp垂直分屏, 多个窗口水平排列多个窗口中显示同一个文件里的内容
ctrl+w+w光标在打开的屏幕之间切换快捷键操作 (按住ctrl然后按两次w)
qall同时退出多个屏幕
wqall同时保存退出多个屏幕
sp 文件名分屏的同时指定打开的文件的名字在新窗口中显示指定的文件的内容
vsp 文件名分屏的同时指定打开的文件的名字在新窗口中显示指定的文件的内容

除了在命令模式下分屏, 我们也可以在使用vim打开文件的时候直接分屏, 下边是需要用到的参数:

  • -o: 水平分屏
  • -O: 垂直分屏
# 在 vim 打开文件的时候指定打开多个文件和分屏方式
# 水平分屏
$ vim -o 文件1, 文件2, 文件3 ...
# 垂直分屏
$ vim -O 文件1, 文件2, 文件3 ...


57、在末行模式下进行行的跳转和执行shell命令

行跳转

在 vim 中不仅可以在命令模式下进行行的跳转,也可以在末行模式下进行行跳转,末行模式下指定哪一行光标就可以跳转到哪一行。

:行号   # 输入完行号之后敲回车
执行shell命令

在使用 vim 编辑文件的过程中,还可以在末行模式下执行需要的shell命令,在执行 shell 命令之前需要在前边加上一个叹号 !

# 语法:
:!shell命令# 举例
:!ls		# 回车即可


58、vim 的配置文件

vim 是一个文本编辑器工具,这个工具也是有配置文件的,文件的名字叫做vimrc,在里边可以设置 样式功能快捷键 等属性 。对应的配置文件分为两种 用户级别 系统级别

  • 用户级别的配置文件(~/.vimrc)只对当前用户有效;
  • 系统级别的配置文件(/ect/vim/vimrc)对所有Linux用户都有效;
  • 如果两个配置文件都设置了, 用户级别的配置文件起作用(用户级别优先级高)。

轻松搞定Vim插件安装


59、gcc 的安装和版本查看

GCC 是 Linux 下的编译工具集,是 GNU Compiler Collection 的缩写,包含 gcc、g++ 等编译器。这个工具集不仅包含编译器,还包含其他工具集,例如 ar、nm 等。

GCC 工具集不仅能编译 C/C++语言,其他例如 Objective-C、Pascal、Fortran、Java、Ada 等语言均能进行编译。GCC 在可以根据不同的硬件平台进行编译,即能进行交叉编译,在 A 平台上编译 B 平台的程序,支持常见的 X86、ARM、PowerPC、mips 等,以及 Linux、Windows 等软件平台。

安装 GCC

有些纯净版的Linux默认没有gcc编译器, 需要自己安装, 在线安装步骤如下:

# 安装软件必须要有管理员权限
# ubuntu
$ sudo apt update   		# 更新本地的软件下载列表, 得到最新的下载地址
$ sudo apt install gcc g++	# 通过下载列表中提供的地址下载安装包, 并安装# centos
$ sudo yum update   		# 更新本地的软件下载列表, 得到最新的下载地址
$ sudo yum install gcc g++	# 通过下载列表中提供的地址下载安装包, 并安装

gcc安装完毕之后, 可以查看版本:

# 查看 gcc 版本
$ gcc -v
$ gcc --version# 查看 g++ 版本
$ g++ -v
$ g++ --version


60、gcc 的工作流程和多文件编译

gcc 的工作流程

GCC 编译器对程序的编译下图所示,分为 4 个阶段:预处理(预编译)编译和优化汇编链接。GCC 的编译器可以将这 4 个步骤合并成一个。 先介绍一个每个步骤都分别做了写什么事儿:

  1. 预处理:在这个阶段主要做了三件事: 展开头文件宏替换去掉注释行
    • 这个阶段需要GCC调用预处理器来完成, 最终得到的还是源文件, 文本格式
  2. 编译:这个阶段需要GCC调用编译器对文件进行编译, 最终得到一个汇编文件
  3. 汇编:这个阶段需要GCC调用汇编器对文件进行汇编, 最终得到一个二进制文件
  4. 链接:这个阶段需要GCC调用链接器对程序需要调用的库进行链接, 最终得到一个可执行的二进制文件
文件名后缀说明gcc 参数
.c源文件
.i预处理后的 C 文件-E
.s编译之后得到的汇编语言的源文件-S
.o汇编后得到的二进制文件-c

在这里插入图片描述

在 Linux 下使用 GCC 编译器编译单个文件十分简单,直接使用 gcc 命令后面加上要编译的 C 语言的源文件,GCC 会自动生成文件名为 a.out 的可执行文件(也可以通过参数 -o 指定生成的文件名),也就是通过一个简单的命令上边提到的4个步骤就全部执行完毕了。但是如果想要单步执行也是没问题的,下边基于这段示例程序给大家演示一下。

// 假设程序对应的源文件名为 test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>int main()
{int array[5] = {1,2,3,4,5};for(int i=0; i<5; ++i){printf("array[%d] = %d\n", i, array[i]);}return 0;
}

第一步: 对源文件进行预处理, 需要使用的gcc参数为 -E

# 1. 预处理, -o 指定生成的文件名
$ gcc -E test.c -o test.i

第二步: 编译预处理之后的文件, 需要使用的gcc参数为 -S

# 2. 编译, 得到汇编文件
$ gcc -S test.i -o test.s

第三步: 对得到的汇编文件进行汇编, 需要使用的gcc参数为-c

# 3. 汇编
$ gcc -c test.s -o test.o

第四步: 将得到的二进制文件和标准库进制链接, 得到可执行的二进制文件, 不需要任何参数

# 4. 链接
$ gcc test.o -o test

最后再次强调, 在使用gcc编译程序的时候可以通过参数控制内部自动执行几个步骤:

# 参数 -c 是进行文件的汇编, 汇编之前的两步会自动执行
$ gcc test.c -c -o app.o# 该命令是直接进行链接生成可执行程序, 链接之前的三步会自动执行
$ gcc test.c -o app    

tips:生成c文件的可执行程序用gcc,生成cpp文件的可执行程序用g++。

多文件编译

GCC 可以自动编译链接多个文件,不管是目标文件还是源文件,都可以使用同一个命令编译到一个可执行文件中。

1、准备工作

首先将程序编译之前需要的代码准备出来,例如一个项目包含3个文件,文件 string.h,string.c 中有一个函数 strLength 用于计算字符串的长度,而在 main.c 中调用这个函数将计算的结果显示出来。

  • 头文件

    #ifndef _STRING_H_
    #define _STRING_H_
    int strLength(char *string);
    #endif // _STRING_H_
    
  • 源文件 string.c

    #include "string.h"int strLength(char *string)
    {int len = 0;while(*string++ != '\0') 	// 当*string 的值为'\0'时, 停止计算{len++;}return len; 	// 返回字符串长度
    }
    
  • 源文件 main.c

    #include <stdio.h>
    #include "string.h"int main(void)
    {char *src = "Hello, I'am Monkey·D·Luffy!!!"; printf("string length is: %d\n", strLength(src)); return 0;
    }
    
2、编译运行

因为头文件是包含在源文件中的,因此在使用gcc编译程序的时候不需要指定头文件的名字(在头文件无法被找到的时候需要使用参数 -I 指定其具体路径而不是名字)。我们可以通过一个 gcc 命令将多个源文件编译并生成可执行程序,也可以分多步完成这个操作。

  • 直接链接生成可执行程序

    # 直接生成可执行程序 test
    $ gcc -o test string.c main.c# 运行可执行程序
    $ ./test
    
  • 先将源文件编成目标文件,然后进行链接得到可执行程序

    # 汇编生成二进制目标文件, 指定了 -c 参数之后, 源文件会自动生成 string.o 和 main.o
    $ gcc –c string.c main.c# 链接目标文件, 生成可执行程序 test
    $ gcc –o test string.o main.o# 运行可执行程序
    $ ./test
    


61、gcc 参数简介和参数 (-o):指定生成的文件名使用举例

下面的表格中列出了常用的一些 gcc 参数,这些参数在 gcc命令中没有位置要求,只需要编译程序的时候将需要的参数指定出来即可。

gcc编译选项选项的意义
-E预处理指定的源文件,不进行编译
-S编译指定的源文件,但是不进行汇编
-c编译、汇编指定的源文件,但是不进行链接
-o [file1] [file2] / [file2] -o [file1]将文件 file2 编译成文件 file1
-I directory (大写的i)指定 include 包含文件的搜索目录
-g在编译的时候,生成调试信息,该程序可以被调试器调试
-D在程序编译的时候,指定一个宏
-w不生成任何警告信息, 不建议使用, 有些时候警告就是错误
-Wall生成所有警告信息
-Onn的取值范围:0~3。编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-l在程序编译的时候,指定使用的库
-L指定编译的时候,搜索的库的路径。
-fPIC/fpic生成与位置无关的代码
-shared生成共享目标文件。通常用在建立共享库时
-std指定C方言,如:-std=c99,gcc默认的方言是GNU C
指定生成的文件名 (-o)

该参数用于指定原文件通过 gcc 处理之后生成的新文件的名字,有两种写法,原文件可以写在参数 -o 前边后缀写在后边。

# 参数 -o 的用法,原材料 test.c 最终生成的文件名为 app
# test.c 写在 -o 之前
$ gcc test.c -o app# test.c 写在 -o 之后
$ gcc -o app test.c


62、gcc 的 -l(大i)参数的使用举例

如果在程序中包含了一些头文件,但是包含的一些头文件在程序预处理的时候因为找不到无法被展开,导致程序编译失败,这时候我们可以在gcc命令中添加 -I 参数重新指定要引用的头文件路径, 保证编译顺利完成。

# -I, 指定头文件目录
$ tree
.
├── add.c
├── div.c
├── include
│   └── head.h
├── main.c
├── mult.c
└── sub.c# 编译当前目录中的所有源文件,得到可执行程序
$ gcc *.c -o calc
main.c:2:18: fatal error: head.h: No such file or directory
compilation terminated.
sub.c:2:18: fatal error: head.h: No such file or directory
compilation terminated.

通过编译得到的错误信息可以知道,源文件中包含的头文件无法被找到。通过提供的目录结构可以得知头文件 head.h 在 include 目录中,因此可以在编译的时候重新指定头文件位置,具体操作如下:

# 可以在编译的时候重新指定头文件位置 -I 头文件目录
$ gcc *.c -o calc -I ./include


63、gcc 的 -D 参数的使用举例

在程序中我们可以使用宏定义一个常量,也可以通过宏控制某段代码是否能够被执行。在下面这段程序中第8行判断是否定义了一个叫做 DEBUG 的宏,如果没有定义第9行代码就不会被执行了,通过阅读代码能够知道这个宏是没有在程序中被定义的。

// test.c
#include <stdio.h>
#define NUMBER  3int main()
{int a = 10;
#ifdef DEBUGprintf("我是一个程序猿, 我不会爬树...\n");
#endiffor(int i=0; i<NUMBER; ++i){printf("hello, GCC!!!\n");}return 0;
}

如果不想在程序中定义这个宏,但是又想让它存在,通过gcc的参数 -D 就可以实现了,编译器会认为参数后边指定的宏在程序中是存在的。

# 在编译命令中定义这个 DEBUG 宏, 
$ gcc test.c -o app -D DEBUG# 执行生成的程序,可以看到程序第9行的输出
$ ./app 
我是一个程序猿, 我不会爬树...
hello, GCC!!!
hello, GCC!!!
hello, GCC!!!

-D 参数的应用场景:
在发布程序的时候,一般都会要求将程序中所有的log输出去掉, 如果不去掉会影响程序的执行效率,很显然删除这些打印log的源代码是一件很麻烦的事情,解决方案是这样的:

  • 将所有的打印log的代码都写到一个宏判定中, 可以模仿上边的例子

    • 在编译程序的时候指定 -D 就会有log输出

    • 在编译程序的时候不指定 -D,log就不会输出


64、gcc 和 g 加加的区别

关于对 gccg++ 很多人的理解都是比较片面的或者是对二者的理解有一些误区,下边从三个方面介绍一下二者的区别:

  1. 在代码编译阶段(第二个阶段):
    • 后缀为 .c 的,gcc 把它当作是C程序,而 g++ 当作是 C++ 程序
    • 后缀为.cpp 的,两者都会认为是 C++ 程序,C++ 的语法规则更加严谨一些
    • g++会调用gcc,对于C++代码,两者是等价的,也就是说 gcc 和 g++ 都可以编译 C/C++代码
  2. 在链接阶段(最后一个阶段):
    • gcc 和 g++ 都可以自动链接到标准C库
    • g++ 可以自动链接到标准C++库,gcc如果要链接到标准C++库需要加参数 -lstdc++
  3. 关于 __cplusplus 宏的定义
    • g++ 会自动定义__cplusplus 宏,但是这个不影响它去编译C程序
    • gcc 需要根据文件后缀判断是否需要定义 __cplusplus 宏 (规则参考第一条)

综上所述:

  1. 不管是 gcc 还是 g++ 都可以编译 C 程序,编译程序的规则和参数都相同
  2. g++可以直接编译C++程序, gcc 编译 C++程序需要添加额外参数 -lstdc++
  3. 不管是 gcc 还是 g++ 都可以定义 __cplusplus
# 编译 c 程序
$ gcc test.c -o test	# 使用gcc
$ g++ test.c -o test	# 使用g++# 编译 c++ 程序
$ g++ test.cpp -o test              # 使用g++
$ gcc test.cpp -lstdc++ -o test     # 使用gcc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot项目的两种发布方式

一、通过jar包发布 1、在pom中添加一个SpringBoot的构建的插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><!--自动检测项目中的 main 函数--><artifactId>spring-boot-maven-plugin</artifactId>…

【硬件视界2】CPU和GPU:计算机架构的双子星

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、CPU (中央处理器)①主要作用②特点 2、 GPU (图形处理…

Jmeter下载、安装及配置

1 Jmeter介绍 Jmeter是进行负载测试的工具&#xff0c;可以在任何支持Java虚拟机环境的平台上运行&#xff0c;比如Windows、Linux、Mac。 Jmeter模拟一组用户向目标服务器发送请求&#xff0c;并统计目标服务器的性能信息&#xff0c;比如CPU、memory usage。 2 Jmeter下载 …

Apple - Text Layout Programming Guide

本文翻译整理自&#xff1a;Text Layout Programming Guide&#xff08;更新日期&#xff1a;2014-02-11 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/TextLayout/TextLayout.html#//apple_ref/doc/uid/10000158i 文章目录 一、文本布局编程指…

用合成数据训练边缘侧火灾检测器

火灾是人类面临的重大威胁&#xff0c;检测火灾至关重要。目前的火焰传感器在距离检测方面存在局限性。为了克服这个问题&#xff0c;我的目标是使用机器学习方法创建一个轻量级且高度准确的火灾检测系统。当需要实时数据处理或机器学习模型可用的数据集很少时&#xff0c;这个…

ELK企业级实战

一、Elstic stack在企业的常⻅架构 https://www.bilibili.com/video/BV1x94y1674x/?buvidXY705117E90F73A790429C9CFBD5F70F22168&vd_source939ea718db29535a3847d861e5fe37ef ELK 解决取得问题 痛点1: ⽣产出现故障后&#xff0c;运维需要不停的查看各种不同的⽇志进⾏…

深入解析Java和Go语言中String与byte数组的转换原理

1.Java String与byte[]互相转换存在的问题 java中&#xff0c;按照byte[] 》string 》byte[]的流程转换后&#xff0c;byte数据与最初的byte不一致。 多说无益&#xff0c;上代码&#xff0c;本地macos机器执行&#xff0c;统一使用的UTF-8编码。 import java.nio.charset.S…

逻辑操作符

目录 && --- 逻辑与操作符 || --- 逻辑或操作符 && --- 逻辑与操作符 逻辑与操作符有并且的意思&#xff0c;一般用于判断语句中 逻辑与操作符运行规则是都要为真&#xff0c;才会继续执行或计算 360笔试题&#xff1a; 有关前置(--)&#xff0c;后置(-…

树莓派安装windows系统

第1步&#xff1a; https://uupdump.net/下载对应的系统文件&#xff0c;所有选择项都默认选择。 第2步&#xff1a; 解压下载后的文件&#xff0c;双击运行下面文件。等待下载完成&#xff0c;等待过程很漫长&#xff0c;很考验耐心。 第3步&#xff1a; 提示已经finish了&…

Streamer-Sales 销冠 —— 卖货主播大模型来了,一键让你成为销冠!

今天给大家推荐一个在GitHub上非常火的卖货主播大模型 Streamer-Sales&#xff0c;旨在让你成为销冠。 这是一个能够根据商品特点进行解说的卖货主播大模型&#xff0c;通过生成的细腻、独到的解说词&#xff0c;激发用户的购买欲望。 相关链接 项目地址&#xff1a;github.c…

一文入门Nanomsg通信库

转载自本人博客&#xff1a;https://www.jjy2023.cn/2024/06/27/%e4%b8%80%e6%96%87%e5%85%a5%e9%97%a8nanomsg%e9%80%9a%e4%bf%a1%e5%ba%93/ 1. Nanomsg介绍 Nanomsg官方在线文档&#xff1a;https://nanomsg.org/index.html 本文全部代码用C实现。 以前一直在使用ZeroMQ库处理…

关于Unity运行时动态修改材质的小秘密

一、问题背景 在以往的Unity项目中涉及到修改材质的需求时&#xff0c;也只是改改材质贴图&#xff0c;材质颜色等&#xff0c;也没遇到那么多动态修改材质的坑。最近在做Unity App Demo时也遇到了要修改材质的小需求&#xff0c;本以为几分钟就能完成了&#xff0c;却花费了我…

Cesium Model 中的剪裁平面 (ClippingPlane)

Cesium Model 中的剪裁平面 (ClippingPlane) 参考: https://www.cnblogs.com/webgl-angela/p/9197672.html Cesium Model 中的剪裁平面 (ClippingPlane) // 相关类: class ClippingPlaneCollection {} class ClippingPlane {}// 剪裁的整体流程: Model.prototype.update () …

牛客小白月赛97 (个人题解)(待补完)

前言&#xff1a; 前天晚上写的一场牛客上比赛&#xff0c;虽然只写出了三道&#xff0c;但比起之前的成绩感觉自己明显有了一点进步了&#xff0c;继续努力吧&#xff0c; 正文&#xff1a; 链接&#xff1a;牛客小白月赛97_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞…

如何用DCA1000持续采集雷达数据

摘要&#xff1a;本文介绍一下如何通过mmwave studio软件&#xff0c;搭配DCA1000数据采集卡&#xff0c;对AWR1843BOOST进行不间断的数据采集。本文要求读者已经掌握了有关基础知识。 本文开放获取&#xff0c;无需关注。 到SensorConfig页面下&#xff0c;一步步操作&#xf…

ubuntu 18 虚拟机安装(3)安装mysql

ubuntu 18 虚拟机安装&#xff08;3&#xff09;安装mysql 参考 https://cloud.tencent.com/developer/article/1700780 技术分享 | MySQL 设置管理员密码无法生效一例 https://cloud.tencent.com/developer/article/2014384 在Ubuntu18.04上安装MySQL &#xff5c; 超级详细…

无人机挂载抛弹吊舱技术详解

随着无人机技术的飞速发展&#xff0c;无人机在军事、安全、农业、环保等领域的应用越来越广泛。其中&#xff0c;挂载抛弹吊舱的无人机在精确打击、应急处置等场合发挥着重要作用。抛弹吊舱技术通过将弹药、物资等有效载荷挂载在无人机下方&#xff0c;实现了无人机的远程投放…

昇思25天学习打卡营第7天|模型训练

模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 前面几天依次学习了前面几个步骤的操作&#xff0c;今天继续学习模型训练。 数据集和神经网络模型这个前面已经有详细的介绍。准确…

JVM(13):虚拟机性能分析和故障解决工具之Visual VM

1 Visual VM作用 是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序&#xff0c;并且可以遇见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。官方在VisualVM的软件说明中写上了“All-in-One”的描述字样&#xff0c;预示着他除了运行监视、故障处理外&…

ConcurrentHashMap是如何保证线程安全的-put方法简要分析

简介 ConcurrentHashMap 是 Java 中并发编程中常用的线程安全的哈希表&#xff08;HashMap&#xff09;实现。它具有以下几个显著的特点和优点&#xff0c;适合在特定的并发场景中使用&#xff1a; 线程安全性&#xff1a; ConcurrentHashMap 提供了并发访问的线程安全保证&am…