2024年7月

前言

在开发一个新项目时遇到了动态库加载异常的问题,因此在这里记录一下动态库的链接和加载过程中库路径的搜索优先级的相关知识。

动态库的链接

现在有一个
main.o
可重定位目标文件,其中需要用到开源库log4cpp。在链接的时候,我们可以这样链接:

g++ main.o -o a.out -L/path/to/libs -llog4cpp

其中:

  • -L/path/to/libs
    表示链接器去哪个目录下查找库文件。
    编译时库搜索优先级:
    -L指定的路径
    >
    LIBRARY_PATH
    >
    默认库路径

  • -llog4cpp
    表示要链接的库,在链接阶段,链接器一般会按照搜索优先级,从库路径中查找名为
    liblog4cpp.so

    liblog4cpp.a
    的文件进行链接。若不特殊说明,默认优先链接动态库。

动态库的加载

在程序开始运行前的加载阶段,动态链接器会读取可执行文件,查找并加载所有必须的动态库。注意此时的搜索路径并不包含
/path/to/libs
,因为它只作用于链接阶段。链接器搜索的路径有:
LD_LIBRARY_PATH
环境变量,
/etc/ld.so.cache
文件,默认库路径(
/usr/lib
,
/lib
等)。

如果需要从指定的路径加载动态库,则可以使用下述方法:

  • 手动设置
    LD_LIBRARY_PATH
    环境变量:在程序运行前设置环境变量,指定动态库的搜索路径:
    export LD_LIBRARY_PATH=/path/to/runtime_libs:$LD_LIBRARY_PATH
    

    注意,此方法设置环境变量是临时的,一旦终端关闭设置就会失效。若想使其持久化,需要特殊设置,方法包括但不限于:修改.bashrc文件,修改rc.loacl文件。
  • 修改
    /etc/ld.so.conf

    /etc/ld.so.conf.d/*
    配置:
    这些文件提供了系统级别的库搜索路径。系统管理员可以在这些文件中定义默认的库搜索路径,这些设置对所有用户和应用程序都有效。
  • 在链接阶段使用
    -rpath
    :
    在链接阶段,设置RPATH或RUNPATH,将库路径硬编码到可执行文件中
    g++ main.o -o a.out -L/path/to/libs -llog4cpp -Wl,-rpath,/path/to/runtime_libs
    

    注意若可执行文件中同时包含RPATH和RUNPATH,那么RPATH将会被动态链接器忽略。

加载时共享库的搜索优先级为:
RPATH
>
LD_LIBRARY_PATH
>
RUNPATH
>
/etc/ld.so.conf

/etc/ld.so.conf.d/*
>
默认库路径

目录

第一章 信息化发展

1.1 信息与信息化

1.1.1 绪论

  • 信息化基础知识

1.1.1.1 信息化发展历程

  • 从历史角度查看信息化的发展

1.1.1.2 关于信息化

1.新一代IT推动了
新模式、新经济、新业态
  • 典型特征:
    • 智能化
      :以人工智能代表的技术 ;
    • 网络化
      :所有数据都是通过网络进行传播 ;
    • 数字化信息化
      .
2.核心关注点
  • 对物理世界的模拟(开发一个系统的本质是为了模拟现实世界的某些操作,比如OA,就是模拟现实的办公自动化配套流程或者数据,网上购菜系统,失去模拟真实的世界的人类怎么下单,怎么运输,怎么接收物品的过程)

  • 对未来的预测(通过人工智能,大数据,从已知的数据里绘制一些未知的趋势,哪个区域的用户喜欢哪类商品,预测之后,可以重新去组织货物的供应)

  • 对物理世界的优化(通过信息化,去优化现实世界后者物理世界)

3.信息化发展主要方向
  • 个性化需求的高效满足: 希望平台满足自己的个性化需求.

1.1.1.3 信息化的重要性

①信息化的发展水平代表一个国家的信息能力,信息产业成为国家核心竞争力的新战略高地,信息技术成为国家间竞争的核心聚焦(IT产业已经成为国家的核心竞争力,数字化和信息化关系紧密)

②数字经济、数字人才成为区域经济与社会发展的重要支点,这不仅需要各类组织持续强化信息技术人才的业务能力建设,也需要更加关注业务技术人才的信息技术能力建设,从而形成立体化、多元化的新型人才体系(需要相关人才)

③作为数字化转型主体的计算机信息系统工程是一项复杂的社会和技术工程,无论是内容、规模、深度和广度,还是技术、工具、业务和流程,都在不断地发展和创新(是社会和技术相结合的产物)

1.1.2 信息

1.1.2.1 信息的基本概念---知识点

  • 信息和物质,能量三者是并列关系,信息能表达物质和能量.

  • 香农指出:
    信息是用来消除不确定性的东西"
    ,解析:什么是不确定,就是不知道这个事情未来发生还是发生,如果发生,也不知道这个事情会如何发生,或者发生的程度怎么样?本质就是风险知识领域,理解就是
    想办法得到更多的信息,对这件事的不确定性就越小
    .

  • 跟香浓一脉相承的维纳在《控制论》一书中,指出:"
    信息是就是信息,既非物质,也非能量
    ",信息单位是比特bit.

  • 信息是系统有序程度的度量,熵是系统无序程度的度量,而信息与熵正好相反,信息是系统有序程度的度量,表现为负熵.(熵:指的是混乱的程度,熵越大越混乱越无序,熵变小才有利,获得更多信息,就可以使熵减小,
    信息化过程核心
    就是,想办法让有序代替无序,让信息去抵消熵增)

1.1.2.2 信息的特征(11个)---知识点--了解,只看开头三个字

  • (1)
    客观性
    。主观信息必然要转化成客观信息,因此,信息具有客观性(
    例如:不以人的意志为转变
    )

  • (2)
    普遍性
    。物质决定精神,物质的普遍性决定了信息的普遍存在(
    例如:物质精神层面都存在
    )

  • (3)
    无限性
    。客观世界是无限的,反映客观世界的信息自然也是无限的(
    例如:世界无限扩展,所以相关的信息也是无限的
    )

  • (4)
    动态性
    。信息是随着时间的变化而变化的(
    例如:不断变化的
    )

  • (5)
    相对性
    。不同的认识主体从同一事物中获取的信息及信息量可能是不同的(
    例如:同一件事,不同人不同看法
    )

  • (6)
    依附性
    。一方面任何信息必然由客观事物所产生;另一方面任何信息都要有物质的承担者(
    例如:依附不同的载体,信息依附的载体语音、文字、符号、图像、声音、情景、表情、状态等
    )

  • (7)
    变换性
    。信息通过处理可以实现变换或转换,使其形式和内容发生变化(
    例如:微信语音转文字
    )

  • (8)
    传递性
    。信息在时间上的传递就是存储,在空间上的传递就是转移或扩散(
    例如:信息的传递方式主要有口头传递、文书传递和电讯传递
    )

  • (9)
    层次性
    。客观世界是分层次的,反映它的信息也是分层次的(
    例如:信息分高层和底层
    )

  • (10
    )系统性
    。信息可以表示为一种集合,不同类别的信息可以形成不同的整体(
    例如:每个信息都是独立组成的部分
    )

  • (11)
    转化性
    。有效地使用信息可以将信转化为物质或能量(
    例如:信息可以通过转化成物质和能量
    )

1.1.2.3 信息的质量属性(7个)---知识点--了解,只看开头三个字

  • 信息有好有坏,这里就是评价好坏的

  • (1)
    精确性
    ,对事物状态描述的精准程度

  • (2)
    完整性
    ,对事物状态描述的全面程度,完整信息应包括所有重要事实(
    例如:信息要完整不要只传达片面信息
    )

  • (3)
    可靠性
    ,指信息的来源、采集方法、传输过程是可以信任的,符合预期(
    例如:信息真实的
    )

  • (4)
    及时性
    ,指获得信息的时刻与事件发生时刻的问隔长短(
    例如:信息在经济领域的股票上,需要及时
    )

  • (5)
    经济性
    ,指信息获取、传输带来的成本在可以接受的范围之内(
    例如:进行信息的存储收集传递等,最好是以低成本的方式进行信息的存储传递
    )

  • (6)
    可验证性
    ,指信息的主要质量属性可以被证实或者证伪的程度(
    例如:信息真伪可以比较容易进行验证
    )

  • (7)
    安全性
    ,指在信息的生命周期中,信息可以被非授权访问的可能性,可能性越低越安全(
    例如:第二到五章比较重要
    )

以上是做信息的数据处理,不是项目经理的工作,项目经理的工作是建造信息系统,上述是数据处理

1.1.2.4 信息系统的定义与分类

这里开始是高项的工作

  • 以计算机为基础的信息系统可以定义为:结合管理理论和方法,应用信息技术解决管理问题,提高生产效率,为生产或信息化过程以及管理和决策提供支撑的系统。(
    解析:工作内容对项目管理能力的要求高于IT能力,第一步是结合管理和方法,第二步才是应用信息技术,主要解决的是管理问题
    )

  • 信息系统的组成部件包括硬件、软件、数据库、网络、存储设备、感知设备、外设、
    人员
    以及把数据处理成信息的
    规程
    等。(
    解析:信息系统不光包含建造者,未来还包括系统用户和各种信息的处理或者传递的规程(规章就是流程
    )

  • 从用途类型来划分,信息系统一般包括电子商务系统、事务处理系统、管理信息系统、生产制造系统、电子政务系统、决策支持系统等。(
    解析:决策支持系统过去使用很多数据挖掘技术,当今2024年,就是用到很多AI技术
    )

面向管理 支持生产 是信息系统的显著特点,第一个要是支持生产,第二个是面向管理.

1.1.2.5 信息系统抽象模型

  • 存在于高项第4版新出的.

  • 需要1)了解作为项目经理,什么情况下,才能支撑建立一个新系统,2)了解信息系统包括什么.

  • 管理模型
    是指系统服务对象领域的专门知识,以及分析和处理该领域问题的模型,又称为对象的处理模型(
    解析:将真实世界的问题抽象成管理模型,例如:电子商务系统,需要把真实的商务环境人员、流程和设备等抽象成管理模型,管理模型与IT无关
    )

  • 信息处理模型
    指系统处理信息的结构和方法(
    解析:将管理模型映射成信息处理模型(笔者认为,就是建模的过程)
    )

  • 系统实现条件
    指可供应用的计算机技术和通信技术、从事对象领域工作的人员,以及对这些资源的控制与融合(
    解析:想用新系统去解决现实世界中的管理问题所需的物质基础(包括IT技术支撑和人员配合)
    )

1.1.2.6 信息系统抽象模型

  • 为了工程化的需要,信息系统划分为具有典型特点的若干个阶段,每个阶段有不同的目标、工作方法阶段中的任务也由不同类型的人员来负责。这些阶段组成信息系统的生命周期。

  • 信息系统的生命周期可以简化为(
    重点考试掌握这五个阶段
    ):


    • 系统规划
      (可行性分析与项目开发计划)---整个项目的整体规划
    • 系统分析
      (需求分析)------- 需求分析主要来源于此
    • 系统设计
      (概要设计(也叫架构设计)、详细设计)
    • 系统实施
      (编码、测试)
    • 系统运行和维护
      等阶段

1.1.3 信息化

从整个企业甚至整个国家的层面来看待问题,就是信息化,相当于过去的现代化.

什么什么化,一般指的是一个过程.

1.1.3.1 什么是信息化

  • 信息化
    是指培养发展以计算机为主的智能化工具为代表的新生产力,并使之造福于社会的历史
    过程
    。(
    解析:不是短期过程,是长远的过程
    )

  • 信息化以现代
    通信、网络、数据库
    技术为基础,将所研究对象各要素汇总至数据库(
    不是真数据库,是数据集合
    .),供特定人群生活、工作、学习、辅助决策等,是和人类息息相关的各种行为相结合的一种技术。

  • 信息化的核心
    是通过
    全体社会成员
    的共同努力,在经济和社会各个领域充分应用基于信息技术的先进社会生产工具提高信息时代的社会生产力,并推动生产关系和上层建筑的改革,使国家的综合实力、社会的文明程度和人民的生活质量全面提升。

1.1.3.2 信息化的内涵

层次 内涵 解析
信息网络体系 包括信息资源、各种信息系统、公用通信网络平台等 信息化的一个基础,到处传递信息都要网络
信息产业基础 包括信息科学技术研究与开发、信息装备制造、信息咨询服务等 国家的基础
社会运行环境 包括现代工农业、管理体制、政策法律、规章制度、文化教育、道德观念等生产关系与上层建筑 要对各个行业进行信息化
效用积累过程 包括劳动者素质、国家现代化水平和人民生活质量的不断提高精神文明和物质文明建设不断进步等 效用积累:所有信息化系统或者全社会所有人对信息化的认知,不是一天完成的,不断地在生活中使用信息化系统,加强系统使用,使得大家不断地去接受使用信息化手段或生活或生产方式,再退出新系统,大家更容易接受,整个信息系统的运转和建立就很容易成功,这些就是效用积累的过程.

1.1.3.3 国家信息化体系

  • 信息资源(核心任务)

  • 信息网络(基础设施)

  • 信息技术应用(龙头)

  • 信息技术和产业(物质基础)

  • 信息化人才(成功之本/关键)

  • 信息化法规政策和标准规范(根本保障)

1.1.3.4 组织信息化趋势

  • 组织的信息化是国家经济与社会信息化的基础.
  • 组织:就是许多人组成的集合,小到一个团队,大到企业.
范围 描述 解析
产品信息化 物质产品的特征向信息产品的特征迈进,越来越多的产品中嵌入了智能化元器件 做个单项产品或者单项服务 .例如:手机,电视,冰箱
产业信息化 农业工业、服务业等传统产业广泛利用信息技术,大力开发和利用信息资源,从而实现产业的升级 指大的行业,比上一个更大的范围
社会生活信息化 市场、科技、教育、军事、政务、日常生活等在内的整个社会体系采用先进的信息技术 社会生活的方方面面.
国民经济信息化 生产、流通、分配、消费等经济的四个环节通过信息进一步连成一个整体 支持社会生活的生产等方面

国民经济信息化是世界各国急需实现的目标.

1.1.3.5 国家信息化趋势

  • 国家信息化发展战略总目标是建设网络强国,分“三步走":
时间 任务 解析
到2020年 核心关键技术部分领域达到国际先进水平,信息产业国际竞争力大幅提升,信息化成为驱动现代化建设的先导力量 基本实现,核心关键技术领先
到2025年 建成国际领先的移动通信网络,根本改变核心关键技术受制于人的局面,实现技术先进、产业发达、应用领先、网络安全坚不可摧的战略目标,涌现一批具有强大国际竞争力的大型跨国网信企业 移动通信网络5G/6G,国产化替代
到21世纪中叶 信息化全面支撑富强民主文明和谐的社会主义现代化国家建设,网络强国地位日益巩固在引领全球信息化发展方面有更大作为 引领全球信息化

1.1.3.5 国家信息化任务(了解)

  • 建设泛在智联的数字基础设施体系(
    解析:泛在:广泛存在或者信息系统服务达到随时可用,随地可用
    )

  • 建立高效利用的数据要素资源体系构建释放数字生产力的创新发展体系

  • 培育先进安全的数字产业体系构建产业数字化转型发展体系

  • 构筑共建共治共享的数字社会治理体系·打造协同高效的数字政府服务体系

  • 构建普惠便捷的数字民生保障体系·拓展互利共赢的数字领域国际合作体系

  • 建立健全规范有序的数字化发展治理体系(来自《“十四五”国家信息化规划》)

1.2 现代化基础设施

  • 现代化IT基础知识

1.2.1 新型基础设施建设--------新基建

1.2.1.1 传统基建------老基建

  • 传统基建叫做铁公基,国家要建设铁路\公路\机场\水利设置等等,会拉动很多产业的发展

1.2.1.2 新基建的内容

  • 新基建传统“铁公基"相对应,包括
    5G基建
    (橙色字体跟IT行业特别相关的)、特高压、城际高速铁路和城际轨道交通、新能源汽车充电桩、
    大数据中心

    人工智能

    工业互联网
    等七大领域.
新型基础设施包括三方面
方向 内容 解析
信息基础设施 (技术新) 包括:
①以5G、物联网、工业互联网、卫星互联网为代表的
通信网络
基础设施:
②以人工智能、云计算、区块链等为代表的
新技术
基础设施;
③以数据中心、智能计算中心为代表的
算力
基础设施等
三条都是跟技术相关的
融合基础设施(应用新) 深度应用互联网、大数据、人工智能等技术,支撑传统基础设施转型升级,进而形成的融合基础设施。包括
智能交通
基础设施、
智慧能源
基础设施等
把技术放到应用里边,带动新基建
创新基础设施(平台新) 支撑科学研究、技术开发、产品研制的具有公益属性的基础设施包括
重大科技
基础设施、
科教
基础设施、
产业技术创新
基础设施等
公益性或者科研类的

1.2.1.3 新基建发展重点(了解,看一遍)

  • ① 强化数字转型、智能升级、融合创新支撑,布局建设信息基础设施、融合基础设施创新基础设施等新型基础设施

  • ② 建设高速泛在、天地一体、集成互联、安全高效的信息基础设施,增强数据感知、传输、存储和运算能力(
    解析:天地一体:卫星通信技术和地面通信技术协议打通,从平行发展变为交叉发展
    )

  • ③ 加快5G网络规模化部署,持续提高用户普及率,推广升级千兆光纤网络

  • ④ 前瞻布局6G网络技术储备

  • ⑤ 扩容骨干网互联节点,新设批国际通信出入口,全面推进互联网协议第六版(IPV6)商用部署

  • ⑥ 实施中西部地区中小城市基础网络完善工程

  • ⑦ 推动物联网全面发展,打造支持固移融合、宽窄结合的物联接入能力

  • ⑧ 加快构建全国一体化大数据中心体系,强化算力统筹智能调度,建设若干国家枢纽节点和大数据中心集群,建设E级和10E级超级计算中心

  • ⑨ 积极稳妥发展工业互联网和车联网

  • ⑩ 打造全球覆盖、高效运行的通信、导航、遥感空间基础设施体系,建设商业航天发射场

  • ⑪ 加快交通、能源、市政等传统基础设施数字化改造,加强泛在感知、终端联网、智能调度体系建设

  • ⑫ 发挥市场主导作用,打通多元化投资渠道,构建新型基础设施标准体系

1.2.2 工业互联网

1.2.2.1 工业互联网的内涵

  • 工业互联网(Industrial Internet)是
    新一代信息通信技术

    工业经济
    深度融合

    的新型基础设施、应用模式和工业生态(
    解析:IT技术(新一代信息通信技术)和工业经济深度融合
    )

  • 通过对人、机、物、系统等的全面连接,构建起覆盖全产业链、全价值链的全新制造和服务体系,为工业乃至产业
    数字化

    网络化

    智能化
    发展提供了实现途径

  • 从工业经济发展角度


    • 推动传统工业转型升级
    • 加快新兴产业培育壮大
  • 从网络设施发展角度


    • 加速网络演进升级
    • 拓展数字经济空间

工业互联网是第四次工业革命的重要基石.

1.2.2.2 工业互联网平台体系

  • 工业互联网平台体系具有四大层级
层级 描述 解析
网络是基础 网络体系包括网络互联数据互通和标识解析三部分
平台是中枢 平台体系包括边缘层、laaS、PaaS和SaaS四个层级,相当于工业互联网的“操作系统” 边缘计算:把计算能力\通信能力\控制能力,放到比较底层的设备上
数据是要素 工业互联网数据有三个特性:
①重要性
②专业性
③复杂性
数据是工业互联网重要的要素
安全是保障 安全体系涉及设备、控制、网络、平台、工业App、娄数据等多方面网络安全问题 安全更复杂,因为多个设备联网,底层也联网

1.2.2.3 工业互联网网络体系

  • 网络互联:实现要素之间的数据传输,包括企业外网和企业内网。典型技术包括传统的工业总线、工监以太网以及创新的时间敏感网络(TSN)、确定性网络、5G等技术(
    解析:实现工业互联网所有的元素之间进行信息传递或者流通
    )


    • 企业外网根据工业高性能、高可靠、高灵活、高安全网络需求进行建设,用于连接企业各地机构、上下游企业、用户和产品
    • 企业内网用于连接企业内人员、机器、材料、环境、系统,主要包含
      信息(IT)网络和控制(OT)网络
      (控制网络应该是操作网络,这里需要记)。当前,内网技术发展呈现三个特征:
      IT和OT正走向融合,工业现场总线向工业以太网演进,工业无线技术加速发展
  • 数据互通:通过对数据进行标准化描述和统一建模,实现要素之间传输信息的相互理解,数据互通涉及数据传输、数据语义语法等不同层面(
    解析:关于数据的工业互联网数据.,例如:标准化处理,传输过程进行控制
    )

  • 标识解析:实现要素的标记、管理和定位,由标识编码、标识解析系统和标识数据服务组成,通过为物料、机器、产品等物理资源和工序、软件、模型数据等虚拟资源分配标识编码,实现物理实体和虚拟对象的逻辑定位和信息查询,支撑跨企业、跨地区、跨行业的数据共享共用(
    解析:标识解析:最早产生在物流行业,每个包裹要编数字进行编号才能追踪,工业互联网里所有需要控制的东西都要进行编码或者标识
    )

1.2.2.3 工业互联网平台体系的作用

层次 描述 解析
数据汇聚 网络层面采集的多源、异构、海量数据,传输至工业互联网平台,为深度分析和应用提供基础
建模分析 提供大数据、人工智能分析的算法模型和物理、化学等各类仿真工具,对海量数据挖掘分析 使用数据挖屈或者机器学习算法对汇聚来的数据进行分析处理
知识复用 将工业经验知识转化为平台上的模型库知识库,加速共性能力沉淀和普及 建模分析之后产生的知识或者模型,最好分发出去给未来的业务去使用,甚至给行业里不同的企业去用,叫做知识复用或者叫共享,强调形成知识库
应用创新 面向研发设计、设备管理、企业运营、资源调度等场景,帮助企业提质增效 所有工业互联网设计的要素和环节都可以创新

1.2.2.4 工业互联网安全的特点

  • 工业互联网安全体系的核心任务:通过监测预警、应急响应、检测评估、功能测试等手段确保工业互联网健康有序发展。特点:
特点 描述 解析
涉及范围广 工互联网打破了传统工业相对封闭可信的环境,网络攻击可直达生产一线。联网设备的爆发式增长和工业互联网平台的广泛应用,使网络攻击面持续扩大 包括很多终端设备都要连起来,安全隐患非常大
造成影响大 工业互联网涵盖制业、能源等实体经济领域,一旦发生网络攻击破坏行为,安全事件影响严重 大型工业企业掌握着国家生产基础的命脉,一旦发生安全事故造成的影响特别大
企业防护基础弱 目前我国广大工业企业安全意识、,防护能力仍然薄弱,整体安全保障能力有待进一步提升 传统工业进行信息化改造,其本身安全意识不是很强,企业防护基础薄弱

1.2.2.5 工业互联网典型应用模式(记住title)

  • (1)
    平台化设计
    :依托工业互联网平台,汇聚人员、算法、、模型、任务等设计资“实现高水平高效率的轻量化设计、并行设计、每敏捷设计、交互设计和基于模型的设计,变变革传统设计方式,提升研发质量和效率(
    解析:各个企业的设计任务可以放到平台上解决
    )

  • (2)
    智能化制造
    :互联网大数据人工智能等新一代信息技术在制造业领域加速创新应用,实现材料、设备、产品等生产要素与用户之间的在线连接和实时交互,逐步实现机器代替人工生产,智能化代表制造业未来发展的趋势.(
    解析:智能化主要是使用大数据人工智能技术,把技术引入到制造领域的制造过程中
    )

  • (3)
    网络化协同
    :通过跨部门、跨层级、跨企业的数据互通和业务互联,推动供应链上的企业和合作伙伴共享客户、订单、设计、生产、经营等各种信息资源,实现网络化的协同设计、协同生产、协同服务,进而促进资源共享、能力交易以及业务优化配置等。(
    解析:可以打通政府部门,通过工业互联网进行网络协同
    )

  • (4)
    个性化定制
    :面向消费者个性化需求,通过客户需求准确获取和分析、敏捷产品开发设计、柔性智能生产,精准交付服务等,实现用户在产品全生命周期中的深度参与,是以低成本、高质量和高效率的大批量生产实现产品个性化设计、生产、销售及服务的一种制造服务模式(
    解析:面向客户,甚至是个体的消费者,发展好了,消费者可以直接通过互联网把需求直接传递给设计生产企业,进行个性化定制
    )

  • (5)
    服务化延伸
    :是制造与服务融合发展的新型产业形态,指的是企业从原有制造业务向价值链两端高附加值坏节延伸,从以加工织装为主向“制造+服务“转型,从单纯出售产品向出售“产品+服务“转变,具体包括设备健康等理、产品远程运维、设备融资租赁、分享制造、互联网金融等(
    解析:工业企业生产出一个产品,要通过网络,将未来产品的升级,后台的后续服务,责任都移交给生产企业
    )

  • (6
    数字化管理
    :企业通过打通核心数据链,贯通制造全场景、全过程,基于数据的广泛汇聚、集成优化和价值挖据,优化、创新乃至重塑企业战略决策、产品研发、生产制造、经营管埋、市场服务等业务活动,构建数据驱动的高效运营管理新模式(
    解析:把整个企业的生产环节都使用数字化技术打通进行管理
    )

  • 总结
    工业互联网已延伸至众多个国民经济大类,涉及原材料、装备、消费品.电子等制造业各大领域,以及采矿、电力、建筑等实体经济重点产业,实现更大范围、更高水平、更深程度发展,形成了干姿百态的融合应用实践

总体讲工业互联网就是把新的技术应用到工业领域,然后强化工业的智能化生产

1.2.3 车联网

汽车已经深入千家万户,汽车已经成为一个集成的电子产品,汽车只是搭载网络的一个电子产品,从这个角度来看待车联网.

1.2.3.1 车联网的概念

  • 车联网(lnternet of Vehicles,loV)是新一代网络通信技术与汽车、电子、道路交通运输等领域
    深度融合
    的新兴产业形态。(
    解析:车联网:IT技术和多种设备,多个领域的融合,汽车只是其中一种
    )

  • 智能网联汽车是搭载先进的车载传感器控制器、执行器等装置,并融合现代通信与网络技术,实现
    车与车、路、人、云端
    等智能信息交换、共享,具备复杂环境感知、智能决策、协同控制等功能,可实现“安全、高效、舒适、节能”行驶的新一代汽车。(
    解析:车跟各种设备进行消息交换和共享,应对复杂环境协同工作
    )

1.2.3.2 车联网体系框架

  • 车联网系统是一个"端、管、云"三层体系
层级 描述 解析
端系统 智能传感器采集与获取车辆信息,感知行车状态与环境
具有车内通信、车间通信、车网通信的泛在通信终端
具备IOV寻址和网络可信标识等能力的设备
通过汽车传感器进行信息采集,做路况感知,车内通信,车与车之间通信
管系统 解决车与车、车与路、车与网、车与人等的
互联互通
实现车辆自组网及多种异构网络之间的通信与漫游
在功能和性能上保障实时性、可服务性与网络泛在性是公网与专网的统一体
管系统理解为管道系统,就是汽车跟各方面进行信息传递的管道系统,本质就是信息通道,要求安全稳定高效
云系统 车联网是一个云架构的车辆运行信息平台,生态链包含广泛(ITS、物流客货运、危特车辆、汽修汽配、汽车租赁、企事业车辆管理、汽车制造商4S店、车管、保险、紧急救援、移动互联网等),是多源海量信息的汇聚因此需要虚拟化、安全认证、实时交互、海量存储等云计算功能 多个职能部门加入,通过海量云计算指挥汽车,云系统状态才是真正的车联网转态

1.2.3.3 车联网链接方式

链接手段 描述 解析
车与云平台间的通信 车辆通过卫星无线通信或移动蜂窝等无线通信技术实现与车联网平台的信息传输,接收平台控制指令,实时共享数据 传统是4G/5G
没有信号就是卫星通信
车与车间的通信 车辆之间实现信息交流与信息共享,包括车辆位置、行驶速度等车辆状态信息,可用于判断道路车流状况
车与路间的通信 借助地面道路固定通信设施实现车辆与道路间的信息交流,用于监测道路路面状况,引导车辆选择最佳行驶路径
车与人间的通信 用户可以通过Wi-Fi、蓝牙、蜂窝等无线通信手段与车辆进行信息沟通,监测并控制车辆
车内设备间的通信 车辆内部各设备间的信息数据传输,用于对设备状态的实时检测与运行控制、建立数字化的车内控制系统

车联网本质就是联网

1.2.3.4 车联网的应用场景(了解)

场景 描述 解析
实用类场景应用 每秒数干次的数据点帮助车主在问题发生之前提前预测
远程信息处理让汽车具备安全防护功能,提高安全性
汽车跟踪提醒装置使车辆被持续追踪
跟车联网关系最为紧密的,通过感知及时汇报问题,远程云平台及时报告路况,关注个人试使用汽车体验
便捷类场景应用 车载平台的智能化发展,通过语音、手势控制就可以实现更多服务有助于创造更全的驾驶体验 便捷性来讲通过智能语言直接控制,还包括智能驾驶,控制汽车音乐,温度
效率类场景应用 车辆系统固件和软件的自动更新
车载远程服务可以将信息发送至车辆以及远程启动等
实现智能化交通,改善道路拥堵,提升出行效率和安全
跟场景应用有交叉,关注全社会的路况交通

1.3 现代化创新发展

各个产业里边如何应用或者引入IT技术,加快推进产业的发展.

1.3.1 农业农村现代化

  • 农业现代化的三个过程



    • 现代工业
      装备农业,用
      现代科学技术
      改造农业,用
      现代管理方法
      管理农业用
      现代科学文化知识
      提高农民素质的过程(
      解析:现代科学最重要的就是IT技术
      )
    • 建立高产、优质、高效农业生产体系,把农业建成具有显著经济效益、社会效益和生态效益的可持续发展的农业的过程
    • 大幅度提高农综合生产能力、不断增加农产品有效供给和农民收入的过程
  • 农业信息化 是农业现代化的重要技术手段


    • 利用信息技术和信息系统为农业产供销及相关的管理和服务提供有效的信息支持,以提高农业的综合生产力和经营管理效率的过程
    • 在农业领域全面地发展和应用信息技术,使之渗透到农业生产、市场、消以及农村社会、经济、技术等各个具体环节,加速传统农业改造,大幅度地提高农业生产效率和农业生产力水平,促进农业持续、稳定、高效发展的过程

乡村振兴战略

  • 聚焦数字赋能农业农村现代化建设,重重点建设三方面
方向 描述 解析
建设基础设施 一手抓新建、一手抓改造,提出推动农村干兆光网、5G、移动物联网与城市同步规划建设,提升农村宽带网络水平,推动农业生产加工和农村基础设施数字化、智能化升级 农村铺设宽带
发展智慧农业 建立和推广应用农业农村大数据体系,推动物联网、大数据、人工智能、区块链等新一代信息技术与农业生产经营深度融合,让农业资源利用更加合理高效 用到新技术特别是物联网和大数据
建设数字乡村 构建线上线下相结合的乡村数字惠民便民服务体系,推进“互联网+" 政务服务向农村基层延伸,深化乡村智慧社区建设,提升乡村治理和服务的智能化、精准化水平

国家第一产业 ----- 农业

1.3.2 两化融合与智能制造

国家第二产业 ----- 工业

1.3.2.1 两化融合的概念(重点,蓝字背诵)

  • 两化融合是
    信息化

    工业化
    的高层次的深度结合,是指以
    信息化带动工业化
    (特点)、以工业化促进信息化,走新型工业化道路

  • 信息化和工业化的融合既加速了工业化进程,也拉动了信息技术的进步。
    信息世界与物理世界的深度融合
    (特点)是未来世界发展的总趋势,两化深度融合顺应这一趋势,正在全面加速数字化转型,推动制造业企业形态、生产方式、业务模式和就业方式的根本性变革。

两化融合的核心是信息化支撑,追求可持续发展模式

两化融合的四个方面
  • 信息化与工业化主要在技术、产品、业务、产业四个方面进行融合。
方面 描述 解析
技术融合 工业技术与信息技术的融合,产生新的技术,推动技术创新如汽车电子技术、工业控制授术 把IT技术融入到传统的工业技术里
产品融合 电子信息技术或产品渗透到产品中,增加产品的技术含量,如数控机床、智能家电、遥控飞机 冰箱,电视加入了智能模块
业务融合 信息技术应用到企业研发设计、生产制造、经营管理、市场营销环节,推动业务创新和管理升级 产业生产业务的各个阶段,都把IT技术加入其中
产业衍生 两化融合可以催生出的新产业,形成一些新兴业态,如工业电子、工业软件、工业信息服务业 IT融入各个产业当中

1.3.2.2 智能制造的概念

  • 智能制造(Intelligent Manufacturing,IM)是基于
    新一代信息通信技术

    先进制造技术
    深度融合,贯穿于设计、生产、管理、服务等制造活动的各个环节,具有
    自感知、自学习、自决策、自执行、自适应
    等功能的新型生产方式(
    解析:设计、生产、管理、服务等制造活动的各个环节,都使用IT技术进行改造
    )

  • 智能制造是一种由
    智能机器

    人类专家
    共同组成的人机一体化智能系统,它在制造过程中能进行智能活动,诸如分析、推理、判断、构思和决策等。通过人与智能机器的合作共事,去扩大、延伸和部分地取代人类专家在制造过程中的脑力劳动。(
    解析:把 智能机器 人类专家 结合起来,形成智能系统)


智能制造
是一项重要的国家战略,也是各个国家推动新一代工业革命的
关注焦点

1.3.2.2.1 智能制造能力成熟度模型
  • 企业或者行业引入智能制造,达到标准的哪个等级通过几个角度进行评定.

  • 重点
    :
    • 能力要素: 制造
    • 能力域: 设计\生产\物流\销售\服务
1.3.2.2.2 智能制造能力成熟度模型

  • 一级 (规划级):企业应开始对实施智能制造的基础和条件进行
    规划
    ,能够对核心业务活动(设计、生产、物流、销售、服务)进行
    流程化管理

  • 二级 (规范级):企业应采用自动化技术、信息技术手段对核心装备和业务活动等进行
    改造和规范
    ,实现
    单一业务活动的数据共享

  • 三级 (集成级):企业应对装备、系统等开展
    集成
    ,实现
    跨业务活动间的数据共享

  • 四级 (优化级):企业应对人员、资源、制造等进行
    数据挖掘
    ,形成知识、模型等,实现
    对核心业务活动的精准预测和优化

  • 五级 (引领级):企业应基于模型持续驱动业务活动的
    优化和创新
    ,实现
    产业链协同并衍生新的制造模式和商业模式

1.3.3 消费互联网

IT技术应用到千家万户的手里.(简单理解就是用互联网消费,例如:淘宝购物,京东购物等)

1.3.3.1 消费互联网的概念

  • 消费互联网是
    以个人为用户
    ,以日常生活为应用场景的应用形式,满足消费者在互联网中的消费需求而生的互联网类型。

  • 消费互联网
    以消费者为服务中心
    ,针对个人用户提升消费过程的体验,在人们的阅读、出行、娱乐、生活等诸多方面进行改善,让生活变得更方便、更快捷。

消费互联网本质是
个人虚拟化
,增强个人生活消费体验.

1.3.3.2 消费互联网的基本属性

  • 媒体属性:例如:直播带货
  • 产业属性:通过消费互联网,把许多产业接入整个网络空间.例如:尔滨旅游爆火.
  • 这些属性影响着人们的生活方式,渗透到人们生活的各个领域中,变革消费体验

1.3.3.3 消费互联网应用新格局

  • 社交网络推动传播效率,一些主播大V掌握社交媒体话语权

  • "无身份社会"的建立: 不再通过广告渠道,而是通过直播自媒体获取信任,进行带货.

  • 场景应用多元扩展: 越来越多的领域接入消费互联网.

1.4 数字中国

驱动生产方式的变革,对应数字经济,驱动生活方式的变革,对应的是数字社会,驱动治理方式的变革,对应的是数字政府.整体是数字生态

  • 数字中国是新时代
    国家信息化发展的新战略
    ,是满足人民日益增长的美好生活需要的新举措,是驱动引领经济高质量发展的新动力,涵盖经济、政治、文化、社会生态等各领域信息化建设
  • 包括宽带中国互联网+、大数据云计算、人工智能、数字经济电子政务、新型智慧城市、数字乡村等内容

1.4.1 数字经济

概念

  • 数字经济是一种新的技术经济范贰,它建立在信息与通信技术的重大突破的基础上,(数字经济定义:)以
    数字技术与实体经济融合
    驱动的产业梯次转型和经济创新发展的主引擎,在基础设施、生产要素、产业结构和治理结构上表现出与农业经济、工业经济显著不同的新特点。(
    解析:范式:一些框架性质的东西,成熟的东西,一些规律的总结
    )

  • 新技术经济范式


    • 云计算、人工智能、大数据等技术在与社会经济活动的融合重构中,经过技术与经济的相互促进,形成了一些相对稳定的经济新结构和新形态,如平台经济、分享经济、算法经济、服务经济、协同经济等。先一步形成的经济形态触发社会其他领域的连锁变革,最终实现整个经济领域的技术经济范式转换。(
      解析:举例:外卖都是通过软件,软件通过算法推荐外卖员,推荐路径等,都是平台通过算法在做,会导致恶性竞争,压低价格,质量越来越差,但是,这种经济范式已经形成,无法改变了.
      )
  • 数字经济的技术经济范式的结构主要包括驱动力、新结构、价值创造和经济增长。

背记: 数字经济包括数字产业化、产业数字化、数字化治理和数据价值化四个部分.

1.4.1.1 数字产业化

  • 数字产业化是指为产业数字化发展提供数字技术、产品、服务、基础设施和解决方案,以及完全依赖于数字技术、数据要素的各类经济活动,包括电子信息制造业、电信业、软件、信息技术、互联网行业等。(
    解析:数字产业,就相当于IT行业,把这个产业做大做强,就是数字产业化
    )

  • 数字产业化发展重点包括:


    • 云计算
    • 大数据
    • 物联网
    • 工业互联网
    • 区块链
    • 人工智能
    • 虚拟现实和增强现实

1.4.1.2 产业数字化

  • 产业数字化是指在新一代数字科技支撑和引引领下,以
    数据为关键要素
    ,以
    价值释放为核心
    ,以
    数据赋能为主线
    ,对产业链上下游的全要素数字化升级转型和再造的过程(
    解析:数字产业支撑传统行业,让传统行业做得更好,就叫产业数字化.
    蓝字记一下)

  • 产业数字化的意义


    • 微观:数字化助力传统企业蝶变,再造企业质量效率新优势
    • 中观:数字化促进产业提质增效,重塑产业分工协作新格局
    • 宏观:孕育新业态新模式,加速新旧动能转换新引擎

2035年远景目标提出,实施“上云用数赋智”行动.(
解析:上云:使用云计算.用数:使用大数据技术进行辅助决策.赋智:就是使用人工智能技术,进行预测或者建立各种模型.
)

  • 产业数字化的典型特征
    • 以数字科技变革生产工具
    • 以数据资源为关键生产要素
    • 以数字内容重构产品结构
    • 以信息网络为市场配置纽带
    • 以服务平台为产业生态载体
    • 以数字善治为发展机制条件

以数据驱动的业务形式将成为主流,全渠道的数据盘活将成为企业的核心竞争力。

1.4.1.3 数字化治理

  • 数字化治理通常指
    依托互联网

    大数据

    人工智能
    等技术和应用,
    创新社会治理方法与手段
    ,优化社会治理模式,推进社会治理的科学化、精细化、高效化,助力社会治理现代化(
    解析:用数字化手段进行数字治理.
    )

  • 数字化治理的
    核心特征

    全社会的数据互通、数字化全面协同与跨部门的流程再造
    ,形成"用数据说话、用数据决策、用数据管理、用数据创新”的治理机制。

  • 数字化治理的内涵包含:


    • 对数据的治理
      :即治理对象扩大到涵盖数据要素(
      解析:保证数据规范.
      )
    • 运用数据进行治理
      :即运用数字与智能技术优化治理技术体系,进而提升治理能力(
      解析:规范的使用数据.
      )
    • 对数字融合空间进行治理
      :适应数字融合世界的治理体系,对数字融合空间的新生事物进行有效治理.(
      解析:进行数字化之后,会引起很多连锁反应,形成大的数字化的世界,需要进行治理.
      )

1.4.1.4 数据价值化

  • 价值化的数据
    是数字经济发展的关键生产要素,加快推进数据价值化进程是发展数字经济的本质要求。数据价值化包括但不限于数据采集、数据标准数据确权、数据标注、数据定价、数据交易、数据流转、数据保护等。(
    解析:有价值的数据十分重要.
    )

  • 数据价值化是指以
    数据资源化
    为起点,经历
    数据资产化

    数据资本化
    阶段实现数据价值化的经济过程。(
    解析:数据通过采集后才能成为重要的资源.下边部分有时间查看,无时间可以不看
    )


    • 就数据资源化:是使无序、混乱的原始数据成为有序、有使用价值的数据资源。数据资源化阶段包括通过数据采集、整理、聚合、分析等,形成可采、可见、标准、互通、可信的高质量数据资源。数据资源化是激发数据价值的基础,其本质是提升数据质量,形成数据使用价值的过程

    • 数据资产化:是数据通过流通交易给使用者或者所有者带来的经济利益的过程。数据资产化是实现数据价值的核心,其本质是形成数据交换价值,初步实现数据价值的过程。·数据资本化:主要包括两种方式,数据信贷融资与数据证券化。数据资本化是拓展数据价值的途径,其本质是实现数据要素社会化配置。

1.4.2 数字政府

概念

  • 数字政府通常是指以
    新一代信息技术
    为支撑,以“业务数据化、数据业务化为着力点,通过
    数据驱动重塑政务信息化管理架构
    、业务架构和组织架构,形成"用数据决策、数据服务、数据创新”的现代化治理模式

  • 数字政府不仅是“互联网+政务”深度发展的结果,核心目的是
    以人为本
    ,实施路径是
    共创、共享、共建、共赢
    的生态体系。

1.4.2.1 数据政府的特征

特征 描述 分析
协同化 主要强调组织的互联互通,业务协同方面能实现一个跨层级、跨地域、跨部门、跨系统、跨业务的高效协同管理和服务
云端化 云平台是政府数字化最基本的技术要求,政务上云促成由分散建设向集约式规划与建设演化,是是政府转型的必要条件 上云:优势节约成本,可以集成数字化资源
智能化 智能化治理是政府应对社会治理多元参与、治理环境越发复杂、治理内容多样化趋势的关键手段 数字化分析技术进行智能化的处理
数据化 数据化是现阶段数字政府建设的重点,是建立在政务数据整合共享基础上的数字化的转型
动态化 指数字政府是在数据驱动下动态发展不断演进的过程 整个政府的运营,随着时间变化,对政府的需求不断变化,数字政府的建设需要进行动态发展

1.4.2.2 数据政府建设的关键词

关键词 描述 解析
共享 推动政务数据共享,推进政务服务事项集成化办理。数字政府,数据先行。数据共享是提升政务服务效能的重要抓手
互通 国家政务服务平台持续推动与各地区、各部门政务服务业务办理系统的全面对接融合,打破地域阻隔与部门壁垒,实现更大范围内的系统互联互通,有力推动了政务服务线上线下融合互通和跨地区、跨部门、跨层级协同办理 办理业务,不同业务部门应该打通
便利 数字政府,利企便民。加强数字政府建设的根本目标是更好地服务企业和群众,满足人民日益增长的美好生活需要 应该便民

1.4.2.3 数据政的主要内容(重要)

  • 一网通办


    • 依托于一体化在线政务服务平台,通过规范网上办事标准,优化网上办事流程,搭建统一的互联网政务服务总门户,整合政府服务数据资源和完善配套制度等措施,推行政务服务事项网上办理,推动企业群众办事线上只登录一次即可全网通办。(
      解析:提供公共服务的部门都在放在互联网上,可以一次办理.
      )
  • 跨省通办


    • 一种政务服务模式,申请人在办理地之外的省市提出事项申请或在本地提出办理其他省市事项申请,办理模式通常可分为全程网办、代收代办和多地联办等(
      解析:实现,.
      )
  • 一网统管


    • 围绕城市治理水平的提升,主要针对各类民生诉求和城市事件,用实时在线数据和各类智能方法,及时、精准地发现问题、对接需求、研判形势、预防风险,在最低层级、最早时间,以相对最小成本,解决最突出问题,取得最佳综合效应,实现线上线下协同高效处置一件事(
      解析:2024年还需要缓慢实现,把整个城市的所有业务都放在一起管理,这样才能系统处理整个城市的工作.
      )
"一网统管"建设要点
要点 描述 分析
一网 主要包括政务云、政务网和政务大数据中心等 把所有资源集中到统一的网络中,集中到政务云,或者集中到政务网
一屏 通过对多个部门的数据进行整合,将城市运行情况充分反映出来 本质是数据的汇总,通过统一的一个数据渠道观看各个方面的数据
联动 畅通各级指挥体系,为跨部门、跨区域、跨层级联勤联动、高效处置提供快速响应能力 为了解决同一个事件,跨部门跨区域产生快速的行动
预警 基于多维、海量、全息数据汇集,实现城市运行体征的全量、实时掌握和智能预警 涉及到数据的分析或预测,汇总到所有的数据之后,可以提前通过后台运算,提前做出一些预测
创新 以管理需求带动智能化建设,以信息流、数据流推动业务流程全面优化和管理创新 各个方面使用创新的手段,使用信息技术辅助数字政府的建设

1.4.3 数字社会

1.4.3.1 数字民生

  • 信息技术体系正以一种前所未有的势头向政治、文化、生活等民生领域延伸将(
    最主要内涵:
    )
    “人”与“公共服务”通过数字化的方式全面连接
    ,将大幅提升社会整体服务效率和水平,实现数字民生

  • 数字民生建设的重点


    • 普惠
      :充分开发利用信息技术体系,扩大民生保障覆盖范围,助力普惠型民生建设解决民生资源配置不均衡等问题(
      解析:让更多人享受到信息技术的便利.
      )
    • 赋能
      :信息技术体系与民生的深度融合赋予了民生建设新动能,促进民生保障实效指数式增长,如“互联网+教育”"互联网+医疗"互联网+养老"互联网+交通”等(
      解析:使用信息技术在民生领域的所有环节,所有部门,让民生服务能力更强大.
      )
    • 利民
      :信息技术体系创新拓展了公共服务场景,推动数字技术全面融入社会交往和日常生活新趋势,使民生服务日趋智慧化、便利化和人性化(
      解析:数字民生确实给大家带来了便利.
      )

1.4.3.2 智慧城市

  • 智慧城市是运用信息通信技术,有效
    整合各类城市管理系统
    ,实现城市各系统间信息资源共享和业务协同,推动城市管理和服务智慧化,提升城市运行管理和公共服务水平,提高城市居民幸福感和满意度,实现可持续发展的种创新型城市视(
    解析:核心使用IT技术.
    )

  • 智慧城市建设持续推动着城市的高质量发展,体现在:(了解)


    • 智慧城市建设更加注重以人民为中心;
    • 新技术持续赋能智慧城市的建设与发展;
    • 城市治理现代化是智慧城市建设的必然要求;
    • 智慧城市群区域一体化协同发展新格局逐步形成;
    • 共建、共治、共享生态模式助力智慧城市高质量发展。
1.4.3.2.1 智慧城市基本原理

  • ①强调“人民城市为人民”,以
    面向政府企业、市民等主体提供智慧化的服务
    为主要模式

  • ②重点强化(
    重点:
    )
    数据治理、数字李生、边际决策、多元融合和态势感知
    五个核心能力要素
    建设

  • ③更加注重规划设计、音部署实施运营管理、评估改进和创新发展在内的智慧城市
    全生命周期管理

  • ④目标旨在推动城市治理、民生服务、生态宜居、产业经济、精神文明
    五位一体的高质量发展

  • ⑤持续推动城市治理体系与治理能力现代化水平提升

1.4.3.2.2 智慧城市核心能力要素
  • 五个核心能力要素密切关联且相互影响,但不可互为替代.
要素 描述 解析
数字治理 围绕数据这一新的生产要素进行能力构建,包括数据责权利管控、全生命周期管理及其开发利用等 涉及数据管控和数据开发
数字孪生 围绕现实世界与信息世界的互动融合进行能力构建,包括社会李生、城市李生和设备李生等,将推动城市空间摆脱物理约束,进入数字空间 数字孪生:不仅仅是简单的数据复制,第一步还是复制,把现实世界中采集出来的数据,进行复制存储,第二步建模,用计算机模拟现实世界,比如交通系统进行放入和模拟,在虚拟环境下把积累的数据孪生一下,在虚拟环境下进行一下运算,通过虚拟模拟使得现实的交通灯运行的更加顺畅,进行模拟,再把模拟结果传回现实世界,最后一步,控制或者优化现实世界.
边际决策 基于决策算法和信息应用等进行能力构建,强化执行端的决策能力,从而达到快速反应、高效决策的效果,满足对社会发展的敏捷需求 相当于云计算中的边缘计算,可以进行决策放权,比如智慧城市中有某个终端节点,可以直接通过运算做出控制,就让其控制和运算,这样可以缩短决策的周期,减少上报的路径.
多元融合 强调社会关系和社会活动的动态性及其融合的高效性等,实现服务可编排和快速集成,从而满足各项社会发展的创新需求 通过多渠道,全方位的感知智慧城市的各种数据,并且把数据进行融合
态势感知 围绕对社会状态的本质反映及模拟预测等进行能力构建,洞察可变因素与不可见因素对社会发展的影响,从而提升生活质量 从多方面收集到数据之后,通过建立好的人工智能,对数据进行分析预测,让智慧城市系统就能感知到目前为止,大家对城市建设是正向还是负向,预测之后,提前做出一些响应.
1.4.3.2.3 智慧城市成熟度等级参考模型
  • 通过参考模型进行评价

  • 一级(规划级):应围绕智慧城市的发展进行
    策划
    ,明确相关职责分工和工作机制等,初步开展数据采集和应用,确保相关活动有序并展。(
    解析:已经对智慧城市进行规划策划,哪个部门做什么已经进行了分工.
    )
  • 二级(管理级):应明确智慧城市发展战略、原则、且标和实施计划等,推进城市基础设施智能化改造,多领域实现
    信息系统单项应用
    ,对智慧城市
    全生命周期实施管理
    。(
    解析:管理在规划之后,已经进行了一些单项的应用了,至少做一项应用了.
    )
  • 三级(协同级):应管控智慧城市各项发展目标,实施多业务、多层级、跨领域应用系统的
    集成,持续推进信息资源的共享与交换,推动惠民服务、城市治理、生态宜居、产业发展等的融合创新,实现
    跨领域的协同改进
    。(
    解析:实际就是做集成,跨领域的进行应用的集成了.
    )
  • 四级(优化级):应聚焦智慧城市与城市经济社会发展
    深度融合
    ,基于数据与知识模烈实施城市经济、社会精准花治理,推动数据要素的价值挖掘和并发利用,推进城市竞争力
    持续提升
    。(
    解析:深度融合.
    )

  • 五级(引领级):应构建智慧城市敏捷发展能力,实现城市物理空间、社会空间、信息空间的融合演进和共生共治,引领
    城市集群治理联动
    ,形成
    高质量发展共同体
    。(
    解析:超出一个城市的级别.
    )

1.4.3.3 数字乡村


  • 数字乡村是伴随
    网络化、信息化和数字化
    在农业农村经济社会发展中的应用以及农民现代信息技能的提高而内生的农业农村现代化发展和转型进程,既是乡村振兴的战略方向,也是建设数字中国的重要内容。(
    解析:可以认为数字乡村是属于农业农村现代化中的一项内容.
    )

  • 数字乡村发展进程


    • 到2035年,数字乡村建设取得长足进展,农业农村现代化
      基本实现
      ,城乡基本公共服务均等化基本实现,生态宜居的美丽乡村基本实现。
    • 到21世纪中叶,
      全面建成
      数字乡村,助力乡村全面振兴,全面实现农业强、农村美、农民富。

1.4.3.4 数字生活


  • 数字生活是依托互联网和一系列数字科技技术应用为基础的一种
    生活方式
    可以方便快捷地带给人们更好的生活体验和工作便利。(
    解析:数字生活也属于数字社会的一个方面.
    )

  • 数字生活要体现在:



    • 生活工具数字化
      。数字化生活时代,信息技术和产品成为极其重要的生活工具,人们将像享受空气、阳光、水一样享受数字化生活工具带来的舒适和便捷。根据摩尔定律和梅特卡夫定律,随着技术的不断创新与广泛扩散,其应用成本将显著下降,而其价值则显著增加。

    • 生活方式数字化
      。在数字社会中,借助于数字化技术,每个人的工作、学习、消费交往、娱乐等各种活动方式都将具有典型的数字化特征,数字家庭成为未来家庭的发展趋势体现在工作更加弹性化和自主化;终身学习与随时随地学习成为可能:网络购物路身主流消费方式;人际交往的范围与空间无限扩大等。

    • 生活内容数字化
      。数字生活时代,人们工作、学习、消费和娱乐的内容具有典型的数字化特征。生活内容数字化体现在工作内容以创造、处理和分配信息为主学习内容个性化信息成为重要消费内容;娱乐内容数字化等。

1.4.3 数字生态


  • 想办法把所有数据进行集中整理,把数据要素整理好之后让其在市场上流通.

1.4.3.1 数据要素市场


  • 数据作为新型生产要素,具有
    劳动工具

    劳动对象
    的双重属性


    • 数据作为劳动对象,通过采集、加工、存储、流通、分析环节,具备了价值和使用价值(
      解析:作为劳动对象,需要对数据进行采集加工存储流通处理,因此其是劳动对象.
      )
    • 数据作为劳动工具,通过融合应用能够提升生产效能,促进生产力发展(
      解析:让生产效率更高,生活更美好.
      )
  • 数据要素市场就是将尚未完全由市场配置的数据要素转向由市场配置的动态过程,其目的是形成
    以市场为根本调配机制
    ,实现数据流动的价值或者数据在流动中产生价值。(
    解析:数据要素市场化:尚未完全由市场配置的数据要素转向由市场配置的动态过程,这个过程就叫数据要素市场化.
    )

  • 数据要素市场化配置的前提:
    明确的数据产权(app想要收集用户数据,就要发布对应的隐私保护条例,对方同意,才可以收集,并且对方同意交换,才可能成为数据市场化的东西)、交易机制、定价机制、分配机制、监管机制、法律范围等保障制度


1.4.3.2 数据营商环境


  • 市场化、法治化、国际化、便利化的营商环境是一个国家、一个地区经济社会高质量发展的重要因素(
    解析:数字营商环境的重要性(了解).
    )

  • 数字营商环境评价体系包含5个一级指标:(
    解析:数字营商环境的好坏(了解).
    )


    • ① 数字支撑体系,包含普遍接入、智慧物流设施、电子支付设施
    • ② 数据开发利用与安全,包含公共数据开放、数据安全
    • ③ 数字市场准入,包含数字经济业态市场准入、政务服务便利度
    • ④ 数字市场规则,包含平台企业责任、商户权利与责任、数字消费者保护
    • ⑤ 数字创新环境,包含数字创新生态、数字素养与技能、知识产权保护

1.4.3.3 网络安全保护


  • 网络空间安全新形势:


    • 网络空间对抗趋势更加突出
    • 大规模针对性网络攻击行为增加
    • 安全漏洞、数据泄露、网络诈骗等风险增加
  • 应对方针:


    • 坚持总体国家安全观和正确的网络安全观
    • 贯彻新发展理念
    • 构建网络安全新格局
    • 全面加强网络安全保障体系和能力建设

强大的网络安全产业实力是保障网络空间安全的根本和基石


1.5 数字化转型与元宇宙


1.5.1 数字化转型

概念

  • 数字化转型(Digital Transformation)是建立在数字化转换(Digitization)、数字化升级(Digitalization)基础上,进一步触及组织核心业务,以新建一种业务模式为目标的高层次转型。数字化转型是开发数字化技术及支持能力以新建一个富有活力的数字化商业模式。(
    解析:企业做数字化转型,这是一个组织,一个行业,甚至一个国家都可能要做数字化转型,数字化转型大部分是针对一个组织的,.
    )

  • 数字化转型的驱动因素:(了解)


    • ① 生产力飞升:第四次科技革命 (
      解析: 新的IT技术推动了数字化转型.
      )
    • ② 生产要素变化:数据要素的诞生 (
      解析: 数据成为了重要的生产要素.
      )
    • ③ 信息传播效率突破:社会互联网新格局 (
      解析: 物联网,工业互联网建立后,信息传递速度大大提升.
      )
    • ④ 社会“智慧主体”规模:快速复制与 “智能+" (
      解析: 车联网这样的技术成为了主体.
      )

数据是与土地、劳动力、资本和技术并列的主要生产要素.

1.5.1.1 数字组织运行参考框架

  • 组织进行数字化运转的参考(了解)

1.5.1.2 如何进行数字化转型

  • 组织的数字化转型就是基于组织既有的治理与管理体系、工艺路径和产品技术、服务活动定义等等,打造更加高效的决策效率、更灵活的工艺调度、更多元的产品与服务技术应用和更丰富的业务模式等。

1) 能力因子定义和数字化 “封装"

  • 组织需要把各项能力和活动进行清晰的结构化并定义,形成细化的可灵活调度和编排的能力因子。 (
    解析: 针对数字化转型,把企业里关于数字化相关的各种能力,进行清点,进行清理,然后进行定义,就是数字化封装.
    )

2) 基于“互联网+”的调度和决策

  • 组织需要在已有治理与管理体系、工艺体系、服务体系、产品体系的基础上,通过使用 "互联网+” 的模式,将组织沉淀的各类知识经验进行数字化提炼,形成数字算法、模型和框架等 (
    解析: 把企业中相关数字化的内容,通过互联网让它进行调度,通过互联网加云计算进行决策.
    )
  • 难点体现在:业务融合、持续坚持、文化冲突、效果判别

3) 转型控制

  • 数字化转型是一个持续的过程,组织需要能够
    有效管控转型过程
    ,无论是服务组织还是工业组织,都不能一蹴而就地完成转型升级 (
    解析: 不断进行数字化转型的过程中,对于转型本身这件事要控制一下,不要转的太快,太突然了,对转型进行有效的组织.
    )

1.5.1.3 智慧转移的S8D模型

  • DIKW模型很好地诠释了数据(Data)、信息(Information)、知识(Knowledge)和智慧(Wisdom)之间的关系,并揭示了他们的转化过程与方法(
    解析: 智慧和数据之间如何进行转化 .
    智慧(人类智慧)到数据转化: 智慧--- 从企业信息化(企业信息)获取到智慧
    知识--- 从这套(知识模型化)系统模型上去抽取知识
    信息-- 从信息化过程中,获取信息
    数据-- 通过数据平台化来采集数据

    数据到智慧(IT大数据智慧)化: 数据-- 从采集数据中抽象出对象,将对象做数字化处理
    信息-- 将数字化处理的数据,映射到孪生世界(虚拟建立的跟现实一样的世界)中,形成孪生虚拟化的信息
    知识-- 通过架构可视化,做知识的复用
    智慧-- 通过计算智慧化做一些智能化的决策的引导
    主要看图理解

    )
  • S8D模型就是基于DIKW,构筑了“智慧一数据数据一智慧”两大过程的8个转化活动
  • 进行描述的不如记住图.
1)“智慧一数据”过程
  • 该过程通常指信息系统规划、建设、运行过程,也就是传统讲的“
    信息化过程
    ”。该过程
    • ① 通过智慧结构化明确了业务体系层面的内容;
    • ② 通过知识模型化定义业务活动的逻辑关系;
    • ③ 通过过程信息化(管理和工艺流程化)明确各执行操作系列要求;
    • ④ 通过数据平台化实现了数据的采集、存储和共享等。
2)“数据一智慧”过程
  • 该过程通常指数据的开发利用和资源管理的过程,即人们常说的“
    智慧化过程
    ”,重点解决基于各类组织组成对象(人员、流程、业务、工艺、装备等)“数字关系”的“脑力替代”。该过程在大数据“筑底”后,多元化数据能够被开发利用:
    • ① 通过对象数字化实现对各类对象的数字化表达;
    • ② 通过李生虚拟化完成物理对象到信息空间的映射;
    • ③ 通过架构可视化实现业务知识模型与经验沉淀的复用和创新;
    • ④ 通过计算智能化实现多元条件下的调度和决策

1.5.1.4 组织能力数字化转型及持续迭代参考模型(CPSD模型)(了解)

  • 组织数字化转型需要在能力因子不断细化的基础上,针对能力因子的数字化转型实施迭代.组织每个能力因子数字化匕"封装”的持续选代主要包含四项活动.

CPSD模型解释
  • 针对能力因子的持续迭代可以从任何一项活动开始实施四项活动,形成持续迭代闭环。

1) 信息物理世界(也称数字李生,CPS)建设

  • 针对能力因子中的各类对象,实施数字李生建设,并在此基础上加入该因子与其他因子之间的配置关系。

2) 决策能力边际化(Power to Edge,PtoE)部署

  • 处置执行层面的装置和人员能够基于决策算法模型等,敏捷取得更高的决策能力(权),达到敏捷响应的效果。

3) 科学物理赛博机制(Cyber-Physical-Solial Systems,CPSS)构筑

  • 在CPS的基础上,汇聚组织内能力因子的环境因素力量(或组织维度的外部社会力量),建设高密度数据框架,参照社会运行原理,封装、解构和重构各能力因子协同关系。

4) 数据框架与信息调制(Digital Frame and Information Modulation,DFIM)设计

  • 组织能力因子的数字密度越高,对其可控性就越高,对应的安全可靠性也越高.

1.5.2 元宇宙

1.5.2.1 什么是元宇宙

  • 定义1:元宇宙是利用科技手段进行链接与创造的,
    与现实世界映射与交互的虚拟世界
    ,具备新型社会体系的数字生活空间 (
    解析: 一定要与现实世界相映射的虚拟世界.
    )

  • 定义2:元宇宙是整合多种新技术而产生的新型
    虚实相融
    的互联网应用和社会形态,它基于扩展现实技术提供沉浸式体验以及数字李生技术生成现实世界的镜像,通过区块链技术搭建经济体系,将虚拟世界与现实世界在经济系统社交系统、身份系统上密切融合,并且允许每个用户进行内容生产和编辑

  • 综合定义:



    • 时空性
      来看,元宇宙是一个空间维度上虚拟而时间维度上真实的数字世界 (
      解析: 空间虚拟,时间与现实世界并行的.
      )


    • 真实性
      来看,元宇宙中既有现实世界的数字化复制物,也有虚拟世界的创造物(
      解析: 既有真实的也有虚拟的.
      )


    • 独立性
      来看,元宇宙是一个与外部真实世界既紧密相连,又高度独立的平行空间(
      解析: 菱形空间.
      )


    • 连接性
      来看,元宇宙是一个把网络、硬件终端和用户囊括进来的一个永续的、广覆盖的虚拟现实系统(
      解析: 使用先进的IT技术,虚实进行连接.
      )


      就是要把虚实世界相融合

1.5.2.2 元宇宙的主要特征

  • 元宇宙
    物理属性淡化
    ,但
    社会属性被强化
特征 描述 解析
沉浸式体验 元宇宙的发展主要基于人们对互联网体验的需求,这种体验就是即时信息基础上的沉浸式体验 看到的,听到的,买到的东西,都跟真实世界体验一样
虚拟身份 人们已经拥有大量的互联网账号,在元宇宙中,随着账号内涵和外延的进一步丰富,将会发展成为一个或若干个数字身份就是数字世界的角色 不同维度产生新的虚拟身份
虚拟经济 虚拟身份的存在就促使元宇宙具备了开展虚拟社会活动的能力而这些活动C需要一定的经济模式展开,即虚拟经济 通过元宇宙的虚拟身份,重新构建一个新的经济体系
虚拟社会治理 元宇宙中的经济与社会活动也需要一定的法律法规和规则的约束,像现实世界一样,元宇宙也需要社区化的社会治理 建立虚拟的社会制度,有法律法规,道德规范制度

1.5.2.3 元宇宙核心技术

  • 元宇宙是整合多种新技术而产生的新型虚实相融的互联网应用和社会形态,基于以下几种技术:
    • 扩展现实:包括虚拟现实VR和增强现实AR。扩展现实技术可以提供沉浸式的体验,可以解决手机解决不了的问题
    • 数字李生:能够把现实世界镜像到虚拟世界里面去。这也意味着在元宇宙里面,我们可以看到很多自己的虚拟分身
    • 区块链:通过区块链技术搭建经济体系,将虚拟世界与现实世界在经济系统社交系统、身份系统上密切融合,并且允许每个用户进行内容生产和编辑

1.5.2.4 元宇宙的发展演进

  • 如何建立一个完整的元宇宙.


  • 数字人: 虚拟一个人物,比如虚拟人物播报.
  • 数字人生: 凭空造一个人设或者真实虚拟一个身份.
  • 数字组织: 某个组织进行交际交换
  • 数字生态: 很多经济企业介入,政府介入,虚拟现实,和真实社会交互
  • 数字社会治理: 让元宇宙发展的更好,持续发展.

1.6 单词汇总

序号 单词 简写 翻译 描述
1 information 信息 信息和物质,能量三者是并列关系,信息能表达物质和能量.
2 Industrial Internet 工业互联网 IT技术(新一代信息通信技术)和工业经济深度融合
3 Internet of Vehicles loV 车联网
4 Intelligent Manufacturing IM 智能制造 设计、生产、管理、服务等制造活动的各个环节,都使用IT技术进行改造
5 Digital Transformation 数字化转型 把IT技术引入到组织中来
6 Digitization 数字化转换
7 Digitalization 数字化升级
8 DIKW 数据 (Data)
信息 (Information)
知识 (Knowledge)
智慧 (Wisdom)
一个模型
9 Metaverse 元宇宙
10 Virtual Reality VR 虚拟现实
11 artificial intelligence AI 人工智能
12 Big Data 大数据
13 Blockchain 区块链
14 Internet+ Internet plus 互联网+
15 Industry 4.0 工业 4.0
16 5th-Generation network 5G
17 network layer 网络层
18 sensing layer 感知层
19 application layer 应用层
20 machine learning 机器学习
21 Embedded system 嵌入式系统

多线程

1. 线程概念

1.1 地址空间和页表的映射关系

  • 地址空间是进程能看到的拥有的资源的大小
  • 页表决定了进程实际拥有资源的大小和位置

所以对进程地址空间和页表进行适当的资源划分,就可以对一个进程的所有资源进行分类

进程地址空间如何与页表和物理内存产生映射的过程

首先进程地址空间有4G,那么如果要建立一个个对应的页表的话需要建立2^32个条目,一个条目里都有权限,是否命中等属性,所以如果要建立
2^32
个的话每个进程都要花费近20G资源,几乎不现实,所以,页表的映射是以下过程。

  • 1.
    首先对于进程地址空间,每个地址都是32位的,那么我们可以将32位划分位3部分,10位,10位,12位,首先对于前10位。

  • 2.
    对于前10位来说,为每个前10为建立一个页目录,即为前10位的划分。

  • 3.
    对于第二个10位,前边创建的页目录即存在这里,每个页目录有1024个,对应每个页表项(页表)。

  • 4.
    对于后12位来说,当我们根据前边两个过程时,到了页表那里,页表里存的就是对应的每个内存块的起始物理,
    内存块的大小位4KB刚好是2^12个大小
    ,所以后12位即为找到物理起始地址后的偏移量。

整体流程 : 对于前10位,每个位建立一个1024个页目录,每个页目录建立1024个,存储了每个前20位在物理内存中的起始地址,这个物理内存的起始地址加上虚拟地址的后12位即偏移量,便可真正找到实际物理内存的地址。

1.2 线程概念

进程是资源分配的最小单位,线程是CPU调度的最小单位

对于一个进程来说,一个进程创立的过程为:

创建对应的内核数据结构task_struct等----->根据进程地址空间创建页表-------->与物理内存建立映射

那么,
如果只想执行进程的一部分呢,就引出了线程的概念
,我们可以创建多个
task_struct
每个PCB执行代码的一部分,但是不需要创建新的系统资源,因为就一个页表和地址空间和内存,如图

那么以上绿色的即为线程,
线程执行是进程的一个执行流,线程是cpu调度的基本单位。

线程也需要被cpu执行,根据先描述再组织,所以也需要特定的数据结构和对应的管理办法,让线程执行进程的一部分,但是要不要为进程创建一系列对应的体系结构呢?不需要,既然他和进程pcb属性这么像,干脆直接复用linux里的进程的一系列系统即可,进行细节改动,这样可以高内聚低耦合。

  • 那么如何看待之间的进程的概念呢?

之前的进程与也是通用的,只不过现在引入了线程,之前的进程写的代码只有一个执行流,只有一个执行流的这个叫做主执行流,进程依靠的是这个主执行流,所以现在进程是
系统资源分配的基本实体
,之前内部只有一个执行流,但是现在
随着线程的引入,进程内部可以存在多个执行流

进程 :承担系统资源分配的基本单位,以下这些的集合统称进程。

  • 既然线程概念已经被引出,那么线程也要跟进程一样,要有独立的id,保存上下文的寄存器,被调度挂起等,这么说的话OS需要再为线程设计单独的一个结构和体系吗? 并不需要,因为线程跟进程的属性很像,所以直接套用之前的PCB的结构和体系即可,
    直接复用进程PCB,用PCB表示Linux中的线程。

  • 所以在Linux中,没有真正意义的线程,是用PCB来模拟线程的。

  • 站在CPU的视角,每个线程都是一个轻量级线程。

  • 进程用来申请整体资源,线程用来向进程要资源。

  • Linux无法直接提供创建线程的系统调用,只能提供轻量级进程,但是OS和用户只认线程,所以Linux用第三方软件层来进行桥接。

  • 轻量级进程lwp
    ,cpu调度是以lwp来调度的,对于进程中的主线程,pid与lwp一样

1.3 示例代码

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);

要使用pthread_create的时候,需要手动去动态链接pthread库,才能正常编译

#include<iostream>
#include<cassert>
#include<unistd.h>
#include<pthread.h>
using namespace std;
void *func(void * args){
    while(1){
        cout<<"我是一个线程....\n";
        sleep(1);
    }
}
int main(){
    pthread_t tid;
    int n=pthread_create(&tid,nullptr,func,(void*)"线程1");
    assert(n==0);
    while(1){
        cout<<"我是主线程....\n";
        sleep(1);
    }
    return 0;
}

使用ps -aL查看系统所有线程

1.4 线程的属性

  • 线程一旦被创建,进程内的几乎所有的资源都被线程共享
  • ⭐线程什么是私有的?

(1) PCB属性私有

(2)
上下文结构私有
,他是线程动态运行的证据,能体现出线程动态切换的属性

(3)
每一个线程都有独立的栈结构

线程的优点:

  1. 线程与进程之间的切换相比,消耗的系统资源比进程少

这是因为在cpu里有一个cache,这个东西会存储一个进程经常用的到的
热点数据
,即为经常访问的数据

他的速度比内存快比cpu慢所以cpu可以直接从这里拿,找不到再去内存中找

那么线程切换,由于线程拥有几乎所有的进程的资源,所以这个cache里的东西不需要切换

但是进程如果切换的话,那么就需要切换了,所以进程与线程之间消耗资源的差距主要体现在这一方面

  1. 能充分利用多处理器的可并行数量

  2. 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现

线程的缺点:

  1. 健壮性降低:

对于单进程多线程而言,假设有一个线程产生异常,那么通常会给进程发送对应的信号进而导致进程终止,其他线程也随之终止

2. 线程控制

不管是C还是C++在linux上编译时都要对原生线程库进行显式链接
-lpthread

头文件:#include <pthread.h>

2.1 线程的创建、终止、等待、取消

线程的创建

函数:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);

参数:

pthread_t *thread:
输出型参数 ,输出参数线程的tid

const pthread_attr_t *attr:
设置线程的优先级等属性,通常设为nullptr

void
(
start_routine) (void *):
回调函数,创建的这个线程的执行流的操作即为该回调函数的执行顺序

void *arg:
传给线程启动函数的参数,可以是一个线程的名字等参数

eg:

pthread_t tid;
pthread_create(&tid, nullptr, func, (void*)"线程1");


线程的终止

线程的终止不能用
exit()函数
,因为该函数是进程的终止函数

线程有自己的终止办法:

  1. *
    调用函数void pthread_exit(void retval);
void pthread_exit(void *retval);

retval为线程退出信息的起始地址,该类型可以是任意类型

  1. 在线程的回调函数中直接return (void*类型)
// 1.多线程入口函数
void *start_routine(void *args)
{
    ......
    return (void*)100;
    //return (void*)一个new的结构体或者类型也可以,但注意要是右值
}


线程的等待

int pthread_join(pthread_t thread, void **retval);//成功返回0  失败返回-1

参数:

pthread_t thread :要等待进程的tid

void **retval : 输出型参数,二级指针,通常保存线程退出的信息等内容

对于第二个参数,因为正确进程的终止或者正常退出都会返回一个(void*)类型的东西,

这个指针可以是一个结构体的起始地址或者数组的起始地址或者一个类型的地址,

那么我们可以用一个参数放到这个函数作为输出型参数,然后等待完后我们就可以访问这个输出型参数的内容,只不过这个输出型参数是一个指针类型

eg:

//创建一个线程返回信息的结构体
class ThreadReturn{
public:
    int exit_code;
    int exit_result;
};

ThreadReturn* res=nullptr; 
int n=pthread_join(it->tid,(void**)&res);
cout<<"线程退出码: "<<res->exit_code;
cout<<"线程退出的结果: "<<res->exit_result;


线程的取消(不常用)

int pthread_cancel(pthread_t thread);

参数: pthread_t thread: 要取消的线程的pid

当该线程取消时,退出信息为-1,如果有线程等待的话,线程被取消,那么此时退出的信息就是-1

综合应用

eg:

#include <iostream>
#include <string>
#include <vector>
#include <cassert>
#include <pthread.h>
#include <unistd.h>
using namespace std;

#define NUM 10

//创建一个包含线程信息的结构体
class ThreadData
{
public:
    int number;
    pthread_t tid;
    char namebuffer[64];
};


//创建一个线程返回信息的结构体
class ThreadReturn{
public:
    int exit_code;
    int exit_result;
};


// 1.多线程入口函数
void *start_routine(void *args)
{
    ThreadData *td = static_cast<ThreadData *>(args);
    int cnt=1;
    while (1)
    {
        cout << "I am new thread,name: " << td->namebuffer << endl;
        sleep(1);
        if(cnt++==5) break;
    }
    //这里要用堆上的,如果不是堆空间的话,那么多个线程会用同一个地址空间,可能会导致数据出错
    ThreadReturn* res=new ThreadReturn();
    res->exit_code=td->number;
    res->exit_result=1019;
    // delete td;
    //2.线程的退出
    return (void*)res;
}

int main()
{

    // 1.线程的创建
    vector<ThreadData *> threads;
    for (int i = 0; i < 10; i++)
    {
        // pthread_t tid;
        // char namebuffer[64];
        ThreadData *td = new ThreadData();
        td->number=i+1;
        snprintf(td->namebuffer, sizeof td->namebuffer, "%s:%d", "Thread", i + 1);
        pthread_create(&td->tid, nullptr, start_routine, td);
        threads.push_back(td);
        // sleep(1);//这里加上sleep就可以正确了,但是不加的话就全是10号
    }

    // 3.线程的等待,并获取返回值结果
    for (auto &it : threads)
    {
        ThreadReturn* res=nullptr;//获取线程退出信息
        int n=pthread_join(it->tid,(void**)&res);
        cout<<"wait success,exit_code:"<<res->exit_code<<" exit_result:"<<res->exit_result<<endl;
        delete res;
        delete it;
    }
    cout << "main thread quit" << endl;
    return 0;
}


2.2 线程分离

1.
默认情况下,新创建的线程是joinable的,必须被join的,线程退出后必须对其进行pthread_join()

操作,进而回收线程的资源,否则将造成系统泄漏

2.
假设主线程不需要关心线程的退出信息和返回结果,那么此时
pthread_join
对主线程来说是一种负担,此时可以让线程脱离主线程的管控,线程结束后告诉操作系统然后自行回收

线程分离的函数:

int pthread_detach(pthread_t thread);

​ 参数 : thread为当前线程的tid

​ 返回值 : 成功返回0,失败返回对应的错误码

但要线程分离首先得知道当前线程的tid才行需要引入函数
pthead_self()
:该函数返回当前线程的tid

函数pthread_self():

pthread_t pthread_self(void);

​ 返回值 : 当前线程的tid,为十进制,可以手动转化为16进制

有了获取获取当前线程的函数,对于一个线程我们可以

pthread_detach(pthread_slef());

此时该线程将分离主线程,结束后告诉系统,回收资源

但是这样有坏处,假设后续主线程对他join了,由于创建线程后有多个执行流,所以如果要被分离的线程没有赶在主线程前边,那么主线程不知道,将会进行阻塞等待了

eg:

void *startroutine(void *args){
    pthread_detach(pthread_self());//分离主线程
    string name=static_cast<const char*>(args);
    while(true){
        cout<<"我是"<<name<<endl;
        sleep(1);
    }
}
int main(){
   	pthread_t tid; 
    pthread_create(&tid,nullptr,start_routine,(void*)"线程1");
   	//进行线程等待,但是线程自己分离了,预期效果应该是返回的是错误码
    int n=pthread_join(tid); 
    return 0;
}
    

以上代码

预期现象:

​ 创建线程后,线程内部进行分离,主线程将不再等待新线程

实际现象:

​ 创建线程后,线程内部进行分离,但是主线程依旧等待新线程

原因 : 因为创建新线程后,产生了一个新的执行流,两个线程随机独立运行,此时如果主线程先运行了,那么主线程将直接跑到了pthread_join等待了,然后新线程去分离了,但是主线程不知道,所以主线程继续等待了,此时就造成了错误

**改进办法 : **

主线程创建完新线程后,由主线程去分离新线程即可避免错误

int main(){
   	pthread_t tid; 
    //线程创建,创建新线程
    pthread_create(&tid,nullptr,start_routine,(void*)"线程1");
   	//线程分离,分离创建的新线程
    pthread_detach(tid);
    int n=pthread_join(tid); //那么此时将不会去等待新线程了
    return 0;
}

2.3 线程库的原理

在Linux中,只有轻量级进程这一概念,但是程序员只认线程这一概念,所以产生了线程库,对轻量级进行封装,线程库是用户级的

对于一个线程,存在自己的属性,上下文和属于自己的栈结构和tid等结构属性

实现过程:

  • 首先将线程库进行动态链接,线程库从磁盘加载到内存,然后进行动态链接,将库加载到共享区中
  • 对于一个新线程,线程库创建一个线程并且创建对应的属性等操作,位于共享区
  • 每个线程都有自己的私有结构,包括栈区等,这在共享区内
  • 所以对于每个线程的tid,线程的tid其实就是该线程在共享区的进程地址空间按的起始地址,拿到这个起始地址就可以访问线程的各种属性了

所以pthread_t类型的线程ID,本质就是一个进程地址空间上的一个地址。

线程局部存储

假设有一个全局属性,每个线程都可以访问他,每个线程都可以对他进行操作,但是只有一份

如果想让这个全局变量,对于每个线程都有一份,那么可以在全局变量的前边加上
__thread
关键字

__thread int val=100;

这样每个线程都有自己的一份val,存在新线程局部存储区域

3. 同步与互斥

线程互斥相关背景概念

  • 临界资源 : 多个线程执行流共享的资源,称为临界资源
  • 临界区 : 每个线程访问临界资源的代码片段,称为临界区
  • 互斥 : 任何时刻,互斥保证只能有一个线程执行流在临界区执行,访问临界资源,对临界资源起保护作用
  • 原子性 : 不会被任何调度机制打断的操作,这个操作只有两个状态,要么不做,要么做就一次性做完

线程同步
: 在保证数据安全的条件下,让线程按照某种特定的顺序访问临界资源,避免饥饿问题,从而造成线程之间的协同,这叫作同步

线程互斥是用来保护临界资源的操作,多个线程不能同时访问临界资源,容易出问题,让多个线程串行执行

多个线程交叉执行本质:就是让调度器尽可能的频繁发生线程调度与切换

例如以下的抢票程序,定义6个线程去抢票。票是临界资源

#include <iostream>
#include <string>
#include<vector>
#include <cstring>
#include <unistd.h>
#include <pthread.h>
using namespace std;
#define NUM 6   //创建线程的数量
//本节:抢票和死锁 ,代码hpp头文件来自lesson32
int tickets=10000;
//定义互斥量的办法1
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;


void* getTickets(void* args){

    string thread_name=static_cast<const char*>(args);
    while(true){
        pthread_mutex_lock(&mutex);//锁上
        if(tickets>0){
            cout<<thread_name<<" get ticket,tickets less: "<<tickets--<<endl;
            pthread_mutex_unlock(&mutex);//解锁
        }
        else{
            pthread_mutex_unlock(&mutex);//解锁
            break;
        }
        usleep(1000);
    }
}

int main()
{
    vector<pthread_t> tids;
    for(int i=0;i<NUM;i++){
        pthread_t tid;
        char namebuffer[64];
        snprintf(namebuffer,sizeof namebuffer,"[%s %d]","Thread",i+1);
        pthread_create(&tid,nullptr,getTickets,(void*)namebuffer);
        tids.push_back(tid);
        usleep(1024);   //这里要usleep一下,因为可能主线程太快导致namebuffer被覆盖
    }

    for(const auto& id:tids){
        pthread_join(id,nullptr);
    }

    return 0;
}

为什么要对以上代码进行互斥操作呢?

假设有一个线程正在抢票且票=1,那么他此时进来if(tickets>0)里了,但假设此时刚好时间片用完了,那么轮到别的线程了,因为上一个线程还没减去票,那么当前线程看到的票的数量还是>0那么此时我--,然后轮到刚刚那个线程了,那么那个线程也减减--了,最后结果就会出现
负数的票数量
,显然这种情况是不允许发生的,所以需要对线程进行互斥操作

互斥量的本质 : 互斥量是一个有两种状态的变量,加锁和解锁两个状态


3.1 互斥量的接口

初始化互斥量

  • 方式一 :定义静态或者全局的互斥量
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//定义在全局区
//或者 static pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

其实该方法也可以定义局部的,只需要有办法让其他线程拿到该互斥量的地址即可,用指针来实现

  • 方法二:动态分配
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
参数:
mutex:要初始化的互斥量
attr:NULL

eg:

int main(){
	pthread_mutex_t mutex lock;//声明一个互斥量
	pthread_mutex_init(&lock,nullptr);
    ......
}

让其他线程能拿到该地址即可

销毁互斥量
: 对于方法一不需要销毁

pthread_mutex_destory(pthread_mutex_t *mutex)


⭐互斥量加锁和解锁

pthread_mutex_lock(pthread_mutex_t *mutex);		//加锁
pthread_mutex_unlock(pthread_mutex_t *mutex);	//解锁

当申请加锁失败,该线程将进入阻塞状态等待

如果线程申请锁成功,那么其他线程此时处于阻塞状态。

如果线程申请锁失败,那么该线程将进入阻塞状态,直至锁被打开。


3.2 如何看待锁

  • 锁本身就是一个共享资源
  • 加锁的过程必须是原子的
  • 如果申请成功,则进入临界区,访问临界资源,没有暂时成功,那么将阻塞等待
  • 谁持有锁谁就进入临界区

加锁的汇编底层实现

  • 1.每个线程在寄存器中都有自己的上下文保存,所以假设线程A申请了锁,那么如下

  • 2.每个线程起始内部值为0,内存中初始化的锁值为1,要申请锁,那么执行汇编语句exchange该语句是一条,假设此时交换完被调走,线程拿着上下文走了,保存在寄存器中,所以,只有一个申请成功,交换后的线程的值为1此时大于0,那么代表申请锁成功

  • 3.假设线程B此时也申请锁线程B的内部值也为0,现在内存中的1已经被线程A调走了,所以无论怎么换,都失败,那么此时将阻塞挂起等待

  • 解锁是将mutex的值变为1,没有交换值的过程,然后唤醒等待的线程

3.3 可重入VS线程安全

可重入 : 同一个函数能被多个执行流进入,当当前执行流还没执行完,其他执行流再次进入,如果执行是没有出问题那么就是可重入的,如果出问题或者返回结果不同那么就是不可重入的。

线程安全 : 多个线程并发一段代码并且出现的结果都相同,不会出现不同的结果,此时线程是安全的,如果引起数据出错问题,那么线程是不安全的。

  • 可重入是线程安全的子集

  • 可重入函数是线程安全函数的一种

  • 线程安全不一定是可重入的,而可重入函数则一定是线程安全的。

4. 死锁

**死锁的概念 : **死锁是两个或多个进程在执行过程中,持有不释放的资源,互相申请被其他进程索占有的不释放的资源而处于的一种永久等待状态。

通俗的讲在多把锁的条件下,我们持有锁,还想要对方的锁,对方也是如此,一直僵持等待,就容易造成死锁

死锁是程序员设计的时候造成的错误,并不是天然存在的,死锁会造成资源浪费和性能损耗等问题。

死锁产生的四个必要条件:

1. 互斥 : 任何时刻保证只有一个执行流在临界区执行。

2. 请求与保持 :进程已经保持了自己的资源,但又提出了新的资源请求,但该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

3. 不剥夺 : 不去强行剥夺其他进程的资源

4. 环路等待 :存在一个环路链,进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源 , .....,Pn正在等待已被P0占用的资源。例如A申请锁1-->锁2,B申请锁2--->锁1,此时假设A申请完锁1然后被调度B申请锁2,此时造成环路了就

上边的四个条件都满足才会产生死锁所以我们可以根据以上的必要条件去破坏死锁的产生。

破坏死锁的产生

首先互斥是锁的特性,是没办法破坏的

  • 破坏
    请求与保持条件:
    请求与保持就是我自己有锁,要别人的锁要不到,那么此时要失败了,此时释放我曾经所有申请成功的所有锁,不保持与请求
  • 破坏
    不剥夺条件:
    可以设计一个优先级高低的竞争策略,当需要的资源被其他进程占有时可以强制剥夺式的去拿
  • 破坏
    环路等待条件:
    在申请锁的时候设计尽量保持申请锁的顺序一致,这样就可以尽可能的避免环路产生

额外补充:

线程申请锁成功,执行临界区的时候,其他线程此时阻塞等待

线程申请锁成功,正在执行临界区的时候,此时依然可以被切换走
,是抱着锁被切走的,所以此时其他线程照样无法进来,等被切换回来继续执行

一个线程申请的锁,可以被另一个线程解锁,因为解锁的汇编语言是将1放入mutex中,并没有交换,但是这种情况很少发生,代码写的时候基本上不会这样写

5. 条件变量

  • 条件变量是实现线程同步与互斥的一个手段,通常条件变量与互斥锁一起使用,条件变量本身不是锁
  • 条件变量是用来阻塞一个队列,等待某一条件或者事件发生,被唤醒时则取消阻塞

1. 条件不满足,阻塞队列 2.条件满足,通知阻塞的线程开始工作

**操作函数 : **

与互斥量类似

  • 条件变量初始化
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *attr);
// 第一个参数为要初始化条件变量的地址,第二个为设置该条件变量的属性,通常为nullptr
  • 销毁
int pthread_cond_destroy(pthread_cond_t *cond)
//参数:要销毁条件变量的地址
  • 等待条件满足
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex)

第一个参数为条件变量的地址,第二个参数为当前锁(互斥量)的地址

为什么等待条件变量的时候要需要互斥量,传入锁的地址呢?

当我条件不满足的时候,我将进入阻塞队列等待条件满足,但是此时是持有锁的,挂起的时候其他线程都拿不到锁了,造成了线程之间的阻塞,严重则一直僵持,所以
当要对条件变量进行等待,此时函数将线程挂起然后将当前持有的锁给释放,当再次被唤醒的时候,再申请锁

  • 唤醒等待
int pthread_cond_signal(pthread_cond_t *cond);
//signal唤醒一个等待的线程
int pthread_cond_boardcast(pthread_cont_t *cond);
//boardcast一次性唤醒所有等待该条件变量的线程

6. 生产者消费者模型

生产者和消费者模型是通过一个容器解决两者之间强耦合的关系,在生产者和消费者之间通过一个阻塞队列来进行通信,生产者生产完数据不用去等待消费者处理,消费者不用去找生产者要数据,都是通过中间层来进行交互,阻塞队列就类似一个缓冲区平衡了消费者和生产者间的处理能力,这个阻塞队列就是用来给生产者和消费者解耦的

**生产者消费者模型的特点 : **

  • 生产者和消费者进行解耦
  • 支持生产和消费的一段时间的忙闲不均的问题
  • ⭐提高效率

基于BlockingQueue的生产者消费者模型

在生产者和消费者之间添加一个阻塞队列,生产者放数据,消费者取数据

当队列为空时,消费者需要等待,此时可以使用条件变量来限制,等待条件解除,解除等待

当队列为满时,生产者等待,等待消费者取数据

为什么该模型高效呢?

当有多个线程生产以及多个线程消费时,高效之处不在与阻塞队列。

假设生产者放完数据之前需要初始化等操作,要花费一定时间,消费者获取数据之后要花时间处理拿到的数据。

但是当放之前/生产完数据后,此时其他线程也可以在这个时间进行放/取数据,然后切换线程,再回到我刚刚的线程,开始生产或者消费等操作,所以高效率的体现在线程之间可以切换,解决了忙闲不均
生产之前消费之后各线程可以让线程并行执行。

7. 信号量

信号量广泛用于进程或线程间的同步和互斥,信号量本质上是⼀个非负的整数计数器,它被⽤来控制对公共资源的访问。

申请信号量的操作叫做P操作,释放信号量的操作叫做V操作,所以PV操作来协助完成同步

信号量头文件 : #include <semaphore.h>

  • 初始化信号量
int sem_init(sem_t *sem,int pshared,unsigned int value)
//参数: sem为信号量类型   
//pshared : 通常是0,0表示线程间共享
//value : 初始化信号量的值
  • 销毁信号量
int sem_destory(sem_t *sem);
  • 等待信号量 (P操作) :
    等待信号量,有的话就取消等待,将信号量减去1
int sem_wait(sem_t *sem);
  • 发布信号量 (V操作) :
    发布信号量,通常将信号量加1
int sem_post(sem_t *sem);

7.1 基于环形队列的生产消费模型

通过一个信号量来保证环形队列中 :

环形队列采用数组来模拟 , 用模运算来模拟环状特性

在环中只有两种情况,消费者和生产者才会碰头: 1.环形队列没数据 2.环形队列数据满

所以,通过信号量来维护特殊情况时两个位置不会超。

当队列没有数据时 消费者不能超过生产者的位置 也就是没有数据消费者不能继续

当队列数据满时 生产者不能超过消费者的位置 也就是数据满了生产者不能继续

#pragma once
#include <vector>
#include <pthread.h>
#include <semaphore.h>

template <class T>
class ringQueue
{
private:
    void P(sem_t &sem){sem_wait(&sem);}
    void V(sem_t &sem){sem_post(&sem);}

public:
    ringQueue(int gval = 5) : _cap(gval)
    {
        _rq.resize(_cap);
        pthread_mutex_init(&_pmutex, nullptr);
        pthread_mutex_init(&_cmutex, nullptr);
        sem_init(&_less, 0, 10); // 假设信号量初始为50个
        sem_init(&_have, 0, 0);
        _pindex=_cindex=0;
    }
    ~ringQueue()
    {
        pthread_mutex_destroy(&_pmutex);
        pthread_mutex_destroy(&_cmutex);
        sem_destroy(&_less);
        sem_destroy(&_have);
    }

    void push(const T &in)
    {
        P(_less);
        pthread_mutex_lock(&_pmutex);

        _rq[_pindex++]=in;
        _pindex%=_cap;

        V(_have);
        pthread_mutex_unlock(&_pmutex);
    }

    void pop(T* out){
        P(_have);
        pthread_mutex_lock(&_cmutex);

        *out=_rq[_cindex++];
        _cindex%=_cap;
        V(_less);
        pthread_mutex_unlock(&_cmutex);
    }

private:
    int _cap;                         // 环形数组的容量
    std::vector<T> _rq;                    // 用s数组来模拟实现环形阻塞队列
    int _pindex, _cindex;           // 生产者在环形阻塞队列中的下标,消费者的下标
    pthread_mutex_t _pmutex, _cmutex; // 锁: 生产者锁(_pmutex)和消费者锁(_cmutex)
    sem_t _less, _have;               // 信号量: _less表示还有多少剩余的空间,_have表示现在有多少
};

8. 线程池

线程池是一种线程使用模式。
线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着 监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。
线程池不仅能够保证内核的充分利 用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。

总的来说在运行是频繁的创建多个线程和销毁会造成速度变慢等,所以线程池是一次性创建好多个线程,供使用,是一种典型的
空间换时间的方法

暴露出push的接口接受外部任务,处理任务,也可以根据其他要求来创造其他接口

代码地址 :
码云(基于阻塞队列的线程池)


9. 线程安全的单例模式

单例模式是一种常见的
设计模式

某些类, 只应该具有一个对象(实例), 就称之为单例.

例如一个人只能有一个妻子. 在很多服务器开发场景中, 经常需要让服务器加载很多的数据 (上百G) 到内存中. 此时往往要用一个单例的类来管理这 些数据.

饿汉实现方式和懒汉实现方式

饿汉实现方式和懒汉实现方式

吃完饭, 立刻洗碗, 这种就是饿汉方式. 因为下一顿吃的时候可以立刻拿着碗就能吃饭.这就是
饿汉方式

吃完饭, 先把碗放下, 然后下一顿饭用到这个碗了再洗碗, 就是
懒汉方式.

懒汉方式最核心的思想是 "延时加载". 从而能够优化服务器的启动速度.

懒汉就是需要用的时候再去对应的行为操作

其实平常new的堆空间,如果只先new了一批空间,操作系统实现的方式其实就是用懒汉方式来实现的

new一部分空间,操作系统首先会在进程地址空间处给你划分好一段区域,但是实际物理内存并没有给你,以及页表也没有建立映射,当检测到你用了这一段空间时,发生缺页中断,放下手里的事情,给你分配物理内存,然后建立页表映射关系,所以这就是一种典型的懒汉方式


什么是I8n

国际化(
I18n
)指的是设计和开发产品的过程,使得它们能够适应多种语言和文化环境,而不需要进行大量的代码更改。这通常涉及到创建一个基础版本的产品,然后通过配置和资源文件来添加对不同语言和地区的支持。

这样,当产品需要在新的地理区域或语言环境中使用时,只需要添加或更新相应的资源文件,而不需要修改产品本身的代码。

"
I18n
" 是 "
Internationalization
" 的缩写形式,之所以是 "
I18n
" 而不是 "
Int
" 或者其他缩写,是因为 "
Internationalization
" 这个词的第一个字母是 "
I
",最后一个字母是 "
n
",而在这两个字母之间有 18 个字符。因此,"
I18n
" 成为了一个流行的缩写方式,类似的还有 "
K8s
" 。


Spring Boot I18n

I8n
体现在
Java
后端比较常见的就是错误提示,而
SpringBoot
本身就提供了对I8n的支持。使用也非常简单,可以参考一下
官方文档



添加国际化资源文件

SpringBoot
默认会读取
classpath/resource
下的
messages
目录里的国际化资源文件,可以通过下面这个配置更改:

spring.messages.basename=messages

咱们先通过
Idea
创建国际化资源文件,方法如下:

Untitled
Untitled

创建完成后在
reources
目录下能看到这些国际化资源文件,图中为了演示,定义了咱们开发中比较常见的登录错误提示信息。

Untitled



创建工具类

创建工具类的目的是方便咱们获取国际化信息

public class I18nUtil {
 public static String getI18nMessage(String code) {
         try {
           // SpringBoot提供有一个MessageSource的默认实现
             MessageSource messageSource = SpringUtils.getBean("messageSource");
             // 从SpringBoot中获取请求上下文 语言
             Locale locale = LocaleContextHolder.getLocale();
             // 因为我项目只有中文和英文,所以判断一下除了指定中文,否则默认使用英文  
             // 这里对简体中文的定义,Locale[] SIMPLIFIED_CHINESE = {Locale.CHINESE, Locale.CHINA, Locale.SIMPLIFIED_CHINESE, Locale.PRC};
             if (Arrays.stream(LocaleUtils.SIMPLIFIED_CHINESE).toList().contains(locale)) {
                 locale = Locale.SIMPLIFIED_CHINESE;
             } else {
                locale = Locale.US;
             }
            return messageSource.getMessage(code, null, locale);
         } catch (Exception e) {
             log.error("获取国际化内容异常", e);
             // 如果获取国际化信息失败就返回原内容
             return code;
         }
     }
}



定义接口统一返回类

@Data
public class RestResult<Timplements Serializable {

    private static final long serialVersionUID = 1L;

    /** 状态标识码 */
    private String code;

    /** 描述信息 */
    private String message;

    /** 数据 */
    private T data;
    
    public String getMessage(){
     if (StrUtil.isNotEmpty(this.code)) {
       // 获取I8n
      return I18nUtil.getI18nMessage(this.code)
     }
     return this.message;
    }
    
    // 省略其他方法。。。
}



