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

操作系统 | 学习笔记 | 王道 | 2.4死锁

2.4 死锁

文章目录

      • 2.4 死锁
        • 2.4.1 死锁的概念
        • 2.4.2 死锁预防
        • 2.4.3 死锁避免
        • 2.4.4 死锁检测和解除

img

2.4.1 死锁的概念
  1. 死锁的定义

    在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是“死锁”。发生死锁后若无外力干涉这些进程都将无法向前推进。

  2. 死锁、饥饿、死循环的区别

    img

    • 共同点:都是进程无法顺利向前推进的现象(故意设计的死循环除外)

    • 区别:

      • 死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。两个以上程序

      • 饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。单个程序

        比如:在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”

      • 死循环:某进程执行过程中一直跳不出某个循环的现象。

        有时是因为程序逻辑bug导致的,有时是程序员故意设计的。

  3. 死锁产生原因

    • 对系统资源的竞争

      各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资源(CPU)的竞争是不会引起死锁的。

    • 进程推进顺序非法

      请求和释放资源的顺序不当,也同样会导致死锁。例如,并发执行的进程P1、P2分别申请并占有了资源R1、R2,之后进程P1又紧接着申请资源R2,而进程P2又申请资源R1,两者会因为申请的资源被对方占有而阻塞,从而发生死锁。

    • 信号量的使用不当也会造成死锁

      如生产者-消费者问题中,如果实现互斥的P操柞在实现同步的P操作之前,就有可能导致死锁。(可以把互斥信号量、同步信号量也看做是一种抽象的系统资源)

  4. 死锁产生的必要条件

    产生死锁 必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。

    • ① 互斥条件:只有对必须 互斥使用的资源的争抢 才会导致死锁(如哲学家的筷子、打印机设备)。像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)。
    • ② 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
    • ③ 请求和保持条件:进程已经 保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
    • ④ 循环等待条件:存在一种进程资源的 循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。

    注:发生死锁时一定有循环等待,但是发生循环等待时未必死锁,即 循环等待是死锁的必要不充分条件。

    img

    如果同类资源数大于1,则即使有循环等待,也未必发生死锁(如上图 Pn 可以同时请求 P1 或者 Pk 的资源,得到 Pk 资源后,不会发生死锁)。 但如果系统中每类资源都只有一个,那循环等待就是死锁的充分必要条件了。

  5. 死锁处理策略

    • 死锁预防。设置某些限制条件,破坏产生死锁的4个必要条件中的一个或几个。
    • 避免死锁。在资源的动态分配过程中,用某种方法防止系统进入不安全状态。
    • 死锁的检测及解除。无须采取任何限制性措施,允许进程在运行过程中发生死锁。通过系统的检测机构及时地检测出死锁的发生,然后采取某种措施解除死锁。

    死锁的几种处理策略的比较见下表。

    资源分配策略各种可能模式主要优点主要缺点
    死锁预防保守,宁可资源闲置一次请求所有资源,资源剥夺,资源按序分配适用于突发式处理的进程,不必进行剥夺效率低,进程初始化时间延长;剥夺次数过多;不便灵活申请新资源
    死锁避免是“预防”和“检测”的折中(在运行时判断是否可能死锁)寻找可能的安全允许顺序不必进行剥夺必须知道将来的资源需求;进程不能被长时间阻塞
    死锁检测宽松,只要允许就分配资源定期检查死锁是否已经发生不延长进程初始化时间,允许对死锁进行现场处理通过剥夺解除死锁,造成损失
2.4.2 死锁预防

死锁的产生必须满足四个必要条件,只要其中一个或者几个条件不满足,死锁不会发生。

  1. 破坏互斥条件

    img

    把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。如: SPOOLing技术。使用 SPOOLing 技术可以把 独占设备在逻辑上改造成共享设备。比如,用SPOOLing技术将打印机改造为共享设备…

  2. 破坏不剥夺条件

    img

    • 提供两种方案:
      • ① 申请资源得不到时,主动释放所占有资源。
      • ② 申请资源被其他进程占用时,由 OS 协助剥夺。
    • 策略的缺点:
      • 实现起来比较复杂;
      • 释放已获得的资源可能造成前一阶段工作的失效,因此这种方法一般只适用于易保存和恢复状态的资源,如CPU;
      • 反复地申请和释放资源会增加系统开销,降低系统吞吐量;
      • 方案 ① 可能导致进程饥饿。
  3. 破坏请求和保持条件

    img

    采用 静态分配方法,即进程 在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行。一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源了。

    策略的缺点: 进程在整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率极低。另外,该策略也有 可能导致某些进程饥饿。

  4. 破坏循环等待条件

    img

    采用 顺序资源分配法。首先给系统中的资源编号,要求进程只能按编号递增顺序请求 资源。

    原理分析: 一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象(类比拓扑排序)。

    策略的缺点: 不方便增加新的设备,因为可能需要重新分配所有的编号;进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费;必须按规定次序申请资源,用户编程麻烦。

