精华内容
下载资源
问答
  • 准确 及时 完整 规范性 对于客户信息我们有哪些保密义务? 合作项目结束时,应根据客户的具体要求返还全部或部分含有“技术信息”、“商业秘密”的书面、电子资料 客户的相关帐号密码要及时归还客户并让其...

    写在前面

    我在网上搜题目时,发现很多人把错的答案都发上去了,并且没有标注出来。
    不知是不是答案有变化还是在坑人。我的答案如果有错,还请在评论区说一声。

    我的错题也在这里面,每种题目的格式都不一样。若你把错题答案当作正确的填进去了,我也没什么办法了。

    判断题

    (T代表正确,F代表错误)
    F 中小项目管理流程要求合同信息发布后10个自然日内在ISDP系统中完成“预计开工时间”及“预计验收时间”。
    T 重点网络客户,客户问题未彻底解决,但客户明确认为不必再处理的问题,联系重点网络的维护接口人确认后闭环。
    T 企业服务的全新定位是:构建高品质服务产业联盟,提供无处不在的一致性服务体验。
    T 在客户还没有说完前,不要将他的内容定性,不要让自己陷入争论。
    F ASP工程师小A还没有获得华为资格认证,某天收到客户的电话要求到现场处理紧急故障,由于联系不上自己的导师老B,为了赶时间,独自到现场帮助客户处理故障。
    F ASP工程师只可通过电话的方式获得高危操作管理授权。
    T 因ASP提供的勘测报告不准确而导致的勘测差错货或华为通过质量检查发现并确认为物料浪费时,即被视为勘测质量违约,所造成损失或浪费的质量违约金由ASP支付。
    F 周日,小A正和女朋友在逛街;一关系相当好的客户工程师小B打电话给他,请求协助解决一网络问题。街上比较吵闹,沟通半小时都没解决问题;于是,小A将华为研发小C(小A大学同学)的手机号码告诉小B,让小B找小C帮忙解决。
    T 供应商应确保其参与到华为项目的员工签署网络安全承诺函,其内容至少包括供应商提供的《网络安全承诺函》的要求,供应商应就己方员工违反《网络安全承诺函》的行为向华为承担违约责任。客户及华为有权要求分包方提交其与员工签署的网络安全承诺函。
    F 供应商应主动预防网络安全事故、事件及危机的发生,并根据需要开展网络安全稽查和改善活动。
    F 不需要经客户确认,现场工程师可以自行决定关闭/挂起问题单/修改问题单级别。
    F 验收流程中工程验收日期录入后5个工作日内上载支撑工程合作验收的PAC。
    F 维护工作完成后,现场工程师只需在《现场服务报告》中记录下好件条码即可。
    F ASP资源申请技能认证时原则上工作经验要求为初级1年,中级2年,高级3年,资深4年。
    T iEngineer在完工日期录入前,需先点击“工程局点信息列表”中的“拆分订单”,录入设备安装的“实际安装地点”。
    F 对于不同变更实施方案或不属于同一产品族的变更不需要分别创建不同的变更单。
    F 工程师小B在接到客户故障申报后赶到客户现场,发现问题无法解决,于是及时将情况反馈至技术支持响应工程师小C,小B就和小C协商由小C远程解决此问题,后小B离开客户现场。
    T 硬盘安装前要戴好 ESD 防静电手腕,并且工作在 ESD 防静电工作区,防静电手腕必须紧挨皮肤而不能戴在衣物外。
    F 当知道客户说些什么时,可及时打断对方的说话,发表自己意见,让问题更快解决。
    T ASP中小项目成熟度考核包括维护及时率和验收准确率两个指标。
    T iEngineer中上载初验证书的命名规则为:合同号+初验的客户签署日期。
    T ASP应该在合同信息发布后以及项目正式施工前体外例行跟踪PRPO委托下发情况、设备发货/到货情况。
    F 每个项目交付完毕后都要对客户进行详细系统性的培训才能收尾。
    T 变更方案中必须包含回退方案和回退决策人。
    T 自检质量问题及华为质量抽检中发现的质量问题,需在期望解决时间或要求关闭时间点前关闭。
    T 项目实施完成后,现场工程师应对客户工程师进行4小时内的简单培训。
    T 重点网络客户,客户问题未彻底解决,但客户明确认为不必再处理的问题,联系重点网络的维护接口人确认后闭环。
    T 对于设备健康检查中发现的问题需纳入遗留问题跟踪表,如工程师无法自行解决的需建ecare问题单跟踪。
    F 不需要经客户确认,现场工程师可以自行决定关闭/挂起问题单/修改问题单级别。
    F 合作管理服务文档V2.4要求:客户支持类的单次服务PO的验收,再发起验收申请时,需在验收电子流中上载《现场技术服务报告》。
    F ASP资源认证参加网络安全上岗证考试的通过分数为70分。
    T 接收客户物料时需履行数据删除告知义务,提醒客户清除数据、确认删除部件中存储的客户数据。向华为返回产品或部件时,伙伴应提前清除其中存储的客户数据,包括最终用户数据。
    T 项目实施完成后,需要提醒用户修改项目中使用过的用户/密码。
    F 中国企业服务新定位是“Huawei Inside”, 通过“无处不在的联接+数字平台+无所不及的智能”, 致力于打造数字中国的底座、成为数字世界的内核。
    F 在客户现场绝对禁止用客户的网络上网聊天打游戏,除非用自己携带的移动无线网卡,同时注意不要影响客户工作。
    T FSE需在约定时间点之前到达客户现场,如果因故无法准时到达,需第一时间知会客户,告知迟到原因,取得客户谅解。
    T 在培训服务中,若需要引用客户的信息,需要先进行去敏感化处理,或者获得客户的书面授权。
    T 一个变更单可以涉及一个或多个属于同一产品族的产品。
    F ASP中小项目成熟度考核指标 = 维护及时率* 70% + 验收准确率 * 30%。
    F 小L到客户现场交付安装服务。客户将大概网络规划告知小L后边说有事,不便与小L一起去机房调试设备。小L经过客户口头同意后便进入机房独自调试设备。请问小L的做法是否正确?
    T ASP工程师拒绝客户无礼要求后,被客户投诉,ASP可通过《XX项目回溯报告》澄清事实,经华为查实后,将视该投诉为无效投诉。
    F ASP资源首次申请技能认证需要通过服务规范性考试即可。
    F 团队成员一起在客户场所工作,为了不打扰客户,在保证不泄露账号和密码的前提下,大家可以共享账户。
    F 不需要经客户确认,现场工程师可以自行决定关闭/挂起问题单/修改问题单级别。
    F 中小合同管理中计划维护及时率 = 预计开工时间均不为空合同数 / 合同总数。

    F ASP中小合同管理过程中,必须等待PO下发后才能入场,不须主动监管工程委托状态。
    T 现场服务结束后,应清理本次服务过程中所有增加的跟客户相关的临时性工作内容(如删除过程数据,取消登录账号等),如果由于后续工作需要,某些临时性内容需要保留,必须获得客户的书面批准。
    F ASP资源申请高级和资深认证时需要提交的材料是《附件3:ASP技能资格申请登记表》和《附件7:企业业务ASP工程师技能信息收集及资格评估表》。
    T 华为服务人员有义务保守华为的商业秘密与技术秘密,遵守华为信息安全的各项规定,遵守保密规定,维护华为的知识产权。
    T 工程师需要定期进行电脑/终端进行病毒查杀,当发现或怀疑电脑/存储介质感染病毒时,禁止接入客户网络。
    T 重大变更的“三审批”是指:管理审批、技术审批和客户审批。
    F 服务完工证明必须与最终用户签署,不能与代理商进行签署。
    T ASP应对所有合作工程实行100%的质量自检。

    正确单选题

    事故等级从高到低?
    =>分为一级事故、二级事故、三级事故

    外部项目开工会是在即将开始正式实施前,与()在涉及项目运作计划,沟通机制,项目交付流程等重要问题达成一致。
    =>客户交付管理团队

    以下哪种行为不应成为争取客户的方式?
    =>友商的劣势

    以下对于电源、接地,描述正确的是?
    =>公司发货防雷箱与设备连接的电源线不宜剪除,允许盘绕

    以下关于授权服务中心工程师与客户交流时言语规范的描述,不正确的是?
    =>与不懂技术的客户交谈时,善于把握谈话主动权

    开箱后发现缺货、错货(或到货即损或license)等问题,需填写《货物问题反馈单》提交给?
    =>400热线工程师

    小C到某国企现场维护服务完成后,发现用户日常维护操作很不规范,存在影响设备稳定运行的因素。小C最好怎么做?
    =>给用户提出维护改进建议,作为《现场技术服务报告》或《变更实施总结报告》的附件提交给客户

    以下关于主动维护说法错误的是?
    =>FSE需要在确认设备健康检查日期前一天联系客户确认具体时间,并将沟通结果及时记录到eCare系统中

    维护工程师利用同事电脑中客户网络的登录账户密码,远程接入客户网络解决问题,据调查发现,该登录账号是客户半年前授予该维护人员的,有效期10天。下列说法错误的是?
    =>属于客户网络的访问控制存在的管理漏洞,是客户的责任,和工程师无关

    自检报告模板、质量标准可以在哪里下载?
    =>SUPPORT网站

    在服务交付过程中,针对第三方设备,下列说法不正确的是?
    =>第三方安全软件在使用时如有必要进行修改,可以进行修改以满足业务需求

    以下哪项不属于备件借用的条件?
    =>项目测试

    一线工程师到达客户现场,发现现场的产品配置满足不了客户需求,此时一线工程师首先应该如何处理?
    =>立即与代表处服务合作经理联系,反馈情况,商量解决方法

    在实际工作中树立良好的服务意识不包含哪项?
    =>故障处理过程无需知会客户

    ASP绩效考核中中小项目管理成熟度属于哪个大项?
    =>交付

    以下哪个选项不是计划与控制的基本原则?
    =>每天更新项目支撑计划

    三级重大事故华为处罚金额为?
    =>1-2万元

    中小项目管理流程要求合同信息发布后几个自然日内在ISDP系统中完成“预计开工时间”及“预计验收时间”?
    =>30

    以下关于FSE角色工作内容说法错误的是?
    =>FSE在收到FSIP派发的工单后,对于小时级别的服务,需在10分钟之内点单并联系客户

    华为客户满意度达标分数为?
    =>80分

    工程师小H到用户机房处理故障,以下哪项行为是错误的?
    =>应客户要求为了开通业务操作其它厂家设备

    小B在进行维护完毕以后,观察了两天,运行一切正常,然后征得客户同意后,离开现场。数月以后,客户反馈设备配置被修改,怀疑是我司小B所为,请问小B在项目收尾时,缺少了哪个流程未执行?
    =>通知客户更新设备密码

    现场工程师在重大故障处理操作过程中如对故障处理方案或操作步骤有疑问,需要?
    =>求助服务合作接口人,由服务合作接口人与专家团队再次确认

    关于变更文档交付以下说法错误的是?
    =>对于网络变更,可以不将改造后的工程文档提交给客户

    回访时客户表示:“我来电咨询A产品的问题,工程师处理中判断是B产品导致,于是让我找B产品工程师处理。我不明白为什么A不能直接让相关人员跟我联系处理呢?
    后来我联系了B产品的工程师,B判断还要从A上分析。我再找A时,A仍不承认是本产品的问题。最后我们自己处理好了,显示的结果确实是A上的问题,A工程师才承认。
    如果A工程师第一次判断准确一点,处理问题主动一点,就不用浪费我这么多时间了!”
    上述案例中,A工程师的服务意识方面是需要改进方面说法错误的是?
    =>理清楚自己的职责范围,不是自己处理的问题,决不理会

    关于变更以下说法错误的是?
    =>升级/割接成功需要进行充分的业务验证,如果升级/割接回退了,则不需要

    以下哪项不是变更责任人的职责?
    =>负责对高风险级别变更的评审

    硬件安装检查时,以下描述哪个是正确的?
    =>违反B、C类条款,本次工程无法整改可以不整改

    差错货申报时间为签署POD后多少天内?
    =>30

    小Z到客户现场进行安装服务,客户要求只安装一部分设备,后续完成剩余部分,小Z应该如何处理安装报告?
    =>先将已完成的报告寄回,后续交付完毕后将剩余部分再请客户签一份报告

    某局点连续发生同一问题,并且多次通报事故,华为研发已经在分析此问题,某日又发生同一问题,以下做法正确的是?
    =>立即拨打400电话,同时告知热线工程师此局点同类事故频发,客户满意度有下降的可能

    以下关于FSE现场服务规范说法错误的是?
    =>FSE需在约定时间点之前到达客户现场,如果因故无法准时到达,需抵达现场后知会客户,告知迟到原因,取得客户谅解

    在客户机房施工错误做法是?
    =>工作到凌晨2:00后可以在机房过夜休息

    下列关于设备加电流程的描述,正确的是?
    =>供电设备加电-配电设备加电-受电设备加电

    现场服务接口人接到调度派发的工单后,对于ND/NBD级别服务,18点之前生成的任务,服务接口人需要在多长时间内点单确认(含驳回)并完成派发?
    =>30分钟

    关于了解客户的期望值以下说法错误的是?
    =>在设定期望值是根据现有可提供的服务来设定即可

    错误单选题

    (我选错了的题目 )
    中小项目管理流程要求合同信息发布后几个自然日内在ISDP系统中完成“预计开工时间”及“预计验收时间”?
    X=> 15

    工程师申请备件后,超过多少天未归还即为超期挂账?
    X=>15

    维保外包PO在SCS中提交验收需上传的扫描件文档为?
    X=>现场技术服务报告

    小Z到客户现场进行安装服务,客户要求只安装一部分设备,后续完成剩余部分,小Z应该如何处理安装报告?
    X=>让客户不要签报告,后面一起签

    高危操作三授权不包含哪项授权?
    X=>技术授权

    硬件安装检查时,以下描述哪个是正确的?
    X=>违反A类条款,本次工程无法整改可以不整改

    现场服务接口人接到调度派发的工单后,对于ND/NBD级别服务,18点之后生成的任务,服务接口人需要在多长时间内点单确认(含驳回)并完成派发?
    X=>下一个自然日/工作日18点之前

    某天,一局点发生故障,现场技术支持过程中,服务工程师在操作用户设备前,需要先填写以下哪个文档,得到用户签字许可后才能实施?
    X=>设备操作申请

    正确多选题

    以下哪几种场景可以以《产品安装报告》代替《初验证书》上载到EPMS?
    奇虎客户工程安装
    百度客户工程安装
    阿里巴巴客户工程安装
    腾讯客户工程安装

    ASP在中小合同交付管理中有哪些关键动作?
    ASP工程进度主动管理
    ASP工程委托下发状态主动监管
    ASP主动计划管理
    ASP计划与实际进度偏差管理

    工程施工行为规范包括?
    开箱验货要求工程督导和客户双方人员均在场,验货报告由双方签字确认
    工程施工完成后,工程施工工具应放回工具箱,工具箱应放在安全的地方保存
    未经客户许可,严禁进入施工区域以外的机房和使用、移动客户设备、线缆等
    现场施工过程中应严格执行各产品的工程技术规范,重视工程质量
    上电调测期间应严格按防静电操作规程操作,防止因人为因素造成电路板与其它设备的损坏
    工程施工过程中要保持机房整洁、卫生

    华为文档质量考核要求包含以下几个维度?
    准确性
    及时性
    完整性
    规范性

    对于客户信息我们有哪些保密义务?
    合作项目结束时,应根据客户的具体要求返还全部或部分含有“技术信息”、“商业秘密”的书面、电子资料
    客户的相关帐号密码要及时归还客户并让其修改
    不得以任何方式向任何第三方泄露、出售、出租、转让、许可使用或共享客户的技术信息、经营信息

    去客户现场前需要做哪些事情?
    做到仪容仪表整洁大方,并准备好安捷信提供的服务名片
    与客户确认安装/维护环境是否具备,产品及其配件是否齐备
    做好相关准备,包括服务方案、操作步骤、工具、备件
    客户确认上门安装/维护时间,预约时间时向客户说明有半个小时误差

    在与客户交往时应注意哪些商业规则?
    不泄漏安捷信未经授权的技术机密,不泄漏其它客户的商业秘密和技术机密
    不私下接受客户进行合同交付范围外的服务委托
    不得私刻或使用非法安捷信或客户公章,不仿冒安捷信或客户相关业务授权人员签字
    经公司授权进行的义务服务也应按照正式工作对待

    资料移交内容主要包括?
    设备信息
    过程文档
    账号密码信息

    以下针对华为服务伙伴流程规范描述正确的有?
    通用服务流程规范可概括总结为三阶九步
    移交收尾阶段要做好现场培训、资料移次及服务报告获取
    服务准备阶段要做好计划沟通、方案确认及授权获取
    现场服务阶段要做好现场报到、方案实施及质量检查

    以下对于机房环境要求描述正确的是?
    ODF宜接保护地,光缆内用于增加强度的金属线宜接保护地
    PDF(分线盒)、一次电源输出限流保险应满足设备运行要求
    配线设备应可靠接地,用户外线电缆屏蔽层须正确接地

    验货发现货损需向华为提供哪些信息?
    物料编码、数量、设备序列号Barcode
    受损部位清晰照片、内外包装六个面清晰照片
    装箱单号和货损/丢货箱号
    POD(必须备注货损、丢失)、倾斜/振动标签等

    项目交付质量管理—6步1法的步骤包括?
    示范站建设、质量自检&抽检
    确定项目质量标准、工前培训与技能审核
    客户满意度管理
    质量问题管理、项目质量总结

    以下哪些属于现场服务工程师的职责?
    提交工单关闭申请
    根据设备变更情况,刷新设备档案
    参照《现场服务操作指导书》,配合TAC中心工程师完成现场服务实施,如有备件,须完成备件接收和更换
    完成《现场服务报告》的签收和返回,如有备件,须完成坏件的返还

    关于以下场景中,哪些说法是正确的?某维护工程师现场升级设备时,没有准备好升级工具,工具受控,在客户变更现场申请工具,耗费了大量时间,导致变更时间超出预期,影响客户业务。
    维护人员在变更前未做好工具、软件等准备工作
    变更操作必须预留足够的回退时间
    变更操作超出变更计划时间属于变更失败范畴

    ASP资源首次申请高级认证时需要提交的材料包括?
    认证答辩PPT
    服务规范考试通过截图
    安全上岗证考试通过截图
    《附件7:企业业务ASP工程师技能信息收集及资格评估表》
    《附件3:ASP技能资格申请登记表》

    Hi-Care高级维保方案现场服务响应时间有哪几种?
    7×24×4
    5×10×NBD
    7×24×2
    7×24×ND

    面对命令型客户,沟通时需要采用哪些方式?
    对于疑问点先稳住客户,确认清楚再答复(或升级)
    要有自信,善用内部资源
    面对没在交流心态的客户避免正面冲突或者强硬顶回
    不要随意承诺、应允或草率答复

    对于客户信息我们有哪些保密义务?
    不得以任何方式向任何第三方泄露、出售、出租、转让、许可使用或共享客户的技术信息、经营信息
    客户的相关帐号密码要及时归还客户并让其修改
    合作项目结束时,应根据客户的具体要求返还全部或部分含有“技术信息”、“商业秘密”的书面、电子资料

    去客户现场前需要做哪些事情?
    客户确认上门安装/维护时间,预约时间时向客户说明有半个小时误差
    做好相关准备,包括服务方案、操作步骤、工具、备件
    与客户确认安装/维护环境是否具备,产品及其配件是否齐备
    做到仪容仪表整洁大方,并准备好安捷信提供的服务名片

    ASP主要录入EPMS系统信息有以下哪几项?
    工程计划进度日期
    上载工程文档
    上载工程自检报告
    施工人员信息、客户信息
    工程实际安装地点、实际进度日期

    现场服务过程中,以下哪些行为是错误的?
    安装完成后客户不在,打电话给客户通知后,在客户同意下代客户在安装报告上签字
    客户要求提供本次PO以外的服务,如果能私下出费用给我,可以提供
    客户人员在机房玩游戏,为了拉近关系,帮他打通关
    现场维护服务准备需要做哪些工作?
    定制服务方案
    资源准备和申请
    查询技术文件
    向客户申请现场维护服务

    以下哪些内容属于客户的保密信息?
    客户业务运作体系、组织结构,以及业务关系及工作职责
    客户技术档案与资料、工作记录、设备维护技术指标
    客户管理制度、业务流程、工作规划(计划)、作业计划

    工程方案确认都包含哪些?
    对于高危操作,需提前与客户确认信息:操作时间,窗口时间,业务中断时间,操作风险,回退方案等
    与客户明确实施环境需求及客户配合事宜,如收货场地、运输通道、机房空间、配套电力等
    与客户就设计方案、实施方案、质量标准达成一致

    和急躁型客户沟通时需要采用哪些方式?
    使客户感受到情绪上的满足后以推动问题处理即先处理情感再处理问题
    给予客户情绪上的安抚与认同
    注意提出解决方案的侧重步骤,从简单、影响小的操作做起
    多用封闭式提问

    物流取货时需注意以下哪些内容?
    若确认单上信息不完整,请及时知会到备件平台,按照平台指示进行发运
    若物流商无信息确认单,不能将物料交给物流商带走
    如果物流商取件无确认单就让其带走备件,引起后续备件挂帐超期或无法核销由工程师负责
    物流商上门取件时,一定要核对《物流商上门取货信息确认单》上信息是否与系统中填写归还信息一致,严格按照确认单上信息进行发运物料

    和低技术水平型客户沟通时采用正确的方式包含哪些项?
    首要因素是耐心,放下专家心态,引导客户,了解其真正需求
    语气保持缓和,急躁、大声叫嚷或者讥讽的口气只会导致问题处理恶化
    务必对客户是否了解掌握你所述的技术操作内容进行确认

    错误多选题

    (自用排雷)
    以下哪些内容属于客户的保密信息?(AC)
    A. 客户业务运作体系、组织结构,以及业务关系及工作职责
    B. 客户管理制度、业务流程、工作规划(计划)、作业计划
    C. 客户技术档案与资料、工作记录、设备维护技术指标
    D. 客户公共网站信息、客户业务宣传资料

    物流取货时需注意以下哪些内容?(ABC)
    A. 若确认单上信息不完整,请及时知会到备件平台,按照平台指示进行发运
    B. 物流商上门取件时,一定要核对《物流商上门取货信息确认单》上信息是否与系统中填写归还信息一致,严格按照确认单上信息进行发运物料
    C. 如果物流商取件无确认单就让其带走备件,引起后续备件挂帐超期或无法核销由工程师负责
    D. 若物流商无信息确认单,不能将物料交给物流商带走

    安全生产风险控制包含哪些方面?(BCD CD)
    A. 客户满意度风险控制
    B. 通信安全风险控制
    C. 人身安全风险控制
    D. 财产安全风险控制

    以下对于安装服务文档返回描述正确的是?(ABCD ABC)
    A. 华为直销情况下,如无特殊约定,需要客户签字的产品安装报告
    B. 华为直销情况下,如无特殊约定,需要客户签字盖章的初验证书
    C. 经销商转售情况下安装服务需要客户签字的产品安装报告,以此为证到转售经销商处获得盖章的初验证书,返回华为
    D. 需要返回《产品安装检查表》

    现场维护服务收尾工作有哪些?(ABC)
    A. 密码更新
    B. 设备健康检查
    C. 维护文档更新
    D. 业务运行观察

    DOA受理条件包含如下哪些情况?(BCD)
    A. 必须提供原外包装箱和包装材料
    B. 产品必须外观完好,必须无物理损伤,主机上所有封条未启封
    C. 所有华为设备用户均可直接向华为申请DOA
    D. 申请时必须提供货物问题申请表和货物问题设备照片

    现场服务过程中,以下哪些行为是错误的?(ABCD)
    A. 由于项目需要,征得客户同意后,在机房搭简易床过夜
    B. 安装完成后客户不在,打电话给客户通知后,在客户同意下代客户在安装报告上签字
    C. 客户人员在机房玩游戏,为了拉近关系,帮他打通关
    D. 客户要求提供本次PO以外的服务,如果能私下出费用给我,可以提供

    以下关于现场服务流程规范说法正确的是?(ABCD)
    A. 由于备件原因导致抵达现场时间晚,不计入FSE问题
    B. 由于FSE未及时确认备件信息导致备件晚到不计入FSE问题
    C. 非客户原因不允许将“客户预约时间”修改到合同规定的SLA时间之后
    D. FSE需在合同SLA要求到达时间之前到达客户现场

    工程方案确认都包含哪些?(ABCD)
    A. 对于高危操作,需提前与客户确认信息:操作时间,窗口时间,业务中断时间,操作风险,回退方案等
    B. 与客户明确实施环境需求及客户配合事宜,如收货场地、运输通道、机房空间、配套电力等
    C. 与客户就设计方案、实施方案、质量标准达成一致
    D. 与客户确认机房门密码,方便进入

    现场维护服务收尾工作有哪些?(AB)
    A. 设备健康检查
    B. 密码更新
    C. 维护文档更新
    D. 业务运行观察

    和消极推脱型客户沟通时需要采用哪些方式?(ABCD)
    A. 沟通中避免随意承诺或者强制要求的方式
    B. 保持服务水准,不受客户情绪左右
    C. 了解客户问题推脱的原因,对症下药
    D. 按照客户的意思来处理,不要抵制的意见

    和急躁型客户沟通时需要采用哪些方式?(ABD)
    A. 使客户感受到情绪上的满足后以推动问题处理即先处理情感再处理问题
    B. 给予客户情绪上的安抚与认同
    C. 注意提出解决方案的侧重步骤,从简单、影响小的操作做起
    D. 多用封闭式提问

    中小合同主动计划管理中ASP项目经理或交付负责人需要重点关注哪些工作?(ABCD)
    A. 接收合同信息,指派负责人
    B. 交付文档管理
    C. 计划确认与维护
    D. 工程委托与设备到货监控

    客户保密信息范围包括?(ABC)
    A. 客户业务运作体系、组织结构,以及业务关系及工作职责
    B. 客户管理制度、业务流程
    C. 客户工作规划(计划)、作业计划
    D. 技术档案与资料、工作记录

    工程完工后,在EPMS中涉及可能提交的自检报告有哪几种?(ABCD AC)
    A. 软件自检报告
    B. 遵从性检查报告
    C. 硬件自检报告
    D. 规范性检查报告

    服务一致性提到的三价九步中的三阶是指?(BCD)
    A. 移交收尾
    B. 服务实施
    C. 服务收尾
    D. 服务准备

    对待客户的要求要谨慎,指的是?(BCD)
    A. 最好的做法是明确企业的服务内容,清楚地向客户表明他的这些要求是额外的,然后在自己能力范围内帮助客户解决问题
    B. 如果总是义务地承担额外的服务,那么客户就会习惯性地接受这一点,认为这本来就是自己应得的一旦有一次未能完成,等待的将是客户的不满
    C. 在客户提出额外的要求时,维护人员要谨慎,但这并不意味着“事不关已,高高挂起”这样做换来的同样是客户的不满意
    D. 对于无法做到的事,可以推荐资源给客户,可以努力同客户一起筹划来解决问题

    如何关闭现场维护服务?(ABCD)
    A. 《现场技术服务报告》以及相关附件文档归档保存
    B. 及时归还工具和备件
    C. 签订《现场技术服务报告》
    D. 得到客户许可后即可离开现场

    服务业务质量违约通用处罚细则中违规操作包含以下几项?(ACDE)
    A. 未经客户许可进行设备操作
    B. 在行业默认时间外进行高危操作
    C. 无方案或方案未经审核进行高危操作
    D. 事故隐瞒或事故通报不及时
    E. 私自更换和调动施工人员

    展开全文
  • 数据库命令规范

    2021-04-26 17:12:14
    数据库命令规范 •所有数据库对象名称必须使用小写字母并用下划线分割 •所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) •数据库对象的命名要能做到见名识意...

    数据库命令规范

    •所有数据库对象名称必须使用小写字母并用下划线分割
    •所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)
    •数据库对象的命名要能做到见名识意,并且最后不要超过 32 个字符
    •临时库表必须以 tmp_为前缀并以日期为后缀,备份表必须以 bak_为前缀并以日期 (时间戳) 为后缀
    •所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低)

    数据库基本设计规范

    1. 所有表必须使用 Innodb 存储引擎
    没有特殊要求(即 Innodb 无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用 Innodb 存储引擎(MySQL5.5 之前默认使用 Myisam,5.6 以后默认的为 Innodb)。

    Innodb 支持事务,支持行级锁,更好的恢复性,高并发下性能更好。

    2. 数据库和表的字符集统一使用 UTF8
    兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效,如果数据库中有存储 emoji 表情的需要,字符集需要采用 utf8mb4 字符集。

    3. 所有表和字段都需要添加注释
    使用 comment 从句添加表和列的备注,从一开始就进行数据字典的维护

    4.尽量控制单表数据量的大小,建议控制在 500 万以内。
    500 万并不是 MySQL 数据库的限制,过大会造成修改表结构,备份,恢复都会有很大的问题。

    可以用历史数据归档(应用于日志数据),分库分表(应用于业务数据)等手段来控制数据量大小

    5.谨慎使用 MySQL 分区表
    分区表在物理上表现为多个文件,在逻辑上表现为一个表;

    谨慎选择分区键,跨分区查询效率可能更低;

    建议采用物理分表的方式管理大数据。

    6.尽量做到冷热数据分离,减小表的宽度
    MySQL 限制每个表最多存储 4096 列,并且每一行数据的大小不能超过 65535 字节。

    减少磁盘 IO,保证热数据的内存缓存命中率(表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的 IO);

    更有效的利用缓存,避免读入无用的冷数据;

    经常一起使用的列放到一个表中(避免更多的关联操作)。

    7.禁止在表中建立预留字段
    预留字段的命名很难做到见名识义。

    预留字段无法确认存储的数据类型,所以无法选择合适的类型。

    对预留字段类型的修改,会对表进行锁定。

    8.禁止在数据库中存储图片,文件等大的二进制数据
    通常文件很大,会短时间内造成数据量快速增长,数据库进行数据库读取时,通常会进行大量的随机 IO 操作,文件很大时,IO 操作很耗时。

    通常存储于文件服务器,数据库只存储文件地址信息

    9.禁止在线上做数据库压力测试
    10.禁止从开发环境,测试环境直接连接生成环境数据库

    数据库字段设计规范

    1.优先选择符合存储需要的最小的数据类型
    原因:
    列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的 IO 次数也就越多,索引的性能也就越差。

    方法:
    a.将字符串转换成数字类型存储,如:将 IP 地址转换成整形数据

    MySQL 提供了两个方法来处理 ip 地址

    •inet_aton 把 ip 转为无符号整型 (4-8 位)
    •inet_ntoa 把整型的 ip 转为地址

    插入数据前,先用 inet_aton 把 ip 地址转为整型,可以节省空间,显示数据时,使用 inet_ntoa 把整型的 ip 地址转为地址显示即可。

    b.对于非负型的数据 (如自增 ID,整型 IP) 来说,要优先使用无符号整型来存储
    原因:
    无符号相对于有符号可以多出一倍的存储空间

    SIGNED INT -2147483648~2147483647
    UNSIGNED INT 0~4294967295
    

    VARCHAR(N) 中的 N 代表的是字符数,而不是字节数,使用 UTF8 存储 255 个汉字 Varchar(255)=765 个字节。过大的长度会消耗更多的内存。

    2.避免使用 TEXT,BLOB 数据类型,最常见的 TEXT 类型可以存储 64k 的数据
    a. 建议把 BLOB 或是 TEXT 列分离到单独的扩展表中

    MySQL 内存临时表不支持 TEXT、BLOB 这样的大数据类型,如果查询中包含这样的数据,在排序等操作时,就不能使用内存临时表,必须使用磁盘临时表进行。而且对于这种数据,MySQL 还是要进行二次查询,会使 sql 性能变得很差,但是不是说一定不能使用这样的数据类型。

    如果一定要使用,建议把 BLOB 或是 TEXT 列分离到单独的扩展表中,查询时一定不要使用 select * 而只需要取出必要的列,不需要 TEXT 列的数据时不要对该列进行查询。

    b、TEXT 或 BLOB 类型只能使用前缀索引

    因为MySQL[1] 对索引字段长度是有限制的,所以 TEXT 类型只能使用前缀索引,并且 TEXT 列上是不能有默认值的

    3.避免使用 ENUM 类型
    修改 ENUM 值需要使用 ALTER 语句

    ENUM 类型的 ORDER BY 操作效率低,需要额外操作

    禁止使用数值作为 ENUM 的枚举值

    4.尽可能把所有列定义为 NOT NULL
    原因:

    索引 NULL 列需要额外的空间来保存,所以要占用更多的空间

    进行比较和计算时要对 NULL 值做特别的处理

    5.使用 TIMESTAMP(4 个字节) 或 DATETIME 类型 (8 个字节) 存储时间
    TIMESTAMP 存储的时间范围 1970-01-01 00:00:01 ~ 2038-01-19-03:14:07

    TIMESTAMP 占用 4 字节和 INT 相同,但比 INT 可读性高

    超出 TIMESTAMP 取值范围的使用 DATETIME 类型存储

    经常会有人用字符串存储日期型的数据(不正确的做法)

    •缺点 1:无法用日期函数进行计算和比较
    •缺点 2:用字符串存储日期要占用更多的空间

    6.同财务相关的金额类数据必须使用 decimal 类型
    •非精准浮点:float,double
    •精准浮点:decimal

    Decimal 类型为精准浮点数,在计算时不会丢失精度

    占用空间由定义的宽度决定,每 4 个字节可以存储 9 位数字,并且小数点要占用一个字节

    可用于存储比 bigint 更大的整型数据

    索引设计规范

    1.限制每张表上的索引数量,建议单张表索引不超过 5 个
    索引并不是越多越好!索引可以提高效率同样可以降低效率。

    索引可以增加查询效率,但同样也会降低插入和更新的效率,甚至有些情况下会降低查询效率。

    因为 MySQL 优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,就会增加 MySQL 优化器生成执行计划的时间,同样会降低查询性能。

    2.禁止给表中的每一列都建立单独的索引
    5.6 版本之前,一个 sql 只能使用到一个表中的一个索引,5.6 以后,虽然有了合并索引的优化方式,但是还是远远没有使用一个联合索引的查询方式好。

    3.每个 Innodb 表必须有个主键
    Innodb 是一种索引组织表:数据的存储的逻辑顺序和索引的顺序是相同的。每个表都可以有多个索引,但是表的存储顺序只能有一种。

    Innodb 是按照主键索引的顺序来组织表的

    •不要使用更新频繁的列作为主键,不适用多列主键(相当于联合索引)
    •不要使用 UUID,MD5,HASH,字符串列作为主键(无法保证数据的顺序增长)
    •主键建议使用自增 ID 值

    4.常见索引列建议
    •出现在 SELECT、UPDATE、DELETE 语句的 WHERE 从句中的列
    •包含在 ORDER BY、GROUP BY、DISTINCT 中的字段
    •并不要将符合 1 和 2 中的字段的列都建立一个索引, 通常将 1、2 中的字段建立联合索引效果更好
    •多表 join 的关联列

    5.如何选择索引列的顺序
    建立索引的目的是:希望通过索引进行数据查找,减少随机 IO,增加查询性能 ,索引能过滤出越少的数据,则从磁盘中读入的数据也就越少。

    •区分度最高的放在联合索引的最左侧(区分度=列中不同值的数量/列的总行数)
    •尽量把字段长度小的列放在联合索引的最左侧(因为字段长度越小,一页能存储的数据量越大,IO 性能也就越好)
    •使用最频繁的列放到联合索引的左侧(这样可以比较少的建立一些索引)

    6.避免建立冗余索引和重复索引(增加了查询优化器生成执行计划的时间)
    •重复索引示例:primary key(id)、index(id)、unique index(id)
    •冗余索引示例:index(a,b,c)、index(a,b)、index(a)

    7.对于频繁的查询优先考虑使用覆盖索引
    覆盖索引:就是包含了所有查询字段 (where,select,ordery by,group by 包含的字段) 的索引

    覆盖索引的好处:

    •避免 Innodb 表进行索引的二次查询: Innodb 是以聚集索引的顺序来存储的,对于 Innodb 来说,二级索引在叶子节点中所保存的是行的主键信息,如果是用二级索引查询数据的话,在查找到相应的键值后,还要通过主键进行二次查询才能获取我们真实所需要的数据。而在覆盖索引中,二级索引的键值中可以获取所有的数据,避免了对主键的二次查询 ,减少了 IO 操作,提升了查询效率。
    •可以把随机 IO 变成顺序 IO 加快查询效率: 由于覆盖索引是按键值的顺序存储的,对于 IO 密集型的范围查找来说,对比随机从磁盘读取每一行的数据 IO 要少的多,因此利用覆盖索引在访问时也可以把磁盘的随机读取的 IO 转变成索引查找的顺序 IO。

    8.索引 SET 规范
    尽量避免使用外键约束

    •不建议使用外键约束(foreign key),但一定要在表与表之间的关联键上建立索引
    •外键可用于保证数据的参照完整性,但建议在业务端实现
    •外键会影响父表和子表的写操作从而降低性能

    数据库 SQL 开发规范

    1.建议使用预编译语句进行数据库操作
    预编译语句可以重复使用这些计划,减少 SQL 编译所需要的时间,还可以解决动态 SQL 所带来的 SQL 注入的问题。

    只传参数,比传递 SQL 语句更高效。

    相同语句可以一次解析,多次使用,提高处理效率。

    2.避免数据类型的隐式转换
    隐式转换会导致索引失效如:

    select name,phone from customer where id = '111';
    

    3.充分利用表上已经存在的索引
    避免使用双%号的查询条件。如:a like ‘%123%’,(如果无前置%,只有后置%,是可以用到列上的索引的)

    一个 SQL 只能利用到复合索引中的一列进行范围查询。如:有 a,b,c 列的联合索引,在查询条件中有 a 列的范围查询,则在 b,c 列上的索引将不会被用到。

    在定义联合索引时,如果 a 列要用到范围查找的话,就要把 a 列放到联合索引的右侧,使用 left join 或 not exists 来优化 not in 操作,因为 not in 也通常会使用索引失效。

    4.数据库设计时,应该要对以后扩展进行考虑
    5.程序连接不同的数据库使用不同的账号,进制跨库查询
    •为数据库迁移和分库分表留出余地
    •降低业务耦合度
    •避免权限过大而产生的安全风险

    6.禁止使用 SELECT * 必须使用 SELECT <字段列表> 查询
    原因:

    •消耗更多的 CPU 和 IO 以网络带宽资源
    •无法使用覆盖索引
    •可减少表结构变更带来的影响

    7.禁止使用不含字段列表的 INSERT 语句
    如:

    insert into values ('a','b','c');
    

    应使用:

    insert into t(c1,c2,c3) values ('a','b','c');
    

    8.避免使用子查询,可以把子查询优化为 join 操作
    通常子查询在 in 子句中,且子查询中为简单 SQL(不包含 union、group by、order by、limit 从句) 时,才可以把子查询转化为关联查询进行优化。

    子查询性能差的原因:

    子查询的结果集无法使用索引,通常子查询的结果集会被存储到临时表中,不论是内存临时表还是磁盘临时表都不会存在索引,所以查询性能会受到一定的影响。特别是对于返回结果集比较大的子查询,其对查询性能的影响也就越大。

    由于子查询会产生大量的临时表也没有索引,所以会消耗过多的 CPU 和 IO 资源,产生大量的慢查询。

    9.避免使用 JOIN 关联太多的表
    对于 MySQL 来说,是存在关联缓存的,缓存的大小可以由 join_buffer_size 参数进行设置。

    在 MySQL 中,对于同一个 SQL 多关联(join)一个表,就会多分配一个关联缓存,如果在一个 SQL 中关联的表越多,所占用的内存也就越大。

    如果程序中大量的使用了多表关联的操作,同时 join_buffer_size 设置的也不合理的情况下,就容易造成服务器内存溢出的情况,就会影响到服务器数据库性能的稳定性。

    同时对于关联操作来说,会产生临时表操作,影响查询效率,MySQL 最多允许关联 61 个表,建议不超过 5 个。

    10.减少同数据库的交互次数
    数据库更适合处理批量操作,合并多个相同的操作到一起,可以提高处理效率。

    11.对应同一列进行 or 判断时,使用 in 代替 or
    in 的值不要超过 500 个,in 操作可以更有效的利用索引,or 大多数情况下很少能利用到索引。

    12.禁止使用 order by rand() 进行随机排序
    order by rand() 会把表中所有符合条件的数据装载到内存中,然后在内存中对所有数据根据随机生成的值进行排序,并且可能会对每一行都生成一个随机值,如果满足条件的数据集非常大,就会消耗大量的 CPU 和 IO 及内存资源。

    推荐在程序中获取一个随机值,然后从数据库中获取数据的方式。

    13.WHERE 从句中禁止对列进行函数转换和计算
    对列进行函数转换或计算时会导致无法使用索引

    不推荐:

    where date(create_time)='20190101'
    

    推荐:

    where create_time >= '20190101' and create_time < '20190102'
    

    14.在明显不会有重复值时使用 UNION ALL 而不是 UNION
    •UNION 会把两个结果集的所有数据放到临时表中后再进行去重操作
    •UNION ALL 不会再对结果集进行去重操作

    15.拆分复杂的大 SQL 为多个小 SQL
    •大 SQL 逻辑上比较复杂,需要占用大量 CPU 进行计算的 SQL
    •MySQL 中,一个 SQL 只能使用一个 CPU 进行计算
    •SQL 拆分后可以通过并行执行来提高处理效率

    数据库操作行为规范

    1.超 100 万行的批量写 (UPDATE,DELETE,INSERT) 操作,要分批多次进行操作
    大批量操作可能会造成严重的主从延迟

    主从环境中,大批量操作可能会造成严重的主从延迟,大批量的写操作一般都需要执行一定长的时间, 而只有当主库上执行完成后,才会在其他从库上执行,所以会造成主库与从库长时间的延迟情况

    binlog 日志为 row 格式时会产生大量的日志

    大批量写操作会产生大量日志,特别是对于 row 格式二进制数据而言,由于在 row 格式中会记录每一行数据的修改,我们一次修改的数据越多,产生的日志量也就会越多,日志的传输和恢复所需要的时间也就越长,这也是造成主从延迟的一个原因

    避免产生大事务操作

    大批量修改数据,一定是在一个事务中进行的,这就会造成表中大批量数据进行锁定,从而导致大量的阻塞,阻塞会对 MySQL 的性能产生非常大的影响。

    特别是长时间的阻塞会占满所有数据库的可用连接,这会使生产环境中的其他应用无法连接到数据库,因此一定要注意大批量写操作要进行分批

    2.对于大表使用 pt-online-schema-change 修改表结构
    •避免大表修改产生的主从延迟
    •避免在对表字段进行修改时进行锁表

    对大表数据结构的修改一定要谨慎,会造成严重的锁表操作,尤其是生产环境,是不能容忍的。

    pt-online-schema-change 它会首先建立一个与原表结构相同的新表,并且在新表上进行表结构的修改,然后再把原表中的数据复制到新表中,并在原表中增加一些触发器。把原表中新增的数据也复制到新表中,在行所有数据复制完成之后,把新表命名成原表,并把原来的表删除掉。把原来一个 DDL 操作,分解成多个小的批次进行。

    3.禁止为程序使用的账号赋予 super 权限
    •当达到最大连接数限制时,还运行 1 个有 super 权限的用户连接
    •super 权限只能留给 DBA 处理问题的账号使用

    4.对于程序连接数据库账号,遵循权限最小原则
    •程序使用数据库账号只能在一个 DB 下使用,不准跨库
    •程序使用的账号原则上不准有 drop 权限

    展开全文
  • 蓝牙篇之蓝牙核心规范(V5.2)深入详解汇总 目录 3 配对方法 3.1 安全属性 3.2 IO能力 3.3 OOB认证数据 3.4 加密密钥大小 3.5配对算法 3.5.1 选择密钥生成方法 3.5.2 LE传统配对-Just Works 3.5.3 LE传统...

         蓝牙篇之蓝牙核心规范(V5.2)深入详解汇总 


    目录

    目录

    3 配对方法

    3.1 安全属性

    3.2 IO能力

    3.3 OOB认证数据

    3.4 加密密钥大小

    3.5配对算法

    3.5.1 选择密钥生成方法

    3.5.2 LE传统配对-Just Works

    3.5.3 LE传统配对-Passkey Entry

    3.5.4 带外

    3.5.5 LE传统配对阶段2

    3.5.6 LE安全连接配对阶段2

    3.6 重复事项

    4.密钥分配和生成

    5.加密信息

    6.主标识

    7.身份信息

    8.身份地址信息

    9.签名信息

    10.安全请求


    3 配对方法

    当配对要准备进入配对时,应该启动配对功能初始化设备。如果响应设备不支持配对或配对无法体现,则无法使用错误代码“不支持配对”的配对失败消息回复响应设备。

    Pairing Feature Exchange用于交换IO能力,OOB身份验证数据可用性,身份验证要求,关键大小要求以及要分发的特定运输密钥。 IO能力,OOB身份验证数据可用性和身份验证要求用于确定第2阶段使用的关键生成方法。

    所有的LE 传统配对方式使用和生成两个密钥:

    • 1.临时密钥:用于生成STK的配对过程中使用的128位临时密钥;
    • 2.短时间密钥(STK):用于加密连接后续配对的128位临时密钥。

    LE 安全连接配对方式使用和产生一个密钥:

    • 长期密钥(LTK):用于加密连接后续配对和后续连接的128位密钥。

    认证要求由GAP设定。 认证要求包括绑定类型和(MITM)要求。

    启动设备指示响应设备,其中特定密钥传输类似于发送响应设备,并且密钥类似于响应设备发送到启动器。 响应设备用启动设备发出的密钥和响应设备发出的密钥回复。 可以分发的密钥。 如果设备收到带有无效参数的命令,则必须使用错误代码“无效参数”对失败命令进行响应。

    3.1 安全属性

    SM提供的安全属性归入以下类别:

    • LE安全连接配对
    • 认证的MITM保护
    • 未经授权的非MITM保护
    • 没有安全要求

    在LE传统配对中,通过使用配对密钥进入配对的方法获得了经过认证的(MITM)保护,或者可以使用带外配对的方法获得保护。 在LE 安全连接配对中,使用秘钥进入配对的方法或数字比较方法获得了经过认证(MITM)保护,或者可以使用带薪方法获得。 为了确保生成经过认证的MITM保护,所选的认证要求选项必须具有特定的MITM保护。

    未经授权的非MITM保护不会受到MITM攻击的保护。

    对于LE 传统配对,在使用TK的可预测或简单设定的价值的配对过程中,没有一种配对方法可以防止被动泄漏。 如果配对信息在所有配对方法都提供机密性的情况下分发,则会出现泄漏。

    启动设备应保留安全数据库中分发密钥的安全属性记录。

    响应设备可以保留安全数据库中分布式密钥的分布式密钥大小和安全属性的记录。 根据关键世代方法和谈判的关键点,响应设备可能会减少关键长度,以便启动并使用相同的密钥进行响应。

    在第2阶段生成的密钥的安全属性,其中密钥被分发到安全数据库中。

    3.2 IO能力

    设备的输入和输出能力与生成其IO能力相结合。 输入能力在表2.3中描述。 表2.4中描述了输出能力。

    能力描述
    没有输入设备没有能力指示‘是’或‘否’
    是/否最左边的两个按钮可以简单地映射到‘是’和‘否’或设备有一个机制,用户可以指示‘是’或‘否’。
    键盘提供了一个数字键盘,可以通过‘9’输入数字‘0’并进行确认。 另外还有两个按钮可以简单地映射到‘是’和‘否’,或者设备有一个机制,用户可以指示‘是’或‘否’(见下文注释)。

    注意:‘是’必须通过按下按钮来指示,并有一定的时间限制,否则‘不’将被假定。

    能力描述
    没有输出设备没有显示或通信到6位十进制数字的能力
    数字输出提供显示或通信到6位十进制数字的能力

    个人输入和输出能力映射到设备的单个IO能力,该设备在交换功能中使用。 映射图在表2.5中描述。

    1 没有配对算法可以使用是/否输入和否输出,因此使用NoInput、NoOutput作为结果IO能力。

    3.3 OOB认证数据

    可以使用带外状机制来传达在配对过程中使用的信息。 信息应遵循AD结构的顺序。

    OOB数据标志应在设备具有对等设备的频段认证数据的情况下设置。 设备使用对端设备从频段身份验证数据到对端设备的身份验证。 在LE传统配对对中,如果设备有其他设备可以使用带外认证数据,则使用带外认证方法。

    在LE 安全连接配对中,如果一个设备有对端设备带外认证数据可能带外方法。

    3.4 加密密钥大小

    每个设备都有最大和最小加密密钥长度参数,其中定义了八元组加密密钥的最大和最小大小。 最大和最小加密长度参数应介于7字节(56位)和16字节(128位)之间,以1字节(8位)步为单位。 这是由配置文件或设备应用程序定义的。

    初始和响应设备的最大加密长度参数的小值将用作加密密钥大小。

    启动和响应设备都应检查结果加密密钥大小是否小于设备的最小密钥大小参数,如果是,则设备应发送带有错误代码“加密密钥大小”的失败命令。

    加密密钥大小可以存储,因此可以通过任何服务进行检查,因为它具有最小的加密密钥长度要求。

    如果一个秘钥有一个加密密钥,那么它是最少的16个字节(128位),它应该通过掩码生成密钥的适当MSB来创建,以提供协议加密密钥所在的密钥。 面具应在一代之后捐赠,并在分发,使用或存储之前。

    注意:当BR/EDR链接键从LTK导出时,导数不会在LTK 得到掩码之前。

    例如,如果是128位加密密钥

    0x123456789ABCDEF0123456789ABCDEF0

    并且减少到7字节(56位),然后结果是密钥

    0x0000000000000000003456789ABCDEF0。

    3.5配对算法

    在第1阶段交换的信息用于选择在第2阶段使用的密钥生成方法。

    3.5.1 选择密钥生成方法

    如果设备没有设置认证要求标志中的MITM选项,则应忽略IO能力,并使用Just works关联模型。

    在LE传统配对中,如果两个设备都有带状认证数据,那么在选择支付方法和使用带状支付方法时,应忽略认证要求标志。 其他,设备应具有的IO能力用于确定表2.8中定义的配对方法。

    在LE 安全连接配对中,如果有一方或双方设备已从带外认证数据中删除,则在选择配对方法和使用配对方法时将忽略认证要求标志。 其他,设备应具有的IO能力用于确定表2.8中定义的配对方法。

    表2.6定义了STK生成方法,其中一个设备不支持LE 安全连接。

    表2.7定义了LTK生成方法,其中任何设备都支持LE 安全连接。

    生成的密钥将是经过验证或未经验证的密钥。 如果使用了带外认证方法,并且带外机制被认为是安全的,那么从吹出的关键被认为是真实的; 然而,确切的力量取决于用于传输频段信息的方法。 如果使用了禁止方法,并且禁止使用禁止机制不是安全的,或者泄漏保护水平是未知的,那么关键应该是未经授权的。 表2.8中描述了IO映射为经过验证或未经验证的密钥的能力。

    在LE传统配对对中,如果启动设备已从频段数据中删除,并且响应设备未从频段数据中删除,则响应设备可能会发送带有错误代码“OOB不可用”的配对响应命令的失败命令。

    如果密钥产生方法没有提供足够安全属性的关键,则设备必须发送带有错误代码“身份验证要求”的失败命令。

    3.5.2 LE传统配对-Just Works

    在配对过程中,Just Works STK 产生方法在中间攻击中提供了对Eavesdroppers或man的非保护。 如果攻击者在配对过程中不存在,则可以通过使用对未来连接的加密来建立信任。

    两个设备都设置了认证机制中使用的TK值为零。

    3.5.3 LE传统配对-Passkey Entry

    Passkey Entry STK生成方法使用设备之间的用户从频段传递的6个数字数字。 一个6位数字随机生成的密码接近20位熵。

    如果设备的IO能力仅显示,或者如果表2.8定义了设备显示passkey,则设备显示在000,000和999,999之间的随机生成的passkey值。 显示应显示所有6个数字-包括零。 其他设备应使用户能够在000,000和999,999之间输入价值。

    如果Passkey进入UI失败或在设备发出信号时被取消,则使用原因代码“Passkey Entry Failed”命令失败。

    例如,如果用户输入的密码是‘019655’,那么TK应该是0x00000000000000000000000000000000004CC7。

    Passkey Entry 方法提供了对主动”(MITM)攻击的保护,因为它们将以0.000001的概率发生在几乎调用该方法的情况下。

    Passkey Entry STK生成方法在可能的TK值的有限范围内依赖于可能的TK值。 如果攻击者在互惠过程中不存在,则可以通过使用对未来连接的加密来建立信任和认证。

    3.5.4 带外

    可以使用频段机制之外的通信信息来帮助设备发现,例如设备地址,以及使用128位TK值配对过程。 使用此处定义的随机生成要求,TK值应为128位随机数字。

    如果OOB通信抵抗MITM攻击,则这种关联方法也抵抗MITM攻击。 此外,在乐队方法之外,认证参数(TK)的大小不受用户可以舒适阅读或类型的限制。 为此,可以使用Passkey Entry或Just Works方法使带外方法更加安全。 但是,任何设备都需要匹配OOB接口。

    MITM保护仅在成功攻击的积极中期内提供,发生的可能性为0.000001或更少。

    3.5.5 LE传统配对阶段2

    启动设备生成128位随机编号(Mrand)。

    初始设备使用确认值生成函数c1计算128位确认值(Mconfirm),并输入参数k集到TK, 输入参数r设置为Mrand,输入参数preq设置为交换对等设备(即。 在没有任何修改的情况下),输入参数后,将发送给对等设备交换的配对响应命令(即。 没有任何修改),输入参数设置为启动设备地址类型,设置为启动设备地址,设置为响应设备地址类型,设置为响应设备地址类型,设置为响应设备地址:

    Mconfirm = c1(TK, Mrand, 
    Pairing Request command, Pairing Response command,
    initiating device address type, initiating device address, 
    responding device address type, responding device address)

    用于确认生成的启动和响应设备地址必须在连接设置期间使用设备地址。

    响应设备生成128位随机编号(Srand)。

    响应设备使用确认值生成函数c1计算128位确认值(确认值),并输入参数k集到TK, 输入参数设置为Srand, 输入参数预置请求命令, 输入参数设置为发送响应命令,输入参数设置为启动设备地址类型,设置为启动设备地址,设置为响应设备地址类型,设置为响应设备地址类型,设置为响应设备地址类型:

    Sconfirm = c1(TK, Srand, 
    Pairing Request command, Pairing Response command, 
    initiating device address type, initiating device address,
    responding device address type, responding device address)

    启动设备传输确认响应设备。 当响应设备接收确认时,它会将确认传输到启动设备。 当启动设备接收确认它发送到响应设备时。

    响应设备通过使用收到的Mrand值重复计算初始设备性能来验证Mconfirm值。

    如果回复设备的计算确认值不匹配从启动设备收到的确认值,则应中止对该设备的处理,并且响应设备应发送带有原因代码“确认价值失败”的配对失败命令。

    如果响应设备的计算Mconfirm值匹配从启动设备接收到的Mconfirm值,则响应设备传输Srand到启动设备。

    启动设备使用收到的Srand值通过重复计算响应设备性能来验证收到的确认值。

    如果初始设备计算了确认值,则不会匹配响应进程中止时收到的确认值,并且启动设备应发送给原因代码“确认值失败”的失败命令。

    如果启动设备的计算确认值匹配,则从响应中收到的确认值会消耗STK计算的启动设备,并将控制器调用到可加密的加密中。

    使用密钥生成函数s1生成STK,其中输入参数k集为TK,输入参数r1集为Srand,输入参数r2集为Mrand:

    STK = s1(TK, Srand, Mrand)

    发起人应使用生成的STK对链接上的可加密,或者如果加密已经打开,则穿孔加密暂停程序。

    3.5.6 LE安全连接配对阶段2

    长密钥是在LE安全连接第2阶段生成的。

    公开密钥交换

    最初,每个设备生成是椭圆曲线差分Hellman(ECDH)公共-私人密钥对(第1阶段)。 公私合作伙伴关系包含私人内容(秘密)密钥和公钥。 设备A和B的私钥分别表示为SKa和SKb。 设备A和B的公钥分别表示为PKa和PKb。 有关如何经常更改此关键对的建议。

    启动设备启动了配对,将其公共密钥路由到接收设备(第1a阶段)。 响应设备使用其自己的公钥回复(第1b阶段)。 这些公钥并非秘密地传达给他们,因为他们可以识别设备。

    从任何BD_ADDR收到的任何公共密钥的设备应在正确的曲线上验证(P-256)。

    有效的公钥Q=(XQ,YQ)是其中一个XQ,YQ在范围0到p-1之间,并且满足相关曲线有限域中的等式(YQ)2=(XQ)3+aXQ+b(mod p)。 关于a,b和p的值。

    设备可以通过直接检查曲线方程来验证公钥,通过实施椭圆曲线点添加和加倍公式,这些公式仅在正确的曲线上或通过其他方法有效。

    如果不使用结果LTK,则在LE 安全连接配对过程期间任何一点从对等方检测到无效的公钥。

    公钥交换后,设备可以开始计算Diffie-Hellman密钥。

    当安全管理被放入Debug模式时,他应该使用以下差异-Hellman私人/公共密钥对:

    私人密钥:3f49f6d4至3c55f38 74c9b3e3 d2103f50 4aff607b eb40b799 5899b8a6 cd3c1abd
    公钥(X):20b003d2 f297be2c 5e2c83a7 e9f9a5b9 eff49111 acf4fddb cc030148 0e359de6
    公钥(Y):dc809c49 652aeb6d 63329abf 5a52155c 766345c2 8fed3024 741c8ed0 1589d28b

    注意:只有一侧(启动或响应)需要设置安全连接调试模式,以便调试设备以确定LTK,并且,在那里,可以监视加密连接。

    认证阶段1-公平工作或数字比较

    如果MITM位在配对请求 PDU和/或配对请求 PDU的认证要求中设置为1并且/或配对响应 PDU和两者兼而有之,则将使用数字比较关联模型。设备已设置IO以显示否或键盘显示

    图2.3所示的密码学观点的Just Works或数字比较协议的认证阶段1的顺序对话。

    公钥交换后,each将设备选择设置为伪128位非(第2步)。 该值用于防止重播攻击,并且必须通过对端协议的几乎实例生成。 该值应直接从无障碍的物理源或从物理源获得具有随机值的良好伪随机发生器生成。

    以下是对已交换的两个公钥的承诺及其自身的十一个值的计算的响应设备(步骤3c)。 该承诺作为这些价值的单向函数计算,并传递给启动设备(第4步)。 承诺防止在以后改变这些价值的攻击者。

    交换各自的九个值(第5步和第6步)的启动和响应设备以及启动设备确认承诺(步骤6a)。此时失败表明存在攻击者或其他传输错误并导致中止协议。 议定书可以与新一代公私伙伴关系重复或重复,但如果议定书重复,则必须生成新的非协议。

    使用数字比较时,假设提交检查发生,两个设备计算6位数确认值,然后将其显示给各自设备上的用户(步骤7a,7b和8)。 预计用户将检查6位数字匹配值并确认是否匹配。 如果没有匹配,则必须生成“议定书”废除,并且如果要重复“议定书”,则必须生成新的nonces。

    认证阶段1-Passkey Entry

    认证阶段1-带外

    认证阶段2和长期密钥计算

    3.6 重复事项

    当验证者将启动新的配对请求命令或安全请求命令相同配对之前的配对程序失败时, 或者,它将响应由设备启动的配对请求命令或安全请求命令,以失败的设备声称相同的身份。 对于后来的失败,等待中间应该是指数增加。 这是,几乎失败后,可以在新的注意事项之前等待插槽,可以举例说明,两次等待插槽早于之前的注意事项。 等待干预应限于最大值。

    最大等待间隔依赖于实施。 等待时间应按指数顺序减少到最低限度,因为没有新的失败事件是在一定时间内完成的。 该程序通过使用大量不同的密钥重复配对程序来防止这种情况发生。

    为了保护设备的私钥,设备应该实施一种方法,以防止攻击有关设备私钥的二手信息。 为此,每次付款后(成功或失败),设备必须更改为私人密钥。 其他,它应该改变它的私人密钥,因为S+3F>8,其中S是成功配对的数量,F是自密钥最后更改以来失败的注意事项的数量。

    4.密钥分配和生成

    蓝牙低能耗设备可以将密钥从从设备分配到主设备,并从主设备分配到从设备。当使用LE遗留配对时,以下密钥可以从从机分配到主机:

    • LTK使用加密信息命令
    • EDIV和Rand使用主识别命令
    • 公共设备或静态随机地址使用身份地址信息命令
    • CSRK使用签名信息命令

    当使用LE安全连接时,以下密钥可以从从节点分发到主节点:

    • 使用身份信息命令的IRK
    • 公共设备或静态随机地址使用身份地址信息命令
    • CSRK使用签名信息命令

    当使用LE传统配对时,主节点可以将以下键分配给从节点:

    • LTK使用加密信息命令
    • EDIV和Rand使用主识别命令
    • 使用身份信息命令的IRK、
    • 公共设备或静态随机地址使用身份地址信息命令
    • CSRK使用签名信息命令

    当使用LE安全连接时,主节点可以将以下密钥分配给从节点:

    • 使用身份信息命令的IRK
    • 公共设备或静态随机地址使用身份地址信息命令
    • CSRK使用签名信息命令

    在传输特定密钥分配阶段要分配的密钥显示在配对请求和配对响应命令的密钥分配字段中。

    LE的配对请求和配对响应命令中的启动器密钥分发/生成字段和响应器密钥分发/生成字段的格式如图3所示。

    密钥分配/生成字段具有以下标志:

    • 在LE传统配对中,EncKey是一个1位字段,它被设置为1,以表示设备应使用加密信息命令分发LTK,然后使用EDIV和Rand使用主识别命令分发LTK。在LE安全连接配对中,当SMP在LE传输上运行时,应忽略EncKey字段。EDIV和Rand应设置为零,不得进行分配。当SMP在BR/EDR传输上运行时,EncKey字段被设置为1,以指示设备希望从BR/EDR链接密钥派生LTK。当启动器和响应器密钥分发/生成字段中的两个设备都将EncKey设置为1时,应使用从BR/EDR链接密钥计算LTK的程序。
    • IdKey是一个1位字段,它被设置为1,以指示设备应使用身份信息命令分发IRK,然后使用其公共设备或使用身份地址信息的静态随机地址。
    • SignKey是一个1位的字段,它被设置为1,以表示设备应使用签名信息命令来分发CSRK。
    • LinkKey是一个有1位的字段。当SMP在LE传输上运行时,LinkKey字段被设置为1,以指示设备希望从LTK派导出链接密钥。当启动器和响应器密钥分发/生成字段中的两个设备都将链接密钥设置为1时,应使用从LTK计算BR/EDR链接密钥的程序。不支持LE安全连接的设备应将此位设置为零,并在接收时忽略它。当SMP在BR/EDR传输上运行时,将保留链接密钥字段以备将来使用。

    主机使用“配对请求”命令中的“启动器密钥分发/生成”字段来向启动器请求哪些密钥被分发或生成给响应器。“配对请求”命令中的“响应器密钥分发/生成”字段由主机用来请求响应器向发起器分发或生成哪些密钥。来自从机的“配对响应”命令中的“启动器密钥分发/生成”字段定义了启动器应向响应器分发或生成的密钥。来自从机的“配对响应”命令中的“响应器密钥分配/生成”字段定义了响应者应向发起者分发或生成的密钥。从程序不得设置为主程序在配对请求命令的启动器密钥分配/生成或响应器密钥分配/生成字段中的启动器密钥分配/生成或响应器密钥分配/生成字段中设置为零的任何标志。

    使用LE传统配对时,密钥的分配顺序如下:

    1. 从机:LTK
    2. 从机:EDIV和Rand
    3. 从机:IRK
    4. 从机:BD ADDR
    5. 从机:CSRK
    6. 主机:LTK
    7. 主机:EDIV和Rand
    8. 主机:IRK
    9. 主机:BD ADDR
    10. 主机:CSRK

    当使用LE安全连接时,密钥应按以下顺序分配:

    1. 从机:IRK
    2. 从机:BD ADDR
    3. 从机:CSRK
    4. 主机:IRK
    5. 主机:BD ADDR
    6. 主机:CSRK

    如果没有被分配到密钥,则不应发送要分发该密钥的命令。

    注意:如果未分发一个密钥,则使用此密钥的功能将不可用。例如,如果LTK没有从从机分发到主机,那么主机就无法加密与该从服务器的未来链接,因此必须再次执行配对。

    注:启动器应根据更高层规范所需的功能来确定所需的密钥。例如,如果启动器确定在与该从机的未来链接中需要加密,那么启动器必须通过在“请求配对请求”命令的响应器密钥分发/生成字段中将EncKey位设置为1来请求分发从属的LTK。

    如果在启动器密钥分发/生成和响应密钥分发/生成字段中将Enc密钥、标识密钥和标识密钥设置为零,则不得分发或生成密钥,在使用LE遗留连接配对时和使用LE安全连接配对时使用生成的STK对链接进行加密。

    密钥分发在设备接收到该密钥的基带确认时发送最终密钥时完成,并且在接收设备接收到被分发的最终密钥时完成。

    5.加密信息

    加密信息在LE传统配对传输特定密钥分发中用于分发在加密未来连接时使用的LTK。加密信息命令如图所定义。

    只有当使用生成的STK加密或重新加密链接时,才能发送加密信息命令。

    以下是数据字段:

    长期密钥(16个字节)

    6.主标识

    主标识用于LE传统配对传输特定密钥分发阶段来分发EDIV和Rand,这些EDIV和Rand用于加密未来的连接。

    只有当链接使用生成的STK进行加密或重新加密时,才能发送主识别命令。

    7.身份信息

    身份信息用于传输特定密钥分配阶段来分发IRK。

    只有使用生成的密钥加密或重新加密时,才能发送身份信息命令。

    注:全零身份解析密钥数据字段表示设备没有有效的可解析的私有地址。

    8.身份地址信息

    身份地址信息在传输特定密钥分配阶段分发其公共设备地址或静态随机地址。

    只有使用生成的密钥加密或重新加密时,才应发送身份地址信息命令。

    数据字段为:

    AddrType(1个字节)

    如果BD_ADDR是公共设备地址,则AddrType应设置为0x00。如果BD_ADDR是一个静态随机设备地址,则AddrType应设置为0x01。

    BD_ADDR(6个字节)

    此字段设置为分发设备的公共设备地址或静态随机地址。

    9.签名信息

    签名信息在传输特定密钥分发中用于分发设备用于签名数据的CSRK。

    只有使用链接的密钥使用生成的密钥加密或重新加密时,才能发送签名信息命令。

    10.安全请求

    从程序使用“安全请求”命令来请求主服务器使用所请求的安全属性启动安全。

    将使用以下数据字段:

    AuthReq (1 字节)

    AuthReq字段是一个位字段,表示STK或LTK和GAP绑定信息请求的安全属性。

    Bonding_Flags字段是一个2位字段,它指示响应设备所请求的键合类型。MITM字段是一个1位的标志,如果设备正在请求MITM保护,则设置为1,否则应设置为0。设备将MITM标志设置为1,以便在使用LE传统配对时请求STK的已认证安全属性,在使用LE安全连接时请求LTK。

    SC字段是一个1位的标志。如果设备支持LE安全连接配对,则应将SC字段设置为1,否则应设置为0。如果两个设备都支持LE安全连接配对,则应使用LE安全连接配对,否则应使用LE传统配对。

    展开全文
  • JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段构成数组对象的元素)的访问方式。...

    volatile是什么

    volatile是JVM提供的轻量级的同步机制

    保证可见性
    不保证原子性
    禁止指令重排(保证有序性)

    JMM内存模型之可见性

    JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。

    JMM关于同步的规定:

    线程解锁前,必须把共享变量的值刷新回主内存
    线程加锁前,必须读取主内存的最新值到自己的工作内存
    加锁解锁是同一把锁

    由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量副本拷贝,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成,其简要访问过程如下图:

    在这里插入图片描述
    可见性

    通过前面对JMM的介绍,我们知道各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后再写回到主内存中的。

    这就可能存在一个线程AAA修改了共享变量X的值但还未写回主内存时,另外一个线程BBB又对主内存中同一个共享变量X进行操作,但此时A线程工作内存中共享变量x对线程B来说并不可见,这种工作内存与主内存同步延迟现象就造成了可见性问题

    /**
     * 测试可见性
     */
    
    class MyData{
    
        int number = 0;
    
        public void addT030(){
            this.number += 30;
        }
    }
    
    
    public class VolatileVisibility {
    
        public static void main(String[] args) {
    
            // 共享资源
            MyData data = new MyData();
    
            // 线程处理业务,3秒后修改共享变量
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+ " come in");
                try {
                    TimeUnit.SECONDS.sleep(3);
                    data.addT030();
                    System.out.println(Thread.currentThread().getName()+ " updated");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },"AAA").start();
    
            // 主线程 如果发现共享变量改变了,立即退出
            while (data.number == 0){}
    
            System.out.println(Thread.currentThread().getName()+ " mission success");
        }
    }
    

    结果
    即使线程AAA修改了变量写回了内存,但是主线程工作空间中,变量值一直是0 无法退出,因为线程间变量的修改是不可见的,没有通知主线程,内存中的共享变量发生了改变。
    因此,需要有一种机制,能够是线程间能够相互看到共享变量。

    volatile保证可见性

    /**
     * 测试可见性
     */
    
    class MyData{
    
        volatile int number = 0;
    
        public void addT030(){
            this.number += 30;
        }
    }
    
    

    使用volatile。轻量级锁。使得共享资源可以相互可见。

    volatile不保证原子性

    原子性指的是什么意思?

    不可分割,完整性,也即某个线程正在做某个具体业务时,中间不可以被加塞或者被分割。需要整体完整要么同时成功,要么同时失败。

    volatile不保证原子性案例演示:

    /**
     * 测试可见性
     */
    
    class MyData{
    
        volatile int number = 0;
    
        public void addT030(){
            this.number += 30;
        }
    
        public void increase(){
            this.number++;
        }
    }
    
    
    public class VolatileTest {
    
        public static void main(String[] args) {
    
            MyData data = new MyData();
    
            // 启动20个线程 对同一变量操作
            for (int i = 0; i < 20; i++) {
                new Thread(()->{
                    for (int j = 0; j < 1000; j++) {
                        data.increase();
                    }
                },String.valueOf(i)).start();
            }
    
            // 当活跃的线程数量 大于2时,主线程进入就绪状态,等待cpu执行
            // 默认两个线程是 main,gc垃圾回收 两个线程。只有只剩两个线程时,主线程继续往下执行
            while (Thread.activeCount()>2){
                Thread.yield();
            }
    
            // 按理说值是20000 但是大部分情况下值不是20000
            System.out.println("value "+data.number);
        }
    }
    

    volatile不保证原子性理论解释

    number++在多线程下是非线程安全的。

    我们可以将代码编译成字节码,可看出number++被编译成3条指令。
    在这里插入图片描述

    假设我们没有加 synchronized那么第一步就可能存在着,三个线程同时通过getfield命令,拿到主存中的 n值,然后三个线程,各自在自己的工作内存中进行加1操作,但他们并发进行 iadd 命令的时候,因为只能一个进行写,所以其它操作会被挂起,假设1线程,先进行了写操作,在写完后,volatile的可见性,应该需要告诉其它两个线程,主内存的值已经被修改了,但是因为太快了,其它两个线程,陆续执行 iadd命令,进行写入操作,这就造成了其他线程没有接受到主内存n的改变,从而覆盖了原来的值,出现写丢失,这样也就让最终的结果少于20000。

    volatile不保证原子性问题解决(Atomic原子类),多线程环境下i++等问题解决

    可加synchronized解决,但它是重量级同步机制,性能上有所顾虑。

    如何不加synchronized解决number++在多线程下是非线程安全的问题?使用AtomicInteger。

    class MyData{
    
        volatile int number = 0;
    
        AtomicInteger atomicInteger = new AtomicInteger();
    
        public void addAtomic(){
            atomicInteger.getAndIncrement();
        }
    
        public void addT030(){
            this.number += 30;
        }
    
        public void increase(){
            this.number++;
        }
    }
    
    public class VolatileTest {
    
        public static void main(String[] args) {
    
            MyData data = new MyData();
    
            // 启动20个线程 对同一变量操作
            for (int i = 0; i < 20; i++) {
                new Thread(()->{
                    for (int j = 0; j < 1000; j++) {
                        data.increase();
                        data.addAtomic();
                    }
                },String.valueOf(i)).start();
            }
    
            // 当活跃的线程数量 大于2时,主线程进入就绪状态,等待cpu执行
            // 默认两个线程是 main,gc垃圾回收 两个线程。只有只剩两个线程时,主线程继续往下执行
            while (Thread.activeCount()>2){
                Thread.yield();
            }
    
            // 按理说值是20000 但是大部分情况下值不是20000
            System.out.println(" volatile value "+data.number);
            System.out.println(" atomicInteger value "+data.atomicInteger);
        }
    }
    

    结果:
    在这里插入图片描述

    volatile指令重排案例1

    计算机在执行程序时,为了提高性能,编译器和处理器的常常会对指令做重排,一般分以下3种:
    在这里插入图片描述
    单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致。

    处理器在进行重排序时必须要考虑指令之间的数据依赖性

    多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。

    重排案例1

    public void mySort{
    	int x = 11;//语句1
        int y = 12;//语句2
        × = × + 5;//语句3
        y = x * x;//语句4
    }
    

    可重排序列:

    1234
    2134
    1324
    问题:请问语句4可以重排后变成第一个条吗?答:不能。

    重排案例2

    int a,b,x,y = 0
    在这里插入图片描述

    这也就说明在多线程环境下,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的。

    volatile指令重排案例2

    以下程序在高并发的情况下,执行结果不一样

    public class ReSortSeqDemo{
    	int a = 0;
    	boolean flag = false;
        
    	public void method01(){
    		a = 1;//语句1
    		flag = true;//语句2
    	}
        
        public void method02(){
            if(flag){
                a = a + 5; //语句3
            	System.out.println("retValue: " + a);//可能是6或5   
            }
           
        }
        
    }
    
    

    多线程环境中线程交替执行method01()和method02(),由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。

    禁止指令重排小总结

    volatile实现禁止指令重排优化,从而避免多线程环境下程序出现乱序执行的现象

    先了解一个概念,内存屏障(Memory Barrier)又称内存栅栏,是一个CPU指令,它的作用有两个:

    1. 保证特定操作的执行顺序,
    2. 保证某些变量的内存可见性(利用该特性实现volatile的内存可见性)。

    由于编译器和处理器都能执行指令重排优化。如果在指令间插入一条Memory Barrier则会告诉编译器和CPU,不管什么指令都不能和这条Memory Barrier指令重排序,也就是说通过插入内存屏障禁止在内存屏障前后的指令执行重排序优化。内存屏障另外一个作用是强制刷出各种CPU的缓存数据,因此任何CPU上的线程都能读取到这些数据的最新版本。

    对volatile变量进行写操作时,会在写操作后加入一条store屏障指令,将工作内存中的共享变量值刷新回到主内存。
    在这里插入图片描述
    对Volatile变量进行读操作时,会在读操作前加入一条load屏障指令,从主内存中读取共享变量。
    在这里插入图片描述
    线性安全性获得保证

    工作内存与主内存同步延迟现象导致的可见性问题 - 可以使用synchronized或volatile关键字解决,它们都可以使一个线程修改后的变量立即对其他线程可见。

    对于指令重排导致的可见性问题和有序性问题 - 可以利用volatile关键字解决,因为volatile的另外一个作用就是禁止重排序优化。

    单例模式也会出现并发安全问题

    public class SingletonTest {
    
    
        private static SingletonTest instance = null;
    
        private SingletonTest(){
            System.out.println(Thread.currentThread().getName()+ "构造方法被执行");
        }
    
        public static SingletonTest getInstance(){
            if(instance == null){
                instance = new SingletonTest();
            }
            return instance;
        }
    }
    

    多线程下,单例模式出现了并发安全问题

    public static void main(String[] args) {
    
            for (int i = 0; i < 10; i++) {
                new Thread(()->{
                    SingletonTest.getInstance();
                },String.valueOf(i)).start();
            }
        }
    

    执行结果
    在这里插入图片描述
    按理说,单例模式,应该只出现一个实例,但实际上出现了多个(多线程下)

    解决方法:
    方法一:使用synchronized

    public class SingletonTest {
        private static SingletonTest instance = null;
    
        private SingletonTest(){
            System.out.println(Thread.currentThread().getName()+ "构造方法被执行");
        }
    
        public static SingletonTest getInstance(){
            // dcl 双端检锁机制
            // 内层检查控制并发情况下,单实例问题
            // 外层检查控制并发情况下,效率问题
            if(instance == null){
                synchronized (SingletonTest.class){
                    if(instance == null){
                        instance = new SingletonTest();
                    }
                }
            }
            return instance;
        }
    
        public static void main(String[] args) {
    
            for (int i = 0; i < 10; i++) {
                new Thread(()->{
                    SingletonTest.getInstance();
                },String.valueOf(i)).start();
            }
        }
    
    }
    

    注意:这里采用了dcl双端检锁机制,保证并发的同时,保证效率

    方法二: synchronized+ volatile
    为什么要用volatile

    我们看看 创建对象的过程,在并发环境下,是否会有问题
    instance = new SingletonTest();可以分为以下3步完成(伪代码):

    memory = allocate(); //1.分配对象内存空间
    instance(memory); //2.初始化对象
    instance = memory; //3.设置instance指向刚分配的内存地址,此
    

    步骤2和步骤3不存在数据依赖关系,而且无论重排前还是重排后程序的执行结果在单线程中并没有改变,因此这种重排优化是允许的。

    memory = allocate(); //1.分配对象内存空间
    instance = memory;//3.设置instance指向刚分配的内存地址,此时
    instance(memory);//2.初始化对象
    

    但是指令重排只会保证串行语义的执行的一致性(单线程),但并不会关心多线程间的语义一致性。

    在多线程情况下,可能没有实例化完成, 对象引用就指向了对应地址。对象!=null,但是内部没有数据,调用对应方法时,得不到对应结果。因此我们要禁止指令重排

    public class SingletonTest {
        private static volatile SingletonTest instance = null;
    
        private SingletonTest(){
            System.out.println(Thread.currentThread().getName()+ "构造方法被执行");
        }
    
        public static SingletonTest getInstance(){
            // dcl 双端检锁机制
            // 内层检查控制并发情况下,单实例问题
            // 外层检查控制并发情况下,效率问题
            if(instance == null){
                synchronized (SingletonTest.class){
                    if(instance == null){
                        instance = new SingletonTest();
                    }
                }
            }
            return instance;
        }
    
        public static void main(String[] args) {
    
            for (int i = 0; i < 10; i++) {
                new Thread(()->{
                    SingletonTest.getInstance();
                },String.valueOf(i)).start();
            }
        }
    
    }
    
    展开全文
  • 阿里云Redis开发规范学习总结

    千次阅读 2019-12-05 10:43:30
    二、命令使用1.【推荐】 O(N)命令关注N的数量2.【推荐】:禁用命令3.【推荐】合理使用select4.【推荐】使用批量操作提高效率5.【建议】Redis事务功能较弱,不建议过多使用6.【建议】Redis集群版本在使用Lua上有特殊...
  • mysql修改字段长度命令_值得收藏:一份非常完整的 MySQL 规范 一、数据库命令规范 二、数据库基本设计规范 三、数据库字段设计规范 四、索引设计规范 五、常见索引列建议 六、如何选择索引列的顺序 七、...
  • 由于留空格所产生的清晰是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面右括号前面)不需要加空格,多重括号间不必加空格,因为在C/C++语言中括号已经是最...
  • 1. 【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。...说明:正确的英文拼写语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用。反例: DaZheP...
  • 前端开发规范详解

    千次阅读 2021-01-21 14:46:46
    如果开发团队就一个人的话,那么自己写的代码就是规范,随着公司业务的扩展,团队不断壮大,这时候就要开始考虑协作编码规范问题了。 一个人走的更快,一群人可以走的更远,前提是统一的策略,还要不断地反省...
  • 华为C编程规范原文详情:link. 一、代码总体原则 1、清晰第一 **清晰是易于维护、易于重构的程序必需具备的特征。** ”程序必须为阅读它的人而编写,只是顺便用于机器执行“。 ”编写程序应该以人为本,计算机第...
  • OWASP-安全编码规范

    千次阅读 2021-05-31 23:27:48
    OWASP-安全编码规范 ...1. 序言 本项目与技术无关的文档以清单列表的形式,定义了一套可以集成到软件开发生命周期中的通 用软件安全编码规范。采用这些规范将减少最为常见的软件漏洞。... 保护关键软件资源的安全
  • 史上最强的MySQL数据库设计规范(互联网大厂都使用的2021年最新版本)
  • 运维思索:Cobbler无人值守实现操作系统安装规范化一文只是实现了对操作系统的主机名、网络、磁盘分区的安装规范,但此时还不能够直接用于生产,因为操作系统还有很多配置没有进行优化,接下来的工作就是要对操作...
  • 阿里云Redis开发规范

    万次阅读 2018-03-15 20:17:34
    本文介绍了在使用阿里云Redis的开发规范,从键值设计、命令使用、客户端使用、相关工具等方面进行说明,通过本文的介绍可以减少使用Redis过程带来的问题。一、键值设计1. key名设计【建议】: 可读性和可管理以业务...
  • 账号 以普通帐户安全运行mysqld,禁止mysql以root帐号权限运行,攻击者可能通过mysql获得系统root超级用户权限,完全控制系统。 ##配置/etc/my.cnf[mysql.server]user=mysql ##补充操作说明 直接通过本地网络之外的...
  • c++编程规范和范例

    2021-01-23 15:47:54
    由于留空格所产生的清晰是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面右括号前面)不需要加空格,多重括号间不必加空格,因为在C/C++语言中括号已经是最...
  • [译] ROS C++ 代码规范

    2021-02-04 11:18:18
    ROS C++代码规范与谷歌C++代码规范有诸多相似之处,本文主要讲述在编写ROS C++代码时需要遵守的编程规范。 我喜欢优雅高效的代码。代码逻辑应当直截了当,令缺陷难以隐藏;尽量减少依赖关系,使之便于维护;依据...
  • 目 录TOC \o "1-3" \h \z \u 1概述 41.1适用范围 41.2内部适用说明 41.3外部引用说明 51.4术语定义 51.5符号缩略语 52ORACLE安全配置要求 52.1账号 62.2口令 102.3日志 142.4其他 17概述适用范围本规范明确了...
  • 这可能是最中肯的Redis规范

    千次阅读 2019-12-05 11:46:16
    文章目录使用规范冷热数据区分业务数据分离消息大小限制连接数...select 函数禁用事务禁用 lua 脚本扩展禁止长时间 monitorKey 规范End Redis功能强大,数据类型丰富,再快的系统,也经不住疯狂的滥用。通过禁用部分...
  • 蓝牙篇之蓝牙核心规范(V5.2)深入详解汇总 本部分介绍执行基带控制器的低级链路例程的蓝牙链路控制器规范。 1.总体概述 本部分指定蓝牙基带的正常操作。 蓝牙系统提供点对点连接或点对多点连接。 ...
  • 因为工作需要,公司组里要求考阿里巴巴编程规范,于是我花了一天的时间看了一遍,然后刷了一些题,终于在第三次的时候考过了。考试是基于《阿里巴巴Java开发手册》,一共50道题目,包括多选单选,题目都是选择题。...
  • Web前端开发规范手册

    千次阅读 多人点赞 2019-07-16 14:18:49
    文章目录1 文件命名规则a.... 图片的命名原则c....网页制作细节 ---- head区代码规范2.网页制作细节 ---- 字体3.网页制作细节 ---- 链接4.网页制作细节 ---- 表格5.网页制作细节 ---- 下载速度6.网页制作细节 ---- ...
  • 风格的重要 如果你已经从事编码工作有一段时间了的话,那你肯定会有一种自己...采用 standard 编码风格意味着 代码清晰性和社区约定的重要要高于个人的编码风格。这不一定适用于所有项目开发文化,但是开放项目
  • 【推荐】接口类中的方法属性不要加任何修饰符号(public 也不要加),保持代码的简洁 ,并加上有效的 Javadoc 注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是 与接口方法相关,并且是整个应用的...
  • Misra-C编码规范全解读 - 总目录

    千次阅读 多人点赞 2020-09-26 09:55:10
    欢迎大家来到雪云飞星的《Misra-C 2012编码规范全解读》。Misra C 作为汽车行业乃至嵌入式行业的著名编码规范,被众多的厂商采用并遵守。其有效的拦截潜在的编码风险,能帮助大家在手写代码的时候无形中提高代码质量...
  • 数仓模型命名规范

    千次阅读 2021-12-14 16:29:03
    1. 词根设计规范 词根属于数仓建设中的规范,属于元数据管理的范畴,现在把这个划到数据治理的一部分。完整的数仓建设是包含数据治理的,只是现在谈到数仓偏向于数据建模, 而谈到数据治理,更多的是关于数据规范、...
  • 规范虽然不是语言本身的硬要求,但是已经是每一个语言使用者约定俗成的一个规范。按照编程规范编写的代码,至少在代码阅读时,给人一种愉悦的心情,特别是强迫症患者。另一方面,统一的编程风格,可以减少编写错误...
  • Android的开发文档规范

    2021-03-08 18:29:34
    我们项目的代码时间时间很长,经过太多人手,代码的规范性堪忧,目前存在较多的比较自由的「代码规范」,这非常不利于项目的维护,代码可读性也不够高。 分析现有项目的代码的情况,输出的『定制化规范』文档,用于...
  • 适当的代码规范和标准绝不是消灭代码内容的创造、优雅,而是限制过度个性化,以一种普遍认可的统一方式一起做事,进而提高工作效率,降低沟通成本。 代码的字里行间流淌着的是软件和程序员的血液,质量的提升是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,752
精华内容 15,500
关键字:

命令性规范和禁止性规范