PG系列5:PG体系结构

news2024/11/20 16:54:06

文章目录

  • 一. PG体系结构
    • 1.1 PG的体系结构概述
    • 1.2 PostgreSQL进程概述
  • 二. PG内存结构
  • 三. PostgreSQL进程
    • 3.1 后台进程
    • 3.2 后端进程(backend)或服务器进程
    • 3.3 用户进程或客户端进程
    • 3.4 数据库服务器启动流程
  • 四. PG逻辑结构
    • 4.1 PostgreSQL cluster
    • 4.2 database和cluster的关系
    • 4.3 数据库实例和cluster的关系
    • 4.4 PostgreSQL的tablespace
    • 4.5 Sgment
    • 4.6 Extent
    • 4.7 Block
  • 五. PG物理结构
    • 5.1 cluster的物理结构图谱
    • 5.2 cluster在文件系统上的结构
    • 5.3 测试一个表空间及表的例子
  • 参考:

一. PG体系结构

1.1 PG的体系结构概述

PostgreSQL的主要结构如下:
image.png

1.2 PostgreSQL进程概述

PostgreSQL进程结构图谱和分类:
image.png

二. PG内存结构

image.png

内存结构分为共享内存、本地内存。类似于Oracle的SGA和PGA。

共享内存
是指数据库服务器向操作系统申请的共享内存段,如数据共享缓冲区、日志缓冲区、事务提交日志内存区等,提供给PostgreSQL服务器的所有进程使用。

数据共享缓冲区:PostgreSQL把要操作和处理的表、index,读入到内存中,放到该区域缓存。类似于Oracle的database buffer cache。其大小由shared_buffers参数决定。

日志缓冲区:用于缓存数据库中对数据修改的日志记录,如:update table test set id=1这条SQL语句,数据库会把这个操作的信息记录在该内存区,将来写出到日志文件中,如果配置为归档模式,则最终写出到归档日志文件中去,用于恢复使用。其大小由wal_buffers参数决定。类似于Oracle的log buffer。

提交日志缓冲区:该内存区域有别于wal buffer日志缓冲区。它用于记录数据库中所有事务的提交状态,事务是否已经提交,是否已经终止,是否进行中,子事务等状态信息。用于MVCC。

本地内存
当我们和数据库建立一个连接请求时,数据库帮我们创建1个后端进程。并给该后端进程分配的内存区域,该内存区域只属于这一个后端进程使用,可以认为是私有的。用于处理和响应我们向数据库发起的请求操作。通常包含:工作区work mem、维护工作区、临时缓冲区。

工作区:该内存区用于处理客户端SQL语句请求的order by排序、distinct过滤、表合并连接merge-join、哈希连接hash-join操作等。由work_mem参数决定大小。

维护工作区:该内存区域用于处理重建索引reindex、vacuum空间回收操作、给表添加外键约束等。由maintenance_work_mem参数决定大小。

临时缓冲区:该内存区用于创建和访问临时表时,存放临时表的数据。该内存区和因为SQL中因为大表排序或hash table而在服务器上建立的临时文件(位于pgsql_tmp路径下)没有直接关系。由temp_buffers参数决定大小。

三. PostgreSQL进程

PostgreSQL数据库的进程可以分为三类:后台进程、后端进程或叫服务器进程、客户端进程或用户进程。

3.1 后台进程

image.png