2.4.3 死锁避免

死锁的避免是在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁。

  1. 系统安全状态

    img

    • 安全序列:是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。
    • 安全状态:系统如果存在安全序列,则处于安全状态,安全状态一定不发生死锁。安全序列可能有多个。
    • 不安全状态:如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)

    安全序列的计算方法:

    已知现有三个进程的资源分配表如下(可用代表系统还剩有 3 个资源),现假设可用资源每次分配都是全部分配,并且分配给进程的资源总数应满足进程最多还需求的资源数目(如:可用资源有 3 个,由于 P2 进程还需要 2 个资源,因此只能满足 P2),分配完后回收该进程所拥有的全部资源。

    img

    计算步骤如下:

    img

    因此得到安全序列是 {P2, P1, P3}。


    如果计算到 P3 时,可用资源无法满足 P3 的最大需求,即还需要的资源数目多于可用资源数目,那么就不存在安全序列。

    img

    注:死锁状态一定是不安全状态,不安全状态不一定是死锁状态,即:死锁状态 ⇒ 不安全状态。

    如:A 进程需 10 个资源,而可用资源有 5 个。若 A 还未提出申请,则不会进入死锁状态。

    系统进入不安全状态后,便可能进入死锁状态;反之,只要系统处于安全状态,系统变可避免进入死锁。

  2. 银行家算法

    img

    img

    img

    img

    核心思想: 在分配资源前,预先判断这次分配是否会导致系统进入不安全状态,以此来决定是否答应资源分配请求,从而使得系统避免死锁。

    • 数据结构描述:

      • ①可利用资源向量 A v a i l a b l e Available Available(一维数据)
      • ②最大需求矩阵 M a x Max Max
      • ③分配矩阵 A l l o c a t i o n Allocation Allocation
      • ④需求矩阵 N e e d Need Need

      其中, N e e d = M a x − A l l o c a t i o n Need=Max-Allocation Need=MaxAllocation

      img

      注: A v a i l a b l e ( A , B , C ) = ( 3 , 3 , 2 ) Available(A,B,C)=(3,3,2) Available(A,B,C)=(3,3,2)代表可用的 A 类资源数目有 3 个,B 类资源数目有3个,C 类资源数目有 2 个。

    • 银行家算法描述

      R e q u e s t i Request_i Requesti是进程Pi的请求向量, R e q u e s t i [ j ] = K Request_i[j]=K Requesti[j]=K表示进程 P i Pi Pi需要 j j j类资源 K K K个。

      • ①若 R e q u e s t i [ j ] ≤ N e e d [ i , j ] Request_i[j]≤Need[i,j] Requesti[j]Need[ij],检查此次申请是否超过最多还需求数。

      • ②若 R e q u e s t i [ j ] ≤ A v a i l a b l e [ j ] Request_i[j]≤Available[j] Requesti[j]Available[j],检查系统的可用资源是否还能满足此次需求。

      • ③系统试探着把资源分配给 P i Pi Pi,并修改下面数据结构的数值:

        A v a i l a b l e = A v a i l a b l e − R e q u e s t i Available=Available-Request_i Available=AvailableRequesti,修改i进程剩余可用资源数

        A l l o c a t i o n [ i , j ] = A l l o c a t i o n [ i , j ] + R e q u e s t i [ j ] Allocation[i,j]=Allocation[i,j]+Request_i[j] Allocation[ij]=Allocation[ij]+Requesti[j],i进程已分配资源数加上本次请求资源数

        N e e d [ i , j ] = N e e d [ i , j ] − R e q u e s t i [ j ] Need[i,j]=Need[i,j]-Request_i[j] Need[ij]=Need[ij]Requesti[j],i进程还需的资源数减去本次请求的资源数

      • ④执行安全性算法,检查系统是否处于安全状态,即检查当前系统是否存在安全序列。

      若系统安全,才正式将资源分配给 P i Pi Pi;否则此次试探分配作废,恢复原来分配状态。

      注:安全性算法是银行家算法的核心。

    • 安全性算法描述

      设置工作向量 W o r k Work Work,表示系统中剩余可用资源数目。算法执行开始时, W o r k = A v a i l a b l e Work=Available Work=Available

      • ①初始时安全序列为空。
      • ②检查当前的剩余资源是否能满足某个进程的最大需求。如果可以就将它加入安全序列;若找不到执行步骤④
      • ③把该进程持有资源全部回收,返回步骤②
      • ④若此时安全序列中已有所有进程,则系统处于安全状态,否则处于不安全状态。
    • 例题

      假设当前系统中资源分配和剩余情况如下表所示,现 P 1 P1 P1发出请求向量 R e q u e s t 1 ( 1 , 0 , 2 ) Request_1(1,0,2) Request1(102),判断此次请求是否分配成功。

      img

      • ① 系统按银行家算法进行检查:

        R e q u e s t 1 ( 1 , 0 , 2 ) ≤ N e e d 1 ( 1 , 2 , 2 ) Request_1(1,0,2)≤Need_1(1,2,2) Request1(1,0,2)Need1(1,2,2) R e q u e s t 1 ( 1 , 0 , 2 ) ≤ A v a i l a b l e ( 3 , 2 , 2 ) Request_1(1,0,2)≤Available(3,2,2) Request1(1,0,2)Available(3,2,2)

        此次申请未超过 P 1 P1 P1进程最多还需求数,并且当前可用资源数可满足此次申请,则可试探的为 P 1 P1 P1分配资源,并修改:

        A v a i l a b l e = A v a i l a b l e − R e q u e s t 1 = ( 2 , 3 , 0 ) Available=Available-Request_1=(2,3,0) Available=AvailableRequest1=(2,3,0)
        A l l o c a t i o n 1 = A l l o c a t i o n 1 + R e q u e s t 1 = ( 3 , 0 , 2 ) Allocation_1=Allocation_1+Request_1=(3,0,2) Allocation1=Allocation1+Request1=(3,0,2)
        N e e d 1 = N e e d 1 − R e q u e s t 1 = ( 0 , 2 , 0 ) Need_1=Need_1-Request_1=(0,2,0) Need1=Need1Request1=(0,2,0)

        img

      • ② 系统执行安全性算法检查安全状态:

        W o r k = A v a i l a b l e = ( 2 , 3 , 0 ) Work=Available=(2,3,0) Work=Available=(2,3,0),执行安全性算法,如下表所示:

        img

        由安全性检查而知,可以找到一个安全序列 { P1, P3, P4, P0, P2 },因此系统是安全的,可以将P1所申请的资源分配给他。

