面试被问到了解哪些开发模型?看这一篇就够了!

 🔥 交流讨论:欢迎加入我们一起学习!

🔥 资源分享耗时200+小时精选的「软件测试」资料包

🔥 教程推荐:火遍全网的《软件测试》教程  

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

前言

软件开发模型是指软件开发全部过程、活动和任务的结构框架。一般包括需求、设计、编码和测试等阶段,甚至包括维护阶段。软件开发模型明确规定了软件开发过程中要完成的主要活动和任务,用来指导整个开发过程中的工作。对于不同的系统,可依据软件的特点、项目成员的参与方式选择不同的软件开发模型。作为测试工程师,测试的工作内容与软件开发模型紧密相关,不同的开发模型中,测试的任务和作用也会不同。以下,给大家介绍几种常见的开发模型。

1、瀑布模型

瀑布模型作为最早出现的软件开发模型,提供了软件开发的基本框架,为后续出现的开发模型奠定了基础。从1970年被温斯顿·罗伊斯(Winston Royce)提出后,直到80年代早期,一直是被广泛采用。

这种模式有明确的阶段活动,分为6个阶段:计划→需求分析→软件设计→编码→测试→运行维护。阶段顺序固定,自上而下、相互衔接,形如瀑布流水逐级下落。这也是瀑布模型名称的由来。

瀑布模型的本质是一次通过,即每个活动只执行一次,最后得到软件产品,也称为“线性顺序模型”或者“传统生命周期模型”。其过程是上一个阶段的工作完成输出结果并通过审核,才能“流动”到下一个阶段;否则返回前面,甚至更前的阶段活动。

缺点:

1)各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量。

2)由于开发模型是线性的,单一流程,不可逆,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发风险。

3)测试只是其中一个阶段,缺乏全过程测试思想。早期的错误可能要等到开发后期的测试阶段才能发现,发现问题越晚造成代价越高

4)在软件需求分析阶段,完全确定用户的所有需求是比较困难的,不能应对需求不断变更的项目。

优点:

1)为项目提供了按阶段划分的检查点。

2)当前一阶段完成后,您只需要去关注后续阶段。

适用项目范围:

1)需求很明确的软件开发项目;

2)在开发时间内需求没有或很少变化;

3)分析设计人员应对应用领域很熟悉;

4)低风险项目(对目标、环境很熟悉);

5)用户使用环境很稳定;

2、快速原型模型

快速原型模型与瀑布模型相反,项目初期根据用户的需求快速构建一个可以运行的系统原型,之后向用户展示,由用户进行审核,提出意见,然后逐步丰富项目需求。当需求真正确定后,才正式进行项目开发。

优点:

有助于满足用户的真实需求;原型系统已经通过与用户的交互而得到验证,据此产生的规格说明文档能够正确地描述用户需求。

缺点:

要求开发人员快速建立原型。

适用项目范围:

适用于需求不明确的软件项目。

3、增量模型

又称为迭代模型或演化模型,它将一个完整的软件拆分成不同的组件,然后逐个组件地开发测试,每完成一个组件就展现给客户,让客户确认这一部件功能和性能是否达到客户需求,最终确定无误,将组件集成到软件体系结构中。整个开发工作被组织为一系列短期、简单的小项目,称为一系列迭代,每一个迭代都需要经过需求分析→软件设计→编码→测试的过程。

优点:

1)第一个可交付版本的软件所需的成本与时间较小

2)能够适应客户的需求变更,当需求变化时,只需要修改某一个组件即可。

缺点:

1)如果对用户需求的变更没有整体的规划,可能会变化为"边做边开发"的模式。

2)最终集成各个组件时,可能会出现集成失败的风险。

适用项目范围:

适用于工期紧张、功能可以划分、比较复杂的软件项目。软件工程师必须有较高的技术水平,能够设计出开放的软件体系结构。

4、螺旋模型

该模型融合了瀑布模型、快速原型模型,由巴利·玻姆(Barry Boehm)于1988年提岀,该模型最大的特点就是引入了其他模型所没有的风险分析。螺旋模型将开发过程分为几个螺旋周期,每个螺旋周期大致和瀑布模型相符合,在每个周期开始之前都会进行风险分析。在每个阶段,首先构建软件原型,根据快速原型模型完成这个迭代过程,产出最终完善的产品,然后进入下一个阶段,同样下一个阶段开始之前也要进行风险评估,这样循环往复直到完成所有阶段的任务。

该模型共有四个象限,每个象限的含义如下:

1、制订计划:确定软件目标,制订实施方案,并且列出项目开发的限制条件。

2、风险分析:评价所制订的实施方案,识别风险并消除风险。

3、实施工程:开发产品并进行验证。