此处我的测试库因为有些功能还未安装,有些进程不存在。

  1. /usr/pgsql-15/bin/postmaster -D /var/lib/pgsql/15/data/是数据库服务器的master进程,其它诸如checkpoint,background writer,walwrite,autovacuum launcher,stats collector,logical replication launcher都是由它fork的子进程。当然,数据库运行模式不同,配置不同,也可能有其它后台进程,如归档进程等。

  2. postgres:PostgreSQL数据库的核心进程,也是整个cluster的父进程,该进程出现问题,整个cluster就over了。该进程由操作系统的守护进程1号进程派生。Linux下的1号进程是整个服务器的守护进程,类比于Java程序中的Object类,一切类的父类。

  3. checkpointer:检查点进程,等价于Oracle的CKPT进程,负责完成数据库的检查点,通知数据库的写进程DBWR将内存中的脏数据写出到磁盘。

  4. background writer :等价于Oracle的DBWR进程,负责将内存中的脏数据写出到磁盘。

  5. walwriter :等价于Oracle的LGWR进程,负责将日志缓冲区中的记录关于数据库的修改的日志写出到日志文件中去,确保数据的修改不会丢失,用于恢复使用。

  6. autovacuum launcher:自动清理工作进程。由于PostgreSQL不像Oracle那样有undo的机制,将数据被修改前的信息写入到undo,然后修改数据。PostgreSQL采取的是在原数据块上进行保留旧的数据,并作标记,等到将来修改提交生效之后,旧的数据(dead tuple翻译为死元组)不需要的话,就得清理,由该进程来完成。

  7. stats collector:统计信息收集进程。用于及时的更新数据库中的统计信息,如表、index有多少条记录,数据分布等,给优化器提供最新的信息,便于优化器选择最优的执行计划。避免统计信息不准确,导致优化器选择错误的执行计划,导致SQL性能下降或偏差。

  8. logical replication launcher:逻辑复制进程。用于完成逻辑复制的工作。

  9. archiver:归档进程,等价于Oracle的ARCH进程,用于完成数据库日志文件的归档。当数据库配置了归档模式之后,可以看到该进程。

3.2 后端进程(backend)或服务器进程

当我们的应用程序和图形界面的客户端工具,连接到PostgreSQL数据库服务器时。master进程会为该应用程序创建1个服务器进程,用于处理和响应该客户端应用程序的请求。

image.png

image.png

如上,可以看到服务器进程号是18499,通过select pg_backend_pid()查询。同时,看到服务器上该进程的父进程是1164,由 /usr/pgsql-15/bin/postmaster -D /var/lib/pgsql/15/data/这个主进程派生。

后端进程或服务器进程的数量由max_connections参数决定。

每一个后端进程一次只能访问一个数据库。它和客户端进程进行TCP通信,开户端断开之后,该进程自动回收消失。客户端重新连接或发起新连接时重新创建新的后端进程。

由于进程的创建或回收,比较消耗操作系统的资源,因此,多数情况下,应用系统都会通过连接池的方式和数据库建立连接。

从PostgreSQL官方给后端进程的命名可以看到还是一脉相承的,比如,我们查看当前会话所在的后端进程号或者叫服务器进程的时候,我们调用的是pg_backend_pid()函数,杀会话所在进程时,调用的是pg_terminate_backend(),或者pg_cancel_backend()。

3.3 用户进程或客户端进程

指的是连接数据库服务器的应用程序或者客户端工具等。
image.png

每个用户进程或者客户端进程对应一个服务端进程。
image.png

这2张图引自《PostgreSQL for DBA Architects》p21-22。

3.4 数据库服务器启动流程

当我们通过pg_ctl工具来启动PostgreSQL数据库时,先在操作系统上创建1个master进程,然后该进程派生出一系列的后台进程,同时该进程监听$PGDATA/postgresql.conf配置文件中指定的端口。并且,向操作系统申请内存,用于数据库的正常运行操作,处理客户端的连接请求操作处理。最后,数据库可以正常对外提供服务。

image.png

四. PG逻辑结构

PG逻辑结构图解:
image.png

image.png

4.1 PostgreSQL cluster

当我们在一台服务器上安装部署并且初始化一个PostgreSQL数据库之后,严格的讲,其实是我们安装部署了一套PostgreSQL数据库软件,然后初始化了一个PostgreSQL的database cluster。这里的cluster是什么概念呢?

首先,这里的cluster完全是个逻辑上的概念,它是指一系列的数据库的集合。它所包含的数据库就是指,当我们以postmaster -D /var/lib/pgsql/15/data/ start来启动数据库cluster时,由这个-D参数指定,或者是PGDATA环境变量指定的路径下的所有的数据库的集合。当然,这么说太抽象了,其实,从物理上,我们可以这么说明和解释:

[root@sr-fe ~]# su - postgres
上一次登录:日 6月 25 10:10:40 CST 2023pts/2 上
-bash-4.2$ 
-bash-4.2$ env | grep PGDATA
PGDATA=/var/lib/pgsql/15/data
-bash-4.2$ 
-bash-4.2$ 
-bash-4.2$ ll /var/lib/pgsql/15/data
total 68
drwx------ 5 postgres postgres    33 Jun  9 19:17 base
-rw------- 1 postgres postgres    30 Jun 25 00:00 current_logfiles
drwx------ 2 postgres postgres  4096 Jun 25 10:10 global
drwx------ 2 postgres postgres   188 Jun 15 00:00 log
drwx------ 2 postgres postgres     6 Jun  9 19:17 pg_commit_ts
drwx------ 2 postgres postgres     6 Jun  9 19:17 pg_dynshmem
-rw------- 1 postgres postgres  4574 Jun 12 10:28 pg_hba.conf
-rw------- 1 postgres postgres  1636 Jun  9 19:17 pg_ident.conf
drwx------ 4 postgres postgres    68 Jun 22 22:16 pg_logical
drwx------ 4 postgres postgres    36 Jun  9 19:17 pg_multixact
drwx------ 2 postgres postgres     6 Jun  9 19:17 pg_notify
drwx------ 2 postgres postgres     6 Jun  9 19:17 pg_replslot
drwx------ 2 postgres postgres     6 Jun  9 19:17 pg_serial
drwx------ 2 postgres postgres     6 Jun  9 19:17 pg_snapshots
drwx------ 2 postgres postgres     6 Jun 12 10:28 pg_stat
drwx------ 2 postgres postgres     6 Jun  9 19:17 pg_stat_tmp
drwx------ 2 postgres postgres    18 Jun  9 19:17 pg_subtrans
drwx------ 2 postgres postgres     6 Jun  9 19:17 pg_tblspc
drwx------ 2 postgres postgres     6 Jun  9 19:17 pg_twophase
-rw------- 1 postgres postgres     3 Jun  9 19:17 PG_VERSION
drwx------ 3 postgres postgres    60 Jun  9 19:17 pg_wal
drwx------ 2 postgres postgres    18 Jun  9 19:17 pg_xact
-rw------- 1 postgres postgres    88 Jun  9 19:17 postgresql.auto.conf
-rw------- 1 postgres postgres 29451 Jun 12 10:25 postgresql.conf
-rw------- 1 postgres postgres    58 Jun 22 22:16 postmaster.opts
-rw------- 1 postgres postgres    95 Jun 22 22:16 postmaster.pid
-bash-4.2$ 
-bash-4.2$ oid2name
All databases:
  Oid  Database Name  Tablespace
--------------------------------
    5       postgres  pg_default
    4      template0  pg_default
    1      template1  pg_default
-bash-4.2$ 
-bash-4.2$ psql
psql (9.2.24, server 15.3)
WARNING: psql version 9.2, server version 15.0.
         Some psql features might not work.
Type "help" for help.

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

postgres=# select oid,datname from pg_database ;
 oid |  datname  
-----+-----------
   5 | postgres
   1 | template1
   4 | template0
(3 rows)

postgres=# 

4.2 database和cluster的关系

数据库是指一些列数据库对象的集合,比如表,index,view,function等这些数据库对象隶属于一个特定的数据库。

cluster指的是一些列数据库的集合。比如:一个cluster初始化之后,包含3个默认数据库:postgres,默认的管理数据库;template0,默认的不可修改的空数据库;template1,默认的模板数据库,当我们创建数据库时,会参照该数据库来创建。

当我们在template1模板数据库中创建和安装1个数据库插件extension,uuid之后,再去创建新的数据库,那么新数据库中就会自动包含该uuid这个extension。

1个cluster可以包含多个数据库,反过来1个database只能隶属于1个cluster。

image.png

4.3 数据库实例和cluster的关系

我们定义数据库实例是指一堆PostgreSQL的后台进程和内存结构,cluster指的是我们在初始化数据库时,指定的PGDATA环境变量指向的操作系统上的那个路径下的一堆的文件。

一个数据库实例在其一个生命周期内(从启动到关闭)只能“挂载”一个数据库cluster,反之,一个cluster也只能被一个实例挂载访问。二者之间是严格的一对一关系。

但是,在一台服务器上,我们可以安装一套PostgreSQL数据库软件,用这个数据库软件可以创建多个实例和多个cluster。每个实例对应于一个cluster。只要每个cluster所指定的监听端口不同,我们就可以同时运行多个实例和cluster。

如:我们可以在这套环境上再初始化一个实例和cluster,将其指向另外一个监听端口即可。

4.4 PostgreSQL的tablespace

定义:
tablespace依然是一个逻辑概念,它是隶属于cluster的。