2.4.4 死锁检测和解除

img

如果系统既不采取预防死锁的措施,也不采取避免死锁的措施,系统就很可能发生死锁。在这种情况下,系统应当提供死锁检测和解除的手段。

  1. 资源分配图

    系统死锁可利用 资源分配图 来描述。圆代表一个进程,框代表一类资源,框中一个圆代表一类资源中的一个资源。

    img

    • 两种结点:
      • 进程结点:对应一个进程
      • 资源结点:对应一类资源,一类资源可能有多个
    • 两种边:
      • 请求边:表示进程想申请几个资源(每条边代表一个)
      • 分配边:表示已经为进程分配了几个资源(每条边代表一个)
  2. 死锁定理

    简化资源分配图可检测系统状态是否为死锁状态。简化方法如下:

    ① 在资源分配图中,找出 既不阻塞又不是孤点的进程 Pi。

    • 不阻塞:表示进程申请的资源可以被满足,如 P1 进程。由于 R2 资源除分配给 P2 进程一个资源外,还剩有一个资源,因此 P1 进程申请的 R2 资源可以被满足。相反,P2 进程申请 R1 资源则不会被满足,由于 R1 资源全部被分配完。
    • 不是孤点:表示与该进程节点至少一个边相连。

    ② 消去进程所有的请求边和分配边,使之成为孤点。

    重复以上步骤,若能消去图中所有的边,则称该图是可完全简化的。

    img

    注:并不是系统中所有的进程都是死锁状态,用死锁检测算法 化简资源分配图后,还连着边的那些进程就是死锁进程。

    死锁定理:如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁

  3. 死锁解除

    img

    一旦检测出死锁的发生,就应该立即解除死锁。解除死锁的主要方法有:

    • 资源剥夺法

      挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是 应防止被挂起的进程长时间得不到资源而饥饿。

    • 撤销进程法(或称终止进程法)

      强制撤销部分甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。撤销的原则可以按进程优先级和撤销进程代价的高低进行。

    • 进程回退法

      让一个或多个死锁进程回退到足以避免死锁的地步。进程回退时,自愿释放资源而非剥夺。这就要求系统要记录进程的历史信息,设置还原点。

    注:撤销进程法中参考的优先级,应考虑:进程优先级、已执行多长时间、还要多久能完成、进程已经使用了多少资源、进程是交互式的还是批处理式的等因素。