4、客户评估:客户对产品进行审核评估,提出修正建议,制订下一步计划。

优点:

1)对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量作为软件开发的一个重要目标;

2)减少了过多测试或测试不足所带来的风险;

3)在螺旋模型中维护只是模型的另一个周期,在维护和开发之间并没有本质区别。

缺点:

螺旋模型是风险驱动的,因此要求软件开发人员必须具有丰富的风险评估经验和这方面的专门知识

适用项目范围:

适用于内部开发的大型软件(开发周期长、比较容易受到社会因素影响的软件项目),软件开发人员具有丰富的风险评估知识和经验。


 

5、V模型

V模型也叫RAD(Rapid Application Development,快速应用开发)模型,是软件开发过程中的一个重要模型,由于其模型构图形似字母V,所以称为软件测试的V模型。V模型大体可以划分为以下几个不同的阶段步骤:客户需求分析、软件需求分析、概要设计、详细设计、软件编码、单元测试、集成测试、系统测试、验收测试。

优点:

开发阶段包含了底层测试(单元测试)和高层测试(系统测试);清楚的标识了开发和测试的各个阶段;每个阶段分工明确,便于整体项目的把控。

缺点:

自上而下的顺序导致了,测试工作要在编码之后进行,就导致错误不可以及时进行修改;实际工作中,经常变更需求,导致v模型步骤反复执行,返工量大,灵活度低。

适用 项目范围:

一般适用于一些传统信息系统应用的开发,而一些高性能高风险的系统、互联网软件,或一个系统难以被具体模块化的时候,就比较难做成V模式所需的各种构件,需要更强调迭代的开发模型或者敏捷开发模型。

6、敏捷模型

敏捷模型是20世纪90年代兴起的一种软件开发模型。在现代社会的开发中,由于业务会经常快速的变化,因此会导致在软件开发之前经常是无法得到详细完整的开发需求,没有完整的开发需求,传统的软件开发模型也就无法适用。敏捷开发模型的提出就是为了解决该问题。该模型以客户的需求为核心,采用迭代,循序渐进的方法进行开发。

软件项目在构建初期会被拆分为多个相互联系而又独立运行的子项目,然后迭代完成各个子项目。当客户有需求变更时,敏捷模型能够迅速地对某个子项目做出修改以满足客户的需求。在这个过程中,软件一直处于可使用状态。

优点:

1、用户很快可以看到一个基线架构版的产品

2、敏捷注重市场快速反应能力,与客户面对面的交流

3、随时可以接受更改

缺点:

1、注重人员的沟通,需要较好的团队协作

2、忽略文档的重要性,需要项目中存在经验较强的人

3、如果项目人员流动大太,会增加项目维护难度

适用项目范围:

适用于产品复杂,需求多变,难预测、实现周期长的产品。

最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!