请求头添加语言编码

curl -H "Accept-Language: zh-CN" http://example.com


Spring Cloud 配置I8n

上面是一个简单的是
SpringBoot
项目配置I8n的流程,但是在
Spring Cloud
下通常会有多个服务(
SpringBoot
项目)。按照我们的习惯一般有一个公共项目(
common
),用于封装
POJO
和一些通用的工具类、常量类之类的功能,然后把这个项目打成
jar
包,其他业务服务都会依赖这个项目,达到功能复用的目的。通用我们也会将一些通用的错误信息(比如:用户Id不能为空)放到
common
项目里面,那么怎么把这些通用错误信息配置成
I8n
呢?

按照上面所说,我们把
common
项目打成
jar
包供其他业务服务使用,那么当其他服务引入
common
依赖以后,
common
就和业务服务同处于一个
Spring
容器,这时候上面的
I8n
配置就无法读取到
common
里面的
I8n
配置了(上面讲过了
SpringBoot
默认读取的是项目
classpath/resource
下的配置文件)。因此我们需要自定义一个
MessageSource
然后读取
common
下的
I8n
配置就可以了。

  1. 首先,我们在 common resource 下创建 I8n 配置文件,方法和上面一样,因为和业务服务同处一个 Spring 容器,所以我们需要将资源名称区分开,我们暂且就叫 common_messages , 如下图所示:
Untitled
Untitled
  1. 然后,我们配置一个自定义 MessageSource Bean ,并且读取我们设置的 common_messages
@Bean(name = "commonMessageSource")
public ResourceBundleMessageSource resourceBundleMessageSource() throws IOException {
    ResourceBundleMessageSource source = new ResourceBundleMessageSource();
    source.setDefaultEncoding(StandardCharsets.UTF_8.displayName());
    source.setBasename("common_messages");
    return source;
}
  1. 最后,调整 I8nUtil 逻辑,先读取业务服务自己的 I8n ,如果没有再从 common I8n 获取,如果还没有则返回原 code
public class I18nUtil {
 public static String getI18nMessage(String code) {
         try {
           // SpringBoot提供有一个MessageSource的默认实现
             MessageSource messageSource = SpringUtils.getBean("messageSource");
             // 从SpringBoot中获取请求上下文 语言
             Locale locale = LocaleContextHolder.getLocale();
             // 因为我项目只有中文和英文,所以判断一下除了指定中文,否则默认使用英文  
             // 这里对简体中文的定义,Locale[] SIMPLIFIED_CHINESE = {Locale.CHINESE, Locale.CHINA, Locale.SIMPLIFIED_CHINESE, Locale.PRC};
             if (Arrays.stream(LocaleUtils.SIMPLIFIED_CHINESE).toList().contains(locale)) {
                 locale = Locale.SIMPLIFIED_CHINESE;
             } else {
                locale = Locale.US;
             }
            try{
              // 先读取业务服务自己配置的I8n
             return messageSource.getMessage(code, null, locale);
            }catch (NoSuchMessageException e) {
                // 如果没有获取到,再从common里面读取I18n
              ResourceBundleMessageSource commonMessageSource = SpringUtils.getBean("commonMessageSource");
                return commonMessageSource.getMessage(code, null, locale);
            }
         } catch (Exception e) {
             log.error("获取国际化内容异常", e);
             // 如果获取国际化信息失败就返回原内容
             return code;
         }
     }
}