查看:
通过pg_tablespace字典表来查看cluster下表空间的信息,或者是\db命令也可查看表空间的信息;
image.png

默认表空间:
每个cluster默认情况下有2个表空间,分别命名为pg_default用于存放各个数据库私有的数据库对象,pg_global用于存放cluster全局共享的数据库对象信息,例如:cluster中数据库本身的信息,表空间的信息,数据库订阅信息,数据库复制信息,数据库认证授权信息、控制文件等。

专用表空间:
pg_global表空间是专表空间专用的,只能存放全局共享的数据库对象,不能存放用户数据,否则报错:

pg_default,表空间,默认存放cluster下所有数据库的所有数据库对象。这一点儿上,倒是有点儿类似于Oracle数据库的专表空间专用。

表空间和数据库的关系:一个表空间可以给多个数据库使用,一个数据库里的不同数据库对象也可以存放在不同的表空间下。表空间和数据库的关系,不严格的讲,可以说是多对多的关系。不像Oracle数据库中,一个数据库可以包含多个表空间,且每个表空间只能属于一个数据库使用。
如何创建表空间:OS上路径需提前创建,postgres用户得有读写操作系统文件系统权限,数据库管理员权限。

-- 不要把表空间目录放在data目录下
-bash-4.2$ psql
psql (9.2.24, server 15.3)
WARNING: psql version 9.2, server version 15.0.
         Some psql features might not work.
Type "help" for help.

postgres=# 
postgres=# create tablespace newtbs location '/var/lib/pgsql/15/data/tbs_dir';
WARNING:  tablespace location should not be inside the data directory
CREATE TABLESPACE
postgres=# 

创建库表时指定表空间:

create database newdb tablespace newtbs;
create table test_tbs(id int) tablespace newtbs ;

修改表空间:
数据库创建之后,或者数据库对象(表、index等)创建之后,也可以分别通过alter database/table/index来修改表空间信息。

表空间作用:
主要用于逻辑上隔离数据库对象,或者用于数据库存储空间规划或迁移存储。想要通过表空间的设置,进而对于数据库性能提升?作用不大,毕竟现在基本上都是直接上SSD(Solid State Drive )存储给数据库使用。

4.5 Sgment

一个段是分配给一个逻辑结构(一个表、一个索引或其他对象)的一组区,是数据库对象使用的空间的集合;段可以有表段、索引段、回滚段、临时段和高速缓存段等。

4.6 Extent

区是数据库存储空间分配的一个逻辑单位,它由连续数据块所组成。第一个段是由一个或多个盘区组成。当一段中间所有空间已完全使用,PostgreSQL为该段分配一个新的范围。

4.7 Block

数据块是PostgreSQL 管理数据文件中存储空间的单位,为数据库使用的I/O的最小单位,是最小的逻辑部件。默认值8K。

五. PG物理结构

5.1 cluster的物理结构图谱

image.png

5.2 cluster在文件系统上的结构

目录文件概述:

base 				--存放默认数据库的目录
global				--存放的数据库相关的字典视图或者表文件		
pg_commit_ts		    --事务存放的提交的时间戳数据
pg_dynshmem		--动态内存分配存放的空间(dynamic share memeory)
pg_hba.conf			--基于主机的配置文件
pg_ident.conf		    --基于对等认证的配置文件
pg_logical			--存储数据库内部状态的逻辑解码数据
pg_multixact		    --存放多事务状态的数据
pg_notify			    --消息通知目录(LISTEN状态目录)
pg_replslot			--存放复制槽的数据
pg_serial			    --提交的可串行化事务的状态数据
pg_snapshots		    --执行导出快照函数时的状态信息数据
pg_stat 			    --统计信息目录
pg_stat_tmp 		    --临时统计信息目录
pg_subtrans	        --子事务目录
pg_tblspc            --表空间映射目录
pg_twophase         --两阶段提交状态的数据
PG_VERSION	        --存放主版本编号的文件
pg_wal				--存储 WAL 文件的目录
pg_xact 			    --事务提交的状态数据
postgresql.auto.conf --存储通过 ALTER SYSTEM 命令修改的参数文件(可以手动修改)
postgresql.conf       --数据库的参数配置文件
postmaster.opts       --上一次数据库启动状态的命令
postmaster.pid        --存放当前数据库的主进程编号及相关目录及端口的信息

image.png

