软件工程师笔试面试题
软件工程师的常见面试题

选择题:在软件开发过程中,哪种模型强调按照时间顺序进行严格的阶段划分,每个阶段都有明确的任务和输出?A. 螺旋模型B. 喷泉模型C. 瀑布模型(正确答案)D. 敏捷模型关于数据结构中的栈(Stack),以下哪种说法是正确的?A. 栈是一种先进先出的数据结构B. 栈是一种后进先出的数据结构(正确答案)C. 栈不允许进行插入和删除操作D. 栈的访问速度比数组慢在面向对象编程中,哪个概念用于描述对象之间的交互方式?A. 继承B. 封装C. 接口(正确答案)D. 多态关于软件测试,以下哪种测试方法主要关注于测试软件的功能是否按照需求规格说明书正确实现?A. 性能测试B. 安全测试C. 功能测试(正确答案)D. 回归测试在数据库设计中,哪种图用于表示实体之间的关系?A. 数据流图B. E-R图(正确答案)C. 状态图D. 类图以下哪种编程语言是一种动态类型语言?A. JavaB. C++C. Python(正确答案)D. C#在软件开发中,版本控制的主要目的是什么?A. 提高软件的执行速度B. 管理软件的多个版本,确保团队成员之间的协作顺畅(正确答案)C. 减少软件中的bug数量D. 自动化软件测试关于算法的时间复杂度,以下哪种说法是正确的?A. 时间复杂度越低,算法的执行速度越慢B. 时间复杂度越高,算法的执行速度越快C. 时间复杂度用于描述算法执行时间与输入规模之间的增长关系(正确答案)D. 时间复杂度与算法的实际执行时间无关在Web开发中,哪种技术用于在客户端和服务器之间异步传输数据?A. HTMLB. CSSC. AJAX(正确答案)D. JavaScript(虽然JavaScript也用于Web开发,但它本身不专门用于异步传输数据)。
软件工程师面试题及答案

软件工程师面试题及答案在当今科技飞速发展的时代,软件工程师成为了备受追捧的职业之一。
而在求职过程中,面试是至关重要的环节。
以下为您呈现一些常见的软件工程师面试题及答案,希望能对您有所帮助。
一、技术类问题1、请简要介绍一下面向对象编程(OOP)的三大特性,以及它们在实际开发中的应用。
答案:面向对象编程的三大特性是封装、继承和多态。
封装是将数据和操作数据的方法封装在一个类中,以实现数据的隐藏和保护,提高代码的安全性和可维护性。
例如,将一个人的个人信息和相关操作封装在一个“Person”类中。
继承允许创建一个新类,从现有类继承属性和方法,实现代码的复用和扩展。
比如,从“Employee”类继承创建“Manager”类。
多态使得同一个方法在不同的对象中有不同的实现方式,增强了程序的灵活性。
比如,在一个图形绘制程序中,不同的图形类(如圆形、方形)都实现了“draw”方法,但具体的绘制方式不同。
2、谈谈你对数据库索引的理解,以及在什么情况下应该使用索引,什么情况下不应该使用?答案:数据库索引是一种用于提高数据检索速度的数据结构。
它类似于书籍的目录,通过索引可以快速定位到所需的数据。
在经常用于查询、连接和排序的列上应该使用索引,比如主键、外键、经常用于搜索的字段等。
然而,在数据量小的表、频繁更新的列、数据分布不均匀的列上不应该使用索引,因为创建和维护索引会带来额外的开销,可能会降低数据插入、更新和删除的性能。
3、解释一下什么是线程安全,以及如何实现线程安全?答案:线程安全是指多个线程同时访问和操作同一共享资源时,程序的执行结果是正确的,不会出现数据不一致或其他异常情况。
实现线程安全的方法有多种,比如使用同步关键字(如 synchronized )来锁定关键代码段,确保同一时刻只有一个线程能够访问共享资源;使用线程安全的集合类(如 ConcurrentHashMap )替代非线程安全的集合类;避免共享可变状态,尽量使用不可变对象等。
软件测试工程师常见面试题和笔试题