本文使用
markdown.com.cn
排版

B+树重要操作

中间节点

  • 中间节点的key,与其对应的指针的原则是,小于key的元素在其指针指向的节点中
  • 中间节点的key可以看成是右斜着排放的,即小于等于key的节点由key对应的指针指定,最有一个指针指向大于最右侧key的节点

分裂

  • 当中间节点数量满了时,进行分裂,新生成一个相邻的中间节点right_internal_node
  • 计算原先保留多少元素, 例如保留left_count = K/2
  • 将left_count对应的key作为upper_key后续插入到中间节点
  • 从left_count + 1下标开始,将key复制到新生成的节点中
  • 将left_count下表对应的指针留在左节点
    • 将left_count +1 下表对应的指针开始复制到新生成的节点中

分裂后插入上层中间节点

  • 经过分裂有三个重要元素:left_internal_node(也就是原先被分裂节点), right_internal_node(新生成的节点),upper_key
  • 上层中间节点为upper_internal_node
  • 注意原先upper_internal_node有一个old_key和old_ptr指针指向left_internal_node,这个old_key肯定是比upper_key大的
    • 将(upper_key, left_internal_node)作为一对插入到upper_internal_node
    • 将old_key对应的old_ptr改成指向right_internal_node

image

删除

借入数据

