一、进程
三种状态:就绪、运行、等待。关系图如下。
😇就绪:当一个进程获得了除处理机以外的一切所需资源,一旦得到处理机即可运行,则称此进程处于就绪状态;
😇运行:当一个进程在处理机上运行时,则称该进程处于运行状态。(处于此状态的进程的数目小于等于处理器的数目,对于单处理机系统,处于运行状态的进程只有一个。)另外,在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
😇等待:等待某一事件暂时不能运行。又称阻塞态、睡眠态等。

五种状态(新建状态、运行、就绪、等待、终止状态)
😇新建状态:进程在创建时需要申请一个空白PCB,向其中填写控制和管理进程的信息,完成资源分配。
😇终止状态:进程结束,或出现错误,或被系统终止,进入终止状态,无法再执行。
其关系图如下:

二、绝对路径和相对路径
绝对路径:从根目录开始的路径,以“/”代表根目录;
相对路径:是从当前路径开始的路径。
例:以下图为基准,当前工作目录为MyDrivers,访问book2.doc的绝对路径和相对路径为?

🔺绝对路径:\MyDrivers\user2\
🔺相对路径:user2\
👉PV操作:由P操作原语和V操作原语组成(原语是不可中断的过程),该操作用来实现进程的同步和互斥,属于进程的低级通信。
✅嵌入式操作系统能运行在不同的微处理器平台上,能针对硬件变化进行结构与功能上的配置——嵌入式操作系统的可定制性。
😮微型化:从性能和成本角度考虑,希望占用的资源和系统代码量少;
😮可定制性:从减少成本和缩短研发周期考虑,要求嵌入式操作系统能运行在不同的微处理器平台上,能针对硬件变化进行结构与功能上的配置,以满足不同应用的需求;
😮实时性:嵌入式操作系统主要应用于过程控制、数据采集、传输通信、多媒体信息及关键要害领域需要迅速响应的场合,所以对实时性要求较高;
😮可靠性:系统构件、模块和体系结构必须达到应有的可靠性,对关键要害应用还要提供容错和防故障措施;
😮易移植性:为了提高系统的易移植性,通常采用硬件抽象层和板级支持包的底层设计技术。
三、极限编程XP的最佳实践
👇
现场客户(On-site Customer):要求至少有一名实际的客户代表在整个项目开发周期在现场负责确定需求、回答团队问题以及编写功能验收测试;
代码规范(Code Standards):强调通过指定严格的代码规范来进行沟通,尽可能的减少不必要的文档;
每周40小时工作制(40-hour Week):要求项目团队人员每周工作时间不能超过40小时,加班不得连续超过两周,否则反而影响生产率;
计划博弈(Planning Game):要求结合项目进展和技术情况,确定下一阶段要开发和发布的系统范围;
系统隐喻(System Metaphor):通过隐喻来描述系统如何运作、新的功能以何种方式加入到系统。通常包含一些可以参照和比较的类和设计模式。此外,XP不需要提前进行详细的框架设计。
简单设计(Simple Design):代码的设计应该尽可能的简单,只要满足当前功能的要求,不多不少;
测试驱动(Test--driven):先测试(在编码之前先将测试写好,然后再编码),直至所有的测试全部通过;
代码重构(Refactoring):开发人员应当经常进行重构。一般“功能实现与实现后”这两个关键点应进行重构;
成对编程(PairnProgramming):由两个开发人员在同一台电脑上共同编写解决同意问题的代码,一般一人负责写代码,另一人负责保证代码的正确性和可读性;
集体代码所有制(Collective Ownership):开发小组的每个成员都有更改代码的权利,所有人对全部代码都有责任;
持续集成(Continuous Integration):希望在一天中集成系统多次,并随需求改变的同时要不断地进行回归测试;
小型发布(Small Release):在非常短的周期内以递增的方式发布新版本,这样就能较容易的估计每个迭代周期的进度,便于控制工作量和风险,也可以及时处理用户反馈;
🙋ISO/IEC9126软件质量模型:评估软件质量。包含质量特性、质量子指标、度量指标。
质量特性 | 功能性 | 可靠性 | 易用性 | 效率 | 维护性 | 可移植性 |
质量子特性 | 适合性 | 成熟性 | 易理解性 | 时间特性 | 易分析性 | 适应性 |
准确性 | 容错性 | 易学性 | 资源利用性 | 易改变性 | 易安装性 | |
互操作性 | 易恢复性 | 易操作性 | 稳定性 | 共存性 | ||
保密安全性 | 吸引性 | 易测试性 | 易替换性 | |||
依从性 | 依从性 | 依从性 | 依从性 | 依从性 | 依从性 |
四、耦合
非直接耦合:两个模块之间没有直接联系,它们之间的联系是通过主模块的控制和调用实现的,其耦合度最低、模块独立性也最强;
数据耦合:两个模块之间有调用关系,传递的最简单的数据值,相当于高级语言的值传递;
标记耦合:两模块直接传递的是数据结构,如高级语言中的数组名、记录名、文件名等这些名字即标记,实际传递的就是这个数据结构的地址;
控制耦合:是指一个模块调用另一个模块时,传递的是控制变量,被调用模块通过该控制变量的值有选择的执行模块内的某一功能;
外部耦合:模块间通过软件之外的环境联结(比如I/O将模块耦合到特定的设备、格式、通信协议上)时成为外部耦合;
公共耦合:通过一个公共数据环境相互作用的那些模块间的耦合;
内容耦合:当一个模块直接使用另一个模块的内部数据,或通过非正常入口转入另一个模块内部时,称为内容耦合。
📢界面设计的三大黄金准则
🌞用户操纵控制
🌞减少用户的记忆负担
🌞保持界面的一致性
五、白盒测试用例设计方法
✅语句覆盖每条语句至少执行一次;
✅判定覆盖每个判断的每个分支至少执行一次;
✅条件覆盖每个判定的每个条件应取到各种可能的值;
✅条件判定覆盖同时满足判定覆盖条件覆盖;
✅条件组合覆盖每个判定中各条件的每一种组合至少出现一次;
✅路径覆盖使程序中每一条可能的路径至少执行一次。
至上而下,发现错误的能力由弱至强。
软件的维护
😷纠错型维护:诊断和修正系统中遗留的错误。常在系统运行中发生异常或故障时进行;
😷适应性维护:使系统适应环境的变化而进行的维护工作。常见的有代码改变、数据结构变化、数据格式以及输入、输出方式的变化、数据存储介质的变化;
😷完善性维护:为了满足原有系统功能的扩充、增加软件规范书中没有规定的功能与特性、对于程序处理效率的提高等而进行的系统维护工作。一般有程序的合并、数据输出图形方式的增加、联机在线帮助功能、用户界面调整;
😷预防性维护:对将要发生变化或调整的系统进行维护,为未来的修改与调整奠定更好的基础;
组合与聚合
聚合:两个对象之间是整体和部分的弱关系,整体和部分可以分开,部分的生命周期可以超越整体。
组合:两个对象之间是整体和部分的密切关系,部分的生命周期不能超越整体,或者说不能脱离整体而存在。
面向对象的设计原则
👇
单一职责原则:一个类只做一件事,实现类要单一
开放-封闭原则:对扩展开发,对修改封闭
李氏Liskov替换原则:不破坏继承体系,子类重写方法功能发生改变,不该影响父类方法的含义
依赖倒置原则:高层不应依赖低层,要面向接口编程
接口隔离原则:接口精简单一,高聚合,低耦合
组合重用原则:使用组合或聚合关系实现代码复用,防止继承泛滥
Demeter原则:一个类要保持对其他对象最少的了解,降低耦合
部署图UML
显示系统中软件和硬件的物理架构;
可以看到软件和硬件组件之间的物理关系以及处理节点的组件分布情况;
物理建模
设计模式
👉创建型模式:创建对象(工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式)
👉结构型模式:处理类和对象的组合(适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式)
👉行为型模式:描述类或对象怎么样交互和怎样分配职责(策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式)
责任链(Chain of Responsibility)模式:使得多个对象都有机会处理请求,以避免请求的发送者和接收者之间的耦合关系。(将这些对象连成一条链,沿着它传递请求,直到有一个对象处理它为止。)
😣Handle:抽象处理者
😣ConcreteHandler:具体处理者
😣Client:客户类
迭代器模式Iterator:提供一种方法顺序访问一个聚合对象中的各个元素,而不需要暴露该对象的内部表示。
观察者模式Observer:定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
今天的学习就到这里啦!