软件公司面试题软通动力面试1.白箱测试和黑箱测试是什么?什么是回归测试?2.单元测试、集成测试、系统测试的侧重点是什么?3.设计用例的方法、依据有那些?4.一个测试工程师应具备那些素质和技能?5.集成测试通常都有那些策略?6.你用过的测试工具的主要功能、性能及其他?7.一个缺陷测试报告的组成8.基于WEB信息管理系统测试时应考虑的因素有哪些?9.软件本地化测试比功能测试都有哪些方面需要注意?10.软件测试项目从什么时候开始,?为什么?11.需求测试注意事项有哪些?12.简述一下缺陷的生命周期13.测试分析测试用例注意(事项)?瑞星笔试题1.一台计算机的IP是192.168.10.71子网掩码255.255.255.64与192.168.10.201是同一局域网吗?2.internet中e-mail协仪,IE的协仪,NAT是什么,有什么好处,能带来什么问题?DNS是什么,它是如何工作的?3.PROXY是如何工作的?4.win2k系统内AT命令完成什么功能,Messenger服务是做什么,怎么使用? 5进程,线程的定义及区别6,32位操作系统内,1进程地址空间多大,进程空间与物理内存有什么关系?7网络攻击常用的手段,防火墙如何保证安全.8如何配静态IP,如何测网络内2台计算机通不通,PING一次返几个数据包?9WIN9X与WINNT以上操作系统有"服务"吗,服务是什么,如何停止服务?10AD在WIN2KSERVER上建需什么文件格式,AD是什么?XP多用户下"注销"与"切换"的区别.11UDP可以跨网段发送吗?12最简单的确认远程计算机(win2K以上)某个监听端口是正常建立的?13软件测试的定义,测试工作是枯燥反复的,你是如何理解的?黑盒,白盒,回归,压力测试的定义.14winrunner,loadrunner是什么,区别15磁盘分区如何分类,请举例说明安装操作系统的注意事项.中软的面试题一. 简答题.1. 避免死锁的方法有哪些?2. 在Sybase数据库中注册用户与数据库用户有什么区别?3. 在MS SQL_Server 数据库中通过什么约束保证数据库的实体完整性4. 内存有哪几种存储组织结构.请分别加以说明软件开发网5. JAVA中的Wait() 和notify()方法使用时应注意些什么?6. 用户输入一个整数.系统判断,并输出是负数还是非负数,请设计测试用例.7. 操作系统中的同步和互诉解决了什么问题8. UNIX 中init二. 编写类String 的构造函数,析构函数和赋值函数已知类String 的原型为class string{public:string(const char *str=null);//普通构造函数string(const string &other);//拷贝构造函数---string(void);string &operate=(const string &other);//赋值函数private:char * m-data;//用于保存字符串};请编写string 的上述4个函数三. 有关内存的思考题1. void getmemory(char *p){ p=(char*)mallol(100);}void test(void){char * str =null;getmemory(str);strcpy(str,”hello,world”);printf(str);}请问运行Test函数会有什么样的结果2. char*getmemory(void){ char p[]=”hello world”;return p;}void test(void){char *str=null;str=Getmemory();printf(str);} 请问运行Test 函数会有什么样的结果.奇虎面试题前三道程序题(下面的题不排序,有笔试题,也有面试题)4、怎么划分缺陷的等级?5、怎么评价软件工程师?6、软件工程师的素质是什么?7、怎么看待软件测试?8、软件测试是一个什么样的行业?9、图书(图书号,图书名,作者编号,出版社,出版日期)作者(作者姓名,作者编号,年龄,性别)用SQL语句查询年龄小于平均年龄的作者姓名、图书名,出版社。
应届生软件工程师面试题目

应届生软件工程师面试题目
一、专业知识类
1. 你对软件工程的理解是什么?
2. 你掌握哪些编程语言?并简要介绍一下。
3. 你对数据结构和算法的理解是什么?举例说明。
4. 你了解软件设计模式吗?可以简要介绍一下常用的设计模式吗?
5. 你掌握哪些开发工具和技术?例如 IDE、版本控制工具、自动化测试工具等。
6. 你了解网络编程方面的知识吗?例如 TCP/IP、HTTP、WebSocket 等协议,Socket 编程等。
二、项目经验类
1. 你的最佳项目是哪一个,可以介绍一下吗?
2. 你在该项目中的贡献是什么?你遇到了什么困难,是如何解决的?
3. 你如何衡量项目的成功与否?有哪些关键指标或因素?
4. 你用哪些工具和方法来管理和协调项目进度和任务分配?
5. 你在项目中遇到过哪些问题?你是如何避免和解决这些问题的?
三、个人技能类
1. 你有哪些编程方面的自我提升经验和方法?如何提高自己的
代码质量和效率?
2. 你如何进行调试和排错?举例说明你针对某个难以定位的错
误是如何进行分析和解决的。
3. 你是如何进行团队合作的?有哪些团队合作的经验?
4. 你有哪些自我管理方面的技能和方法?如何合理分配自己的
时间,提高工作效率?
5. 你的沟通能力如何?如果遇到困难或者需要向团队反馈信息,你通常是如何进行的?。
软件工程师岗位面试题及答案(经典版)

软件工程师岗位面试题及答案1.请介绍一次您在团队中解决复杂技术问题的经历。
答案:在上一家公司,我们遇到了一个性能瓶颈问题,导致应用程序响应变慢。
通过分析代码,我发现了数据库查询优化的机会。
我重新设计了查询,减少了查询时间,从而提升了应用程序的性能。
2.请谈谈您在版本控制系统中的经验,以及您如何处理合并冲突。
答案:我熟悉Git,并且经常使用分支进行开发。
当出现合并冲突时,我会首先理解冲突的本质,然后与团队成员讨论解决方案。
我们会在测试环境中验证修改,确保没有引入新问题。
3.在敏捷开发中,您如何确保团队按时交付功能?答案:我在敏捷开发团队中担任过ScrumMaster角色。
我会协助制定冲刺目标,跟踪任务的进度,及时解决障碍,并确保团队保持高效沟通,以确保按时交付。
4.您如何保证代码质量和可维护性?答案:我重视代码审查和单元测试。
代码审查可以发现潜在问题并提供改进建议,而单元测试可以确保代码的正确性。
我还注重编写清晰的文档,以便将来维护和扩展代码。
5.请描述一个您在项目中使用设计模式解决问题的实例。
答案:在一个电子商务项目中,我们需要实现不同支付方式的接口,以支持多种支付方式。
我采用了策略模式,将每种支付方式封装为一个独立的类,并在运行时动态选择合适的支付策略。
6.如何处理一个需求变更,该变更可能对项目进度产生影响?答案:首先,我会与产品经理和团队讨论变更的紧急性和影响。
如果变更必要且合理,我们将评估其对进度的影响,并相应地进行调整,可能会重新分配资源或者调整冲刺计划。
7.您在持续集成和持续交付方面有何经验?答案:我在多个项目中使用Jenkins进行持续集成和交付。
我设置了自动化构建和测试流程,并确保每次提交都会触发构建和测试,从而及早发现问题并快速修复。
8.请说明您在保障应用程序安全性方面的做法。
答案:我会定期进行安全漏洞扫描和代码审查,确保代码没有潜在的安全隐患。
我还会采用输入验证、身份认证和授权等措施来保护应用程序免受攻击。
软件开发工程师面试题及答案

软件开发工程师面试题及答案在软件开发领域,面试是选拔优秀人才的关键环节。
以下是一些常见的软件开发工程师面试题及相应的答案参考。
一、基础知识类1、什么是面向对象编程(OOP)?它的主要特点有哪些?答:面向对象编程是一种编程范式,它将数据和对数据的操作封装在对象中。
主要特点包括封装、继承和多态。
封装是将数据和方法包装在一个类中,隐藏内部实现细节;继承允许一个类从另一个类继承属性和方法,实现代码复用;多态则是同一个方法在不同的对象中有不同的实现方式。
2、解释一下进程和线程的区别。
答:进程是程序的一次执行过程,拥有独立的内存空间;线程是进程中的一个执行单元,多个线程共享进程的内存空间。
进程的创建和销毁开销较大,而线程相对较小。
进程间通信相对复杂,线程间通信较为简单。
3、谈谈你对数据库索引的理解。
答:数据库索引是一种用于提高数据库查询效率的数据结构。
它就像是一本书的目录,可以快速定位到所需的数据。
常见的索引类型有B 树索引、哈希索引等。
索引可以加快查询速度,但过多或不恰当的索引会导致数据插入、更新和删除的性能下降。
二、编程语言类1、如果让你用 Python 实现一个冒泡排序算法,你会怎么做?答:```pythondef bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n i 1):if arrj > arrj + 1 :arrj, arrj + 1 = arrj + 1, arrj```2、在 Java 中,如何实现线程同步?答:在Java 中,可以使用`synchronized` 关键字来实现线程同步。
可以将方法声明为`synchronized` ,或者使用同步块。
另外,还可以使用`Lock` 接口和相关实现类来实现更灵活的线程同步。
3、谈谈 C++中的指针和引用的区别。
答:指针是一个变量,存储的是另一个变量的内存地址;引用则是一个别名,必须在初始化时绑定到一个对象,并且之后不能再重新绑定。
软件工程师面试问题

软件工程师面试问题一、基本面试问题:1. 简单介绍一下你自己。
2. 你对软件工程师这个职位有什么理解?你觉得自己适合这个职位吗?3. 能否谈谈你对软件开发生命周期的了解?4. 你在过去的项目中遇到的最大的挑战是什么?你是如何处理的?5. 你如何处理项目延期或失败的情况?6. 在你的上一份工作中,你是如何与团队合作的?有遇到过与团队成员发生冲突的情况吗?你是如何处理的?7. 你有使用过哪些软件开发工具和技术?8. 能否谈谈你对代码质量的看法以及如何保证代码的质量?9. 你有使用过哪些软件开发模型?你认为哪个模型是最适合软件开发的?10. 你有没有参与到开源项目或者个人的项目中?能谈谈你的经验吗?11. 能否谈谈你对团队沟通和合作的看法?12. 你在哪些方面希望继续学习和提升自己?13. 你最擅长的编程语言是什么?为什么选择这个编程语言?14. 你对数据结构和算法有什么了解?能举例说明在实际项目中的应用吗?15. 你是否持续关注行业的发展和新技术的变化?二、技术面试问题:1. 什么是面向对象编程(OOP)?能否举例说明面向对象编程和面向过程编程的区别?2. 什么是设计模式?能否谈谈你熟悉的设计模式以及它们的应用场景?3. 什么是数据库索引?为什么要使用索引?你是如何优化数据库查询性能的?4. 你在开发过程中如何保证代码的可维护性和可扩展性?5. 什么是HTTP协议?它的工作原理是什么?6. 你对前端开发有了解吗?能谈谈前端开发中常用的技术和工具吗?7. 你对云计算和大数据有了解吗?能谈谈它们对软件开发的影响吗?8. 你有使用过自动化测试工具吗?能谈谈你使用的自动化测试工具以及它们的优缺点?9. 什么是敏捷开发?你认为敏捷开发在软件开发过程中的哪些方面有帮助?10. 你有使用过版本控制工具吗?如果是,请介绍一下你使用的版本控制工具,比如Git。
11. 你在开发过程中遇到过性能问题吗?你是如何进行性能优化的?12. 什么是多线程和并发?你是如何处理多线程编程中的安全问题的?13. 你有使用过数据库管理工具吗?如果是,请介绍一下你使用的数据库管理工具,比如MySQL。
软件工程师面试题

软件工程师面试题在当今数字化的时代,软件工程师的需求日益增长,而面试环节则成为了筛选合适人才的关键。
以下为您呈现一系列常见且重要的软件工程师面试题。
一、编程语言相关1、请简要介绍一下您最熟悉的编程语言,以及它的优势和适用场景。
这个问题旨在考察候选人对所擅长语言的理解深度,以及能否清晰阐述其特点和应用领域。
2、谈谈在 C++中,指针和引用的区别。
此问题检验候选人对 C++这一复杂语言的核心概念的掌握程度。
3、如何在 Java 中实现多线程编程?多线程编程是 Java 中的重要内容,能够反映出候选人的实际编程能力和对并发概念的理解。
二、数据结构与算法1、请描述一下二叉搜索树的特点和操作。
数据结构是软件工程师的基础知识,二叉搜索树是常见的数据结构之一。
2、解释一下冒泡排序和快速排序的原理,并比较它们的时间复杂度和空间复杂度。
排序算法是算法中的基础,通过这个问题可以了解候选人的算法分析能力。
3、如何解决哈希冲突?哈希表在实际编程中广泛应用,处理哈希冲突是关键。
三、数据库相关1、什么是数据库索引?在什么情况下应该使用索引,什么情况下不应该使用?索引是提高数据库查询性能的重要手段,但使用不当也会带来负面影响。
2、讲述一下事务的 ACID 特性。
事务处理是数据库操作的关键概念,对其特性的理解至关重要。
3、如何优化数据库查询性能?这是实际工作中经常面临的问题,能考察候选人的实际经验和解决问题的能力。
四、操作系统相关1、进程和线程的区别是什么?操作系统的核心概念,对系统资源的管理有重要影响。
2、请解释一下虚拟内存的概念和作用。
虚拟内存是操作系统中的重要机制,有助于理解内存管理。
3、死锁产生的条件以及如何避免死锁?死锁是操作系统中的难点问题,能反映候选人对系统资源分配的理解。
五、软件工程相关1、请描述一下软件开发生命周期的各个阶段。
了解候选人对软件开发流程的整体把握。
2、什么是敏捷开发?它与传统开发方法有何不同?敏捷开发在现代软件开发中越来越流行,考察候选人对新开发模式的了解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言:(1)什么是预编译,何时需要预编译:答案:1、总是使用不经常改动的大型代码体。
2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。
在这种情况下,可以将所有包含文件预编译为一个预编译头。
预编译又称为预处理,是做些代码文本的替换工作。
处理#开头的指令吗,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。
c编译系统在对程序进行通常的编译之前,先进行预处理。
c提供的预处理功能主要有以下三种:1)宏定义2)文件包含3)条件编译。
(2)char* const p, char const* p,const char*p 上述三个有什么区别?答案:char * const p; //常量指针,p 的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改const char *p;//和char const *p等价(3)char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc";const char *str5 = "abc"; const char *str6 = "abc"; char *str7 = "abc"; char *str8 = "abc"; cout < <( str1 == str2 ) < < endl; cout < < ( str3 == str4 ) < < endl; cout < < ( str5 == str6 ) < < endl; cout << ( str7 == str8 ) < < endl;结果是:0 0 1 1 str1,str2,str3,str4 是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。
(4)以下代码中的两个sizeof 用法有问题吗?void UpperCase( char str[] ) // 将str 中的小写字母转换成大写字母{for( size_t i=0;i <sizeof(str)/sizeof(str[0]); ++i )if( 'a' <=str[i] && str[i] <='z' )str[i] -= ('a'-'A' );}char str[] = "aBcDe"; cout < < "str 字符长度为: " < < sizeof(str)/sizeof(str[0]) < < endl;UpperCase( str ); cout < < str < < endl;答案:函数内的sizeof 有问题。
根据语法,sizeof 如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。
函数外的str 是一个静态定义的数组,因此其大小为6,因为还有'\0',函数内的str 实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof 作用于上只将其当指针看,一个指针为4 个字节,因此返回4。
(5)一个32 位的机器,该机器的指针是多少位答案:指针是多少位只要看地址总线的位数就行了。
80386 以后的机子都是32 的数据总线。
所以指针的位数就是4 个字节了。
6main(){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}答案:2,5*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5 个int)int*ptr=(int *)(&a+1);则ptr 实际是&(a[5]),也就是a+5 原因如下:&a是数组指针,其类型为int (*)[5]; 而指针加1 要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同a 是长度为5的int 数组指针,所以要加5*sizeof(int) 所以ptr 实际是a[5] 但是prt与(&a+1)类型是不一样的(这点很重要) 所以prt-1 只会减去sizeof(int*)。
a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a 是对象(数组)首地址,a+1 是数组下一元素的地址,即a[1],&a+1 是下一个对象的地址,即a[5]。
7。
请问以下代码有什么问题:int main(){char a;char *str=&a;strcpy(str,"hello");printf(str);return 0;}答案:没有为str分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。
虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。
8。
char* s="AAA";printf("%s",s);s[0]='B';printf("%s",s); 有什么错?答案:"AAA"是字符串常量。
s 是指针,指向这个字符串常量,所以声明s 的时候就有问题。
cosnt char* s="AAA"; 然后又因为是常量,所以对是s[0]的赋值操作是不合法的。
9。
写一个“标准”宏,这个宏输入两个参数并返回较小的一个。
答案:.#define Min(X, Y) ((X)>(Y)?(Y):(X)) //结尾没有‘;’注意括号10。
嵌入式系统中经常要用到无限循环,你怎么用C 编写死循环。
答案:while(1){}或者for(;;)11。
关键字static 的作用是什么?答案:定义静态变量12。
关键字const 有什么含意?答案:表示常量不可以修改的变量。
13。
关键字volatile 有什么含意?并举出三个不同的例子?答案:提示编译器对象的值可能在编译器未监测到的情况下改变。
状态寄存器,多线程应用中被几个线程共享的变量,中断服务子程序会访问的非自动变量。
14。
int (*s[10])(int) 表示的是什么啊?答案:int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。
15。
有以下表达式:int a=248; b=4;int const c=21;const int *d=&a;int *const e=&b;int const* f const =&a;请问下列表达式哪些会被编译器禁止?为什么?答案:*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f; *c 这是个什么东东,禁止*d 说了是const,禁止 e = &a 说了是const 禁止const *f const =&a; 禁止乱七八糟,看不懂16 交换两个变量的值,不使用第三个变量。
即a=3,b=5,交换之后a=5,b=3;答案:有两种解法, 一种用算术算法, 一种用^(异或)a = a + b;b = a - b; a = a - b;或者a = a^b;b = a^b; a = a^b;17.c 和c++中的struct 有什么不同?答案:c 和c++中struct 的主要区别是c 中的struct 不可以含有成员函数,而c++中的struct可以。
c++中struct 和class 的主要区别在于默认的存取权限不同,struct 默认为public,而class 默认为private18.#include <stdio.h>#include <stdlib.h>void getmemory(char *p)p=(char *) malloc(100);strcpy(p,"hello world");}int main( ){char *str=NULL;getmemory(str);printf("%s/n",str);free(str);return 0;}答案:程序崩溃,getmemory 中的malloc不能返回动态内存,free()对str 操作很危险不是很理解!!!19.char szstr[10]; strcpy(szstr,"0123456789"); 产生什么结果?为什么?答案:长度不一样,会造成非法的OS20.列举几种进程的同步机制,并比较其优缺点。
答案:原子操作信号量机制自旋锁管程,会合,分布式系统(a)一个信号量只能置一次初值,以后只能对之进行p操作或v操作。
由此也可以看到,信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点。
信号量机制功能强大,但使用时对信号量的操作分散,而且难以控制,读写和维护都很困难。
加重了程序员的编码负担;核心操作P-V分散在各用户程序的代码中,不易控制和管理;一旦错误,后果严重,且不易发现和纠正。
(b)自旋锁: 旋锁是为了保护共享资源提出的一种锁机制。
调用者申请的资源如果被占用,即自旋锁被已经被别的执行单元保持,则调用者一直循环在那里看是否该自旋锁的保持着已经释放了锁。
自旋锁是一种比较低级的保护数据结构和代码片段的原始方式,可能会引起以下两个问题; 1、死锁 2、过多地占用CPU资源传统自旋锁由于无序竞争会导致“公平性”问题(c)管程:信号量机制功能强大,但使用时对信号量的操作分散,而且难以控制,读写和维护都很困难。
因此后来又提出了一种集中式同步进程——管程。
其基本思想是将共享变量和对它们的操作集中在一个模块中,操作系统或并发程序就由这样的模块构成。