中间节点删除数据后,如果数量少于最低值K/2,那么它可以尝试从它的相邻节点借入数据。那么它的相邻节点在哪里呢?第一类相邻节点是与中间节点共享一个父节点的节点,很容易通过其父节点找到。第二类相邻节点,不与其共享一个父节点:想象一下当节点是父节点的最左边节点时,那么在其父节点下,它只有一个右侧相邻节点,这个时候它的左侧相邻节点不在其父节点下;当节点是父节点的最右边节点时,那么在其父节点下,它只有一个左侧相邻节点,这时候它的右侧相邻节点不在其父节点下,而在右侧树分支下。

image

  • 注意第二类的借入在实现的时候也可以不考虑,只不过这样会过早的带来节点合并。

节点合并

当节点确实从左右都没有节点可以借入数据时,那么它就可以与左右节点合并了。正因为其左右节点也没有多的节点可以借,说明其左右节点不大于K/2,那么合并后节点节点数量是会小于K的。

节点合并,我们可以总是选择与其相同父节点下的相邻节点进行合并。节点合并后,需要使父节点删除掉被合并数据的节点(需要注意的是在实际操作中,我们可以选择被删除的节点最终保留下来,也可以选择相邻节点最终保留下来,这只是实现方式)。

降级

父节点删除某个子节点后,需要检查父节点的key数量是否满足K/2要求,如果父节点不满足,那么父节点也需要执行借入动作,如果父节点无法接入,那么就需要执行合并动作。并最终出发祖父节点的删除动作。整个流程会递归上去最终可能会到根节点,若根节点删除了数据,且一个key也没有了。那么就要将其子节点设置成新的root了(奇怪?没有key还有子节点?注意中间节点指针比key多一个,就是说没有key,也至少有一个指针)。

