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

七、进程地址空间

一、环境变量

(一)概念

环境变量(environment variables):系统当中用做特殊用途的系统变量。
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。
子进程默认会复制拥有与父进程相同的环境变量。

(二)常见环境变量

PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。

(三)查看环境变量方法

echo $NAME NAME:你的环境变量名称
指令 env——显示所有环境变量

(四)和环境变量相关的命令

echo: 显示某个环境变量值
export: 设置一个新的环境变量(export aaaa)
env: 显示所有环境变量
unset: 清除环境变量(rm只是普通的文件操作指令,无法删除环境变量)
set: 显示本地定义的shell变量(本地变量)和环境变量

1.echo: 显示某个环境变量值
2.export : 导出环境变量
3.env : 显示所有环境变量
4.unset :删除环境变量
5.set:查看本地定义的shell变量(本地变量)和环境变量
在这里插入图片描述

(五)和环境变量相关的命令

基本指令也是程序,为什么我们的代码程序运行要带路径,而系统的指令不用带路径?
比如使用指令ls,pwd时直接使用即可,使用自己的myproc 可执行程序时(gcc -o mproc.c myproc) 需要./myproc.c
答:系统中是存在相关的环境变量,保存了程序的搜索路径的! 比如:执行 ls 这个可执行程序时,系统会在PATH中一个一个搜索,在特定路径(系统所有命令都在usr/bin路径下)下可以找到ls,就可以执行。
系统中搜索可执行程序的环境变量叫做 PATH !

1.如何让自己的程序不带路径也可以执行?

把自己的程序拷贝进环境变量中,就可以直接myproc执行程序了,拷贝的过程就是安装软件,但是不建议这样做,本身我们的软件就没什么意义,会污染系统,删除=卸载。
把myproc自己的文件加入环境变量PATH中,export PATH=$PATH:路径(相当于把PATH中的路径改成PATH和myproc的路径)。
错误示范:如果直接 export PATH=路径 ,会覆盖环境变量PATH的原有路径:这里pwd还能用,ls,top什么的就不能用了

# 二、常见的环境变量
XDG_SESSION_ID=299733
TERM_PROGRAM=vscode
HOSTNAME=VM-24-7-centos
TERM=xterm-256color
SHELL=/bin/bash  : 显示shell所在路径
HISTSIZE=3000 : 历史能够记录自己敲过的命令条数
SSH_CLIENT=111.18.128.241 7177 22 : ip地址
TERM_PROGRAM_VERSION=1.78.2 : 版本
USER=root/ : 用户名
VSCODE_GIT_ASKPASS_MAIN=/root/.vscode-server/bin/b3e4e68a0bc097f0ae7907b217c1119af9e03435/extensions/git/dist/askpass-main.js
LOGNAME=root
MAIL=/var/spool/mail/root
PWD=/root/new/add.ringqueue  : PWD:当前用户所处路径
LANG=en_US.utf8 : 支持的编码格式,现在支持的是UTF8
VSCODE_GIT_ASKPASS_EXTRA_ARGS=
HOME=/root  :代表不同用户的家目录
SHLVL=5
VSCODE_GIT_IPC_HANDLE=/run/user/0/vscode-git-d20790e3d3.sock
SSH_CONNECTION=111.18.128.241 7177 10.0.24.7 22
VSCODE_IPC_HOOK_CLI=/run/user/0/vscode-ipc-729d4afb-0a8a-48d3-848b-da318c83e93a.sock
LESSOPEN=||/usr/bin/lesspipe.sh %s
BROWSER=/root/.vscode-server/bin/b3e4e68a0bc097f0ae7907b217c1119af9e03435/bin/helpers/browser.sh
PROMPT_COMMAND=__vsc_prompt_cmd_original
VSCODE_GIT_ASKPASS_NODE=/root/.vscode-server/bin/b3e4e68a0bc097f0ae7907b217c1119af9e03435/node
GIT_ASKPASS=/root/.vscode-server/bin/b3e4e68a0bc097f0ae7907b217c1119af9e03435/extensions/git/dist/askpass.sh
XDG_RUNTIME_DIR=/run/user/0
HISTTIMEFORMAT=%F %T 
COLORTERM=truecolor
OLDPWD=/root/new
_=/usr/bin/env

(一)HOSTNAME——显示主机名