相关文章:

操作系统 | 学习笔记 | 王道 | 2.4死锁

2.4 死锁 文章目录 2.4 死锁2.4.1 死锁的概念2.4.2 死锁预防2.4.3 死锁避免2.4.4 死锁检测和解除 2.4.1 死锁的概念 死锁的定义 在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象&am…...

【FPGA开发】Vivado自定义封装IP核,绑定总线

支持单个文件的封装、整个工程的封装,这里用单个文件举例。 在文件工程目录下,自建一个文件夹,里面放上需要封装的verilog文件。 选择第三个,指定路径封装,找到文件所在目录 取个名,选择封装IP的路径 会…...

python的3D可视化库vedo-3 (visual模块)点对象的属性、光效、附注

文章目录 3 PointsVisual的方法3.1 对象属性3.1.1 顶点大小3.1.2 复制属性3.1.3 颜色设置3.1.4透明度设置 3.2 对象光效3.2.1 点的形状3.2.2 点的表面光效 3.3 尾随线和投影3.3.1 尾随线3.3.2 投影 3.4 给对象附加文字说明3.4.1 标注3.4.2 2D标注3.4.3 气泡说明3.4.4 旗标说明3…...

llamaindex实战-ChatEngine-ReAct Agent模式

概述 ReAct 是一种基于Agent的聊天模式,构建在数据查询引擎之上。对于每次聊天交互,代理都会进入一个 ReAct 循环: 首先决定是否使用查询引擎工具并提出适当的输入 (可选)使用查询引擎工具并观察其输出 决定是否重复…...

redis快速进门

、数据库类型认识 关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 SQL 语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行…...

从0开始linux(39)——线程(2)线程控制

欢迎来到博主的专栏:从0开始linux 博主ID:代码小豪 文章目录 线程创建线程标识符线程参数多线程竞争资源 回收线程detach 线程退出pthread_cancel 线程创建 线程创建的函数为pthread_create。该函数是包含在posix线程库当中,posix线程是C语言…...

International Journal of Medical Informatics投稿经历时间节点

20240423,完成投稿 20240612,按编辑要求修改后再投, with editor 20240613,under review,completed 0, accepted 0, invitation 2. 20240620, under review,completed 0, accepted 1, invitation 2. 20240626, unde…...

BUUCTF—Reverse—Java逆向解密(10)

程序员小张不小心弄丢了加密文件用的秘钥,已知还好小张曾经编写了一个秘钥验证算法,聪明的你能帮小张找到秘钥吗? 注意:得到的 flag 请包上 flag{} 提交 需要用专门的Java反编译软件:jd-gui 下载文件,发现是个class文…...

CLIP-MMA: Multi-Modal Adapter for Vision-Language Models

当前的问题 CLIP-Adapter仅单独调整图像和文本嵌入,忽略了不同模态之间的交互作用。此外,适应性参数容易过拟合训练数据,导致新任务泛化能力的损失。 动机 图1所示。多模态适配器说明。 通过一种基于注意力的 Adapter ,作者称之…...

三维扫描仪-3d扫描建模设备自动检测尺寸

在现代工业制造领域,三维扫描仪已成为实现高精度尺寸检测的关键设备。CASAIM自动化智能检测系统以其自动化三维立体扫描技术,为产品尺寸的自动检测提供了高效、可靠的解决方案。 CASAIM自动化智能检测系统通过非接触式测量方式,通过激光扫描…...

vue3+ant design vue实现日期选择器默认显示当前年,并限制用户只能选择当前年及之前~

1、思路:之前想拿当前年直接做赋值操作,实际上是行不通的,因为组件本身有数据格式限制,会出现报错,然后索性直接获取当前日期(YYYY-MM-DD)赋值给日期组件,这样不管你用的是年&#x…...

【electron-vite】搭建electron+vue3框架基础

一、拉取项目 electron-vite 中文文档地址: https://cn-evite.netlify.app/guide/ 官网网址:https://evite.netlify.app/ 版本 vue版本:vue3 构建工具:vite 框架类型:Electron JS语法:TypeScript &…...