数据文件:
$PGDATA/base:用于存放当前cluster下所有的数据库,数字化命名的路径表示各个数据库,每个数字表示数据库的oid。一些创建数据库时指定了表空间的库会存在表空间目录下,而不是这个目录。
image.png

关于文件名中类似如1213_fsm、1213_vm的文件,表示空闲空间映射文件(free space map),可见性映射文件(visibility map)。
image.png

表空间:
global:用于存放cluster级别共享的全局表,如pg_database,pg_tablespace表,其文件命名依旧采用oid的数字化格式。
image.png
我们可以从数据库中验证这些cluster级别的共享系统表的oid和global下的数字文件名匹配:
image.png

5.3 测试一个表空间及表的例子

代码:

create tablespace testtbs location '/var/lib/pgsql/newtbs';
create database newdb tablespace testtbs;
\c newdb;
create table test_tbs(id bigint) tablespace newtbs ;
insert into test_tbs select * from generate_series(1,1000000000);

测试记录:

postgres=# create tablespace testtbs location '/var/lib/pgsql/newtbs';
CREATE TABLESPACE
postgres=# create database newdb tablespace testtbs;
CREATE DATABASE
postgres=# 
postgres=# 
postgres=# \c newdb;
psql (9.2.24, server 15.3)
WARNING: psql version 9.2, server version 15.0.
         Some psql features might not work.
You are now connected to database "newdb" as user "postgres".
newdb=# create table test_tbs(id bigint) tablespace newtbs ;
CREATE TABLE
newdb=# insert into test_tbs select * from generate_series(1,1000000000);

INSERT 0 1000000000
newdb=# 

image.png

表的数据达到1G后会分割文件,所以会有这么多的文件

表大小达34GB

SELECT pg_size_pretty(pg_total_relation_size('test_tbs'));

image.png

SELECT datname, oid as database_id FROM pg_database WHERE datname = 'newdb';

SELECT nspname, oid as schema_id FROM pg_namespace WHERE nspname = 'public';

SELECT relname, oid as table_id FROM pg_class WHERE relname = 'test_tbs';

SELECT pg_relation_filepath('public.test_tbs');

image.png

参考:

  1. https://github.com/digoal/blog
  2. https://blog.csdn.net/m0_50880099/article/details/124431279
  3. http://www.taodudu.cc/news/show-1287235.html?action=onClick
  4. https://www.modb.pro/mes/1820
  5. https://www.modb.pro/db/389130
  6. http://www.knockatdatabase.com/2021/04/01/postgresql-architecture/#1

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

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

相关文章

DevExpress WPF Scheduler组件,快速构建性能优异的调度管理器!(上)

无论您在WPF项目中是需要Outlook样式的调度程序,还是需要时间表或议程视图来向最终用户展示信息,DevExpress WPF Scheduler都提供了数十个选项,如集成的日程对话框等,因此用户可以快速构建下一个伟大的调度管理器。 DevExpress W…

抖音本地生活团购服务商

抖音本地生活团购服务商市场前景非常广阔。随着移动互联网的普及和人们对本地生活服务需求的增加,本地生活团购行业已成为一个快速增长的市场。而抖音平台拥有庞大的用户基础和强大的社交媒体传播力,为本地生活团购服务商提供了巨大的发展机遇。 抖音…

刷题日记《链表02》

题目描述 给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 可以假设除了数字 0 之外,这两个数字都不会以零开头。 解题思路 面对这种求和相加的题目,不知道…

windows 下安装 mysql-8.0.25 解压版

介绍 此文介绍 mysql-8.0.25-winx64 的 zip 解压版,在 windows 下的安装与配置过程。 官方下载 官网下载页: https://downloads.mysql.com/archives/community/ 进入官网,选择默认版本就行,不需要包含测试工具套件的版本 本地解…

C++ day40

1、思维导图 2、定义一个命名空间Myspace,包含以下函数:将一个字符串中的所有单词进行反转,并输出反转后的结果。例如,输入字符串为"Hello World",输出结果为"olleH dlroW",并在主函数…

0基础入门---第四章---误差反向传播法

🌞欢迎来到深度学习的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 🙏作者水平很有限,如果发现错误&#xff…

Java性能权威指南-总结19