叶子节点

插入

分裂

  • 当叶子节点数量满了时,进行分裂,新生成一个相邻sibling节点
  • 计算原先保留多少元素, 例如保留left_count = K/2
  • 将下标left_count开始的key移动到新生成的节点
    • 将left_count对应的key作为upper_key后续插入到中间节点
  • 将下标left_count开始的value移动到新生成的节点

分裂后插入上层中间节点

  • 新分裂出的节点的第一个key为upper_key
  • 如果叶子节点没有上层中间节点,那么就新建一个中间节点作为根节点,把原先叶子节点以及新分裂出的叶子节点直接插入到新的中间节点。同时将upper_key插入到新中间节点中。即它有1个key,两个指针。
  • 如果有上层中间节点
    • 首先将upper_key插入到中间节点
    • 其次将新分裂出的节点指针也插入到中间节点,这里需要注意的是由于中间节点的指针数量比key数量多一个。所以指针插入的index要比upper_key插入的index大1
      image

删除

  • 删除后,尝试从其右侧的节点借数据,前提是右侧节点包含m/2 +1个元素
  • 若节点(且该节点不是中间节点的最左侧节点)最左边一个元素被删除了,则需要更新中间对应的key

借入数据

借入数据的流程是简单的,与中间节点类似。找到其相邻节点并拿到数据。同样需要注意的是它的相邻节点也可能不在其父节点下。