<think> 嗯,用户这次的需求很明确,是关于安卓/Linux驱动面试题的整理。从对话历史看,用户之前已经询过Linux内核面试题,现在转向更具体的驱动开发方向,特别是安卓相关的场景。用户还提供了几篇参考资料,说明ta正在认真准备技术面试,可能需要实战性强的题清单。 用户引用的资料[1]~[4]很有价值,其中提到中断处理、内存管理、并发控制等核心知识点。结合这些内容和行业常见考点,应该重点覆盖以下维度:首先是硬件交互层(如寄存器操作、中断处理),然后是驱动框架(如Linux设备模型、安卓HAL层),最后是系统优化(启动加速、功耗管理)。尤其要注意安卓特有的binder、ashmem等机制。 考虑到用户可能是求职者,题设计需要区分难度层级:基础题考察概念理解(如IRQ/FIQ区别),进阶题关注实现原理(如自旋锁实现),实战题侧重场景应对(如LCD调试流程)。答案示例要简洁清晰,比如用代码片段说明mmap用法,用表格对比下半部处理机制。 用户资料[3]提到安卓启动优化,这在实际工作中很重要,可以单独列出优化方法表格。另外ta提到的"裸机寄存器操作与系统环境下差异"很有意思,这正好体现驱动开发在不同场景的适配能力,应当在并发控制题中展开。 最后生成的相关题要引导深入学习,比如从binder机制延伸到进程通信安全,从启动优化关联到init进程分析。用户明显是技术背景,题可以适当深入内核源码层面。 </think> 以下是安卓/Linux驱动面试高频题及解析,结合硬件交互与系统特性分类整理: --- ### **一、驱动开发基础** 1. **Linux内存分配函数对比** | 函数 | 适用场景 | 特性 | |---------------|-------------------------|-----------------------------| | `kmalloc` | 小内存连续物理地址 | 最大分配4MB,可能触发直接内存回收[^1] | | `vmalloc` | 大内存非连续物理地址 | 虚拟地址连续,适用于DMA映射 | | `kzalloc` | 要求内存清零 | 等价于`kmalloc + memset(0)` | | `alloc_pages` | 页级分配(如Buddy System) | 直接获取`struct page`结构 | 2. **IRQ与FIQ硬件级差异** - **优先级**:FIQ > IRQ(FIQ有私有寄存器r8-r14减少压栈开销) - **响应速度**:FIQ向量地址在中断向量表末端(`0x1C`),可连续执行代码无需跳转 - **用途**:FIQ用于实时性要求极高的场景(如触控采样)[^4] --- ### **二、中断与并发控制** 3. **中断分上下半部的原因** - **上半部**:快速响应硬件,仅做关键操作(如清除中断标志),**不可中断** - **下半部**:延迟处理耗时任务(如数据处理),**可被新中断打断** - **实现方式**: ```c // 上半部注册 request_irq(irq, top_half_handler, IRQF_SHARED, "dev", dev); // 下半部选择 tasklet_schedule(&bottom_tasklet); // 软中断上下文,不可睡眠 schedule_work(&work_queue); // 进程上下文,可睡眠 ``` [^4][^2] 4. **自旋锁实现原理** - **原子操作**:基于CPU的`test-and-set`指令(如ARM的`LDREX/STREX`) - **忙等待**:未获取锁时循环检测(`while (lock != 0);`) - **注意事项**:禁止在持有锁时睡眠(否则引发死锁)[^4] --- ### **三、内核机制深度** 5. **mmap实现机制** - **核心流程**: ```mermaid graph LR A[用户空间mmap调用] --> B[驱动mmap_operation] B --> C[remap_pfn_range] C --> D[建立页表映射] D --> E[用户空间直接访物理内存] ``` - **应用场景**:LCD帧缓冲区映射(避免用户态-内核态拷贝)[^3] 6. **并发控制必要性及实现** - **竞态场景**:多核同时访设备寄存器(如传感器数据读取) - **解决方案**: ```c static DEFINE_SPINLOCK(data_lock); // 声明自旋锁 void read_sensor_data(void) { spin_lock(&data_lock); iowrite32(REG_ADDR, ...); // 临界区操作 spin_unlock(&data_lock); } ``` [^4] --- ### **四、安卓系统优化** 7. **启动加速关键手段** | 优化方向 | 具体措施 | |--------------|------------------------------------------------------------------------| | **内核裁剪** | 移除无用驱动(`make menuconfig`关闭未用外设支持) | | **Init优化** | 并行启动服务(`init.rc`使用`exec_start`并行执行) | | **打印控制** | 降低Kernel Log等级(`loglevel=1`启动参数) | | **固件加载** | 预加载固件到内存(减少文件系统访)[^3] | 8. **LCD驱动调试流程** 1. 获取屏幕规格书(确认接口类型:MIPI/LVDS/eDP) 2. 配置DTS参数(时序参数、背光控制引脚) ```dts panel: panel@0 { compatible = "samsung,lcd-panel"; backlight-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>; // 背光控制GPIO timing: 1280x720p60 { ... }; // 时序配置 }; ``` 3. 验证帧率与色彩(通过`fbset`调整分辨率)[^3] --- ### **五、嵌入式系统特性** 9. **Linux vs WinCE特性对比** | **特性** | **嵌入式Linux** | **WinCE** | |---------------|--------------------------------|------------------------| | **实时性** | 需打PREEMPT_RT补丁 | 原生支持硬实时 | | **文件系统** | 支持EXT4/F2FS/Btrfs等 | 仅支持FAT/NTFS | | **开发成本** | 工具链免费 | 需购买License | | **驱动模型** | 统一设备树(DTS) | 注册表配置 | 10. **TTY驱动体系结构** ```mermaid graph TB User[用户空间] -->|read/write| TTY_Core[TTY核心层] TTY_Core -->|数据处理| Line_Discipline[线路规程层] Line_Discipline -->|字节流| TTY_Driver[底层驱动(UART/USB)] ``` - **关键层**:线路规程层实现协议解析(如PPP/SLIP)[^1] --- ### 相关进阶题 1. 如何通过eBPF监控驱动中的函数调用? 2. 解释Binder驱动在安卓进程通信中的作用? 3. Ashmem(匿名共享内存)相比mmap的优势? 4. 如何诊断因自旋锁引发的系统死锁? 5. 在安卓系统中调试I2C设备失败的常见原因? > 注:面试中常要求手写关键结构体(如`file_operations`)或分析驱动oops日志。 [^1]: 寄存器操作与内存分配机制 [^2]: 中断上半部与下半部实现原理 [^3]: 安卓启动优化与外设调试实战 [^4]: 并发控制与内核同步机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值