Java性能权威指南-总结19 Java EE性能调优JVM线程调优调节线程栈大小偏向锁自旋锁线程优先级 小结 Java EE性能调优Web容器的基本性能 Java EE性能调优 JVM线程调优 JVM的某些调优策略可以影响线程和同步的性能。 调节线程栈大小 当空间非常珍贵时,可以调节线程…

Day6——Web安全基础

网络安全学习笔记Day6 Web安全基础 一.Web简介什么是Web?什么是因特网?互联网,因特网,万维网的关系万维网构想的诞生http协议URL 二.Web发展史Web1.0Web2.01.0与2.0的区别Web1.0的安全漏洞Web2.0的安全漏洞 三.杂项门户网站静态页…

戴尔笔记本如何用U盘重装Win10系统?

戴尔笔记本如何用U盘重装Win10系统?很多使用戴尔笔记本的用户,都想知道如何用U盘来重装Win10系统,用户首先要确认自己的戴尔笔记本电脑能不能联网,然后再准备一个8G以上的U盘,最后根据小编分享的戴尔笔记本用U盘重装Wi…

Springboot Mybatis 不存在插入数据,存在则更新数据

前言 是不是经常看到代码, 查一下数据库,如果存在数据,就做更新语句调用; 如果不存在,就插入。 今天该篇介绍的 是使用 INSERT INTO ON DUPLICATE KEY UPDATE 来实现我们上述的场景, 不需要…

不能真“生成代码”的“低代码”平台,不可能获得程序员的认可

目录 前言 思考 解决问题 基本现状 发现亮点 前言 >前几天我和一个好友聊天的时候,他是这么评价低代码平台的:“想证明程序员都是傻X,又想让程序员买单!程序员本身心里就不爽... ” 那么,低代码发展势头迅猛的…

Live800:客服系统如何帮助企业优化服务流程

随着互联网的发展和社会进步,客服服务已经成为企业经营中不可或缺的一部分,然而,客服服务一直以来都备受诟病,用户对客服人员的不满情绪也随之而来。显然企业急需提升客户服务质量,这就离不开客服系统的帮助。 那么&am…

Linux系统中的信号

信号是由用户、系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。Linux信号可由如下条件产生: 对于前台进程,用户可以通过输入特殊的终端字符来给它发送信号。比如输入CtrlC通常会给进程发送一个中断信号&#xf…

人类语言和机器语言

人类语言和机器语言是两种不同的语言形式,二者之间有很多异同点。人类语言是人们日常交流所使用的语言,也是一种自然语言,人类语言是非常复杂和多样化的,包括文字、口语、手语等等,而机器语言则是非常简单和规范化的一…

Maven项目,本地jar包导入手动导入到Maven库中

当你的项目,由于网络或者环境这些问题,无法从maven中央仓库更新jar包到本地的时候,可以尝试下面方法,手动添加jar包到Maven仓库; 方法一(推荐): 1、需要先拿到你的jar包&#xff0…

Linux——3Linux用户和权限

目录 3.1 认识root用户 root用户(超级管理员) su 和 exit命令 sudo命令 3.2 用户、用户组 3.3 修改权限控制 - chmod 3.4 修改权限控制 - chown 3.1 认识root用户 root用户(超级管理员) 无论是Windows、MacOS、Linux均采…

8.10 TCP是如何实现可靠传输的

目录 TCP 最主要的特点 面向流的概念 Socket 有多种不同的意思 TCP是如何实现可靠传输的? A 如何知道 B 是否正确收到了 M1 呢? 确认丢失 确认迟到 连续 ARQ 协议 累计确认 TCP报文段的首部格式 TCP 最主要的特点 TCP 是面向连接的运输层协议&a…

基于Java理发店会员管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

深入探析CAN收发器NCV7342D10R2G各项参数

NCV7342D10R2G安森美深力科 CAN收发器是控制器局域网(CAN)协议控制器和物理总线之间的接口,可用于12V和24V系统。收发器向总线提供差分传输能力,向CAN控制器提供差分接收能力。由于接收器输入的共模电压范围很宽能够达到卓越的电磁…

charles unknown 问题和手机代理设置(iOS手机)

一、Charles下载 下载地址:https://www.charlesproxy.com/download/ 二、Charles配置代理 1.查看本机IP:help-->Local IP Address 2.查看或者设置访问端口:Proxy->Proxy Settings 3.设置不代理计算机的请求(推荐&#xff0…