[root@VM-24-7-centos add.ringqueue]# echo $HOSTNAME
VM-24-7-centos

(二)SHELL—— 显示shell所在路径

(三)HISTSIZE——历史能够记录自己敲过的命令条数

(四)HOME——代表不同用户的家目录

三、环境变量和局部(普通)变量

环境变量:系统当中用做特殊用途的系统变量。
命令行变量分两种:

(一)普通变量(在env查不到)

(二)环境变量(全局)(在env能查到)

环境变量具有全局属性:环境变量是会被子进程继承下去的! !
所谓得本地变量,本质就是在bash内部定义的变量,不会被子进程继承下去!

四、环境变量的C、C++获取方式

(一)问题1:main函数可以带参数吗?最多可以带多少?

可以,实际是三个。

1. 先说main函数的前两个参数

main函数的前两个参数分别是下图所示:这两个参数我们称为:命令行参数
int main(int argc,char *argv[]) { // 数组个数 数组

}

2.argv[]中放什么呢?

我们给main函数传递的前两个参数 argc,char* argv[] 称为 命令行参数,传递的是命令行中输入的程序名和选项!比如命令行输入了./myproc -a -b -c,argc对应就是4,argv[ ] 中传入了这4个字符串,argv[0] = “./myproc”,argv[1] = “-a”,argv[2] = “-b”,argv[3] = “-c”,argv[4] = “NULL”,指针数组以NULL结尾。

在这里插入图片描述
给命令行参数传程序名和选项意义是什么?我们通过实现一个命令行版的计算器来理解:

(二)实现一个命令行版的计算器

我们要实现的功能:
执行 ./myproc -a 10 20 要实现 10+20=30;
执行 ./myproc -s 10 20 要实现 10-20=-10