05《存储器层次结构与接口》计算机组成与体系结构 系列课

目录 存储器层次结构概述 层次结构的定义 存储器的排名 存储器接口 处理器与存储器的速度匹配 存储器接口的定义 存储器访问命中率 两种接口 第1种方式:并行 命中率的计算 存储器访问时间 第2种方式:逐级 结语 大家好,欢迎回来。…...

elasticsearch报错fully-formed single-node cluster with cluster UUID

1.问题描述 k8s集群内部署的es中间件起不来,查看日志发现如下警告,节点发现功能开启,但是目前我是单节点服务,所以尝试编辑sts将节点发现功能去掉或者在部署时将你的sts的yaml文件和chart文件修改重新部署以去掉该功能 {"t…...

Milvus×Florence:一文读懂如何构建多任务视觉模型

近两年来多任务学习(Multi-task learning)正取代传统的单任务学习(single-task learning),逐渐成为人工智能领域的主流研究方向。其原因在于,多任务学习可以让我们以最少的人力投入,获得尽可能多…...

DAPP

02-DAPP 1 啥是 DApp? DApp,部署在链上的去中心化的应用。 DApp 是开放源代码,能运行在分布式网络上,通过网络中不同对等节点相互通信进行去中心化操作的应用。 DAPP 开放源代码,才能获得人的信任。如比特币&#xff…...

生产环境中,nginx 最多可以代理多少台服务器,这个应该考虑哪些参数 ?怎么计算呢

生产环境中,nginx 最多可以代理多少台服务器,这个应该考虑哪些参数 ?怎么计算呢 关键参数计算方法评估步骤总结 在生产环境中,Nginx最多可以代理的服务器数量并没有一个固定的限制,它取决于多个因素,包括Ng…...

【深度学习|目标跟踪】StrongSORT 详解(以及StrongSORT++)

StrongSort详解 1、论文及源码2、DeepSORT回顾3、StrongSORT的EMA4、StrongSORT的NSA Kalman5、StrongSORT的MC6、StrongSORT的BOT特征提取器7、StrongSORT的AFLink8、StrongSORT的GSI模块 1、论文及源码 论文地址:https://arxiv.org/pdf/2202.13514 源码地址&#…...

23种设计模式-原型(Prototype)设计模式

文章目录 一.什么是原型设计模式?二.原型模式的特点三.原型模式的结构四.原型模式的优缺点五.原型模式的 C 实现六.原型模式的 Java 实现七. 代码解析八.总结 类图: 原型设计模式类图 一.什么是原型设计模式? 原型模式(Prototype…...

Qt—QLineEdit 使用总结

文章参考:Qt—QLineEdit 使用总结 一、简述 QLineEdit是一个单行文本编辑控件。 使用者可以通过很多函数,输入和编辑单行文本,比如撤销、恢复、剪切、粘贴以及拖放等。 通过改变 QLineEdit 的 echoMode() ,可以设置其属性,比如以密码的形式输入。 文本的长度可以由 m…...

go-zero使用自定义模板实现统一格式的 body 响应

前提 go环境的配置、goctl的安装、go-zero的基本使用默认都会 需求 go-zero框架中,默认使用goctl命令生成的代码并没有统一响应格式,现在使用自定义模板实现统一响应格式: {"code": 0,"msg": "OK","d…...

BUGKU printf

整体思路 实现循环-->获取libc版本和system函数地址->将strcpy的got表项修改为system并获得shell 第一步:实现循环 从汇编语句可以看出,在每次循环结束时若0x201700处的值是否大于1则会继续循环。 encode1会将编码后的结果保存至0x2015c0处&am…...

深度学习:梯度下降法

损失函数 L:衡量单一训练样例的效果。 成本函数 J:用于衡量 w 和 b 的效果。 如何使用梯度下降法来训练或学习训练集上的参数w和b ? 成本函数J是参数w和b的函数,它被定义为平均值; 损失函数L可以衡量你的算法效果&a…...

`console.log`调试完全指南

大家好,这里是 Geek技术前线。 今天我们来探讨 Console.log() 的一些优点。并分析一些基本概念和实践,这些可以让我们的调试工作变得更加高效。 理解前端 log 与后端 log 的区别 前端 log 与后端 log 有着显著的不同,理解这一点至关重要。…...

ROS VSCode调试方法

VSCode 调试 Ros文档 1.编译参数设置 cd catkin_ws catkin_make -DCMAKE_BUILD_TYPEDebug2.vscode 调试插件安装 可在扩展中安装(Ctrl Shift X): 1.ROS 2.C/C 3.C Intelliense 4.Msg Language Support 5.Txt Syntax 3.导入已有或者新建ROS工作空间 3.1 导入工作…...

16 —— Webpack多页面打包

需求&#xff1a;把 黑马头条登陆页面-内容页面 一起引入打包使用 步骤&#xff1a; 准备源码&#xff08;html、css、js&#xff09;放入相应位置&#xff0c;并改用模块化语法导出 原始content.html代码 <!DOCTYPE html> <html lang"en"><head&…...

微服务即时通讯系统的实现(服务端)----(3)

目录 1. 消息存储子服务的实现1.1 功能设计1.2 模块划分1.3 模块功能示意图1.4 数据管理1.4.1 数据库消息管理1.4.2 ES文本消息管理 1.5 接口的实现1.5.1 消息存储子服务所用到的protobuf接口实现1.5.2 最近N条消息获取接口实现1.5.3 指定时间段消息搜索接口实现1.5.4 关键字消…...

.net6.0 mvc 传递 model 实体参数(无法对 null 引用执行运行时绑定)

说一下情况&#xff1a; 代码没问题&#xff0c;能成功从数据库里查到数据&#xff0c;能将数据丢给ViewBag.XXXX, 在View页面也能获取到 ViewBag.XXXX的值&#xff0c;但是发布到线上后报这个错&#xff1a; Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 无法对 …...

VUE 入门级教程:开启 Vue.js 编程之旅

一、Vue.js 简介 Vue.js 是一套构建用户界面的渐进式 JavaScript 框架。它专注于视图层的开发&#xff0c;能够轻松地与其他库或现有项目进行整合。Vue.js 的核心库只关注视图层&#xff0c;通过简洁的 API 实现数据绑定和 DOM 操作的响应式更新&#xff0c;让开发者可以高效地…...

Ubantu系统docker运行成功拉取失败【成功解决】

解决docker运行成功拉取失败 失败报错 skysky-Legion-Y7000-IRX9:~$ docker run hello-world docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head “http://%2Fvar%2Frun%2Fdocker.sock/_ping”: dial uni…...

杭州市做外贸网站的公司/微信营销模式有哪些

本文整理自2017云栖大会-成都峰会上阿里云高级技术专家许玲的分享讲义。讲义主要分享了阿里云在智能客服方面给出的解决方案&#xff0c;并分享了其智能服务机器人“云博士”及其工作思路&#xff0c;并分享了关于阿里云旗下的智能对话分析服务的内容。...

外贸网站 域名后缀/福州百度关键词排名

json的定义&#xff1a; JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 JSON 是 JS 对象的字符串表示法&#xff0c;它使用文本表示一个 JS 对象的信息&#xff0c;本质是一个字符串。 1.require-运行时加载 test.json文件 {"testData": "…...

邯郸做网站推广费用/怎么联系百度人工服务

Android(3)点击事件的处理和应用 1.在学习点击事件之前呢.我们学习安卓控件中的Textview,Button,redioButton,checkBox,等相关控件是使用,在安卓中呢,TextView是许多的App开发的必备控件,无论是大的项目还是小的项目都会有TextView的出现.接下来我们就从它开始讲起,来简单介绍这…...

爱网度假/网站排名优化软件

旧的时间字符串-->simpledataformat1.parse(该字符串) 获得date类型 -->simpledataformat2.format(date) simpledateformat1的pattern的格式和旧的字符串相同&#xff0c;simpledateformat2的pattern格式和希望的相同。 比如 旧的字符串格式为 yyyy-MM-dd&#xff0c;希望…...

wordpress的文章如何备份/好用的搜索引擎

2019独角兽企业重金招聘Python工程师标准>>> 1 进入php源代码目录中的mbstring所在目录cd /usr/local/src/php-5.2.4/ext/mbstring/2 执行php安装后目录中的bin/phpize文件/usr/local/php/bin/phpize3 进入php源代码目录cd /usr/local/src/php-5.2.4/4 执行上述目录…...

厦门网站关键词优化/保定seo推广公司

什么是spring Spring是java企业级应用的开源开发框架。Spring主要用来开发java应用&#xff0c;但是有些扩展是针对于J2EE平台的web应用。其目的是为了简化java企业级应用开发。 使用Spring框架的好处是什么 轻量&#xff1a;基本的版本大约为2MB控制反转Ioc&#xff1a;spr…...