分类: 复习资料

  • 物联网工程设计与实施

    范围

    1~5 章,8、9 章

    第一章 物联网工程设计与实施

    1.1 物联网工程主要内容

    1.1.1 概念

    物联网工程 是 研究物联网系统的规划、设计、实施与管理的工程科学。

    1.1.2 内容

    1. 数据感知系统
    2. 数据接入与传输系统
    3. 数据存储系统
    4. 数据处理系统
    5. 应用系统
    6. 控制系统
    7. 安全系统
    8. 机房
    9. 网络管理系统

    1.2 物联网工程设计的目标与约束条件

    1.2.1 目标

    在系统工程科学方法指导下,根据用户需求,设计完善的方案,优选各种技术和产品,科学组织工程实施,保证建设成一个可靠性高、性价比高、易于使用、满足用户需求的系统。

    1.2.2 约束条件

    1. 政策
    2. 预算
    3. 时间
    4. 技术

    1.3 物联网工程设计原则

    1. 围绕设计目标
    2. 考虑应用要求
    3. 在需求、成本、应用、技术等因素之间寻找平衡
    4. 优先选用简单可行方案
    5. 避免简单照抄其它设计方案
    6. 具有可预见性和可扩展性

    第二章 需求分析 可行性研究

    2.1 需求分析

    目标:

    明确用户需求,为设计提供依据。

    内容:

    1. 了解背景
    2. 了解业务和安全性需求
    3. 了解物联网通信需求
    4. 物联网环境条件
    5. 信息处理能力要求
    6. 管理需求
    7. 可扩展性需求

    2.4 可行性研究

    概念:在投资决策之前,对拟建项目进行全面技术、经济分析论证的科学方法。

    目的:综合论证项目建设的必要性、财务的盈利性、经济上的合理性、技术的先进性适应性及建设条件的可能性和可行性,为投资决策提供科学依据。

    内容要求:

    1. 方案具体
    2. 内容真实
    3. 预测准确
    4. 论证严密

    第三章 网络设计

    3.1 逻辑网络设计

    逻辑网络结构描述了设备的互联和分布。

    目标

    1. 合适的运行环境
    2. 成熟稳定的技术选型
    3. 合理的网络结构
    4. 合适的运营成本
    5. 逻辑网络的可扩充性
    6. 逻辑网络的易用性
    7. 逻辑网络的可管理性
    8. 逻辑网络的安全性

    原则

    1. 先进性
    2. 高可靠性
    3. 标准化
    4. 可扩展性
    5. 易管理性
    6. 安全性
    7. 实用性
    8. 开放性

    层次化网络模型

    优点

    1. 降低网络成本
    2. 简化设计元素,易于理解,提高故障隔离程度,保证了网络的稳定性
    3. 改变一个网络节点对整体影响小

    五层模型

    研究角度

    1. 感知层
    2. 传输层
    3. 处理层
    4. 应用层

    物联网工程及实施的角度

    1. 感知层对客观世界物品或环境信息的感知(传感器)。
    2. 接入层为感知层和局域网接入汇聚层/广域网/终端用户访问网络提供支持(网卡/ZigBee模块)。
    3. 汇聚层将网络业务连接到骨干网,负责安全、流量负载、路由相关的策略。
    4. 骨干层(核心层)提供高速的数据传输,连接汇聚层,将数据传输到其他网络。
    5. 数据中心数据汇聚、存储、处理、分发。

    3.2 物理网络设计

    任务是为所涉及的逻辑网络设计特定的物理环境平台。

    第四章 数据中心设计

    任务和目标

    1. 设计高性能计算机系统
    2. 设计服务器系统
    3. 设计数据存储系统
    4. 设计核心网络
    5. 设计机房
    6. 设计机房装修方案

    4.4.2 独立磁盘冗余阵列 RAID

    把多块独立硬盘按不同方式组合形成硬盘组,提供比单个硬盘更高的存储性能 和 数据备份技术。

    第五章 物联网安全设计

    5.1 感知与标识系统安全设计

    5.1.1 RFID 系统安全设计

    RFID 使用的 4 阶段

    1. 感应
    2. 选中
    3. 认证
    4. 应用

    RFID 系统的三个特征

    1. 正确性特征,真实标签被认可
    2. 安全性特征,伪造的标签不被认可
    3. 隐私性特征,标签在未授权时不可被识别跟踪

    第八章 物联网工程实施

    实施过程

    1. 项目招投标阶段
    2. 项目启动阶段
    3. 具体实施阶段
    4. 测试阶段
    5. 项目验收阶段
    6. 售后服务和培训阶段

    第九章 物联网运行维护与管理

    测试内容

    1. 终端测试
    2. 通信线路测试
    3. 网络测试
    4. 数据中心设备测试
    5. 应用系统测试
    6. 安全测试

    测试方法

    1. 主动测试
    2. 被动测试

    ThingsBoard 简介 优缺点 应用

    ThingsBoard 是一种开源的物联网(IoT)平台,旨在帮助用户快速构建、部署和扩展物联网解决方案。它提供了一个灵活的架构和功能丰富的工具,用于连接和管理各种设备、收集和处理设备生成的数据,并通过仪表板和可视化报表展示数据。

    以下是 ThingsBoard 的一些优点:

    • 开源平台:ThingsBoard 是开源的,可以自由访问、使用和修改。这使得用户可以根据自己的需求进行定制和扩展,以满足特定的物联网应用场景。
    • 可扩展性:ThingsBoard 的架构设计具有良好的可扩展性,可以轻松地处理大规模的设备连接和数据处理需求。它支持分布式部署和集群配置,可以处理数千个设备和海量数据。
    • 多协议支持:ThingsBoard 支持多种常见的物联网通信协议,如 MQTT、CoAP、HTTP 等,使得用户可以与各种类型的设备进行连接和通信。
    • 设备管理和控制:ThingsBoard 提供了功能强大的设备管理和控制功能,包括设备注册、配置管理、远程命令和固件升级等。这使得用户可以方便地监控和管理设备状态,并进行远程控制操作。
    • 数据可视化和分析:ThingsBoard 提供了灵活的仪表板和可视化报表功能,可以实时展示设备生成的数据,并支持数据分析和报警。用户可以自定义仪表板来监控设备状态、趋势和关键指标。

    一些 ThingsBoard 的缺点可能包括:

    • 学习曲线:对于没有经验的用户来说,开始使用 ThingsBoard 可能需要一些时间来了解其概念和配置。特别是对于非技术背景的用户,可能需要一些学习和培训。
    • 自定义开发:虽然 ThingsBoard 提供了一些基本的功能和组件,但如果需要更复杂的自定义功能,可能需要进行额外的开发和定制。这可能需要一些编程知识和开发资源。

    ThingsBoard 在许多物联网应用场景中都可以应用,包括但不限于以下几个领域:

    • 工业物联网(IIoT):ThingsBoard 可以用于监控和管理工厂设备、生产线和供应链的数据。它可以提供实时数据分析、故障检测和预测维护等功能,以提高生产效率和质量。
    • 智能城市:ThingsBoard 可以用于监控和控制城市基础设施,如交通信号灯、智能路灯、垃圾桶等。它可以帮助城市管理者优化资源利用、改善交通流动性和提供智能服务。
    • 农业和环境监测:ThingsBoard 可以用于农业领域,监测土壤湿度、气象条件和农作物生长状况,以实现智能灌溉和精细化农业管理。它也可以用于环境监测,监测空气质量、水质和能源消耗等指标。
    • 物流和供应链:ThingsBoard 可以帮助物流和供应链领域监控货物的位置、温度和湿度等信息,以实现实时跟踪和预警。它可以提供实时数据分析和仓储优化,以改善物流效率和降低成本。
  • 传感器网络

    重点

    第一章 绪论

    第三章 WSN 拓扑控制与覆盖技术

    第四章 WSN 通信与组网技术

    第五章 WSN 支撑技术

    为重点

    题型

    选择(20,10*2)

    名词解释(10 分,5*2)

    简答 (25 分,5*5)

    分析计算(35 分)

    综合(10 分)

    WSN 定义

    WSN(Wireless Sensor Network)即无线传感器网络。

    无线传感器网络是大量的静止的或移动的传感器以自组织或多跳的方式构成的无线网络。目的是协作地探测、处理和传输网络覆盖区域内感知对象的监测信息,并报告给用户。

    WSN 特点

    1. 自组织性
    2. 以数据为中心
    3. 应用相关性
    4. 动态性
    5. 网络规模大
    6. 可靠性

    各种拓扑结构的优缺点

    平面网络结构

    特点

    1. 所有节点对等,功能特性一致。
    2. (优点)结构简单,易维护,较好健壮性。
    3. (缺点)没有中心管理节点,采用自组织协同算法,组网算法较为复杂。

    分级网络结构

    特点

    1. 网络分为上层和下层,上层为中心骨干节点,下层一般为传感器节点。
    2. 一个或多个骨干节点,骨干节点之间、一般传感器之间采用平面网络结构。
    3. 骨干节点为对等结构。
    4. 分级网络以簇的形式存在,簇首和成员节点
    5. 扩展性好,便于集中管理。降低成本,提高网络覆盖率、可靠性。
    6. 开销大,硬件成本高,一般传感器之间不能直接通信。

    混合网络结构

    特点

    1. 网络骨干节点之间、一般传感器节点之间都采用平面网络结构。网络骨干节点与一般传感器节点之间采用分级网络结构。
    2. 一般传感器节点之间可以相互通信,不需要通过汇聚骨干节点来转发数据。
    3. 相较于分级网络节点,功能更强,硬件成本更高。

    Mesh 网络结构

    特点

    1. 通常只允许节点与其邻居节点直接通信。
    2. 网络内部节点一般相同。
    3. 节点之间存在多条通信路径,较强容错能力和健壮性。
    4. 虽然不同节点是对等地位,但某个节点可以被指定为簇首,执行额外功能,簇首节点失效,可以由其他节点接替。
    5. 由无线节点构成网络。
    6. 每个节点至少可以和一个其它节点通信。
    7. 自我形成:节点可以自动加入网络,也可以自动离开网络。
    8. 自愈功能:当网络中某个节点失效时,网络可以自动调整,使得网络仍然可以正常工作。
    9. 支持多跳路由:节点可以通过多跳路由的方式与网络中的任何节点通信。
    10. 功耗限制和移动性取决于节点类型。
    11. 多种网络接入方式,星型、Mesh 等。

    定位

    定义

    根据有限的位置已知的节点(锚节点)来确定无线传感器网络中的其他节点(盲节点)的位置。

    四类定位算法

    1. 基于测距的定位算法、距离无关的定位算法。
    2. 基于锚节点定位和无锚节点辅助的定位算法。
    3. 集中式计算定位与分布式计算定位。
    4. 紧密耦合定位与松散耦合定位。

    性能分析

    1. 定位精度
    2. 规模
    3. 锚节点密度
    4. 节点密度
    5. 覆盖率
    6. 容错性和自适应性
    7. 功耗
    8. 成本

    节点位置计算方法

    1. 三边测量法
    2. 三角测量法
    3. 极大似然估计法
    4. 最小最大法

    基于测距的定位算法

    三个阶段:测距、定位、校正

    1. RSSI(Radio Signal Strength Indicator) 定位算法基于接收信号强度,将信号强度转换为距离,然后根据距离计算位置。
    2. TOA(Time of Arrival) 定位算法基于信号传播速度,根据信号传播时间计算距离,然后根据距离计算位置。
    3. TDOA(Time Difference of Arrival) 定位算法基于信号传播速度,根据信号传播时间差计算距离,然后根据距离计算位置。
    4. AOA(Angle of Arrival) 定位算法基于到达角定位机制,通过测量信号的方向,多点定位。(两条线的交点)

    距离无关的定位算法

    1. 质心定位算法
    2. 凸规划定位算法

    典型定位算法

    1. Active Badge 定位算法
    2. Active Office 定位算法
    3. Cricket 定位算法

    WSN 中存在的隐藏终端和暴露终端问题(书上未找到)

    “隐藏终端”(Hidden Stations):在通信领域,基站 A 向基站 B 发送信息,基站 C 未侦测到 A 也向 B 发送,故 A 和 C 同时将信号发送至 B,引起信号冲突,最终导致发送至 B 的信号都丢失了。”隐藏终端”多发生在大型单元中(一般在室外环境),这将带来效率损失,并且需要错误恢复机制。当需要传送大容量文件时,尤其需要杜绝”隐藏终端”现象的发生。

    暴露终端是指在发送节点的覆盖范围内而在接收节点的覆盖范围外的节点,暴露终端因听到发送节点的发送而可能延迟发送。但是,它其实是在接收节点的通信范围之外,它的发送不会造成冲突。这就引入了不必要的延时。

    隐藏终端和暴露终端问题产生的原因:

    由于 ad hoc 网络具有动态变化的网络拓扑结构,且工作在无线环境中,采用异步通信技术,各个移动节点共享同一个通信信道,存在信道分配和竞争问题;为了提高信道利用率,移动节点电台的频率和发射功率都比较低;并且信号受无线信道中的噪声、信道衰落和障碍物的影响,因此移动节点的通信距离受到限制,一个节点发出的信号,网络中的其它节点不一定都能收到,从而会出现“隐藏终端”和“暴露终端”问题。

    隐藏终端和暴露终端问题对 ad hoc 网络的影响:

    隐藏终端”和“暴露终端”的存在,会造成 ad hoc 网络时隙资源的无序争用和浪费,增加数据碰撞的概率,严重影响网络的吞吐量、容量和数据传输时延。在 ad hoc 网络中,当终端在某一时隙内传送信息时,若其隐藏终端在此时隙发生的同时传送信息,就会产生时隙争用冲突。受隐藏终端的影响,接收端将因为数据碰撞而不能正确接收信息,造成发送端的有效信息的丢失和大量时间的浪费(数据帧较长时尤为严重),从而降低了系统的吞吐量和量。当某个终端成为暴露终端后,由于它侦听到另外的终端对某一时隙的占用信息,而放弃了预约该时隙进行信息传送。其实,因为源终端节点和目的终端节点都不一样,暴 露终端是可以占用这个时隙来传送信息的。这样,就造成了时隙资源的浪费。

    隐藏终端和暴露终端问题的解决方法:

    解决隐藏终端问题的思路是使接收节点周围的邻居节点都能了解到它正在进行接收,目前实现的方法有两种:一种是接收节点在接收的同时发送忙音来通知邻居节点,即 BTMA 系列;另一种方法是发送节点在数据发送前与接收节点进行一次短控制消息握手交换,以短消息的方式通知邻居节点它即将进行接收,即 RTS/CTS 方式。这种方式是目前解决这个问题的主要趋势,如已经提出来的 CSMA/CA、MACA、MACAW 等。还有将两种方法结合起来使用的多址协议,如 DBTMA。

    对于隐藏发送终端问题,可以使用控制分组进行握手的方法加以解决。一个终端发送数据之前,首先要发送请求发送分组,只有听到对应该请求分组的应答信号后才能发送数据,而是收到此应答信号的其他终端必须延迟发送。

    在单信道条件下使用控制分组的方法只能解决隐发送终端,无法解决隐藏接收终端和暴露终端问题。为此,必须采用双信道的方法。即利用数据信道收发数据,利用控制信道收发控制信号 .

    数据融合

    概念:充分利用网络中各个节点的信息,通过一定的算法,将各个节点的信息进行融合,得到更加准确的信息。

    好处:

    1. 提高了信息的可信度、可靠性。
    2. 扩展系统的空间、时间覆盖能力。
    3. 减小系统的信息模糊程度。
    4. 改善系统的检测能力。
    5. 提高系统决策的正确性。

    分类:

    根据处理融合信息的方法不同:

    1. 集中式:所有节点的数据都发送到一个中心节点,由中心节点进行数据融合。
    2. 分布式:传感器对自己的数据单独进行处理,再将处理结果发送到中心节点,由中心节点进行数据融合。带宽要求低、计算速度快、可靠性和延续性好、系统生命力强。融合精度没有集中式高。
    3. 混合式:集中式和分布式相结合。系统结构变得复杂。

    根据融合处理的数据种类不同:

    1. 时间融合:同一传感器在不同时间对目标的测量值进行融合。
    2. 空间融合:不同传感器同一时刻对目标的测量值进行融合。
    3. 时空融合:不同传感器在一段时间内对目标的测量值进行融合。

    信息抽象程度不同:

    1. 数据级融合:对原始数据进行融合。
    2. 特征级融合:对数据进行特征提取,再进行融合。
    3. 决策级融合:对数据进行决策,再进行融合。优点:
      1. 灵活
      2. 带宽要求低
      3. 有效反映环境或目标的特征
      4. 具有容错性
      5. 通信量小,抗干扰能力强
      6. 对传感器依赖小
      7. 处理代价低

    MAC层协议中的CSMA/CA协议

    CSMA/CA协议是一种基于信道监听的MAC层协议,其工作原理是:在发送数据前,先监听信道,如果信道空闲,则发送数据;如果信道忙,则等待一段时间再监听,直到信道空闲,然后发送数据。如果信道忙,等待的时间超过了一个阈值,则放弃发送,等待下一次发送机会。

    信道(通信介质资源)分配的方式(动、静态)区别

    静态信道分配:在通信开始前,就已经确定了通信资源的分配情况,通信过程中不再改变。

    动态信道分配:通信过程中,根据通信的需要,动态地分配通信资源。

    RFID 系统的工作流程

    RFID 的定义:

    RFID(Radio Frequency Identification)射频识别技术,是一种无线通信技术,它利用电磁场自动识别标签(Tag)上的信息,存储的信息可以是一个电子产品代码,也可以是一个人的身份证号码,还可以是一个包裹的运输信息等等。

    RFID 系统的组成:

    1. RFID 标签:由芯片和天线组成,用于存储和传输数据。
    2. 阅读器:用于读取标签中的数据。

    RFID 系统的工作流程

    阅读器向标签发送激励信号,激励信号的频率与标签的工作频率相同,标签接收到激励信号后,从中提取能量,激励标签工作。

  • 软件测试复习

    题型

    判断、简答、应用、综合

    重点

    软件测试的定义

    使用人工或自动手段来运行和测定某个系统的过程,其目的在于检验系统是否 满足规定的需求 或是弄清预期结果与实际结果之间的差异。

    缺陷的概念

    质量的含义

    是产品或服务所满足明示或暗示需求能力的固有属性和特征的集合

    质量的特性

    1. 功能适应性
    2. 效率
    3. 兼容性
    4. 易用性
    5. 可靠性
    6. 安全性
    7. 可维护性
    8. 可移植性

    缺陷的定义

    1. 从产品内部看,软件缺陷是指产品开发或维护过程中存在的错误、毛病。
    2. 从外部看,软件缺陷是系统所需要实现的某种功能的失效或违背。

    缺陷的来源、构成

    1. 需求定义
    2. 初步设计
    3. 详细设计
    4. 代码

    集成

    集成是指将各个独立的软件组件(模块、子系统等)合并在一起,以验证它们在整体系统中的交互和协作是否正常工作。集成测试旨在检测不同组件之间的接口问题、数据传递问题、功能一致性以及整体系统的稳定性和可靠性。

    自动化测试的概念

    自动化测试是指使用软件来控制测试设备,执行测试用例,比较实际结果和预期结果,从而自动化地完成测试过程。

    了解什么是压力、动态、静态、回归、阿尔法(伽马、贝塔)测试

    压力测试

    压力测试是指在系统正常工作负载的情况下,通过长时间或超大负荷地运行测试软件,来测试系统的性能指标。可以了解系统可靠性、性能瓶颈。

    动态测试

    动态测试是指在软件运行时,通过运行测试用例来检测软件的功能、性能、安全性等特性。

    静态测试

    静态测试是指在软件运行之前,通过检查源代码、设计文档、用户手册等来检测软件的功能、性能、安全性等特性。

    回归测试

    回归测试是指在软件发生变更之后,通过运行测试用例来检测软件的功能、性能、安全性等特性。

    阿尔法(伽马、贝塔)测试(α测γ测β测)

    阿尔法测试是指在软件开发过程中,由软件开发者在开发环境下,通过运行测试用例来检测软件的功能、性能、安全性等特性。

    黑白盒测试

    黑盒测试

    黑盒测试是指在软件运行时,通过运行测试用例来检测软件的功能、性能、安全性等特性,但是不考虑软件内部的结构和工作原理。

    白盒测试

    白盒测试是指在软件运行时,通过运行测试用例来检测软件的功能、性能、安全性等特性,同时考虑软件内部的结构和工作原理。

    语句覆盖

    语句覆盖是指在软件运行时,要求每个语句至少被执行一次。

    判定覆盖

    判定覆盖是指在软件运行时,要求每个判定的每个可能的结果至少被执行一次。

    条件覆盖

    条件覆盖是指在软件运行时,要求每个判定的每个条件的每个可能的结果至少被执行一次。

    因果图

    因果图是一种图形化的测试用例设计方法,它将程序的逻辑结构表示为一个有向图,图中的节点表示程序中的语句,图中的边表示程序中的控制流。

    测试过程的目的是什么?

    1. 功能测试:验证每个功能是否按照事先定义的要求工作。
    2. 性能测试:评测分析系统在不同负载下的运行情况、性能指标。
    3. 安全性测试:测试系统在应对非授权的访问、故意损坏时的系统防护能力。
    4. 兼容性测试:测试系统在不同的硬件、软件、网络环境下的运行情况。也包括共存、互操作性测试。
    5. 可靠性测试:检验系统是否能保持长期稳定、正常地运行。
    6. 易用性测试:测试系统是否容易学习、使用、理解,界面美观、交互友好。
    7. 回归测试:测试系统在发生变更之后,是否仍然能够正常工作。

    软件缺陷的分级

    分级

    1. 致命的:系统崩溃、数据丢失、系统不可用、系统不稳定、系统不可恢复。
    2. 严重的:系统功能不完整、系统功能不正确、系统性能不足、系统安全性不足。
    3. 一般的:系统界面不美观、系统界面不友好、系统易用性不足、系统易学性不足。
    4. 微小的:错别字、文字排列不整齐等。

    完整软件测试的流程

    软件工程过程来看

    1. 需求评审
    2. 设计评审
    3. 单元测试
    4. 集成测试
    5. 系统测试
    6. 验收测试

    项目管理的角度看

    1. 测试计划
    2. 测试设计
    3. 执行与监控
    4. 结果分析与评估
    5. 项目总结

    接口测试概念

    验证不同软件系统、模块或组件之间的接口是否正常工作。

    接口是不同软件实体之间进行通信和交互的方式,接口测试的目的是确保这些接口能够按照规范进行正确的数据传递、请求处理和响应。

    自动化测试流程

    什么是自动化测试

    把以人为驱动的测试行为转化为机器执行的一种过程。

    流程

    1. 测试环境的搭建和设置
    2. 基于模型实现测试设计的自动化
    3. 脚本自动生成
    4. 测试数据的自动产生
    5. 测试操作步骤的自动执行
    6. 测试结果分析
    7. 测试流程的自动处理
    8. 测试报告自动生成

    上机实验的内容和原理(等价类、决策表、有效等价类和无效等价类)【不会很复杂】

    等价类

    等价类是指在测试过程中,将输入域划分为若干个子集,使得每个子集中的输入数据对于测试来说是等价的。

    1. 弱一般等价类测试
    2. 强一般等价类测试
    3. 弱健壮等价类测试
    4. 强健壮等价类测试

    一般/健壮:是否考虑无效等价类 强/弱:单缺陷假设还是多缺陷假设

    如果实现语言是强类型,则不必使用健壮形式测试。

    决策表

    决策表是一种测试设计技术,它是一种表格,用来描述系统的行为,它的每一行代表一个测试用例,每一列代表一个输入条件或一个动作。

    有效等价类和无效等价类

    有效等价类是指在测试过程中,将输入域划分为若干个子集,使得每个子集中的输入数据对于测试来说是有效的。

    无效等价类是指在测试过程中,将输入域划分为若干个子集,使得每个子集中的输入数据对于测试来说是无效的。

    边界值分析

    边界值测试是软件测试中的一种策略,旨在检测系统在边界条件下的行为和处理能力。边界值测试的基本概念是,错误和异常往往在接近数据范围的边界处发生。

    目前流行的技术怎么进行测试

    1. 单元测试
    2. 集成测试
    3. 系统测试
    4. 专项测试
    5. 软件本地化测试

    笔记

    软件测试-Sofeware Test

    测试用例-Test Case

    测试执行前设计的一套详细测试方案,包括测试环境(硬件、软件、网络)、测试步骤、测试数据、预期结果等。

    SQA – Software Quality Assurance-软件质量保证

    是一项管理性工作,侧重于对流程的评审和监控。

    Test – 测试

    是一项技术性工作,侧重于对产品的评估和验证。

    TDD – Test Driven Development-测试驱动开发

    是一种敏捷开发的技术,它要求在编写功能代码之前,先编写单元测试代码,然后只编写使单元测试通过的功能代码,从而达到测试驱动开发的目的。

    ALAC – Act Like A Customer-像一个客户一样做

    基于客户使用产品的知识开发出的测试方法

    如何降低测试规模,并保证测试的典型性?

    组合分析是一种基于每对参数组合的测试技术。

    V 模型

    一种软件开发过程模型,它将软件开发过程分为软件开发和软件测试两个部分,两个部分是对称的,相互对应。

    W 模型

    V 模型的修改版。

    1. 测试过程和开发过程同步
    2. 测试过程是对开发过程中阶段性成果和最终的产品进行验证的过程。两者相互依赖
    3. 两者各有特点,存在差异。

    判定表

    条件桩:条件(就是表头)

    动作桩:动作(结果的取值)

    条件项:条件桩中的一项的取值

    动作项:在各种条件项组合下采取的动作

    驱动程序和桩模块

    这是单元测试中的概念,在单元测试中为了隔离单元,需要用到驱动程序和桩程序。

    驱动程序:用于驱动被测程序的模块,它调用被测模块,给被测模块传递参数。

    桩程序:模拟被测模块调用的下级模块。当被测模块依赖于其它单元,测试时为了隔离被测模块,需要用桩程序来模拟被测模块调用的下级模块。

    JUnit 5 的常用注解

    1. @Test:标记测试方法
    2. @ParameterizedTest:参数化测试
    3. @RepeatedTest:重复测试
    4. @TestFactory:动态测试
    5. @BeforeEach:在每个测试方法之前执行
    6. @AfterEach:在每个测试方法之后执行
    7. @BeforeAll:在所有测试方法之前执行
    8. @AfterAll:在所有测试方法之后执行
    9. @TestTemplate:测试模板
    10. @TestMethodOrder:测试方法的执行顺序
    11. @DisplayName:测试方法的显示名称
  • 射频识别与传感器技术

    头大,学的什么东西。By the way,图还得我自己来。

    PDF放前面,Markdown放这里。

    题型

    1. 选择题 10 分
    2. 名词解释 25 分
    3. 简答题 36 分
    4. 计算分析 15 分
    5. 论述 14 分

    测量方法

    根据获得测量值的方法

    1. 直接测量 实际结果 = 测量结果 y = x
    2. 间接测量 实际结果 y = 一个测得值 x 或多个测得值 x1,x2,…,xn 的函数。 y = f(x) y = f(x1,x2,…,xn)
    3. 组合测量 若实际结果必须经过求解联立方程组求得,称为组合测量。 如:$$
      \left\{\begin{matrix}x_{1}=f_{1}(y_{1},y_{2},…,y_{m}) \\x_{2}=f_{2}(y_{1},y_{2},…,y_{m}) \\\vdots \\x_{3}=f_{3}(y_{1},y_{2},…,y_{m}) \end{matrix}\right.
      $$

    根据测量方式

    1. 偏差式测量 仪表指针的位移决定被测量的量值。精度较低。
    2. 零位式测量 用指零仪表的零位反映测量系统的平衡状态,测量系统平衡时,用已知的标准量决定被测量的量值。
    3. 微差式测量 将被测量与已知标准量相比较,取得差值后,用偏差法测得此值。

    根据测量条件

    1. 等精度测量 影响和决定误差大小的全部因素始终保持不变。
    2. 不等精度测量 不同测量条件下,用不同精度的仪表,不同的测量方法,不同的测量次数,不同的测量者。

    根据被测量变化快慢

    1. 静态测量 被测量在测量过程中固定不变。不需要考虑时间因素对测量的影响。
    2. 动态测量 被测量在测量过程中不断变化。

    根据测量敏感元件是否与被测介质接触

    1. 接触式测量
    2. 非接触式测量

    根据测量系统是否向被测对象施加能量

    1. 主动式测量
    2. 被动式测量

    检测系统的构成

    传感器感受被测量的大小,并输出相对应的输出信号。

    信号调理电路对传感器输出的电信号进行处理。

    显示器将所得信号变成人的感官可以接受的信号。

    数据处理装置对测得的数据进行处理、运算、分析、对动态测试结果进行频谱分析。

    执行机构通断、控制、调节、保护。

    传感器的静态特性和动态特性

    静态特性

    1. 灵敏度$$
      S=\frac{\Delta y}{\Delta x}
      $$
      输出量增量与输入量增量之比。S 越大越灵敏。输入输出特性曲线上某点的斜率就是灵敏度
    2. 线性度 传感器的输出与输入之间数量关系的线性程度。
    3. 迟滞 相同工作条件下,输入量由小到大(正行程)及输入量由大到小(反行程)变化期间其输入输出特性曲线不重合的现象称为迟滞。差值称为迟滞差值。最大迟滞差值 ΔHmax 与满量程输出值 YFS 称为迟滞误差,用 γH 表示。$$
      \gamma_{H}=\frac{\Delta H_{max}}{Y_{FS}}\times 100\%
      $$
    4. 重复性 相同工作条件下,输入量按同一方向做全量程连续多次变化时,所得特性曲线不一致的程度。
    5. 漂移 输入量不变,输出量随时间变化。

    动态特性

    输入量随时间变化时传感器的响应特性。


    金属应变片的工作原理

    电阻应变效应:导体在外界作用下产生机械变形(拉伸 / 压缩)时,其电阻值相应发生变化。

    被测量使弹性元件产生应变,应变再由应变片产生相应的电阻变化,因而通过测量电阻,可以得到被测量的大小。

    半导体应变片工作原理

    半导体材料的电阻率 ρ 随作用应力的变化而变化。

    电阻应变片测量电路

    不平衡电桥

    $$
    易知,E_{D} = E,E_{A} = 0. \\ 初状态为平衡,故有 \\ E_{B} = E_{C} \\ 即有 \\ \frac{R_{2}}{R_{1}}=\frac{R_{4}}{R_{3}} \\ 当 R_{1} 变化,有 \\ E_{B}=E \cdot (\frac{R_{1}+\Delta R_{1}}{R_1+R_2+\Delta R_1})\\ E_C=E \cdot (\frac{R_3}{R_3+R_4})=E \cdot (\frac{R_1}{R_1+R_2})\\ 此时 U_0=E_B-E_C\\ 由糖水不等式,显然 E_B>E_C\\ \begin{split} U_0&=E\cdot \frac{(R_1+\Delta R_1)(R_1+R_2)-R_1(R_1+R_2+\Delta R_1)}{(R_1+R_2+\Delta R_1)(R_1+R_2)}\\ &=E\cdot\frac{\Delta R_1\cdot R_2}{(R_1+R_2)^2+\Delta R_1(R_1+R_2)} \end{split}\\ 相对于 (R_1+R_2)^2 来说,\Delta R_1(R_1+R_2) 可忽略不计\\ 分数上下同除以 R_1^2,令 n=\frac{R_2}{R_1}\\ 故\\ U_0=\frac{n}{(1+n)^2} \cdot \frac{\Delta R_1}{R_1}\cdot E
    $$

    自感式电感传感器工作原理

    利用线圈自感量的变化测量。

    传感器的运动部分与衔铁相连,被测量变化时,衔铁产生位移,引起磁路中电阻变化,使得电感线圈的电感量变化,测量出这种变化,就能确定衔铁位移量大小和方向。

    差动变压器式传感器工作原理

    变压器的次级线圈产生感应电压,两个相同的次级线圈接成差动的形式,即反向串联,即成为差动变压器。铁芯做成活动的,则变成差动变压器式传感器。铁芯运动时,在次级绕组中产生感应电势,测量这种电势即可得到被测量。

    衔铁向上运动,则 U2 > 0。

    电涡流式传感器工作原理

    块状金属导体置于变化的磁场中或在磁场中做切割磁感线运动时,导体内将产生旋涡状的感应电流,称为电涡流。

    当传感器激励线圈通过交变电流 I1 ,线圈周围产生交变磁场 H1 ,使得置于此磁场中的被测导体产生电涡流 I2 ,产生反向的新的交变磁场 H2。使得传感器激励线圈的电感量、阻抗、品质因数变化,即线圈等效阻抗发生变化。

    线圈等效阻抗 Z的变化与被测金属导体电阻率 ρ磁导率 μ几何形状/尺寸因子 r激磁电流频率 f线圈与被测金属导体的距离 x有关,若使得其中一个为变量,其它因素不变,则可通过测量 Z 来测量这个变化量。

    电容式传感器的工作原理

    将被测非电量的变化转换成电容量变化。

    平行板电容器的电容如下

    $$
    C=\frac{\varepsilon A}{d}\\ \\ \varepsilon-平行板间介质介电常数\\ A-极板所覆盖的面积\\ d-极板间距离
    $$

    当被测参数变化使得式中某一参数变化,就可以把参数变化转换为电容变化,通过测量电路就可转换为电量输出。

    分类

    1. 变极距型
    2. 变面积型
    3. 变介质型

    压电效应、逆压电效应

    某些电介质当沿着一定方向对其施力而使其变形时,内部产生极化现象,同时在它两个表面上产生符号相反的电荷,外力去掉后,又重新恢复到不带电的状态,称为 压电效应

    当在电介质极化方向施加电场时,电介质也会产生几何变形,称为 逆压电效应

    霍尔传感器原理与应用

    霍尔效应

    置于磁场中的静止载流导体,当它的电流方向与磁场方向不一致时,载流导体上垂直于电流和磁场的方向上将产生电势差,该电势差称为霍尔电势差。

    应用

    1. 霍尔式位移传感器
    2. 霍尔式转速传感器
    3. 霍尔计数装置

    光电式传感器

    外光电效应

    在光线作用下,物体内电子逸出物体表面向外发射的现象。

    这种电子称为光电子。

    内光电效应

    在光线作用下,物体的导电性能发生变化或产生光生电动势的效应。

    两类

    1. 光电导效应 在光线作用下,半导体材料吸收入射光子能量,若能量大于等于半导体材料的禁带宽度,就激发出 电子 – 空穴对,使载流子浓度增加,半导体导电性增加,阻值减低。是光敏电阻的原理。
    2. 光生伏特效应 光线的作用下能够使物体产生一定方向的电动势的现象。是光电池的原理。

    光敏电阻

    无光照时,光敏电阻阻值很大,电路中电流很小。被一定波长的光范围的光照后,其阻值急剧减小,电路中电流迅速增大。

    光敏二极管

    没有光照射时,反向电阻很大,反向电流很小。被光照射时,形成光电流,光照强度越大,光电流越大。

    因此不受光照射时,光敏二极管处于截止状态,而受到光照射时,光敏二极管处于导通状态。

    光敏三极管

    集电极电流是光电流的 β 倍,因此光敏晶体管具有放大作用。

    光电池

    原理是光生伏特效应,其本质是一个大面积的 PN 结,当光照射到 PN 结的一个面,光子能量大于半导体材料的禁带宽度,电池每吸收一个光子就产生一对自由电子和空穴,电子 – 空穴对从表面向内扩散,建立一个和光照强度有关的电动势。

    光电耦合器件

    是由发光元件(如发光二极管)和光电接收元件(如光敏二极管、光敏三极管等)合并使用,以光作为媒介把输入端的电信号耦合到输出端的一种器件。

    1. 用于实现电隔离的光电耦合器 有时可以取代继电器、变压器、斩波器。
    2. 用于检测物体位置或有无物体的光电开关

    体积小、寿命长、无触点、抗干扰能力强、输出输入绝缘、可以单向传输 模拟信号或数字信号。

    光电开关的工作原理

    光电开关是一种利用感光元件对变化的入射光加以吸收,并进行光电转换,同时加以某种形式的放大和控制,从而获得最终的控制输出“开”“关”信号的器件。

    气敏传感器的工作原理

    原理:利用气体在半导体表面的氧化和还原反应导致敏感元件阻值变化。当氧化型气体吸附到 N 型半导体上,还原型气体吸附到 P 型半导体上时,半导体载流子减少,使电阻值增大。将上述条件反过来则使其电阻值减小。

    湿敏传感器的工作原理

    湿敏传感器是能够感受外界湿度变化,并通过器件材料的物理或化学性质变化,将湿度转化成有用信号的器件。

    超声波传感器的工作原理与应用

    利用超声波在超声场中的物理特性和各种效应而研制的装置称为超声波传感器、换能器或探测器。

    超声波探头:是超声波的发射器和接收器。

    压电式:利用压电材料的逆压电效应把高频电振动转换成高频机械振动,产生超声波。利用压电效应把超声振动转换为电信号,接收超声波。

    应用:

    1. 超声波物位传感器:超声波物位传感器是利用超声波在两种介质的分界面上的反射特性制成的。如果从发射超声脉冲开始,到接收探头接收到反射波为止的这个时间间隔为已知,就可以求出分界面的位置,利用这种方法可以对物位进行测量。
    2. 超声波流量传感器:超声波流量传感器的测定方法是多样的,但目前应用较广的主要是超声波传播速度变化法。超声波在流体中传播时,在静止流体和流动流体中的传播速度是不同的,利用这一特点可以求出流体的速度,再根据横截面积,便可以知道流体的流量。

    红外感应系统的工作原理

    红外辐射的本质是热辐射,温度低的物体辐射的红外线波长长,温度高的物体辐射的红外线波长短。在一般常温下,所有物体都是红外辐射的发射源,但发射的红外波长不同。红外感应实际就是根据物体因表面温度不同会发出不同波段的红外光这一特性进行检测的。

    编码器的原理与应用

    原理

    编码器是将角位移和线位移转换成数字量的一种数字传感器,它以高精度、高分辨率和高可靠性被广泛用于各种位移的测量。

    应用

    1. 角度位置测量
    2. 数字测速

    热电传感器

    热电偶测温原理

    两种不同材料的导体(或半导体)组成一个闭合回路,当两接点温度 T 和 T0 不同时,则在该回路中就会产生电动势,这种现象称为热电效应,该电动势称为热电势。这两种不同材料的导体或半导体的组合称为热电偶,导体 A、B 称为热电极。

    三个基本定律

    中间温度定律 在热电偶测温回路中,tc为热电极上某一点的温度,热电偶 AB 在接点温度为 t、t0 时的热电势 EAB( t, t0) 等于热电偶 AB 在接点温度 t、tc 和 tc、t0 时的热电势 EAB( t, tc ) 和 EAB( tc, t0) 的代数和,即$$
    E_{AB}(t,t_0)=E_{AB}(t,t_C)+E_{AB}(t_C,t_0)
    $$

    均质导体定律 由两种均质导体组成的热电偶,其热电动势的大小只与两材料及两接点温度有关,与热电偶的大小尺寸、形状及沿电极各处的温度分布无关。这条定理说明:热电偶必须由两种不同性质的均质材料构成。

    中间导体定律 在热电偶测温回路内,接入第三种导体时,只要第三种导体的两端温度相同,则对回路的总热电势没有影响。

  • 软件工程复习

    燃尽了,写到半夜两点。

  • 计算机网络 复习

    这是个重量级的复习资料,因为疫情提前放假,我足足复习了一个月,只能说薄纱期末了。

  • 汇编复习

    考试范围

    1、题型:简答(6 个,24 分);计算写出 OF SF ZF CF 值;指令执行题;内存绘制题;编程题;论述题

    2、第一、二、三章(汇编语言的组合;计算机中数和符号的表示;补码的加减运算;逻辑运算规则;汇编程序的优势;寄存器的作用和组成;8086 结构特征;段;有效地址、物理地址;外设和接口;32 位 CPU 工作模式;汇编编程所需文件;上机步骤)

    第四章(寻址方式)

    第五章(指令系统)

    第六章(伪指令,变量属性,赋值伪指令,过程定义伪指令,数值回送伪指令)

    第七章(分支,循环)

    第一章 基础

    1.1 简介

    1.1.1 机器语言与汇编语言

    三类计算机程序设计语言:

    1. 机器语言
    2. 汇编语言
    3. 高级语言

    汇编指令也称为符号指令。汇编语言也称为符号语言。符号也称为助记符。

    汇编程序 是把汇编语言源程序翻译成机器码的程序。这个过程称为 汇编

    1.1.2 汇编语言的组成

    1. 汇编指令:机器码助记符,是汇编语言的核心
    2. 伪指令:没有对应机器码,计算机不执行
    3. 其他符号:如 +、-、*、/ 编译器识别,没有对应机器码

    1.1.3 学习意义

    1. 对于计算机应用开发有重要作用
    2. 是从根本上认识和理解计算机工作过程的最好办法

    1.2 数据表示

    1.2.1 进制转换

    1. B 二进制
    2. D 十进制
    3. H 十六进制

    101101(B)=45(D)=101101B=45D=1011012=4510

    1.2.2 二进制和十六进制的运算

    1.2.3 带符号数的补码

    补码符号位数据位
    正数0
    000
    负数1其正数数据位反码再把最低位加一

    性质:补码的补码是原码。

    1.2.4 补码加减法

    [ X + Y ] = [ X ] +[ Y ]

    [ X – Y ] = [ X ] +[ – Y ]

    不必考虑数字的正负,符号位直接参与运算。最高位的进位丢弃。

    1.2.7 逻辑运算

    1. 与 AND
    2. 或 OR
    3. 非 NOT
    4. 异或 XOR异或就是异,不一样则 true。

    小结

    1. 汇编语言的优势?因为用汇编语言设计的程序最终被转换成机器指令,故能够保持机器语言的一致性,直接、简捷,并能像机器指令一样访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O 端口等。使用汇编语言,可以访问所有能够被访问的软、硬件资源。目标代码简短,占用内存少,执行速度快,是高效的程序设计语言,经常与高级语言配合使用,以改善程序的执行速度和效率,弥补高级语言在硬件控制方面的不足,应用十分广泛。

    第二章 计算机基本原理

    2.1 计算机系统组成

    基本工作原理

    1. 存储程序
    2. 程序控制

    这种原理称为冯诺依曼原理,这样的计算机称为冯诺依曼计算机,这种计算机的体系结构称为冯诺依曼结构。

    典型冯诺依曼结构如图所示。

    主要部分:

    1. 中央处理器
    2. 存储器
    3. 输入/输出子系统

    三部分由系统总线连在一起。

    2.2 存储器

    2.2.2 存储器

    1. 基本存储单元
      • 最小单位:一个二进制位 bit
      • 一个字节:八位二进制 Byte
      • 一字 (Word):2 字节 Word
      • 双字:2 字 32 位
      80×86 微机内存储器以字节为基本单位。即读写至少是一个字节。(隐藏知识点,地址按照字节编码)
    2. 字的存储一字 16 位,高八位为高位字节,低八位为低位字节。规定高位字节在高地址单元,低位字节在低地址单元。

    2.2.3 存储器分段

    1. 分段概念8086 系统有 20 根地址线,可以寻址 1MB。但 8086 系统是 16 位机,16 位结构解决 20 位地址,采用分段法。段的划分并不是在内存,是来自 CPU。计算物理地址 段地址 * 16 + 偏移地址 = 物理地址。 (注意,* 16 是左移 4 位,不是左移 16 位!)每个段 64KB,因为偏移地址 16 位。意义:使得程序设计时,程序保持相对的完整性。
    2. 段的类型存储器逻辑分段类型:
      • 代码段 存放指令,段基址存放在段寄存器 CS(Code Segment)
      • 数据段 存放数据,段基址存放在段寄存器 DS(Data Segment)
      • 附加段 辅助存放数据,段基址存放在段寄存器 ES(Extra Segment)
      • 堆栈段 重要的数据结构,可用来保存数据、地址和系统参数,段基址存放在段寄存器 SS(Stack Segment)
      编写汇编时必须有代码段,而数据段、堆栈段、附加段可以根据需要选择。

    2.2.4 逻辑地址

    用户编程时使用的地址。

    段地址和偏移地址都是 16 位二进制数。

    有可能多个逻辑地址组织对应到同一个物理单元上。因此逻辑地址不是唯一的。

    CPU 要想读写数据,需要进行下面三类交互:

    1. 存储单元地址
    2. 器件选择,读/写命令
    3. 读/写数据

    地址、数据、控制信息传送是通过 总线 的。总线有三类:

    1. 地址总线
    2. 控制总线
    3. 数据总线

    2.3 寄存器

    2.3.1 寄存器介绍

    典型 CPU 由 运算器、控制器、寄存器 等器件构成。

    8086 CPU 有 14 个寄存器。

    按使用类别划分,寄存器分三类:

    1. 通用寄存器
    2. 段寄存器
    3. 专用寄存器

    寄存器组如下:

    1. 通用数据寄存器
      • AX Accumulator,累加器,运算时较多使用
      • BX Base,基址寄存器,除了存储数据,一般存放一段内存的起始偏移地址
      • CX Count,计数寄存器,除了存储数据,一般存放重复操作的次数
      • DX Data,数据寄存器,除了存储数据,有时存放 32 位数据的高 16 位
      这四个寄存器可以分成两个独立的 8 位寄存器来使用,AX 的高八位寄存器为 AH(Accumulator High),低八位为 AL(Accumulator Low)。其它寄存器同理。
    2. 地址寄存器
      • SP Stack Pointer,堆栈指针寄存器,存放堆栈栈顶偏移地址
      • BP Base Pointer,基址指针寄存器,存放内存中数据的偏移地址
      • SI Source Index,源变址寄存器,经常用来存放内存中源数据区的偏移地址。变址寄存器指的是,在某些指令作用下它可以自动递增或递减其中的值。
      • DI Destination Index,目的变址寄存器,经常用来存放内存中目的数据区的偏移地址,在某些指令作用下它可以自动递增或递减其中的值。
      这四个寄存器不能拆分使用。
    3. 段寄存器
      • CS Code Segment,代码段寄存器,存放当前正在执行的程序段的地址。
      • SS Stack Segment,堆栈段寄存器,存放堆栈段的段基址。
      • DS Data Segment,数据段寄存器,用来存放数据段的段基址。
      • ES Extra Segment,附加段寄存器,用来存放另一个数据段的段基址。 32 位 8086 处理器增加了两个段寄存器 FS、GS,功能类似 ES(EFG 可还行)。
      32 位的 8086 处理器仍然使用 16 位的段寄存器,但是存储内容变化了。
    4. 指令指针寄存器
      • IP Instruction Pointer,指令指针寄存器,存放即将执行指令的偏移地址。
    5. 标志寄存器
      • FLAGS 存放 CPU 的两类标志:
        • 状态标志反映处理器当前的状态(溢出,进位等)。六个状态标志:
          • CF Carry Flag 进位/借位标志,表示加法有进位或者减法有借位。
          • PF Parity Flag 奇偶标志,1 表示运算结果低八位有偶数个“1”。
          • AF Assistent carry Flag 辅助进位标志。
          • ZF Zero Flag 零标志,1 则运算结果为 0。
          • SF Sort Flag 符号标志,是运算结果最高位(符号位),如果未溢出,1 为负数,0 为非负数。如果溢出了,结果就因错误而无意义,但符号标志仍然可以标志正负,溢出后,1 为正,0 为负(与正常结果相反)。
          • OF Overflow Flag 溢出标志,1 则结果错误。无符号数也有这个标志但可以不处理。
        • 控制标志控制 CPU 的工作方式,如 是否响应可屏蔽中断。三个控制标志:
          • TF
          • IF Interrupt Flag 中断允许,1 表示允许处理器响应可屏蔽中断请求信号,称为开中断。反之则关中断。
          • DF Direction Flags 方向标志,0 时用增加的方式修改源或目的地址。见 SI/DI 寄存器
        标志名标志为 1标志为 0OF 溢出 是/否OVNVDF 方向 减/增DNUPIF 中断 允许/不允许EIDISF 符号 负/正NGPLZF 零 是/否ZRNZAF 辅助进位 有/无ACNAPF 奇偶 偶/奇PEPOCF 进位 有/无CYNC状态标志每次运算后自动产生,控制标志的值由指令设定。

    2.3.2 CS 和 IP

    CS 是 Code Segment 代码段寄存器,IP 是 Instruction Pointer 指令指针寄存器。

    提供了 CPU 要执行的指令的地址。因此如果内存中的一段信息被 CPU 执行过,就一定被 CS:IP 指向过。

    2.3.3 堆栈

    数据存入 堆栈 是以 的方式存入(16 位),后存入的数据,物理地址小/低。栈指针 SP 指向栈顶,压栈则 -2。

    常常用于保存调用的程序的返回地址和现场参数,也可以作为一种临时的数据存储区。

    2.4 外设和接口

    外设(外部设备)也称为 输入/输出设备,通过 输入/输出接口 与主机连接。

    接口一方面连接外设,一方面通过总线与主机相连。接口内有若干寄存器,用于在 CPU 与外部设备之间传递信息。系统对外设接口中的寄存器进行统一编号,称为端口号。CPU 可以通过端口地址来区分和访问不同的外设。

    端口/寄存器分为以下3类

    1. 数据端口 用来存放需要传递的数据。起数据缓冲作用。方向可以是输入/输出。
    2. 控制端口 传递 CPU 对外部设备的控制信号。例如启动磁盘工作。方向总是输出。
    3. 状态端口 协调外设与主机的同步。反映外设工作状态。例如某设备还未准备好接收数据,则不能向它发送数据。状态端口的传送方向对于 CPU 而言总是输入。

    CPU与I/O接口中的端口的信息传输是通过数据总线进行的。

    2.5 32 位 8086CPU 的工作模式

    1. 实模式 兼容 16 位机的特点,内存寻址范围 0 ~ 0FFFFFH 的 1MB 空间,地址线低 20 位有效。可以使用 32 位寄存器和 32 位操作数,MS DOS 只能在实模式下运行。
    2. 保护模式 是 32 位 8086CPU 的主要工作模式,特点是 全部地址线参与寻址 ,程序使用 逻辑地址,或者称为虚拟地址。虚拟地址的段选择符存放在寄存器中,应用程序不能更改,操作系统决定。 物理地址 是 16 位段选择符对应的 32 位段基址 和 32 位偏移地址组成。32 位即 4GB 大小。 采用虚拟地址使得各程序之间有严格的内存保护和隔离。
    3. 虚拟 8086 模式 就是生成多个虚拟的 8086CPU,以便运行实模式下的 8086 程序。 支持内存保护和隔离,可以同时运行多个程序。 Windows 下在 DOS 窗口运行一个 DOS 应用程序,则该程序运行在虚拟 8086 模式下。

    小结

    1. 8086 结构特征
      1. 数据总线为 16 位;
      2. 运算器一次最多可以处理 16 位的数据;
      3. 寄存器的最大宽度为 16 位;
      4. 寄存器和运算器之间的通路为 16 位

    第三章 汇编语言程序实例及上机操作

    3.1 汇编语言的工作环境

    3.1.1 汇编语言的系统工作文件

    代码到程序三步骤

    1. 编辑
    2. 汇编
    3. 连接

    编辑形成 .ASM 文件(代码文件),汇编成为 .OBJ 文件,连接形成 .EXE 文件。

    因此需要有四种程序:

    1. 编辑程序如记事本,EDIT.COM。
    2. 汇编程序如 MASM.EXE。
    3. 连接程序如 LINK.EXE
    4. 调试程序如 DEBUG.EXE

    3.2 实例

     code    segment         ;
     assume cs:code ; 说明语句,指定CODE段与CS寄存器关联。
     start: mov ah,1 ; START:是一个标号,MOV AH,1指令表示把1送AH寄存器,这是因为DOS系统功能的1号功能是键盘输入,所以要把功能号1送AH。
      int 21h ; INT 21H 指令即调用DOS系统功能,其1号功能被执行,程序等待键盘输入,从键盘输入一个字符后,程序才继续执行。注意,这个从键盘输入的字符到哪里去了呢?它被放到寄存器AL中,是该字符的ASCII码。如果是字符“A”,则AL中就为41H。
      mov dl,al ; 把AL送DL寄存器。
      add dl,1 ; DL内容加1。为后面的2号功能调用准备输出的字符。
      mov ah,2 ; 调用DOS系统功能的2号功能,显示DL中的字符。
      int 21h ; 执行
      mov ah,4ch ; 调用DOS系统功能的4CH号功能,4CH号功能是程序结束并返回到操作系统。
      int 21h ; 执行
     code ends ;
             end start ; 说明语句,告诉汇编程序,汇编到此结束,程序的启动地址为标号为START的那条指令(第3行)。

    解析:

    CODE 是段名,SEGMENTENDS 是关键字。

    第 1 行 CODE SEGMENT 和第 11 行 CODE ENDS 这 一对说明语句,定义了代码。

    第四章 操作数的寻址方式

    1. 立即寻址方式 MOV AL,6H 指令 目的 数字 源操作数是数字。直接把数字复制进入目的操作数。 只适用于源操作数,类型要和目的操作数相同(同样是字/字节)
    2. 寄存器寻址 MOV AX,BX 源操作数是寄存器。读出寄存器的值,写入目的操作数。
    3. 直接寻址方式 MOV AX,DS:[4050H] MOV AX,[4050] 源操作数是逻辑地址。读出地址的存储单元的值,写入目的操作数。
    4. 寄存器间接寻址方法 MOV AX,[BX] 操作数的地址 EA 在寄存器中。 读入 BX 的值,计算物理地址,再读物理地址的值,写入目的操作数。这里与直接寻址方式的区别在于读了两次,且第一次是寄存器,第二次也是寄存器。 注意,寄存器间接寻址中只允许
      1. BX(DS) Base 基址寄存器,Data Segment 数据段
      2. BP(SS) Base Pointer 基址指针寄存器,Stack Segment 堆栈段
      3. SI(DS) Source Index 源变址寄存器,Data Segment 数据段
      4. DI(DS) Destination Index 目的变址寄存器,Data Segment 数据段
      以上使用逻辑地址的计算方法即段地址 * 16 + 偏移地址 = 物理地址段地址就是括号内的地址,偏移地址就是括号外的寄存器的值。
    5. 寄存器相对寻址方法 MOV AX,TOP[SI] MOV [BX+2623H],AX 以上第一句,源操作数 有效地址 为 EA = SI + TOP(TOP 取其偏移地址若是寄存器或常量,多是 16 位,与 16 位寄存器匹配) 物理地址 为 DS * 10H + EA 然后读取这个物理地址的存储单元的值 这种方式常用于查表。适合访问一维数组。 注意:默认搭配 DS 段寄存器和 BX、SI、DI。SS 段寄存器和 BP
    6. 基址变址寻址方式 MOV AX,[BX+DI] 源操作数物理地址为 DS * 10H + BX +DI 取出该地址的存储单元的值。 允许使用的基址寄存器为
      1. BX(DS) Base 基址寄存器
      2. BP(SS) Base Pointer 基址指针寄存器
      变址寄存器为
      1. SI Source Index 源变址寄存器
      2. DI Destination Index,目的变址寄存器
    7. 相对基址变址寻址方式 MOV AX,[BX+DI+MASK] 物理地址为 DS * 10H + BX + DI + MASK 注意:默认 DS 为数据端 允许使用的基址寄存器为
      1. BX(DS) Base 基址寄存器
      2. BP(SS) Base Pointer 基址指针寄存器
      变址寄存器为
      1. SI Source Index 源变址寄存器
      2. DI Destination Index,目的变址寄存器
      可用于二维数组的处理。

    小结

    1. 选择寻址方式的两个原则
      1. 实用
      2. 有效
    2. 双操作数指令的提示
      1. 双操作数的两个操作数长度需要匹配。
      2. 两个操作数不能同时是内存单元。 因为一条指令需要使用地址线传输地址,如果都是地址,那么一条指令就需要传输两个地址,所以是不现实的。

    第五章 常用指令系统

    汇编语言的一般格式为:

    [ 标号 : ] 指令助记符 [ 操作数 ] [ ; 注释 ]

    例如:

     START: MOV AX,DATA ; DATA 送AX

    上述一般格式内的方括号为可选内容,由此可知,一条指令中只有 指令助记符 是必不可少的。

    意义说明:

    1. 标号 标号是一个符号地址,用来表示指令在内存中的位置。 令使用标号时,应加冒号 :
    2. 指令助记符 指令助记符表示指令名称,是指令功能的英文缩写。
    3. 操作数 操作数表示指令要操作的数据或数据所在的地址。 可以是 寄存器、常量、变量,也可以由表达式构成。 80×86 指令一般带有 0 个、1 个或 2 个操作数。 双操作数指令的 第一个 操作数称为 目的操作数 DST,存放操作结果。第二个 称为 源操作数 SRC。操作数之间用 , 分开。
    4. 注释 注释由分号 ; 开始。 注释超过一行则在每行都必须以分号开头。

    5.1 数据传送指令

    5.1.1 通用数据传送指令

    1. MOV(move) 传送 格式:MOV DST,SRC 操作:(DST)←(SRC),将源操作数传送到目的操作数。 注意:
      1. DSTSRC 长度必须明确且一致
      2. DSTSRC 不能同为存储器,不允许在两个存储单元之间直接传送数据。这是因为一条指令最多发送一个地址。
      3. DST 不能为 CSIP ,因为 CS:IP 指向的是当前要执行的指令。
      4. DST 不允许是立即数。
      更多信息见 P62
    2. PUSH(push onto the stack) 进栈 格式:PUSH SRC 操作:(SP)←(SP)-2 ((SP)+1,(SP))←(SRC) 表示将源操作数压入堆栈(目的操作数),目的操作数地址由SS:SP指定,指令中无需给出。 SP总是指向栈顶,堆栈操作以 字(16 位) 为单位进行操作。
    3. POP(pop from the stack) 出栈 格式:POP DST 操作:(DST)←((SP)+1,(SP))(SP)←(SP)+2 其中DST表示目的操作数。将堆栈中源操作数弹出到目的操作数,堆栈中源操作数地址由 SS:SP 指定,指令中无需给出。 源操作数弹出后,SP加 2,下移一个字,指向新的栈顶。
    4. XCHG(exchange) 交换 格式:XCHG OPR1,OPR2 操作:(OPR1)← →(OPR2) 其中OPR1OPR2为操作数。把 2 个操作数互换位置。 XCHG为双操作数指令,两个操作数均是目的操作数,除了遵循双 操作数指令的规定,也不能用立即数寻址。

    5.1.2 累加器专用传送指令

    1. IN(input)输入 把端口号 PORT 或由 DX 指向的端口的数据输入到累加器,根据端 口号的长度,有长格式和短格式两种形式。
      1. 长格式:IN AL,PORT(字节) IN AX,PORT(字) 操作:AL ←(PORT)AX ←(PORT) PORT 为端口号,端口号范围为 00~FFH 时,可以使用长格式指令 长格式指令,是指其机器指令长度为 2 个字节(端口号占 1 个字节)
      2. 短格式:IN AL,DX(字节) IN AX,DX(字) 操作:AL ←((DX))AX ←((DX)) 端口号范围为 0100H~0FFFFH 时,必须使用短格式指令。 短格式指令长度为 1 个字节,因为端口号存放在 DX 寄存 器中。
    2. OUT(output)输出 把累加器的数据输出到端口 PORT 或由 DX 指向的端口。与输入指 令相同,根据端口号的长度,分为长格式和短格式两种形式。
      1. 长格式:OUT PORT,AL(字节) OUT PORT,AX(字节) 操作:PORT ← AL PORT ← AX
      2. 短格式:OUT DX,AL(字节) OUT DX,AX(字节) 操作:(DX)← AL(DX)← AX
    3. XLAT(translate)换码 格式:XLAT 操作:AL ←(BX+AL) 把 BX+AL 的值作为有效地址,取出其中的一个字节送 AL。

    5.1.3 地址传送指令

    1. LEA(Load Effective Address)有效地址送寄存器 格式:LEA REG,SRC 操作:REG ← SRC 把源操作数的有效地址 EA 送到指定的寄存器。
    2. LDS(Load DS with Pointer)指针送寄存器和 DS 格式:LDS REG,SRC 操作:REG ←(SRC)DS ←(SRC+2) 把源操作数 SRC 所指向的内存单元中 2 个字送到指定的寄存器 REG 和 DS。
    3. LES(Load ES with Pointer)指针送寄存器和 ES 格式:LDS REG,SRC 操作:REG ←(SRC)ES ←(SRC+2) 把源操作数 SRC 所指向的内存单元中 2 个字送到指定的寄存器 REG 和 ES。

    5.1.4 标志寄存器传送指令

    1. LAHF(Load AH with Flags)标志送 AH 寄存器
    2. SAHF(Store AH into Flags)AH 送标志寄存器
    3. PUSHF(Push Flags)标志入栈
    4. POPF(Pop Flags)标志出栈

    以上 4 条指令的格式相同,只有操作码部分,操作数为固定默认值。

    5.2 算术运算指令

    5.2.1 类型扩展指令

    1. CBW 字节扩展成字:convert byte to word
    2. CWD 字扩展成双字:convert word to double word

    这两条指令的格式相同,只有操作码部分,无操作数部分。

    操作数默认为累加器,无需在指令中给出。

    当执行 CBW 时,默认将 AL 寄存器的内容扩展到 AX 寄存器中,扩展方法为符号扩展。

    即如果 AL 的最高位为 1(负数),则 CBW 指令扩展时使 AH=FFH,如果 AL 的最高位为 0(正数),则 CBW 指令扩展时使 AH=00H。

    当执行 CWD 时,默认将 AX 寄存器的内容扩展到(DX,AX)中,其中 DX 存放双字中的高位,AX 存放双字中的低位。

    如果 AX 的最高位为 1(负数),则 CWD 指令扩展时使 DX=FFFFH,如果 AX 的最高位为 0(正数),则 CWD 指令扩展时使 DX=0000H。

    5.2.2 加法指令

    1. ADD(add)加法 格式:ADD DST,SRC 操作:(DST)←(DST)+(SRC) ADD 指令将源操作数与目的操作数相加,结果存入目的操作数中。 特别需要注意,加法指令执行后会影响标志寄存器中的 CF 和 OF 标志位。
    2. ADC(add with carry)带进位加法 格式:ADD DST,SRC 操作:(DST)←(DST)+(SRC)+CF 其中上式中的 CF 为运算前 CF 标志位的值。
    3. INC(increment)加 1 格式:INC OPR 操作:(OPR)←(OPR)+1 该指令不影响 CF 标志位。

    5.2.3 减法指令

    1. SUB(subtract)减法 格式:SUB DST,SRC 操作:(DST)←(DST)-(SRC)
    2. SBB(subtract with borrow)带借位减法 格式:SBB DST,SRC 操作:(DST)←(DST)-(SRC)-CF
    3. DEC(decrement)减 1 格式:DEC OPR 操作:(OPR)←(OPR)-1 该指令不影响 CF 标志位。
    4. NEG(negate)求补 格式:NEG OPR 操作:(OPR)←(OPR)
    5. CMP(compare)比较 格式:CMP OPR1,OPR2 操作:(OPR1)-(OPR2)

    5.2.4 乘法指令

    1. MUL(unsigned mulutiple)无符号数乘法 格式:MUL SRC 操作:当操作数为字节时,(AX)←(AL)×(SRC) 当操作数为字时,(DX,AX)←(AX)×(SRC)
    2. IMUL(signed mulutiple)有符号数乘法 格式和操作与 MUL 相同,用来作有符号数乘法。

    乘法指令中,目的操作数默认为累加器 AX,不必在指令中写出。

    两个相乘的数必须长度相同,根据 SRC 的长度,默认参与运算的是 AL 寄存器的值(即为 AX 寄存器的第八位)或者是 AX 寄存器的值。

    SRC 可以是寄存器或变量,但不能是立即数,因为立即数的长度是不明确的。

    5.2.5 除法指令

    1. DIV(unsigned divide)无符号数除法 格式:DIV SRC 操作: SRC 为字节时,(AL)←(AX)/(SRC)的商,(AH)←(AX)/(SRC)的余数。 SRC 为字时,(AX)←(DX,AX)/(SRC)的商,(DX)←(DX,AX)/(SRC)的余数。该指令将参与运算的数据默认为无符号数,则商和余数都是无符号数。
    2. IDIV(signeddivide)有符号数除法 指令格式和操作与无符号数除法相同,用来作有符号数除法。 最终商的符号应是两个操作数符号的异或,而余数的符号和被除数符号一致。

    在除法指令里,目的操作数必须是累加器 AX 和 DX,不必在指令中写出。

    被除数长度应为除数长度的两倍,余数放在目的操作数的高位,商放在目的操作数的低位。其中 SRC 不能是立即数。

    另外,和作乘法时相同,作除法时需考虑是无符号数还是有符号数,从而选择不同的指令。

    由于除法指令的字节操作要求被除数为 16 位,字操作要求被除数为 32 位,因此往往需要用符号扩展指令使得被除数长度比除数长度扩大一倍。

    需要注意的是,在进行乘法运算时,不会发生溢出问题,但在使用除法指令时,会产生溢出现象。

    当除数是字节类型时,除法指令要求商为 8 位。此时如果被除数的高 8 位绝对值≥除数的绝对值,则商会产生溢出。

    当除数是字类型时,除法指令要求商为 16 位。此时如果被除数的高 16 位绝对值≥除数的绝对值,则商会产生溢出。

    商出现溢出时,系统转 0 号类型中断处理,提示“divide overflow”,并退出程序,返回到操作系统,程序已经崩溃了。

    要想避免出现这种情况,必须在作除法前对溢出作出预判。

    5.2.6 BCD 码的十进制调整指令

    BCD 码是二进制转十进制比较简单的编码,4 位二进制表示 1 位十进制,其转换表如下。

    1. DAA(Decimal Adjust for Addition)加法的十进制调整指令 格式:DAA 操作:加法指令中,以 AL 为目的操作数,当加法运算结束后,使用本指令可以把 AL 中的和调整为正确的 BCD 码格式。 即:
      1. 如果 AL 低 4 位 > 9,或 AF=1,则 AL = AL + 6;
      2. 如果 AL 高 4 位 > 9,或 CF=1,则 AL = AL + 60H, CF = 1。
    2. DAS(Decimal Adjust for Subtraction)减法的十进制调整指令 格式:DAS 操作:减法指令中,以 AL 为目的操作数,当减法运算结束后,使用本指令可以把差调整为 BCD 码格式。 即:
      1. 如果 AL 低 4 位 > 9,或 AF = 1,则 AL = AL – 6,AF = 1;
      2. 如果 AL 高 4 位 > 9,或 CF = 1,则 AL = AL – 60H, CF = 1。

    5.3 逻辑与移位指令

    5.3.1 逻辑指令

    1. AND(and)与 格式:AND DST,SRC 操作:(DST)←(DST)∧(SRC)
    2. OR(or)或 格式:OR DST,SRC 操作:(DST)←(DST)∨(SRC)
    3. NOT(not)非 格式:NOT OPR 操作:(OPR)←(OPR)
    4. XOR(exclusive or)异或 格式:XOR DST,SRC 操作:(DST)←(DST)∀(SRC)
    5. TEST(test)测试 格式:TEST OPR1,OPR2 操作:(OPR1)∧(OPR2) 说明:TEST 指令的两个操作数相与的结果不保存,只根据结果置标志位。

    逻辑运算指令只会对部分标志位产生影响,其中 NOT 指令不影响任何标志位,其他指令将使 CF 位和 OF 位为 0,AF 位无定义,其他位则根据运算结果设置。

    逻辑指令除了常规的逻辑运算功能外,通常还可以用来对操作数的某些位进行处理,例如屏蔽某些位(将这些位置 O),或使某些位置 1,或测试某些位等。

    1. SHL(Shift Logical Left)逻辑左移
    2. SAL(Shift Arithmetic Left)算术左移
    3. SHR(Shift Logical Right)逻辑右移
    4. SAR(Shift Arithmetic Right)算术右移
    5. ROL(Rotat Left)循环左移
    6. ROR(Rotat Right)循环右移
    7. RCL(Rotat Left with Carry)带进位循环左移
    8. RCR(Rotat Right with Carry)带进位循环右移

    移位指令均是双操作数指令,指令的格式相同,以 SHL 为例,

    则:

    格式:

    1. SHL OPR,1
    2. SHL OPR,CL,其中 CL 寄存器的值大于 1。

    其中 OPR 为寄存器或内存单元,移位次数可以是 1 或 CL 寄存器,如需移位的次数大于 1,则可以在该移位指令前把移位次数先送 CL 寄存器中。

    当执行逻辑或算术左移时,操作结果相同,均是最低位补 0,移出的最高位送 CF 标志位;

    当执行逻辑右移时,最高位补 0,移出的最低位送 CF 标志位;

    当执行算术右移时,OPR 被认为是有符号数,则最高位补符号位自身,移出的最低位送 CF 标志位;

    当执行循环左移时,OPR 整体向左移一位,最高位移出,同时送 CF 标志位和最低位;

    当执行循环右移时,OPR 整体向右移一位,最低位移出,同时送 CF 标志位和最高位;

    当执行带进位循环左移时,OPR 整体向左移一位,此时最高位移出送 CF 标志位,而 CF 标志位原始的数值送 OPR 最低位;

    当执行带进位循环右移时,OPR 整体向右移一位,此时最低位移出送 CF 标志位,而 CF 标志位原始的数值送 OPR 最高位。

    5.4 串操作(我赌一波,不考)

    1. MOVS(Move String)串传送
      1. MOVSB:以字节为单位传送; 操作: (ES:DI)←(DS:SI),DI±1,SI±1
      2. MOVSW:以字为单位传送; 操作: (ES:DI)←(DS:SI),DI±2,SI±2
      3. MOVS DST,SRC:将源串 SRC 传送到目的串 DST 中。
      MOVS指令的寻址方式是固定的,目的串地址为ES:[DI],源串地址为DS:[SI],因此前两种格式都将操作数直接省略了。若采用第三种格式指令,则以字节为单位传送时,可以表示为:MOVS ES:BYTE PTR[DI],DS:[SI] 目的操作数指出了是字节的传送,如果源串不在数据段,也可加前缀,如ES:[SI]。上述操作中,当方向标志 DF=0 时 SI、DI 用+;DF=1 时 SI、DI 用-。方向标志 DF 的设置有两条指令:
      1. CLD(clear direction flag)设置正向(向前,使 DF=0,SI 或 DI 自动加)
      2. STD(set direction flag)设置反向(向后,使 DF=1,SI 或 DI 自动减)
    2. CMPS(Compare String)串比较
      1. CMPSB(字节) 操作: (ES:DI)-(DS:SI),DI±1,SI±1
      2. CMPSW(字) 操作: (ES:DI)-(DS:SI),DI±2,SI±2
      3. CMPS DST,SRC。
      本条串操作指令把两个串的对应位置的字节或字相减,不保存结果,只是根据结果设置标志位。该指令与前缀 REPE 联用时,可比较两个串是否相等。在每次比较过程中,一旦发现不相等,ZF=0,则终止重复执行,而不必等到整个串全部比较结束,此时 CX≠0,ZF=0。该指令终止执行后,可根据标志 ZF 判断两个串是否相等。其他指令格式与串传送指令相同。
    3. SCAS(Scan String)串扫描
      1. SCASB(字节) 操作: AL-(ES:DI),DI±1
      2. SCASW(字) 操作: AX-(ES:DI),DI±2
      3. SCAS DST。
      串扫描指令是把AL/AX寄存器中的内容与附加段中的由目的变址寄存器DI所指向的内存单元内容相比较,与CMPS比较指令相似,并不保存结果,只是根据结果设置标志位。该指令与前缀 REPNE 联用时,可在目的串中查找有无和 AL/AX 寄存器中的内容相同的字节或字。在每次执行串扫描指令过程中,一旦发现相等,即 ZF=1,则终止执行,此时 CX≠0,ZF=1,说明已找到相同的内容,而不必等到整个串全部扫描结束。该指令终止执行后,可根据标志位 ZF 判断是否找到。指令相关格式要求同串传送指令。
    4. STOS(Store in to String)存入串
      1. STOSB(字节) 操作: (ES:DI)←AL,DI±1
      2. STOSW(字) 操作: (ES:DI)←AX,DI±2
      3. STOS DST
      该指令把AL/AX寄存器的内容存入由目的变址寄存器指向的附加段的某单元中,并根据DF的值及数据类型修改目的变址寄存器的内容。当它与 REP 联用时,可把累加器的内容存入一个连续的内存缓冲区,该缓冲区长度由 CX 指定,因此 STOS 串指令可用于初始化某一块内存区。上述有关串处理指令的特性也适合本指令。
    5. LODS(Load from String)从串取
      1. LODSB(字节) 操作: AL←(DS:SI),SI±1
      2. LODSW(字) 操作: AX←(DS:SI),SI±2
      3. LODS SRC。
      该指令意义不大,一般不和 REP 联用,因为重复执行多次的结果也 只是使累加器为最后一次的值。该指令可以由 MOV 指令代替。

    串操作指令用以处理内存中的数据串,但该操作每一次执行处理的只是单个字节或字,因此对于数据串来说,需要重复执行串操作指令才能处理完整个串。

    串操作指令的重复有特定的前缀指令配合,下面先介绍前缀指令:

    1. REP(repeat)重复 前缀 REP 的作用是重复执行串操作指令,直到寄存器 CX=0 为止,而每执行一次串操作指令,会使 CX 的内容自动减 1,因此总的重复次数等于 CX 寄存器的初始值。
    2. REPE/REPZ(repeat while equal/zero)相等/为零则重复 前缀 REPE 也叫 REPZ,只有当 CX 寄存器的值≠0 并且标志位 ZF=1 时,重复执行串操作指令。 若用以比较两个字符串是否相等,每次的串操作指令把源串中的一个字节和目的串中的一个字节进行比较,如果相等(即 ZF=1),则还需继续执行串操作指令,若不相等或者比较全部串的数据(CX=0),则停止。
    3. REPNE/REPNZ(repeat while not equal/not zero)不相等/不为零则重复 前缀 REPNE 也叫 REPNZ,只有当 CX 寄存器的值≠0 并且标志位 ZF=0 时,重复执行串操作指令。 若在一个字符串中查找是否存在某一个字符,串操作指令把字符串中的一个字节和要找的这个字符进行比较,如果不相等(即 ZF=0),则还需继续执行串操作指令,直到找到(ZF=1)或者查找完整个串的数据(CX=0),才停止。

    串处理指令的特性及用法

    5.5 程序转移指令

    5.5.1 无条件转移指令与程序的可重新定位

    JMP(jmp):该指令无条件转移到指令指定的地址去执行程序。

    1. 段内直接转移 格式:JMP NEAR PTR OPR 操作:IP←IP+16 位位移量
    2. 段内间接转移 格式:JMP WORD PTR OPR 操作:IP←(EA) 有效地址 EA 值由 OPR 的寻址方式确定。它可以使用除立即数 方式以外的任何一种寻址方式。
    3. 段间直接转移 格式:JMP FAR PTR OPR 操作:IP←OPR 的偏移地址 CS←OPR 所在段的段地址
    4. 段间间接转移 格式:JMP DWORD PTR OPR 操作:IP←(EA) CS←(EA+2)

    待续,敢考就敢寄。

    第六章 伪指令与源程序格式

    6.1 伪指令

    6.1.1 处理机选择

    随着处理器的升级,增加了新的指令。

    处理机选择伪指令有以下几种:

    1. ·8086 选择 8086 指令系统
    2. ·286 选择 80286 指令系统
    3. ·286P 选择保护方式下的 80286 指令系统
    4. ·386 选择 80386 指令系统
    5. ·386P 选择保护方式下的 80386 指令系统
    6. ·486 选择 80486 指令系统
    7. ·486P 选择保护方式下的 80486 指令系统
    8. ·586 选择 Pentium 指令系统
    9. ·586P 选择保护方式下的 Pentium 指令系统

    指令中的点 · 是需要的。这类伪指令一般放在代码段中的第一条指令前即可。如不给出,则汇编程序认为其默认选择是 8086 指令系统。

    6.1.2 段定义伪指令

    1. 段定义伪指令汇编程序在把源程序转换为目标程序时,只能自动确定标号和变量(代码段和数据段的符号地址)的偏移地址,程序中对于段地址也要作出说明,段地址一旦说明,该段内的指令、标号和变量都属于这个段。段定义伪指令格式:  segment_name  SEGMENT
       ​
       segment_name  ENDSsegment_name由用户确定,大写的为关键字。段定义伪指令两句成对出现,两句之间为其他指令。
    2. 为了确定用户定义的段和哪个段寄存器相关联,用 ASSUME 伪指令 来实现。 ASSUME 伪指令格式: ASSUME register_name: segment_name …,
        register_name: segment_name register_name 为段寄存器名,必须是 CS,DS,ES 和 SS。而 segment_name 则必须是由段定义伪指令定义的段中的段名。ASSUME 伪指令只是指定把某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中。还需要用两条 MOV 指令完成这一操作。但是,代码段不需要这样做,代码段的这一操作是在程序初始化时完成的。

    6.1.3 程序开始和结束伪指令

    源程序结束的伪操作的格式为:

     END [label]

    汇编程序将在遇到 END 时结束汇编。其中标号 label 指示程序开始执行的起始地址。

    如果是多个程序模块相连接,则只有主程序需要使 用标号,其他子程序模块则只用 END 而不能指定标号。

    6.1.4 数据定义与存储器单元分配伪指令

    伪指令的一般格式是:

    [变量] 操作码 N个操作数 [; 注释]

    操作码字段说明所用伪操作的助记符,即伪操作,说明所定义的数据类型。常用的有以下几种。

    1. DB:伪操作用来定义字节,其后的每个操作数都占有一个字节(8 位)。
    2. DW:伪操作用来定义字,其后的每个操作数占有一个字(16 位,其低位字节在第一个字节地址中,高位字节在第二个字节地址中,即数据低位在低地址,数据高位在高地址)。
    3. DD:伪操作用来定义双字,其后的每个操作数占有两个字(32 位)。
    4. DF:伪操作用来定义 6 个字节的字,其后的每个操作数占有 48 位。
    5. DQ:伪操作用来定义 4 个字,其后的每个操作数占有 4 个字(64 位),可用来存放双精度浮点数。
    6. DT:伪操作用来定义 10 个字节,其后的每个操作数占有 10 个字节,为压缩的 BCD 码。

    这些伪操作可以把其后跟着的数据存入指定的存储单元,形成初始化数据;或者只分配存储空间而并不确定数值。

    6.1.5 类型属性操作符

    1. WORD PTR ; 字类型
    2. BYTE PTR ; 字节类型

    就是按照某种类型读取,但不会改变变量本身的类型。

    对一个 8 位(或 16 位)的变量可以用 16 位(或 8 位)方式访问。

    6.1.6 THIS 操作符和 LABEL 伪操作

    通过 THIS 操作符或 LABEL 伪操作,将变量定义为不同的访问类型。

    1. 使用 THIS 操作符: 格式:THIS type
    2. 使用 LABEL 伪操作: 格式:name LABEL type

    type在这里是BYTE或者WORD

    6.1.7 表达式赋值伪指令“EQU”和“=”

    可以用赋值伪操作给表达式赋予一个常量或名字。其格式如下:

     Expression_name EQU Expression
     Expression_name=Expression

    后略

    第七章 分支与循环程序设计

    18 级试卷

  • Android 复习

    第一章 Android 基础入门

    Android 是基于 Linux 的开源操作系统,最初由 Andy Rubin 开放。

    1.1 简介

    1.1.1 通信技术

    1G 很容易被窃听

    2,3,4,5G 技术的本质区别是传输速度不同。

    2019 年,5G 商用元年。

    1.1.3 体系结构

    1. 应用程序层应用程序的集合。
    2. 应用程序框架层提供 API。
    3. 核心类库系统库和 Android 运行时库(包含了 Dalvik 虚拟机,使得每个 Android 应用程序都能运行在独立的进程中)。
    4. Linux 内核层底层驱动的集合,如显示驱动,音频驱动,照相机驱动等。

    1.1.4 Dalvik 虚拟机

    基于寄存器架构。执行特有的 dex文件实现其功能。

    功能:

    1. 对象生命周期管理
    2. 堆栈管理
    3. 线程管理
    4. 安全异常管理
    5. 垃圾回收

    虚拟机编译文件的过程(P4):

    ART 模式

    启用后,安装 APP 时预编译,并将代码转换成机器语言存储在本地。

    提高执行效率。


    1.4 Android 程序结构

    四大组件在 src/main/AndroidManifest.xml 里注册,这是整个程序的配置文件。 四大组件:

    1. Activity 活动
    2. Service 服务
    3. BroadCastReceive 广播接收器
    4. ContentProvider 内容提供商

    接下来介绍程序工程的结构:

    • app 代码和资源
      • libs 第三方 jar 包
      • src 代码和资源的主目录
        • androidTest 调试代码
        • main
          • java 程序代码
          • res 程序资源
          • AndroidManifest.xml 整个程序的配置文件,在其中可以配置程序所需的权限和注册程序用到的四大组件。注意这里是申请网络权限和存储权限的地方,不申请就用不了,而且似乎不会报错。
      • build.gradle app 构建脚本,包含编译的 SDK 版本,Tools 版本,支持的最低 SDK 版本,支持的目标 SDK 版本。
    • build.gradle 安卓程序的构建脚本
    • local.properties 指定程序的 SDK 路径。可以通过 sdk.dir 的值指定,一般不需要修改
    • settings.gradle 配置子项目

    1.5 资源管理与使用

    res 目录中。

    1.6 调试

    输出信息使用 logcat。 v:verbose 详细 d:debug i:info w:warning e:error a:assert 断言 vdiwea

    习题

    一、填空题

    1. Dalvik 中的 Dx 工具会把部分 class 文件转换成(dex)文件。
    2. 如果希望在 XML 布局文件中调用颜色资源,可以使用(@color)调用。
    3. Android 程序入口的 Activity 是在(AndroidMainifest.xml)文件中注册的。
    4. Android 中 查看应用程序日志的工具是(LogCat)。

    二、判断题

    1. Dalvik 是 Google 公司设计的用于 Android 平台的虚拟机。 √
    2. Android 应用程序的主要语言是 Java。√
    3. Android 系统采用分层架构,分别是应用程序层、应用程序框架层、核心类库和 Linux 内核。√
    4. 第三代移动通信技术 (3G) 包括 TD-LTE 和 FDD-LTE 两种制式。× 应是 4G。
    5. Android 程序中,Log.e() 用于输出警告级别的日志信息。× e-error
    6. 每个 Dalvik 虚拟机实例都是一个独立的进程空间,并且每个进程之间不可以通信。× 可以通信。

    三、选择题

    1. Dalvik 虚拟机是基于(C)的架构。 A. 栈 B. 堆 C. 寄存器 D. 存储器
    2. Android 项目中的主题和样式资源,通常放在 (C) 目录。 A. res/drawable B. res/layout C. res/values D. assets
    3. 下列关于 AndroidManifest.xml 文件的说法中,错误的是 (D)。 A. 它是整个程序的配置文件 B. 可以在该文件中配置程序所需的权限 C. 可以在该文件中注册程序用到的组件 D. 该文件可以设置 UI 布局
    4. Dalvik 虚拟机属于 Android 系统架构中的(C) A. 应用程序层 B. 应用程序框架层 C. 核心类库层 D. Linux 内核层
    5. Android 中 短信、联系人管理、浏览器等属于 Android 系统架构中的(A) A. 应用程序层 B. 应用程序框架层 C. 核心类库层 D. Linux 内核层

    四、简答题

    简述 Android 体系结构的层次和特点

    见 1.1.3。书 P3。

    第二章 Android 常见界面布局

    2.1 View 控件

    每个界面必须有且只有一个 ViewGroup 容器。

    2.2 界面布局编写方式

    2.2.1 XML 布局文件 中编写布局

    布局文件放在 res/layout ,用标签定义布局,例如 <RelativeLayout></RelativeLayout>。

    2.2.2 Java 代码中编写布局

    P32

    2.3 布局通用属性(P32)

     android:id
     // 标识
     ​
     android:layout_width
     // 布局的宽度
     ​
     android:layout_height
     // 布局的高度
     ​
     android:background
     // 布局背景
     ​
     android:layout_margin
     // 边界距离,外距
     ​
     android:padding
     // 内距

    2.4 线性布局

     <LinearLayout></LinearLayout>
    1. 排列方式:水平或者竖直排列。 android:orientation=”vertical”
       // 控件自上到下
       ​
       android:orientation=”horizontal”
       // 控件从左到右
    2. 权重 android:layout_weight=”1″
       // 设置权重

    2.5 相对布局

     <RelativeLayout></RelativeLayout>

    相对定位指定子控件的位置。

    2.6 表格布局

    行列方式的布局。

     <TableLayout>
        <TableRow>
        </TableRow>
     </TableLayout>

    2.7 帧布局

     <FrameLayout></FrameLayout>

    习题

    一、填空题

    1. Android 的常见布局都直接或者间接的继承自(ViewGroup)类。
    2. Android 中 的 TableLayout 继承自(LinearLayout)。
    3. 表格布局 TableLayout 通过(TableRow)布局控制表格的行数。
    4. (RelativeLayout)布局通过相对定位的方式指定子控件的位置。
    5. 在 R.java 文件中,android:id 属性会自动生成对应的(int)类型的值。

    二、判断题

    1. ViewGroup 是盛放界面控件的容器。√
    2. 如果在帧布局 FrameLayout 中放入三个所有属性都相同的按钮,那么能够在屏幕上显示的是第 1 个被添加的按钮。× 第三个,因为会被覆盖。
    3. Android 中的布局文件通常放在 res/layout 文件夹中。√
    4. TableLayout 继承自 LinearLayout, 因此它完全支持 LinearLayout 所支持的属性。√
    5. LinearLayout 布局中的 android:layout_weight 属性用于设置布局内控件所占的权重。√

    三、选择题

    1. 下列属性中,用于设置线性布局方向的是(A)。 A. orientation B. gravity C. layout gravity D. padding
    2. 下列选项中,不属于 Android 布局的是(C)。 A. FrameLayout B. LinearLayout C. Button D. RelativeLayout
    3. 帧布局 FrameLayout 是将其中的组件放在自己的(A)。 A. 左上角 B. 右上角 C. 左下角 D. 右下角
    4. 对于 XML 布局文件,android:layout_width 属性的值不可以是(D)。 A. match_parent B. fill_parent C. wrap_content D. match_content
    5. 下列关于 RelativeLayout 的描述,正确的是(C)。 A. RelativeLayout 表示绝对布局,可以自定义控件的 x、y 的位置 B. RelativeLayout 表示帧布局,可以实现标签切换的功能 C. RelativeLayout 表示相对布局,其中控件的位置都是相对位置 D. RelativeLayout 表示表格布局,需要配合 TableRow 一起使用

    第三章 Android 常见界面控件

    3.1 简单控件

    1. Textview 文本框
    2. EditText 文本输入框
    3. Button 按钮
    4. ImageView 图片
    5. RadioButton 单选按钮(圆按钮)
    6. CheckBox 多选按钮(方按钮)
    7. Toast 类 轻量级信息提醒机制。

    3.2 列表控件

    ListView 是类似微信主界面和淘宝搜索界面的列表。

    这种列表需要配合数据适配器 Adapter,常见的 Adapter 如下

    1. BaseAdapter
      1. getCount 获取 Item 个数
      2. getItem(int position) 获取对应位置的 Item 对象
      3. getItemId(int position) 获取 id
      4. getView(int position,View convertView,ViewGroup Parent) 获取视图
    2. SimpleAdapter
    3. ArrayAdapter

    注意学习一下 Adapter 怎么定义。

    习题

    一、判断题

    1. Android 的控件样式,每一个 XML 属性都对应一个 Java 方法。√
    2. 当指定 RadioButton 按钮的 android:checked 属性为 true 时,表示未选中状态。× 当然是选中了。
    3. AlertDialog 对话框能够直接通过 new 关键字创建对象。× 要通过 Builder 对象。
    4. Toast 是 Android 系统提供的轻量级信息提醒机制,用于向用户提示即时消息。√
    5. ListView 列表中的数据是通过 Adapter 加载的。√

    二、选择题

    1. 在 XML 布局中定义了一个 Button, 决定 Button 按钮上显示文字的属性是(B) A. android:value B. android:text C. android:id D. android:textvalue
    2. 下列选项中,(C)用于设置 TextView 中文字显示的大小。 A. android:textSize=”18″ B. android:size=”18″ C. android:textSize=”18sp” D. android:size=”18sp”
    3. 使用 EditText 控件时,当文本内容为空时,如果想做一些提示,那么可以使用的属性是(D)。 A. android:text B. android:background C. android:inputType D. android:hint
    4. 为了让一个 imageView 显示一张图片,可以通过设置的属性是(A)。 A. android:src B. android:background C. android: img D. android:value
    5. 下列关于 ListView 的说法中,正确的是(C) A. ListView 的条目不能设置点击事件 B. ListView 不设 置 Adapter 也能显示数据内容 C. 当教据超出能显示范围时,ListView 自动具有可滚动的特性 D. 若 ListView 当前能显示 10 条,一共有 100 条数据,则产生了 100 个 View
    6. CheckBox 被选择的监听事件通常使用(B)方法。 A. setOnClickListener B. setOnCheckedChangeListener C. setOnMenuItemSelectedListener D. setOnCheckedListener
    7. 当使用 EditText 控件时,能够使文本框设置为多行显示的属性是(A)。 A. android:lines B. android:layout_height C. android:textcolor D. android:textsize
    8. 下列关于 AlertDialog 的描述,错误的是(A) A. 使用 new 关键字创建 AlertDialog 的实例 B. 对话框的显示需要调用 show() 方法 C. setPositiveButton() 方法是 用来设置确定按钮的 D. setNegativeButton() 方法是用来设置取消按钮的

    第四章 程序活动单元 Activity

    4.1 Activity 生命周期

    5 种生命周期的状态:

    1. 启动状态 十分短暂
    2. 运行状态 可见的、有焦点的。运行状态的 Activity 具有高优先级,即使内存不足,系统也会先销毁栈底的 Activity 来确保当前的 Activity 正常运行。
    3. 暂停状态 可见,但无焦点不可操作,例如主界面出现一个弹窗,则主界面就是暂停状态。
    4. 停止状态 完全不可见就是停止状态。
    5. 销毁状态 会被清理出内存。

    生命周期方法:

    1. onCreate() 创建界面的时候初始化的函数,一开始就会调用,可以重写这个方法来做一些初始化工作,例如给控件写数据等
    2. onStart() 即将可见时调用
    3. onResume() 获取焦点时调用
    4. onPause() 暂停,被遮挡时调用
    5. onStop() 不可见时调用
    6. onRestart() 停止状态启动
    7. onDestory() 销毁时调用

    4.2 Activity 创建、配置、启动、关闭

    创建

    编译器左上角 new 就行。

    配置

    编写类继承 ( extend ) activity 类

    启动

     public void startActivity (Intent intent)

    关闭

     public void finish() 

    4.3 Intent 意图和 IntentFilter 匹配

    显式和隐式 Intent

    1. 显式 intent Intent intent = new Intent(this, SecondActivity.class);
       startActivity(intent);那么就用 intent 的属性来确定需要打开的 Activity 了。
    2. 隐式 intent 主要有三个属性值:
      1. action 要完成的动作
      2. data 传递的数据
      3. category action 属性的额外信息

    IntentFilter

    隐式 Intent 会使得系统将其和每一个组件的过滤器相匹配,三个属性值都匹配成功,则唤起相应的组件。

    匹配规则:

    1. action 清单文件中设置 一些 action 属性(<intent-filter></intent-filter>),只要 action 匹配上了一条就算匹配上。
    2. data 清单文件中设置 一些 data 属性(<intent-filter></intent-filter>),只要 data 匹配上了一条就算匹配上。
    3. category 清单文件中设置 一些 category 属性(<intent-filter></intent-filter>),隐式的 intent 里的 category 必须包含于(小于等于)清单文件里的 category 属性,否则匹配不上。因此 intent 的 category 如果是空则和所有的 IntentFilter 匹配上

    4.4 Activity 之间的跳转

    4.4.1 数据传递

    1. 用 Intent 来做数据传递。 putExtra(String name, …);
       // 加入一个属性,第一个参数是属性名,第二个是属性值第二个参数的类型是变化的,因为这个函数有很多的重载。但应该都是基本数据类型。不能传递一个对象的引用。另一个 Activity 取出这个属性这样操作。 getIntent().getStringExtra(String name)
       // 如果这个属性的值是 int,就把 String 改成 Int。Boolean→Boolean
    2. 用 Bundle 类传递数据 例如 Intent intent = new Intent() ;
       Bundle bundle = new Bundle() ;
       bundle.putString(“account”, “小米”);
       intent.putExtras(bundle);
       startActivity(intent);另一个 Activity 取出 Bundle 这样操作。 getIntent() .getExtras() .getString(“account”);

    4.4.2 数据回传

    三个方法:

    1. startActivityForResult( Intent intent, int requestCode); 第一个参数是意图对象,第二个是请求码,标识请求来源。这个函数用来开启一个 Activity,当开启的 Activity 被销毁时会返回数据。
    2. setResult( int resultCode, Intent intent); 用于携带数据回传。
    3. onActivityResult( int requestCode, int resultCode, Intent data); 用于接收回传的数据。

    startActivityForResult( Intent intent, int requestCode); 用于在 MainActivity 开启 SecondActivity。

    setResult( int resultCode, Intent intent); 用于 SecondActivity 设置 Result,自身销毁后 Result 会返回到 MainActivity。

    onActivityResult( int requestCode, int resultCode, Intent data); 用于对回传的 Result 解析,是在 SecondActivity 销毁后自动调用的。需要重写。

    4.5 任务栈和启动模式

    任务栈

    任务栈是存放 Activity 实例的容器,销毁就弹出栈,用户操作的永远是栈顶。

    启动模式

    1. standard 默认的启动模式,启动一个就创建一个新的实例。
    2. singleTop 如果启动的是栈顶的任务则复用,而不是创建新的实例。
    3. singleTask 如果启动的是栈内的任务则复用,而不是创建新的实例。
    4. singleInstance 启动新的栈来管理新的实例,不管哪个栈调用这个 Activity,整个系统里只有这一个 Activity,例如安卓的系统桌面。

    4.6 Fragment (P95)

    嵌入 Activity 的 UI 片段。

    4.6.2 生命周期

    受其所属的 Activity 影响,也和 Activity 类似,有 启动、运行、暂停、停止、销毁五种状态,但 Activity 暂停,Fragment 也暂停,停止、销毁也是跟随 Activity 的。

    在 Activity 运行的时候,可以单独对每个 Fragment 操作,如添加(启动状态)删除(销毁状态)等。

    习题

    一、填空题

    1. Activity 的启动模式包括 standard, singleTop,singleTask 和(singleintance)。
    2. 启动一个新的 Activity 并且获取这个 Activity 的返回教据,需要重写(startActivityForResult() )方法。
    3. 发送隐式 Intent 后,Android 系统会使用(IntentFilter)匹配相应的组件。
    4. 在清单文件中为 Activity 添加 <intent-filter> 标签时,必须添加的属性名为(action)否则隐式 Intent 无法开启该 Activity.
    5. Activity 的(finish() )方法用于关闭当前的 Activity。

    二、判断题

    1. 如果 Activity 不设置启动模式,则默认为 standard.√
    2. Fragment 与 Activity 的生命周期方法是一致的。× 方法当然不一样 P80 和 P95
    3. 如果想要关闭当前的 Activity, 可以调用 Activity 提供的 finish() 方法。√
    4. <intent-filter> 标签中间只能包含一个 action 属性。× 多个
    5. 默认情况下,Activity 的启动方式是 standard。√

    三、选择题

    1. 下列选项中,不属于 Android 四大组件的是(C) A. Service B. Activity C. Handler D. ContentProvider
    2. 下列关于 Android 中 Activity 管理方式的描述中,正确的是(B) A. Android 以堆的形式管理 Activity B. Android 以栈的形式管理 Activity C. Android 以树的形式管理 Activity D. Android 以链表的形式管理 Activity
    3. 下列选项中,(B)不是 Activity 生命周期方法。 A. onCreate() B. startActivity() C. onStart() D. onResume()
    4. 下列方法中,(A)是启动 Activity 的方法。 A. startActivity() B. goToActivity() C. startActivityResult() D. 以上都是
    5. 下列关于 Intent 的描述中,正确的是(B) A. Intent 不能够实现应用程序间的数据共享 B. Intent 可以实现界面的切换,还可以在不同组件间直接进行数据传递 C. 使用显式 Intent 可以不指定要跳转的目标组件 D. 隐式 Intent 不会明确指出需要激活的目标组件,所以无法实现组件之间的数据跳转

    第五章 数据存储

    5 种存储方式:

    • 文件存储 openFileInput() openFileOutput() 类似 Java。
    • SharedPreferences 存储 存储一些简单的配置信息,采用 xml 格式。
    • SQLite 数据库存储 支持基本 SQL 语法,一般使用其作为复杂数据的存储引擎。
    • ContentProvider 四大组件之一,用于应用程序间的数据交换。可以将自己的数据共享给其它的应用程序使用。
    • 网络存储 存储在网络服务器上。

    5.2 文件存储(P108)

    5.2.1 写入

    内部存储

    内部存储是存在应用程序中的,文件会被该应用程序私有化,其它应用程序需要申请权限才可以操作。卸载应用程序时,这些文件也会删除。

     FileOutputStream fos = openFileOutput( String fileName, int mode);
     String word = "Hello World!";
     fos.write(word.getBytes());
     fos.close();

    写入( FileOutputStream )有四种读写模式,以枚举的方式定义,填入第二个参数。

    1. MODE_PRIVATE只能被当前文件读写。
    2. MODE_APPEND可以追加。
    3. MODE_WORLD_READABLE该文件可以被其它程序读。
    4. MODE_WORLD_WRITEABLE可以被其它程序写。

    外部存储

    外部存储是存入外部的设备(SD卡或内嵌的存储卡)的。永久性的存储方式。可以被其它应用程序共享,可能会被浏览、修改、删除,是不安全的存储方式。

    需要使用 Environment.getExternalStorageState() 方法确认外部设备是否可用。

     String state = Environment.getExternalStorageState();
     // 获取外存状态
     if(state.equals(Environment.MEDIA_MOUNTED)) {
         //状态判断
         File SDPath = Environment.getExternalStorageDirectory();
      // 获取 SD 卡路径
      File file = new File( SDPath, "data.txt");
         // 创建文件对象
         FileOutputStream fos = new FileOutputStream(file);
         // 打开文件流
         fos.write( data.getBytes());
         // 写入
      fos.close();
         // 关闭流
     }

    5.2.2 读取

    内部存储

     String content = "";
     // 创建 存储的字符串
     FileInputStream fis = openFileInput( "data.txt");
     // 打开文件输入流
     byte[] buffer = new byte[fis.available()];
     // 创建缓冲区
     fis.read(buffer);
     // 读入缓冲区
     content = new String( buffer);
     // 读入字符串
     fis.close();
     //关闭流

    外部存储

     String state = Environment.getExternalStorageState();
     // 获取外存状态
     if(state.equals(Environment.MEDIA_MOUNTED)) {
         //状态判断
         File SDPath = Environment.getExternalStorageDirectory();
      // 获取 SD 卡路径
      File file = new File( SDPath, "data.txt");
         // 创建对象文件
         FileInputStream fis = new FileInputStream(file);
         // 打开流
         BufferedReader br = new BufferedReader( new InputStreamReader( fis));
         // 创建字符输入缓冲流对象
         String data = br.readLine();
         // 读取数据
         br.close();
         fis.close();
     }

    5.3 SharedPreferences 存储(P115)

    持久化存储。存一些配置,类似账号密码。采用 xml 格式。

    5.4 SQLite 数据库存储(P118)

    可以存储大量数据。

    习题

    一、判断题

    1. SQLite 是 Android 自带的一个轻量级的数据库,支持基本 SQL 语法。√
    2. Android 中的文件存储方式,分为内部存储方式和外部存储方式。√
    3. 使用 openFileOutput() 方式打开应用程序的输出流时,只需指定文件名。× 还有读写模式。这是内部存储的输出流,外存用 new FileOutputStream(file)。Input 只要文件名(从文件里面读到程序里面当然不用什么追加什么的)
    4. 当 Android SDK 版本低于 23 时,应用程序想要操作 SD 卡数据,必须在清单文件中添加权限。√
    5. SQLiteDatabase 类的 update() 方法用于删除数据库表中的数据。× update 当然是更新
    6. SQLite 数据库的事 务操作满足原子性、一致性、隔离性和持续性。√

    二、选择题

    1. 下列关于 SharedPreferences 存取文件的描述中,错误的是(C)。 A. 属于移动存储解决方式 B. SharedPreferences 处理的就是 key-value 对 C. 读取 xml 的路径是 /sdcard/shared_prefs D. 文本的保存格式是 xml
    2. 下列选项中,不属于 getSharedPreferences 方法的文件操作模式参数是(B)。 A. Context.MODE_PRIVATE B. Context.MODE_PUBLIC C. Context.MODE_WORLD_ READABLE D. Context.MODE_WORLD_WRITEABLE
    3. 下列方法中,(B)方法是 shardPreferences 获取其编辑器的方法。 A. getEdit() B. edit() C. setEdit() D. getAll()
    4. Android 对教据库的表进行查询操作时,会使用 SQLietDatabase 中的(C)方法。 A. insert() B. execSQL() C. query() D. updata()
    5. 下列关于 SQLite 数据库的描述中,错误的是(C) A. SqliteOpenHelper 有创建数据库和更新数据库版本的的功能 B. SqliteDatabase 类是用来操作数据库的 C. 每次调用 SqliteDatabase 的 getWritableDatabase 方法时,都会执行 SqliteOpenHelper 的 onCreate() 方法 D. 当数据库版本发生变化时,会调用 SqliteOpenHelper 的 onUpgrade() 方法更新数据库
    6. 下列初始化 SharedPreferences 的内代码中,正确的是(D) A. SharedPreferences sp = new SharedPreferences(); B. SharedPreferences sp = SharedPreferences.getDefault(); C. SharedPreferences sp = SharedPreferences.Factory(); D. SharedPreferences sp = getSharedPreferences();

    第六章 内容提供者和内容观察者

    6.1 内容提供者

    A 程序通过 ContentProvider 来暴露数据,B 程序通过 ContentResolve 操作 A 程序暴露的数据。A 程序会将操作结果返回给 ContentResolver,然后 ContentResolver 再将操作结果返回给 B。

    两个重要的部分

    1. 数据模型 使用基于数据库模型的 简单表格,其中每个数据的唯一标识是 _ID,数据类型是 int。查询字段数据用 getInt() /getString() /getLong() 等
    2. Uri ContentResolver 的增删查改方法以 Uri 的形式对外提供数据。 Uri 的三部分:
      1. scheme content:// 表示操作的数据被 ContentProvider 控制,不会被修改。
      2. authority 表示 ContentProvider 设置的唯一标识。主要用来区分程序,其一般是表示程序包名。
      3. path 表示资源或数据。可以动态修改。
      例如 content:// cn.itcast.mycontentprovider/ person

    6.4 内容观察者

    实时监听 ContentProvider 共享的数据是否变化。

    观察指定的 Uri 代表的数据的变化。

    变化时触发 ContentObserver 的 onChange() 方法。

    详细解释 P138

    习题

    一、判断题

    1. Uri 主要由三部分组成,分别是 scheme,authority 和 path。√
    2. 内容观察 ContentObserver 用于观察指定 URI 代表的数据的变化。√
    3. 内容提供者主要功能是实现跨程序共享数据的功能。√
    4. Android 中通过内容解析者查询短信数据库的内容时不需要加入读短信的权限。× 危险权限一共九个:
      1. 位置
      2. 日历
      3. 照相机
      4. 联系人
      5. 存储卡
      6. 传感器
      7. 麦克风
      8. 电话
      9. 短信 这九个需要动态申请。也就是说不仅需要在清单中注册,还需要在代码里面申请!
    5. Android 系统的 UriMatcher 类用于匹配 Uri。√

    二、选择题

    1. 如果一个应用程序想要访问另外一个应用程序的数据库,那么需要通过(C)实现。 A. BroadcastReceiver B. Activity C. ContentProvider D. AIDL
    2. 下列方法中,(B)能够得到 ContentResolver 的实例对象。 A. new ContentResolver() B. getContentResolver() C. newInstance() D. ContentUris.newInstance()
    3. 自定义内容观察者时,需要继承的类是(B)。 A. BaseObserver B. ContentObserver C. BasicObserver D. DefalutObserver
    4. 对查询手机系统短信时,内容提供者对应的 Uri 为(C)。 A. Contacts.Photos.CONTENT_URI B. Contacts.People.CONTENT_URI C. content://sms/ D. Media.EXTERNAL_CONTENT_URI
    5. 下列关于 ContentProvider 的描述,错误的是(D)。 A. ContentProvider 是一个抽象类,只有继承后才能使用 B. ContentProvider 只有在 AndroidManifest.xml 文件中注册后才能运行 C. ContentProvider 为其他应用程序提供了统一的访问数据库的方式 D. 以上说法都不对

    第七章 广播机制

    7.1 广播机制的概述

    广播机制:每个程序可以根据自己的兴趣来注册广播,广播可能是系统发送的也可能是其他应用发送的。

    消息订阅者(广播订阅者)注册广播接收者(Binder 机制),广播发送者发送广播(Binder 机制),处理中心接收,根据消息发送者的要求,在已注册列表内寻找合适的消息订阅者,寻找依据是(IntentFilter/Permission)。然后由处理中心发送广播到消息订阅者。

    广播接收者默认重写类的构造函数和 onReceive() 方法。

    Android 8.0 后,必须用动态注册才可以接收广播,静态接收无效。

    1. 无序广播 异步执行,所有监听这个广播的广播接收者都会收到,但接收/执行顺序不确定。效率高,但无法拦截。
    2. 有序广播 按照广播接收者声明的优先级别依次接收,只有一个广播接收者能接收到。在这个广播接收者中的逻辑执行完,再继续传递。效率较低,有接收先后顺序,可以被拦截(终止)。优先级相同,先注册的先接收。setPriority(int priority) 函数,参数值越大,优先级越高。
    3. 指定广播 有序广播的一种,保证某个接收者一定会接收到这个广播。

    习题

    一、填空题

    1. (BroadcastReceiver)用来监听来自系统或者应用程序的广播。
    2. 广播接收者的注册方式有两种,分别是(动态注册)和(静态注册)。

    二、判断题

    1. Broadcast 表示广播,它是一种运用在应用程序之间传递消息的机制。√
    2. 在清单文件注册广播接收者时,可在 <intent-filer> 标签中使用 priority 属性设置优先级别,属性值越大优先级越高。√
    3. 有序广播的广播效率比无序广播更高。× 当然是无序的高,因为有序的需要按顺序接收和执行。
    4. 动态注册的广播接收者的生命周期依赖于注册广播的组件。√
    5. Android 中广播接收者必须在清单文件里面注册。× 动态注册不需要在清单里注册。但注意危险权限注册,既要在清单注册也要代码里面动态注册。

    三、选择题

    1. 关于广播类型的说法,错误的是(BC)。(多选) A. Android 中的广播类型分有序广 播和无序广播 B. 无序广播是按照一定的优先级进行接收 C. 无序广播可以被拦截,可以被修改数据 D. 有序广播按照一定的优先级进行发送
    2. 广播作为 Android 组件间的通信方式,使用的场景有(ABCD)。(多选) A. 在同一个 APP 内部的同一组件内进行消息通信 B. 不同 APP 的组件之间进行消息通信 C. 在同一个 APP 内部的不同组件之间进行消息通信(单个进程) D. 在同一个 APP 具有多个进程的不同组件之间进行消息通信

    第八章 服务

    8.1 服务概述

    四大组件之一,关于四大组件见 1.4。

    在后台长时间执行操作并且不提供用户界面的应用程序。

    一般由 Activity 启动,但不依赖于 Activity,有自己的生命周期。

    应用场景:

    1. 后台运行 后台长时间运行而不提供界面,系统必须回收内存资源的时候,会被销毁,否则一直在后台运行。
    2. 跨应用访问 服务被启动时,即使用户切换到其它应用程序,服务也会后台继续运行

    例如多媒体后台播放是服务,后台记录地理位置也是服务。

    注意,服务并不是运行在子线程中,而是在主线程中,只是没有界面而已。它的耗时操作会开启子线程来处理,否则会出现 ANR(程序无响应)异常。

    8.3 服务的生命周期

    与启动方式有关,有两种启动方式。

    1. startService() 方法(其他组件调用 stopService()停止,服务自身调用 stopSelf() ) 依次调用 onCreate() onStartCommand() onDestory() 在后台长时间运行,启动服务的组件与服务之间没有关联。即使组件被销毁,服务也会继续运行。
    2. bindService() 方法( unbindService() 解绑) 依次调用 onCreate() onBind() onUnbind() onDestory() 服务与组件绑定,允许组件与服务交互,组件退出/调用 unbindService() 方法,服务就会销毁(当所有组件都解绑的时候,这个服务就会被销毁)。 多个组件可以绑定一个服务。第一个组件绑定是会回调 onCreate() 生命周期方法,后续的绑定只会调用 onBind() 方法,返回 IBinder 给客户端。

    8.5 服务的通信

    通过调用 bindService() 方法开启服务后,服务与绑定服务的组件之间可以通信,通过组件可以控制服务操作服务。

    通信可以先用 startService() 来开启服务,再 bind 绑定组件来通信,也可以直接以 bindService() 来开启服务。

    服务通信方式有两种

    1. 本地服务通信 应用程序内部通信。 Service 类onBind() 方法会返回一个 IBinder 对象,传递给 ServiceConnection 类onServiceConnected( ComponentName Name, IBinder service) 方法,然后绑定服务的组件就通过 IBinder 对象Service 通信。
    2. 远程服务通信 应用程序之间的通信。通过 AIDL(一种接口定义语言) 实现。由于每个应用程序都有自己的进程,因此远程服务通信,是不同进程之间的通信。注意进程与线程的区别,线程是更小的概念,前面提到后台服务在主线程内,耗时操作在子线程内。而主线程和子线程都在进程内。

    习题

    一、填空题

    1. 如果想要停止 bindService() 方法启动的服务,需要调用(onUnbind() )方法。
    2. Android 系统的服务的通信方式分为(本地通信)和(远程通信)。
    3. 远程服务通过(AIDL)实现服务的通信。

    二、判断题

    1. Service 服务是运行在子线程中的。× 是主线程,但耗时操作放到子线程,否则出现程序无响应。
    2. 不管使用哪种方式启动 Service, 它的生命周期都是一样的。× 生命周期的方法都不一样,生命周期也不一样
    3. 使用服务的通信方式进行通信时,必须保证服务是以绑定的方式开启的,否则无法通信。√
    4. 一个组件只能绑定一个服务。× 多个组件可以绑定一个服务,一个组件可以绑定多个服务(据说)
    5. 远程服务和本地服务都运行在同一个进程中。× 远程服务是不同进程之间的数据通信,因此是多进程。

    三、选择题

    1. 如果通过 bindService 方式开启服务,那么服务的生命周期是(C)。 A. onCreate() →onstart() →onBind() →onDestroy() B. onCreate() →onBind() →onDestroy() C. onCreate() →onBind() →onUnBind() →onDestroy() D. onCreate() →onStart() →onBind() →onUnBind() →onDestroy()
    2. 下列关于 Service 服务的描述中,错误的是(D) A. Service 是没有用户可见的界面,不能与用户交互 B. Service 可以通过 Context.startService() 来启动 C. Service 可以通过 Context.bindService() 来启动 D. Service 无须在清单文件中进行配置
    3. 下列关于 Service 的方法描述,错误的是(D)。 A. onCreate() 表示第一次创建服务时执行的方法 B. 调用 startService() 方法启动服务时执行的方法是 onStartCommand() C. 调用 bindService() 方法启动服务时执行的方法是 onBind() D. 调用 startService() 方法断开服务绑定时执行的方法是 onUnbind()
  • 数据库复习

    第一章 绪论

    1.1 数据库系统概述

    1.1.1 四个概念

    1. 数据(Data)描述事物的符号记录 是 数据。数据含义 是 数据语义
    2. 数据库(DB,DataBase)长期储存在计算机内,有组织的,可共享的大量数据的集合。特点:
      1. 按一定的数据模型组织、描述和储存。
      2. 较小冗余度。
      3. 较高数据独立性和易扩展性。
      4. 可共享。
    3. 数据库管理系统(DBMS,DataBase Management System)用户与操作系统间的一层数据管理软件,是计算机的基础软件。功能:
      • 数据定义
      • 数据组织、存储、管理
      • 数据操纵
      • 数据库事务管理和运行管理
      • 数据库建立和维护
    4. 数据库系统存储、管理、处理和维护数据的系统。

    1.1.2 历程

    1. 人工管理阶段
    2. 文件系统阶段
    3. 数据库系统阶段

    1.1.3 数据库系统的特点

    1. 数据结构化
    2. 数据共享性高、冗余度低、易扩充
    3. 数据独立性高
    4. 数据 由 数据管理系统 统一管理控制

    1.2 数据模型

    对数据特征的抽象。

    是数据库系统的核心和基础

    根据模型应用目的可以将模型分为两大类:

    1. 概念模型
    2. 逻辑模型和物理模型

    1.2.1 概念模型

    基本概念:

    1. 实体客观存在并可相互区别的事物称为 实体 。一条数据本身是一个实体。
    2. 属性实体具有的某一特性称为 属性
    3. 码唯一标识实体的属性集称为
    4. 实体型实体名和属性名集合来抽象刻画实体,称为 实体型。如 学生(姓名,学号,性别,出生日期)是一个实体型。
    5. 实体集同一类型的实体集合。
    6. 联系不同实体集之间的联系。有一对一,一对多,多对多。

    E-R 方法:实体-联系方法。

    1.2.2 数据模型的组成要素

    • 数据结构数据库的组成对象以及对象之间的联系。
    • 数据操作操作及操作规则。对各种对象的实例允许执行的操作的集合。
    • 数据的完整性约束条件一组完整性规则。

    1.2.3 常用数据模型

    • 层次模型
    • 网状模型
    • 关系模型
    • 面向对象数据模型
    • 对象关系数据模型
    • 半结构化数据模型

    基本层次联系 是指两个记录以及它们间的一对多(包括一对一)的联系。

    1.2.4 数据模型详解

    层次模型

    特点:

    • 有且只有一个结点没有双亲节点,称为根节点
    • 根以外其它结点有且只有一个双亲节点

    //类似树,只有一个父节点但可以很多个子节点。

    优点:

    1. 数据结构简单清晰
    2. 查询效率高
    3. 良好的完整性支持

    缺点:

    1. 非层次性的不适合用层次模型表示
    2. 具有多个父节点的关系,使用层次模型比较复杂
    3. 查询子女结点必须通过双亲节点
    4. 层次命令趋于程序化

    网状模型

    特点:

    1. 允许一个以上的节点无双亲
    2. 一个结点可以有多个双亲

    优点:

    1. 更直接描述现实世界
    2. 性能良好,存取效率高

    缺点:

    1. 结构复杂
    2. 嵌入高级语言后,用户不易掌握
    3. 必须了解系统结构的细节

    关系模型

    数据结构
    • 关系:一张表
    • 元组:一行
    • 属性:一列
    • 码:唯一标识
    • 域:属性的取值范围
    • 分量:元组的一个属性值
    • 关系模式:对关系的描述,理解成表头,但表示成关系名(属性1,属性2,属性3,……)

    关系模型要求关系规范化,不允许表中有表。

    术语对比

    关系术语一般表格的术语
    关系名表名
    关系模式表头
    关系一张表
    元组
    属性
    属性名列名
    属性值列值
    分量一条记录中的一个列值
    非规范关系表中有表

    优点:

    1. 建立在严格的数学概念上
    2. 数据结构简单、清晰,用户易懂、易用
    3. 存取路径对用户透明

    1.3 数据库系统的三级模式结构

    外模式、模式、内模式 三个抽象级别。

    1. 模式也称 逻辑模式 ,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
    2. 外模式也称 子模式用户模式 ,它是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
    3. 内模式也称 存储模式 ,一个数据库只有一个内模式,它是数据物理结构和存储方式的描述。是数据在数据库内部的组织方式。

    1.4 数据库系统的二级映像功能与数据独立性

    两层映像:

    • 外模式 / 模式映像一个模式(数据的全局逻辑结构)可以有多个外模式(数据的局部逻辑结构)。注:应用程序是根据数据的外模式编写的。数据与程序有逻辑独立性。模式改变时,外模式可以不变。
    • 模式 / 内模式映像当存储结构改变时,模式和应用程序都可以不改变。数据与程序具有物理独立性。

    第二章 关系数据库

    2.1 关系数据结构及形式化定义

    2.1.1 关系

    • 域属性的取值范围。定义:域是一组具有相同数据类型的值的集合。域允许的不同取值个数称为 基数
    • 笛卡尔积就是把多个域的全部组合遍历。例如 老师域×学生域 得到 全部(老师,学生)。
    • 关系笛卡尔积代表全部的可能性,但现实中往往并不是全部可能性都真实存在。因此笛卡尔积的子集称为关系。若某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为 候选码 多个候选码,选一个为 主码 。候选码的各种属性称为 主属性 。不包含在各种候选码中的属性称为 非主属性非码属性 。候选码有时候只有一个属性,有时候可能包含全部属性,即全部属性才能唯一地标识一个元组。后者称为 全码 。三种类型:
      • 基本关系(基本表,基表)
      • 查询表
      • 视图表
      关系模型要求关系规范化6条性质
      1. 列是同质的,每个分量来自同一个域。
      2. 不同的列可以出于同一个域。如 老师域和学生域 合成 人域。但属性名(列名)需要区分开。
      3. 列的顺序无所谓。
      4. 行的顺序无所谓
      5. 任意两个元组的候选码不同。(候选码是唯一标识)
      6. 分量必须取原子值。即每个分量都是一个不可分的数据项。(基本)

    2.2 关系的完整性

    实体完整性、参照完整性、用户定义的完整性。

    1. 实体完整性主属性不能取空值。
    2. 参照完整性外码对于关系 R 中每个元组,外码要么取空,要么取外码所在表的主码(唯一标识)。
    3. 用户定义的完整性例如分数在0~100之间。

    2.3 关系代数

    传统集合运算:

    1. 并 R ∪ S
    2. 差 R – S 属于R但不属于S
    3. 交 R ∩ S
    4. 笛卡尔积 ×

    关系运算

    1. 选择 Sigma σF(R)选择满足条件的元组。
    2. 投影 派 ΠA(R)关系 R 的投影是从 R 中选择出若干属性列,组成新的关系。
    3. 连接 $$
      R \Join S
      $$
      从两个 关系 的笛卡尔积中选取满足条件的元组。
    4. 除运算 R ÷ S 包含所有在 R 不在 S 的属性和值。

    2.4 关系演算

    ALPHA 语言

    GET 检索操作

    • GET W(SC.Cno) //条件为空
    • GET W(5)(Student.Sno,Student.Sage):Student.Sdept=‘IS’ DOWN Student.Sage //取五个 IS 系学生的学号年龄,年龄降序排列。

    PUT 插入操作

    HOLD 取指令,类似于指针指向一个关系

    UPDATE 修改操作,不允许修改主码

    DELETE

    DROP

    基本格式

    操作语句 工作空间名(数量)(表达式):操作条件

    RANGE A B 把 A 重命名为 B 。

    函数名功能
    COUNT对元组计数
    TOTAL求总和
    MAX求最大值
    MIN求最小值
    AVG求平均值

    QBE 语言

    Query By Example。

    在表中填条件。

    操作符

    操作符意义
    P.Print 打印
    U.Update 更新
    I.Insert 插入
    D.Delete 删除

    第三章 SQL

    3.1 概述

    特点:

    1. 综合统一
    2. 高度非过程化
    3. 面向集合的操作方式
    4. 同一种语法结构提供多种使用方式
    5. 语言简洁,易学易用

    数据库中只存放视图定义,不存放视图数据。

    3.2 SQL 语句

    操作关键字:

    关键字作用
    CREATE创建
    DROP删除表,索引
    ALTER TABLE修改
    UPDATE更新
    DELETE删除数据

    ALTER TABLE 适用于表和索引的修改,可以ADD列,DROP列,ALTER列

    名词关键字:

    关键字意义
    SCHEMA模式
    TABLE
    INDEX索引

    数据类型:(挖坑,下辈子填)

    SELECT 语句中可选的条件:

    关键字作用
    DISTINCT去除重复
    ALL不去除重复

    通配符:

    • % 任意长度
    • _ 一位长度

    WHERE 子句常用查询条件:

    3.3 索引(INDEX)

    索引存在可以加快查询速度。

    3.4 视图(VIEW)

    CREATIVE VIEW name (列名1,列名2…) AS SELECT [WITH CHECK OPTION];

    第四章 数据库安全性

    4.1 安全性概述

    安全性:保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。

    不安全因素:

    1. 非授权用户对数据库恶意存取破坏
    2. 数据库的重要或敏感的数据被泄露
    3. 安全环境的脆弱性

    4.2 安全性控制

    常用方法和技术:

    1. 用户标识和鉴别
    2. 存取控制
    3. 视图机制
    4. 审计
    5. 数据加密
    1. 用户身份鉴别
      • 静态口令
      • 动态口令
      • 生物特征
      • 智能卡
    2. 存取控制
      • 定义用户权限
      • 合法权限检查
    3. 自主存取控制两个要素:
      • 数据库对象
      • 操作类型
      授权:定义用户权限
    4. 授权
      1. 授予 GRANTGRANT 操作如SELECT ON TABLE name TO username;
      2. 收回 REVOKEREVOKE 操作如SELECT ON TABLE name TO username;
    5. 强制存取控制方法强制存取控制是对数据本身进行密集标记。无论数据如何复制,标记和数据是一个不可分的整体。只有符合密级标记要求的用户才可以操纵数据,从而提供了更高级别的安全性。数据库所管理的实体被分为主体和客体。客体受主体操控。可以理解成,主体是操作者,客体是资料。敏感度标记分配给主体与客体的实例值。主体:许可证级别。客体:密级。敏感度标记:
      1. 绝密
      2. 机密
      3. 可信
      4. 公开
      规则:
      1. 主体许可证级别高于等于客体密级则可读
      2. 主体许可证级别低于等于客体密级则可写

    第五章 数据库完整性

    正确性相容性

    5.1 实体完整性

    主码不能取空值。

    定义实体完整性(设置主码)

    1. 列级定义(单属性)
    2. 表级定义(单属性或多属性)

    检查实体完整性

    1. 检查主码值是否唯一
    2. 检查主码的各个属性是否为空

    5.2 参照完整性

    外码对于关系 R 中每个元组,外码要么取空,要么取外码所在表的主码(唯一标识)。

    定义参照完整性(设置外码)

    表级定义。

    FOREIGN KEY (属性名) REFERENCES 表名(属性名)

    检查参照完整性

    5.3 用户定义的完整性

    如列值非空,列值唯一,列值是否满足一个条件表达式 CHECK(列名 条件)。

    1. 列级定义
    2. 元组上定义

    第六章 关系数据理论

    6.1 函数依赖

    X→Y则函数依赖。

    通过X可以推出Y。

    6.2 码

    候选码

    主码

    主属性:包含在任何一个候选码中的属性。

    其它叫非主属性。

    码:候选码和主码统一简称。

    6.3 范式

    关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。

    最低要求 1NF。第一范式中,进一步要求为 2NF。

    规范化:一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合。

    6.4 2NF

    若R∈1NF,且每一个非主属性完全函数依赖于任何一个候选码,则R∈2NF。

    6.5 3NF

    没有传递依赖关系的存在称为3NF。

    定义:设R<U,F>不存在 码X,属性组Y,非主属性Z,使得

    $$
    X\to Y,Y\to Z,Y\not{\to } X
    $$

    成立,则称 R<U,F>∈3NF。

    第七章 数据库设计

    7.1 基本步骤

    1. 需求分析
    2. 概念结构设计
    3. 逻辑结构设计
    4. 物理结构设计
    5. 数据库实施
    6. 数据库运行和维护

    7.2 E-R 图

    E-R 图是概念结构设计中的概念。

    E-R 模型

    两个实体型之间的联系:

    1. 一对一联系(1:1)
    2. 一对多联系(1:n)
    3. 多对多联系(m:n)

    多个实体型之间的联系:

    一对一,一对多,多对多。

    单个实体型内的联系:

    一对一,一对多,多对多。

    E-R 图

    实体型:矩形

    属性:椭圆

    联系:菱形

    第十章 数据库恢复技术

    10.1 事务

    定义

    是用户定义的一个数据库操作序列。

    这一系列操作,要不全都做,要不全都不做。是不可分割的。

    特性

    ACID 特性:

    1. 原子性(不可分割)
    2. 一致性(使数据库中的数据不发生逻辑错误)
    3. 隔离性(并发的各个事务之间不能相互干扰)
    4. 持续性(永久性,事务提交后,其改变或者效果应该是永久性的)

    干扰因素:

    1. 不同事务交叉执行
    2. 事务执行时被强行停止

    第十一章 并发控制

    11.1 概述

    事务是并发控制的基本单位

    并发操作带来的不一致性

    1. 丢失修改
    2. 不可重复读
    3. 读 “脏” 数据

    主要原因:并发操作破坏了事务的隔离性。

    并发控制机制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰。

    并发控制主要技术:

    1. 封锁
    2. 时间戳
    3. 乐观控制法
    4. 多版本并发控制

    11.2 可串行化调度

    定义

    多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行执行这些事务时的结果相同。

    可串行性

    是并发事务正确调度的准则。

    11.3 两段锁协议(2PL)

    事务两个阶段:

    1. 获得封锁,扩展阶段:在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。
    2. 释放封锁,收缩阶段:在释放一个封锁之后,事物不再申请和获得任何其他封锁。

    11.4 封锁的粒度

    封锁对象的大小。

    封锁对象可以是逻辑单元,也可以是物理单元。

    封锁粒度与系统的并发度和并发控制的开销密切相关。

    多种封锁粒度,供不同的事务选择。称为多粒度封锁