节点合并

与中间节点的操作类似,找到相邻节点,拷贝数据。通知父节点删除一个节点即可。

要记录哪些指针

  • 从B+树的定义上来看,至少每个叶子节点需要记录一个指向右侧相邻节点的指针

其他指针要不要记录呢?

  • 节点是否要记录父节点指针?
  • 中间节点是否要记录右侧节点的指针?
  • 节点是否要记录其左侧节点的指针?

这个因设计实现而异了,记录更多的指针,那么在寻找定位的时候肯定更加容易,但是也带来了很多维护成本,这个在设计的时候做考量。

如何找到相邻的节点

相同父节点下的相邻节点

很容易,很自然,进行遍历就可以或者对key进行find或二分法(注意所有节点里面的key都是有序的)

非相同父节点下的相邻节点

  • 最节点的方式是记录节点(包括中间节点)的左侧、右侧指针

另外一种方式,如果不想过多的记录指针,那么可以通过搜索回溯的方式来找目标节点到相邻节点。 某个最左侧中间节点为例:

  • 从它开始往上回溯,当回溯到的节点不是其父节点的最左侧节点时,说明我们已经找到了共同祖先
  • 然后从共同祖先中的左侧节点(对应下图1的左侧节点3)开始往下找其最右侧的子节点,当往下搜索的层数与向上回溯的层数相同时,我们就找到了目标节点的相邻节点。
  • 最右侧中间节点的搜索过程是类似的。
    image

例如想找到节点5的做相邻节点4,就往上回溯首先到1, 5是1的最左侧节点,则继续向上到2,1不是2的最左侧节点,所有2就是共同祖先了。1的左侧节点3往下,找到最右侧节点4, 4与5是相同层级的,那么就是5的相邻左节点了。

另外一个问题是如何进行回溯呢?一种实现方式是子节点记录父节点的指针;另一种实现方式是,记录搜索过程的搜索栈(即从根节点到叶子节点经过了哪些中间节点,记录到一个列表里面)。