// makefile
myproc:myproc.cg++ -o $@ $^ -std=c++11 -lpthread
.PHONY:clean
clean:rm -f myproc
// main.c
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main(int argc,char *argv[])
{if (argc != 4){//如果用户输入不对,打印使用手册,-a加法,-s(subtract)减法,-m乘法,-d除法:printf("Usage: %s [-a|-s|-m|-d] one_data two_data\n", argv[0]);return 0;}int x = atoi(argv[2]);    //atoi:把字符串转为整数int y = atoi(argv[3]);if (strcmp("-a", argv[1]) == 0)    //如果输入-a,就是加法{printf("%d+%d=%d\n", x, y, x + y);}else if (strcmp("-s", argv[1]) == 0)    //如果输入-s,就是减法{printf("%d-%d=%d\n", x, y, x - y);}else if (strcmp("-m", argv[1]) == 0)    //如果输入-m,就是乘法{printf("%d*%d=%d\n", x, y, x * y);}else if (strcmp("-d", argv[1]) == 0 && y != 0)    //如果输入-d,就是除法{printf("%d/%d=%d\n", x, y, x / y);}else{//输入错误说明不会用,还是打印使用手册printf("Usage: %s [-a|-s|-m|-d] one_data two_data\n", argv[0]);}return 0;
}

在这里插入图片描述

1.给命令行参数传程序名和选项意义是什么?

答:同一个程序,通过传递不同的参数,让同一个程序有不同的执行逻辑 / 执行结果。
这就解释了指令中那么多选项的由来和起作用的方式!!Linux系统中,会根据不通的选项,让不同的命令,可以有不同的表现!
这就解释了我们平时输入的指令传入了哪里!

(三)命令行可以带第三个参数!: char *env[](环境变量)

1.每个进程是会被传入环境变量参数的,环境变量传给env[] 。

#include<stdio.h>
int main(int argc,char* argv[],char* env[])
{
// 存环境变量的指针数组以NULL结尾,所以到NULL时for循环结束:
for(int i=0;env[i];i++)
{
printf(“env[%d]:%s\n”,i,env[i]);
}
return 0;
}
在这里插入图片描述

2.C语言中函数无参,也是可以传参的,只不过实参没用上

但是如果是int fun(void) 就不可以传参。
这就解释了我们可以直接给main()函数传参的原因

(四)通过代码获取环境变量的三种方式

1.C语言获取环境变量的第一种方法

#include<stdio.h>
int main(int argc,char* argv[],char* env[])
{
// 存环境变量的指针数组以NULL结尾,所以到NULL时for循环结束:for(int i=0;env[i];i++) 
{printf("env[%d]:%s\n",i,env[i]);                                                                                }
return 0;
}

在这里插入图片描述

2.通过第三方变量environ获取

C语言给我们提供了一个全局变量environ。

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main() {extern char** environ;for (int i = 0; environ[i]; i ++)  {printf("%d : %s \n",i,environ[i]);}return 0;
}

3.getenv——获取环境变量的接口

通过环境变量名直接获得环境变量的内容。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main() {char *val = getenv("PATH");printf("%s\n",val);return 0;
}

在这里插入图片描述

五、程序地址空间

(一)概念

程序地址空间,不是内存!
程序地址空间=进程地址空间,是操作系统上的概念!
堆,栈相对而生。
堆区向地址增大方向增长
栈区向地址减少方向增长
我们一般在C函数中定义的变量,通常在栈上保存,那么先定义的一定是地址比较高的 !

如何理解static变量?
函数内定义的变量用static修饰,本质是编译器会把该变量编译进全局数据区!

(二)感知地址空间的存在

函数内定义的变量用static修饰,本质是编译器会把该变量编译进全局数据区! 父子进程共享全局变量。

#include<unistd.h>
#include<cstdio>
int g_val = 100;
int main() {pid_t id = fork();if (id == 0) {int flag = 0;while (true) {printf("i am son : %d, ppid : %d, g_val : %d, &g_val : %p\n\n",getpid(),getppid(),g_val,&g_val);sleep(1);flag ++;if (flag == 5) {g_val = 200;printf("全局数据我已经改了,请你注意查看\n");}}}else {while(true) {printf("i am father : %d, ppid : %d, g_val : %d, &g_val : %p\n\n",getpid(),getppid(),g_val,&g_val);sleep(2);  }}return 0;
}

fork创建子进程,父子进程同时运行,若在子进程中第5秒改了全局变量g_val的值,会发现!
在这里插入图片描述

父子进程读取同一个变量(因为地址一样!),但是子进程修改的全局变量后,父子进程读取到的
内容却不一样! ! ! !
结论:

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

OS必须负责将虚拟地址转化成物理地址 !

(三)让每一个进程都认为自己是独占系统中的所有资源

进程地址空间:每一个进程在启动的时候,都会让操作系统给他创建一个地址空间,该地址空间就是进程地址空间

每一个进程,都会有一个自已的进程地址空间!
操作系统要不要管理这些进程地址空间呢??
先描述,在组织
进程地址空间,其实是内核的一个数据结构,struct mm_ struct (稍后看! )
举例子理解:

  • 我们往银行存10亿,但是银行可能没10亿,但银行给你画的饼就是10个亿。
  • 一个富豪有3个私生子,富豪给每个私生子画的大饼,说自己有10个亿以后都是你的财产
  • 大富豪: OS
    三个私生子:进程
    富翁给三个私生子画的大饼:进程地址空间
    我不给你,但是我这么说,让你感觉我给你!
    让每一个进程都认为自己是独占系统中的所有资源的! !

(四)虚拟地址空间=进程地址空间:struct mm_ struct

1.概念

所谓的进程/虚拟地址空间:其实就是OS通过软件的方式,给进程提供一个软件视角,认为自己会独占系统的所有资源(内存)。
每个进程会维护一个mm_struct,虚拟地址和物理内存通过页表建立映射关系。(上学时,一个班级中,老师点名需要一张名单,这个名单就是虚拟地址空间)
定义:就是从进程的视角看到的地址空间,是进程运行时所用到的虚拟地址的集合,地址最大的作用是唯一性。

我们在语言层面遇到的地址都是虚拟地址!每个进程都有一个地址空间,都认为自己独占物理内存。

linux下:逻辑地址=虚拟地址=线性地址。

2.为什么不让PCB直接去访问物理地址

  • task_struct如果可以直接访问物理地址,但是物理地址有很多进程,如果你不小心寻址错误,访问到了其他进程,而这个进程是转账类似的,那是不是很危险?而如果我们有一层中间层,不允许你直接访问物理地址,而是在这之间对你的请求进行检查,如果合法给你映射过去,不合法就中止你的请求。
  • 例子:就像const char* s=“hello world”,*s=‘H’,这样是不允许的,当页表识别出你是字符常量区的,它映射时就不会给你w的权限,本质上就是OS给你的权限只有r权限。
  • 每一个进程只隐射到合法内存,不会恶意进程访问,保护物理内存,可以更方便进程与进程之间的解耦,保证了独立性这样的特性。

4.为什么存在地址空间

  • 保护内存。如果进程之间可以访问物理内存,万一进程越界或者非法操作,不安全!
  • 进程管理-Linux内存管理。因为进程具有独立性,一个进程对被共享的数据做修改,如果影响了其他进程,不能称之为独立性,进程地址空间的存在,可以更方便的进行进程和进程的数据代码之间的解耦,保证了进程独立性这样的特征!
  • 让进程或者程序以统一的视角,来看待进程对应的代码和数据等各个区域,方便使用编译器也已统一的角度来进行编译代码!

4. 区域

每个区域范围,都是可以有对应的编号的,在虚拟地址空间 mm_struct 中有存储各个数据区的起始地址和结束地址,也就是区域。
在这里插入图片描述

5.写时拷贝

写时拷贝正好可以回答fork 现象,子进程修改的全局变量后,父子进程读取到的内容却不一样?

因为进程具有独立性,一个进程对被共享的数据做修改,如果影响了其他进程,不能称之为独立性,任何一方尝试写入,OS先进程数据拷贝,更改页表映射,然后让进程继续进行修改!!写时拷贝 : 操作系统自动做的!!(写时拷贝本身就是有OS的内存管理模块完成的!所以我们感知不到)。
在这里插入图片描述

写时拷贝:g_val会再拷贝一份,子进程中的映射关系会改变,指向新的g_val,但是g_val的虚拟地址(相对地址)还是原来的地址,和父进程的g_val虚拟地址(相对地址)一样,但是他们的物理地址不一样,100改成200时,只会改变新的g_val!

6.为什么要写时拷贝?

为什么要写时拷贝,创建子进程的时候,就把数据分开,不行吗?

  • 父进程的数据,子进程不一定全用,即便使用,也不一定全部写入——会有浪费空间的嫌疑
  • 最理想的情况,只有会被父子修改的数据,进行分离拷贝。不需要修改的共享即可——但是从技术角度实现复杂,不可能实现
  • 如果fork的时候,就无脑拷贝数据给子进程,会增加fork的成本(内存和时间)

所以最终采用写时拷贝:

  • 写时拷贝只会拷父子修改的,变相的,就是拷贝数据的最小成本
  • 拷贝的成本依旧存在
    **写时拷贝本质是延迟拷贝策略!**只有真正使用的时候,才给你!
    你想要,但是不立马使用的空间,先不给你,那么也就意味着可以先给别人!
    变相的提高内存的使用率!

7.fork有两个返回值,pid_ t id ,同一个变量,怎么会有不同的值?

  • 当一个函数准备return,return 会被执行两次,return 的本质,就是通过寄存器将返回值写入到接受返回值的变量中,其实在return之前,你的子进程已经创建好了,准备被调度了,所以,返回的本质就是写入,谁先返回,谁就先写入父进程和子进程各自执行return!

  • 当id=fork()的时候,谁先返回,谁就要发生写时拷贝,所以,同一个变量,会有不同的内容值,本质是因为大家的虚拟地址是一样的,但是大家对应的物理地址是不一样的! !

相关文章:

七、进程地址空间

一、环境变量 &#xff08;一&#xff09;概念 环境变量(environment variables)&#xff1a;系统当中用做特殊用途的系统变量。 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但是照样可…...

浅谈智能微电网供电系统的谐波治理

摘要&#xff1a;智能微电网供电系统的特性容易引发谐波&#xff0c;而谐波导致电力损耗加大&#xff0c;降低供电质量。本文从谐波的产 生原因和危害做出详细阐述&#xff0c;并结合智能微电网提出了治 理谐波的方法和措施。 关键词&#xff1a;智能微电网&#xff1b;谐波危害…...

springboot项目的社区/博客系统

课前导读&#xff1a; 你学完一篇&#xff0c;你就多会一项技能&#xff0c;多多少少对你还是有点帮助的不是吗&#xff1f;~~~ 这是博主网页的url&#xff1a;优文共享社区 开发环境&#xff1a;JDK1.8&#xff0c;IDEA2021&#xff0c;MySQL5.7&#xff0c;Windows11 开发技术…...

go语言基础——函数、结构体、接口

由于go不是一门面向对象的语言&#xff0c;因此在有一些特性上和java是有一些区别的&#xff0c;比如go中就没有类这样的概念。下面来介绍一下go的一些特性。 结构体 结构体类似与java中的类&#xff0c;但又不完全一样。在类中&#xff0c;可以定义字段和方法&#xff0c;但…...

项目集管理—项目集治理

一、概述 项目集治理是实现和执行项目集决策&#xff0c;为支持项目集而制定实践&#xff0c;并维持项目集监督的绩效领域。 本章包括&#xff1a; 项目集治理实践项目集治理角色项目集治理设计与实施 项目集治理包括为了满足组织战略和运营目标的要求&#xff0c;对项目集实…...

MySQL了解之复制(一)

1.1、复制解决的问题 数据复制技术有以下一些特点&#xff1a; (1) 数据分布 (2) 负载平衡(load balancing) (3) 备份 (4) 高可用性(high availability)和容错 1.2、复制如何工作 从高层来看&#xff0c;复制分成三步&#xff1a; (1) master将改变记录到二进制…...

Halcon得出三角形内切圆

Halcon得出三角形内切圆 news2023/5/27 7:14: 目录 一、得出三角形的三个角点二、用类似尺规作图法得出三角形圆心 1、以三角形三角点画出圆形轮廓2、求出三角形轮廓与圆形轮廓之间的交点3、获得角平分线&#xff0c;三边角平分线交点为圆心三、求出圆心到边最短距离即半径 …...

2023年6月北京/广州/深圳CDGA/CDGP数据治理认证招生

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…...

KMP 算法(Knuth-Morris-Pratt)

tip&#xff1a;作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; 文章目录 一、什么是 …...

Java泛型详解

泛型的理解 泛型的概念 所谓泛型&#xff0c;就是允许在定义类、接口时通过一个标识表示类中某个属性的类型 或者是 某个方法的返回值类型及参数类型。这个类型参数将在使用时&#xff08;例如&#xff0c;继承或实现这个接口&#xff0c;用这个类型声明变量、创建对象时&#…...

2023上海国际嵌入式展 | 如何通过人工智能驱动的自动化测试工具提升嵌入式开发效率

2023年6月14日到16日&#xff0c;龙智将在2023上海国际嵌入式展&#xff08;embedded world China 2023&#xff09;A055展位亮相。同时&#xff0c;6月14日下午3:00-3:30&#xff0c;龙智资深DevSecOps顾问巫晓光将于创新技术及应用发展论坛第二论坛区&#xff08;A325展位&am…...

微信小程序个人心得

首先从官方文档给的框架说起,微信小程序官方文档给出了app.js, app.json, app.wxss. 先从这三个文件说起. 复制 app.js 这个文件是整个小程序的入口文件,开发者的逻辑代码在这里面实现,同时在这个文件夹里面可以定义全局变量.app.json 这个文件可以对小程序进行全局配置,决定…...

苹果MacOS系统傻瓜式本地部署AI绘画Stable Diffusion教程

Stable Diffusion的部署对小白来说非常麻烦&#xff0c;特别是又不懂技术的人。今天分享两个一键傻瓜式安装包&#xff0c;对小白来说非常有用。下面两个任选一个安装就可以。 一、DiffusionBee 简单介绍 DiffusionBee是基于stable diffusion的一个安装包&#xff0c;有图形…...

DBA之路-- 闪回恢复区FRA(Flash recovery area)与闪回特性(flashback)[待更新]

闪回恢复区FRA&#xff08;Flash recovery area&#xff09;与闪回特性&#xff08;flashback&#xff09; 1、闪回特性FB 用于快速简单恢复数据库中出现的认为误操作等逻辑错误 Flashback由undo表空间的撤销段内容为基础&#xff0c;受限于UNDO_RETENTON参数。要使用flashb…...

chatgpt赋能python:Python3.6.5到Python3.7.5:升级指南

Python 3.6.5到Python 3.7.5&#xff1a;升级指南 Python是一种广泛使用的编程语言&#xff0c;拥有强大的库和框架&#xff0c;能够开发各种类型的应用程序。在Python的发行版中&#xff0c;版本更新是常见的过程&#xff0c;以提供更好的性能和新的功能。 本文将介绍如何将…...

Element UI DatePicker 日期选择器

该组件选择周的时候&#xff0c;默认显示‘xxxx年第x周’&#xff0c;但在需求要显示为‘xxxx年x月第x周&#xff08;mm.dd - mm.dd)’或者‘本周&#xff08;mm.dd - mm.dd)’&#xff0c;最终效果为 首先需要修改v-model默认展示日期&#xff0c;控件中默认展示为周二&#x…...

sw2urdf导出的urdf文件中的惯性参数(inertial)错误的问题

现象描述 有时候&#xff0c;当我们使用solidworks建好我们的模型&#xff0c;然后利用【sw2urdf】导出后&#xff0c;发现其中的惯性参数&#xff0c;似乎不正确&#xff0c;ixx、izz这些参数都是很接近0的&#xff1a; 资料查找 其实这个不是我们设置的问题&#xff0c;而…...

AICG - Stable Diffusion 学习思考踩坑实录(待续补充)

关于模型 如果模型中没有各种角度的脚和手&#xff0c;无论你再怎么费劲心思&#xff0c;AI 都画不出来&#xff0c;目前C 站也没有什么好脚的例子&#xff0c;正面脚背面脚&#xff0c;但是没有侧面脚&#xff0c;脚这块还是很欠缺&#xff0c;希望未来有大牛能训练出来美脚 …...

LiangGaRy-学习笔记-Day19

1、回顾知识 1.1、文件系统说明 xfs与ext4文件系统 CentOS7以上&#xff1a;默认的就是XFS文件系统 xfs 使用的就是restore、dump等工具 CentOS6默认的就是ext4文件系统 extundelete工具就是用于ext4系统 1.2、回顾Linux文件系统 Linux文件系统是由三个部分组成 inode文…...

智能指针(1)

智能指针&#xff08;1&#xff09; 概念内存泄漏指针指针概念RAII使用裸指针存在的问题 智能指针使用分类unique&#xff08;唯一性智能指针&#xff09;介绍智能指针的仿写代码理解删除器 概念 内存泄漏 内存泄漏&#xff1a;程序中已动态分配的堆内存由于某些原因而未释放…...

Steemit 会颠覆 Quora/知乎 甚至 Facebook 吗?

Steemit是基于区块链技术的社交媒体平台&#xff0c;其独特的激励机制吸引了众多用户。然而&#xff0c;是否能够真正颠覆Quora、知乎甚至Facebook这些已经成为社交巨头的平台&#xff0c;仍然存在着许多未知因素。本文将探讨Steemit的优势和挑战&#xff0c;以及其在社交领域中…...

002Mybatis初始化引入

引入依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId> </dependency> 自动检测工程中的DataSource创建并注册SqlSessionFactory实例创建并注册SqlSessionTemplate实例自…...

系统架构师之高内聚低耦合

一、概念&#xff1a; 标记耦合&#xff08;Stamp Coupling&#xff09;和数据耦合&#xff08;Data Coupling&#xff09;是软件设计中两种不同的耦合类型&#xff0c;它们之间的区别如下&#xff1a; 标记耦合&#xff1a;标记耦合是指模块之间通过参数传递标记或标识符来进…...

Netty核心源码剖析(二)

1.Netty接受请求过程源码剖析 1>.从之前的Netty启动过程源码剖析中,我们得知服务器最终注册了一个Accept事件等待客户端的连接.我们也知道,NioServerSocketChannel将自己注册到了bossGroup单例线程池(reactor线程)上,也就是EventLoop; 2>.先简单说下EventLoop的逻辑,Ev…...

「C/C++」C/C++ Lamada表达式

✨博客主页&#xff1a;何曾参静谧的博客 &#x1f4cc;文章专栏&#xff1a;「C/C」C/C程序设计 相关术语 Lambda表达式&#xff1a;是C11引入的一种函数对象&#xff0c;可以方便地创建匿名函数。与传统的函数不同&#xff0c;Lambda表达式可以在定义时直接嵌入代码&#xff…...

bug(Tomcat):StandardContext.startInternal 由于之前的错误,Context[/day01]启动失败

引出 项目启动失败&#xff0c;一个困扰了一上午的bug 报错信息 org.apache.catalina.core.StandardContext.startInternal 一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到 org.apache.catalina.core.StandardContext.startInternal 由于之前的错误…...

Java性能权威指南-总结6

Java性能权威指南-总结6 垃圾收集入门垃圾收集概述GC算法选择GC算法 垃圾收集入门 垃圾收集概述 GC算法 JVM提供了以下四种不同的垃圾收集算法: Serial垃圾收集器 Serial垃圾收集器是四种垃圾收集器中最简单的一种。如果应用运行在Client型虚拟机(Windows平台上的32位JVM或…...

群的定义及性质

群的定义 设 < G , ⋅ > \left<G,\cdot\right> ⟨G,⋅⟩为独异点&#xff0c;若 G G G中每个元素关于 ⋅ \cdot ⋅都是可逆的&#xff0c;则称 < G , ⋅ > \left<G,\cdot\right> ⟨G,⋅⟩为群 由于群中结合律成立&#xff0c;每个元素的逆元是唯一的 …...

mac电脑git clone项目时报错证书过期和权限被拒绝

mac电脑使用git clone命令克隆项目时&#xff0c;一开始一直提示证书过期 SSL certificate problem: certificate has expired 执行以下代码关掉验证后&#xff0c;解决了这个问题 找到git目录 Git\git-cmd输入命令跳转到bin目录&#xff0c;cd bin输入命令运行git.exe执行关…...

【AIGC】Photoshop AI Beta版本安装使用(永久免费)

AIGC 大爆发 Adobe近日宣布&#xff0c;Photoshop&#xff08;测试版&#xff09;应用程序发布了生成式AI绘图&#xff0c;这是世界上第一个创意和设计工作流程的副驾驶&#xff0c;为用户提供了一种神奇的新工作方式。生成式AI绘图由Adobe Firefly提供支持&#xff0c;Adobe的…...

中国建设工程造价管理协会官网/网站页面seo

Android菜单详解&#xff08;五&#xff09;——使用XML生成菜单 - CodingMyWorld - 博客园 回顾前面的几篇&#xff0c;我们都是直接在代码中添加菜单项&#xff0c;给菜单项分组等&#xff0c;这是比较传统的做法&#xff0c;它存在着一些不足。比如说&#xff0c;为了响应每…...

做彩票网站代理犯法吗6/aso排名优化知识

在以往的工作经历中&#xff0c;虽然也会出现公司的一些规章制度&#xff0c;但我鲜少与其打交道&#xff0c;也极少听说。但是来KB这里&#xff0c;突然发现公司居然并没有给我配备电脑&#xff01;&#xff01;原因是制度上并没有写IT人员入职需要配备电脑&#xff0c;尔后通…...

怎么和其他网站交换友情链接/营销策划书

使用 React Native 构建移动应用程序比你想象的要容易——那是因为它使用了 JavaScript&#xff0c;这是一种易于学习的编程语言。在该项目一位经验丰富的开发人员的帮助下&#xff0c;你可以节省时间和金钱&#xff0c;并创建一个具有原生感觉和外观的应用程序。 React Native…...

seo怎么收费/外贸谷歌优化

3.如何确定行数与列数 ①如果我们直接往TableLayout中添加组件的话,那么这个组件将占满一行&#xff01;&#xff01;&#xff01;②如果我们想一行上有多个组件的话,就要添加一个TableRow的容器,把组件都丢到里面&#xff01;③tablerow中的组件个数就决定了该行有多少列,而列…...

淘宝可以到哪些网站做推广/网站平台做推广

你好&#xff0c;每秒zd查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准&#xff0c;在因特网上&#xff0c;作为域名系统服务器的机器的性能经常用每秒查询率来衡量。 原理&#xff1a;每天版80%的访问集中在20%的时间里&#xff0c;这20%时间叫做峰值…...

广州 餐饮 网站建设/seo网站关键词优化方式

实验室通风柜在实验室中起到了决定性的作用&#xff0c;因为这关系到实验室内的环境是不是遭到破坏&#xff0c;实验室人员的身体健康问题等。那么通常在实验过程中&#xff0c;一些化学实验可能会导致一些粉尘及有害气体的出现&#xff0c;即使在我们做好防护的同时&#xff0…...