面试相关复习资料

1.测试岗:

 

1.1登录页面的测试

https://blog.csdn.net/xiaolangmin/article/details/88708207


功能测试
什么都不输入,点击提交按钮,看提示信息
输入正确的用户名和密码,点击提交按钮,验证是否正确登录
输入错误的用户名或者密码,验证登陆会失败,查看提示信息是否正确
登录成功以后是否跳转至正确的页面
登录名和密码是否有长度限制,太长或者太短是否有提示信息
用户名和密码有特殊字符(比如空格),应该怎么处理
记住用户名的功能
密码是否加密显示
输入密码的时候,如果开了大写锁定,要有提示信息
登录失败后,不能记录密码的功能
验证码刷新或者换一个按钮是否正常使用
登录失败,忘记密码的功能是否可以正常使用
界面测试
界面是否合理,2个testbox是否对齐
testbox大小是否合适,符合要求
界面是否美观
登录成功或者失败的提示信息
默认鼠标焦点定位
性能测试
打开登录页面,需要几秒
登录成功以后跳转需要几秒
能支持多少用户同时登录
登录失败给出提示信息需要几秒
安全性测试
用户登录成功以后,保存的cookie是否是httponly(该cookie无法通过JavaScript脚本拿到)
用户名和密码的验证是否是在服务器端而不是客户端
是否限制了错误登陆的次数,以防止暴力破解
用户名和密码的的输入框,应该禁止输入脚本 (防止XSS攻击:https://blog.csdn.net/Ideality_hunter/article/details/80621138)
用户名和密码输入框,应该屏蔽SQL注入攻击  (关于SQL注入攻击:https://www.cnblogs.com/shenbuer/p/7875419.html)
用户名和密码,是否通过加密的方式,发送给web服务器
兼容性测试
是否兼容主流浏览器(IE各种版本,Firefox,Chrome等)
是否兼容不同的平台,比如Windows,Mac等
不同的浏览器大小下,是否正常显示、工作
不同的移动平台上能否正常工作,比如IPhone,Android
其它测试
是否支持快捷键
同一用户通过不同的浏览器登录,是否会导致另一端客户端下线

 

1.2基于WEB信息管理系统测试

https://blog.csdn.net/lluozh2015/article/details/49079145?locationNum=4&fps=1


功能测试: 
1.链接测试: 
   1)测试所有连接是否按指示的那样确实连接到了该连接的页面, 
   2)测试所连接的也面是否存在, 
   3)保证WEB应用系统上没有孤立的页面.只能在集成测试阶段完成 
2.表单测试: 
用户给信息系统管理员提交信息时,要测试提交操作的完整性,以校验提交给服务器的信息的正确性 
3.Cookies测试: 
Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息.如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响 
4.设计语言测试: 
使用哪种版本的HTML 
5.数据库测试: 
数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试

性能测试: 
1.连接速度测试 
用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面 
2.负载测试 
负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求? 
3.压力测试 
负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。压力测试的区域包括表单、登陆和其他信息传输页面等 

可用性测试: 
1.导航测试: 
Web应用系统的层次一旦决定,就要着手测试用户导航功能,让最终用户参与这种测试,效果将更加明显 
2.图形测试 
在Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等 
3.整体界面测试 
内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。信息的正确性是指信息是可靠的还是误传的。例如,在商品价格列表中,错误的价格可能引起财政问题甚至导致法律纠纷;信息的准确性是指是否有语法或拼写错误 
4.客户端兼容性测试 
1)平台测试 
2)浏览器测试 
5.安全性测试
(1)现在的Web应用系统基本采用先注册,后登陆的方式。因此,必须测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而直接浏览某个页面等 
(2)Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用 
(3)为了保证Web应用系统的安全性,日志文件是至关重要的。需要测试相关信息是否写进了日志文件、是否可追踪 
(4)当使用了安全套接字时,还要测试加密是否正确,检查信息的完整性 
(5)服务器端的脚本常常构成安全漏洞,这些漏洞又常常被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题

 

2.2基础知识

https://blog.csdn.net/leceall/article/details/78842037

https://blog.csdn.net/qiu5213173/article/details/46273057

 

  • 什么是软件测试?

软件测试是为了发现错误而执行程序的过程。或者说,软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。

  • 软件测试的目的?

测试的目的是想以最少的人力、物力和时间找出软件中潜在的各种错误和缺陷,通过修正错误和缺陷提高软件质量,回避软件发布后由于潜在的软件缺陷和错误造成的隐患带来的商业风险。

  • 软件测试应该划分几个阶段?

大体上来说可分为单元测试,集成测试,系统测试,验收测试

每个阶段又分为以下五个步骤: 测试计划,测试设计,用例设计,执行结果,测试报告 

初始测试集中在每个模块上,保证源代码的正确性,该阶段成为单元测试,主要用白盒测试方法。 接下来是模块集成和集成以便组成完整的软件包。集成测试集中在证实和程序构成问题上。主要采用黑盒测试方法,辅之以白盒测试方法。 软件集成后,需要完成确认和系统测试。确认测试提供软件满足所有功能、性能需求的最后保证。确认测试仅仅应用黑盒测试方法。

单元测试

单元测试是对软件中的基本组成单位进行的测试,如一个模块、一个过程等等。它是软件动态测试的最基本的部分,也是最重要的部分之一。在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试,测试重点是系统的模块,包括子程序的正确性验证等

集成测试

集成测试,也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求,组装成为子系统或系统,进行集成测试。实践表明,一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。程序在某些局部反映不出来的问题,在全局上很可能暴露出来,影响功能的实现。测试重点是模块间的衔接以及参数的传递等。 

系统测试

系统测试是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能提供系统方案说明书中指定功能的有效方法。测试重点是整个系统的运行以及与其他软件的兼容性

验收测试

验收测试是以用户为主的测试,软件开发和QA人员也应该参加,测试一般在用户所在地进行,由用户验证软件产品是否满足了所有的需求的一系列的验收测试工作。仅限于做项目的公司,部门内部测试稳定后,根据合同中需求由发包商进行验收测试。验收测试的目的是为了以发现”未实现的需求”为目的,以评估”适合使用”为目标,该类测试的不是以发现缺陷为主要目的。

回归测试

回归测试是在软件维护阶段,对软件进行修改之后进行的测试。其目的是检验对软件进行的修改是否正确。

  • 什么是白盒测试,黑盒测试,回归测试?

白盒测试(又称逻辑驱动测试,结构测试),知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作。白盒测试工具是对源代码进行的测试,测试的主要内容包括词法分析与语法分析、静态错误分析、动态检测等。

黑盒测试(又叫功能测试或数据驱动测试),是不需要了解软件内部节构,依据软件的需求规格说明书,检查程序的功能是否符合需求说明。软件的黑盒测试意味着测试要在软件的接口处进行。

回归测试一是检查所作的修改是否达到预定目的,如错误得到改正,能够适应新的运行环境等等;二是不影响软件的其他功能的正确性。回归测试的目的是在程序有修改的情况下,保证原有功能正常的一种测试策略和方法。 

  • 白盒测试和黑盒测试的具体方法?

白盒测试用例设计有如下方法:基本路径测试、等价类划分、边界值分析、覆盖测试、循环测试、数据流测试、程序插桩测试、变异测试。这时候依据就是详细设计说明书及其代码结构。

黑盒测试用例设计方法:等价类划分、边界值分析、错误推测方法、因果图方法、场景设计法、判定表驱动分析方法;依据是用户需求规格说明书,详情设计说明书。

  • 集成测试通常都有哪些方法?

基于功能分解的集成:

       渐增式集成:自顶向下集成(深度优先,广度优先);自底向上集成;三明治集成;

       非渐增式集成:大棒集成

基于调用关系集成(MM路径):

        相邻集成,成对集成

  • 什么是α测试?

Alpha测试(α测试)是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的受控测试,Alpha测试不能由程序员或测试员完成。Alpha测试发现的错误,可以在测试现场立刻反馈给开发人员,由开发人员及时分析和处理。目的是评价软件产品的功能、可使用性、可靠性、性能和支持。尤其注重产品的界面和特色。Alpha测试可以从软件产品编码结束之后开始,或在模块(子系统)测试完成后开始,也可以在确认测试过程中产品达到一定的稳定和可靠程度之后再开始。有关的手册(草稿)等应该在Alpha测试前准备好。

  • 什么是β测试?

Beta测试(β测试)是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场,Beta测试不能由程序员或测试员完成。因而,Beta测试是在开发者无法控制的环境下进行的软件现场应用。在Beta测试中,由用户记下遇到的所有问题,包括真实的以及主管认定的,定期向开发者报告,开发者在综合用户的报告后,做出修改,最后将软件产品交付给全体用户使用。Beta测试着重于产品的支持性,包括文档、客户培训和支持产品的生产能力。只有当Alpha测试达到一定的可靠程度后,才能开始Beta测试。由于Beta测试的主要目标是测试可支持性,所以Beta测试应该尽可能由主持产品发行的人员来管理。

  • 什么是驱动模块?

驱动模块在大多数场合称为”主程序”,它接收测试数据并将这些数据传递到被测试模块.单元测试一个函数单元时,被测单元本身是不能独立运行的,需要为其传送数据,为此写驱动 
驱动模块主要完成以下事情: 
1、接受测试输入; 
2、对输入进行判断; 
3、将输入传给被测单元,驱动被测单元执行; 
4、接受被测单元执行结果,并对结果进行判断; 
5、将判断结果作为用例执行结果输出测试报告。

  • 什么是桩模块?

比如对函数A做单元测试时,被测的函数单元下还包括了一个函数B,为了更好的错误,定位错误,就要为函数B写桩,来模拟函数B的功能,保证其正确。

  • 你用过的测试工具的主要功能?

loadrunner:性能的负载测试工具 

testbed:单元测试和静态测试

KTflow:缺陷报告

UTF:功能测试

LoadRunner通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。

LoadRunner的主要功能:虚拟用户、真实负载、定位性能、分析结果、重复测试

在做一个测试方案时,要做的第一件事就是创建虚拟用户执行脚本。LoadRunner提供了Virtual User Generator来录制或编辑虚拟用户脚本。

  • 测试的流程?

1.需求分析阶段:只要就是对业务的学习,分析需求点。
2.测试计划阶段:测试组长就要根据工作说明书开始编写《测试计划》,其中包括人员,软件硬件资源,测试点,集成顺序,进度安排和风险识别等内容。
3.测试设计阶段:测试方案一般由对需求很熟的高资深的测试工程师设计,测试方案要求根据《需求规格说明书》上的每个需求点设计出包括需求点简介,测试思路和详细测试方法三部分的方案。《测试方案》编写完成后也需要进行评审。
4.测试方案阶段:主要是对测试用例和规程的设计。测试用例是根据《测试方案》来编写的,通过《测试方案》阶段,测试人员对整个系统需求有了详细的理解。这时开始编写用例才能保证用例的可执行和对需求的覆盖。测试用例需要包括测试项,用例级别,预置条件,操作步骤和预期结果。其中操作步骤和预期结果需要编写详细和明确。测试用例应该覆盖测试方案,而测试方案又覆盖了测试需求点,这样才能保证客户需求不遗漏。同样,测试用例也需要评审。
5.测试执行阶段:执行测试用例,及时提交有质量的Bug和测试日报,测试报告等相关文档。

https://zhidao.baidu.com/question/245058978.html

  • 软件测试项目从什么时候开始?

软件测试应该在需求分析阶段就介入,因为测试的对象不仅仅是程序编码,应该对软件开发过程中产生的所有产品都测试。并且软件缺陷存在放大趋势,缺陷发现的越晚,修复它所花费的成本就越大。

什么时候写用例?测试用例要尽早编写,通常我们都会在测试设计阶段来写用例,即《需求规格说明书》和《测试计划》都已完成之后。

  • 什么是需求文档测试?

主要测试需求中是否存在逻辑矛盾以及需求在技术上是否可以实现;

  • 什么是设计文档测试?

测试设计是否符合全部需求以及设计是否合理。

  • 需求测试注意事项有哪些?

一个良好的需求应当具有以下特点:
完整性:每一项需求都必须将所要实现的功能描述清楚,以使开发人员获得设计和实现这些功能所需的所有必要信息。
正确性:每一项需求都必须准确地陈述其要开发的功能。
一致性:一致性是指与其它软件需求或高层(系统,业务)需求不相矛盾。
可行性:每一项需求都必须是与已知系统和环境的权能和限制范围内可以实施的。
无二义性:对所有需求说明的读者都只能有一个明确统一的解释,由于自然语方极易导致二义性,所以尽量把每项需求用简洁明了的用户性的语方表达出来。
健壮性:需求的说明中是否对可能出现的异常进行了分析,并且对这些异常进行了容错处理。
必要性:可以理解为每项需求都是用来授权你编写文档的“根源”。要使用每项需求都能回溯至某项客户的输入,如Use Case或别的来原。
可测试性:每项需求只应在SRS中出现一次。这样更改时易于保持一致性。另外,使用目录表、索引和相互参照列表方法将使软件需求规格说明书更容易修改。
可跟踪性:应能对每项软件需求与它的根源和设计元素、源代码、测试用例之间建立链接链,这种可跟踪性要求每项需求以一种结构化的,粒度好的方式编写并单独标明,而不是大段大段的叙述。

  • 测试结束的标准是什么?

用例全部测试;覆盖率达到标准;缺陷率达到标准;其他指标达到质量标准

  • 什么是静态测试,动态测试?

1.静态测试

静态测试(static testing)就是不实际运行被测软件,而只是静态地检查程序代码、界面或文档中可能存在的错误的过程。

包括对代码测试、界面测试和文档测试三个方面:

    对于代码测试,主要测试代码是否符合相应的标准和规范。

    对于界面测试,主要测试软件的实际界面与需求中的说明是否相符。

    对于文档测试,主要测试用户手册和需求说明是否符合用户的实际需求。

2. 动态测试

动态测试(dynamic testing),指的是实际运行被测程序,输入相应的测试数据,检查实际输出结果和预期结果是否相符的过程,所以判断一个测试属于动态测试还是静态的,唯一的标准就是看是否运行程序。

 

黑盒测试有可能是动态测试(运行程序,看输入输出),也有可能是静态测试(不运行,只看界面)

白盒测试有可能是动态测试(运行程序并分析代码结构),也有可能是静态测试(不运行程序,只静态察看代码)

动态测试有可能是黑盒测试(运行,只看输入输出),也有可能是白盒测试 (运行并分析代码结构)

静态测试有可能是黑盒测试(不运行,只察看界面),也有可能是白盒测试(不运行,只察看代码)
https://blog.csdn.net/peiqqqqq/article/details/82119327

  • 如何编写测试用例及用例的意义

一.概念

1.什么是测试用例?

在测试过程中很重要的一类文档,它是测试工作的核心、是一组在测试时输入输出的标准、是软件需求的具体对照。

2.测试用例的作用:

检验软件是否满足客户需求、体现一个测试人员的工作量、展现测试用例的设计思路

3.测试用例所包含的内容:

用例编号、用例名称、测试背景、前置条件、优先级、重要级、测试数据、测试步骤、预期结果、实际结果、备注。

4.测试用例的编写流程:

需求分析->提取测试点->测试用例编写->测试用例评审

 

二.需求分析

1.什么是需求?

客户的需要的东西以及对东西的要求

2.需求的种类有什么?

业务需求:关注系统是否满足业务要求

用户需求:关注系统是否满足用户习惯

功能需求:关注系统是否满足功能要求

 

三.测试用例的设计方法和编写

1.如何设计编写测试用例?

对各个功能模块进行测试点分析提取测试点再堆测试点进行用例编写

【测试点:通过需求分析后对得出的需要进行测试的具体内容】

 

比如对PC端QQ账号的登录模块,提取测试点就有:

①正常登陆 ②账号为空时点击登录 ③密码为空时点击登录 ④账号密码都为空时点击 登录 ⑤密码错误时点击登录 ⑥找回密码功能是否有效 ⑦记住密码功能是否有效 ⑧ 自动登录功能是否有效

2.编写测试用例该注意什么?

①根据项目的实际情况设计测试用例表格

②用例格式不要生搬硬套

③根据具体情况编写

3.编写测试用例的常用方法:

①等价类划分法:等价类是输入的集合,比如在注册时,密码规定为6-16位英文字母或数字及下划线,那么小于6位的一串字符就是一个等价类,大于16位的一串字符是另一个等价类,在6-16位之间且符合规范的一串字符也是一个等价类,在6-16位之间的但包含除英文字母和数字和下划线之外的字符是另外一个等价类。

在每个等价类中选取一定数目的值作为代表。等价类分为有效等价类和无效等价类,输入符合条件的值对功能进行检验,输入无效等价类中的值可以找出程序错误的地方。

②边界值分析法:对输入的边界值或稍大(小)于边界值的值进行分析。比如某公司在招聘时筛选简历时对年龄的要求是20岁到35岁,那么19、20、21、34、35、36都是边界值,对其进行输入测试观察结果是否符合要求。

③场景法:通过运用场景来对系统的功能点或业务流程的描述,从而提升测试效果。场景法一般分为基本流和备用流,覆盖所有的场景。

④错误猜测法:通过直觉和经验对结果进行分析。

 

四.测试用例评审:

1.什么是用例评审?

①简单的说,评审就是对测试用例进行检查

②评审包括:同行评审、小组评审、部门评审和第三方评审等

③不同的评审有不同的角色参与其中

2.评审的意义:

①通过评审发现用例的不足

②方便测试人员改进用例

③达到在测试时提高测试质量的目的

3.评审的流程是什么?

评审后改进测试用例,再进行评审再改进测试用例,这样一直循环直到评审都通过,这时候才结束评审,也标志着测试用例编写的完成

 

二.测试用例管理:

1.为什么要管理测试用例?

①测试用例数目巨大

②测试用例会根据需求的改变而改变

③测试用例需要补充完善

2.如何管理测试用例?

①原始的Excel管理

②专业的项目管理系统(eg:ALM、禅道、testlink、Bugzilla、JIRA)一般都为web格式

 

三.还是举个例子实在

如图所示为CSDN的web端登录界面部分的截图:

    

如图所示为提取的测试用例点以及编写的相应的测试用例:

测试点:

 

 

测试用例:

 

 

 

https://blog.csdn.net/li1214477012/article/details/80585786

  • 如果能够执行完美的黑盒测试,还需要进行白盒测试吗?(白盒与黑盒的区别)

任何工程产品(注意是任何工程产品)都可以使用以下两种方法之一进行测试。 
黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。 白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否以经过检查。 
软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试或数据驱动测试。黑盒测试主要是为了发现以下几类错误: 
1、是否有不正确或遗漏的功能? 
2、在接口上,输入是否能正确的接受?能否输出正确的结果? 
3、是否有数据结构错误或外部信息(例如数据文件)访问错误? 
4、性能上是否能够满足要求? 
5、是否有初始化或终止性错误? 
软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。白盒测试主要是想对程序模块进行如下检查: 
1、对程序模块的所有独立的执行路径至少测试一遍。 
2、对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测一遍。 
3、在循环的边界和运行的界限内执行循环体。 
4、测试内部数据结构的有效性,等等。 
以上事实说明,软件测试有一个致命的缺陷,即测试的不完全、不彻底性。由于任何程序只能进行少量(相对于穷举的巨大数量而言)的有限的测试,在未发现错误时,不能说明程序中没有错误。

  • 软件的缺陷等级应如何划分?

软件缺陷的等级可以用严重性和优先级来描述; 
严重性:衡量缺陷对客户满意度影响的满意程度,分为 
1,致命错误,可能导致本模块以及其他相关的模块异常,死机等问题; 
2.严重错误,问题局限在本模块,导致模块功能失常或异常退出; 
3.一般错误,模块功能部分失效; 
4.建议模块,有问题提出人对测试模块的改进建议; 
优先级:缺陷被修复的紧急程度; 
1.立即解决(P1级):缺陷导致系统功能几乎不能使用或者测试不能继续,需立即修复; 
2.高优先级(P2级):缺陷严重,影响测试,需优先考虑; 
3.正常排队(P3级):缺陷需要正常排队等待修复; 
4.低优先级(P4级):缺陷可以在有时间的时候被纠正;

  • 针对缺陷采取怎样的管理措施?

1.要更好的管理缺陷,必须引入缺陷管理工具,商用的或者开源的都可。

2.根据缺陷的生命周期,考虑缺陷提交的管理、缺陷状态的管理和缺陷分析的管理。

3.所有发现的缺陷(不管是测试发现的还是走读代码发现的)都必须全部即时的、准确的提交到缺陷管理工具中,这是缺陷提交的管理。

4.缺陷提交后,需要即时的指派给相应的开发人员,提交缺陷的人需要密切注意缺陷的状态, 帮助缺陷的尽快解决。缺陷解决后需要即时对缺陷的修复进行验证。这样的目的有两个:一个是让缺陷尽快解决;二是方便后面缺陷的分析(保证缺陷相关的信息准确,如龄期等),这是缺陷状态的管理。

5.为了更好的改进开发过程和测试过程,需要对缺陷进行分析,总结如缺陷的类别、缺陷的龄期分布等信息,这是缺陷分析的管理。

  • 描述使用bugzilla缺陷管理工具对软件缺陷(BUG)跟踪的管理的流程

1) 测试人员或开发人员发现bug后,判断属于哪个模块的问题,填写bug报告后,系统会自动通过Email通知项目组长或直接通知开发者。 
2) 经验证无误后,修改状态为VERIFIED.待整个产品发布后,修改为CLOSED. 
3) 还有问题,REOPENED,状态重新变为“New”,并发邮件通知。 
4) 项目组长根据具体情况,重新reassigned分配给bug所属的开发者。 
5) 若是,进行处理,resolved并给出解决方法。(可创建补丁附件及补充说明) 
6) 开发者收到Email信息后,判断是否为自己的修改范围。 
7) 若不是,重新reassigned分配给项目组长或应该分配的开发者。 
8) 测试人员查询开发者已修改的bug,进行重新测试。

  • 一个测试工程师应具备哪些素质和技能?

掌握基本的测试基础理论
本着找出软件存在的问题的态度进行测试,即客观,不要以挑刺形象出现
可熟练阅读需求规格说明书等文档
以用户的观点看待问题
有着强烈的质量意识
细心和责任心
良好的有效的沟通方式(与开发人员及客户)
具有以往的测试经验
能够及时准确地判断出高危险区在何处

 

数据库

  • 查询

相关子查询:

相关子查询是指引用了外部查询中出现的表的列的子查询。这就意味着子查询要依赖于外部查询,不能独立地调用它。在逻辑上,相关子查询会为每个外部行单独计算一次。

为每个客户返回其订单ID最大的订单。

SELECT custid,orderid,orderdate,empid 
FROM Sales.Orders AS orders1
WHERE orderid= 
    (SELECT MAX(orders2.orderid) 
    FROM Sales.Orders AS orders2 
    WHERE orders2.custid= orders1.custid);-- 这里引用了外部查询的custid字段

相关子查询通常也和谓词EXISTS一起使用,对于EXISTS,它的输入是一个子查询,如果子查询能够返回任何行,那么它就返回TRUE,否则返回FALSE。

例如,以下查询语句返回下过订单的西班牙客户。

SELECT customers.custid,customers.companyname 
FROM Sales.Customers AS customers
WHERE customers.country=N'Spain' AND EXISTS(SELECT * FROM Sales.Orders AS orders WHERE orders.custid= customers.custid);

https://www.cnblogs.com/mcgrady/p/3888448.html

学生表(学生id,姓名,性别,分数) )student(s_id, name, sex, score)

班级表(班级id,班级名称) class(c_id, c_name)

学生班级表(班级id,学生id) student_class(s_id,c_id)

1.查询一班得分在80分以上或者等于60,61,62的学生

SELECT s.s_id,s.name,s.score,sc.c_id,c.c_name from student s LEFT JOIN student_class sc on s.s_id = sc.s_id LEFT JOIN class c on sc.c_id=c.c_id where (s.score>80 or s.score in(60,61,62)) and c.c_name='一班';

2.査询所有班级的名称,和所有版中女生人数和女生的平均分。

SELECT sc.s_id,c.c_name,COUNT(s.sex),AVG(s.score) from student_class sc LEFT JOIN class c on sc.c_id=c.c_id LEFT JOIN student s on sc.s_id = s.s_id where s.sex='女' group BY c.c_name ORDER BY c.c_id asc;

3.用一条 SQL语句查询出每门课都大于 80 分的学生姓名?

select name from student where name not in (select  name from student where fenshu <=80);

sql语句应该考虑哪些安全性? 

答案:

(1)防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量。 
(2)最小权限原则,特别是不要用root账户,为不同的类型的动作或者组建使用不同的账户。 
(3)当sql运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄漏服务器和数据库相关信息。

  • MySQL外连接、内连接的区别?

内连接 

连接的数据表相对应的匹配字段完全相等的连接。连接关键字是 inner join

外连接

分为左外连接与右外连接、全连接。

左连接的结果集包括指定的左表全部数据与匹配的右表数据,右表中没匹配的全为空值.关键字 left join

右连接的结果集包含指定的右表全部数据与匹配的左边数据,左边中没匹配的全为空值.关键字 right join

全连接

返回左右数据表的所有行,关键字 full join。

  • union 与union all的区别

union 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。

union all 则会显示重复结果,只是简单的两个结果合并并返回。所以效率比union高,在保证没有重复数据的情况下用union all。

https://blog.csdn.net/zhusongziye/article/details/83720809

 

  • 什么是存储过程?有哪些优缺点?

存储过程是一些预编译的SQL语句。

更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。

1.存储过程是一个预编译的代码块,执行效率比较高

2.一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率

3.可以一定程度上确保数据安全

  • 索引是什么?有什么作用以及优缺点?

索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构。索引原理——>B树

你也可以这样理解:索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。

MySQL数据库几个基本的索引类型:普通索引、唯一索引、主键索引、全文索引。

索引的作用:

1.索引加快数据库的检索速度

2.通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能

3.唯一索引可以确保每一行数据的唯一性

4.索引降低了插入、删除、修改等维护任务的速度

5.索引需要占物理和数据空间 

  • 什么是事务?

事务(Transaction)指作为单个逻辑工作单元执行的一系列操作,是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

事务和程序是两个概念。一般地讲,一个程序中包含多个事务。事务的开始与结束可以由用户显式控制。如果用户没有显式地定义事务,则由DBMS按缺省规定自动划分事务。

事务的语句
 开始事物:BEGIN TRANSACTION
 提交事物:COMMIT TRANSACTION
 回滚事务:ROLLBACK TRANSACTION

事务的保存点
     SAVE TRANSACTION 保存点名称 --自定义保存点的名称和位置
     ROLLBACK TRANSACTION 保存点名称 --回滚到自定义的保存点

事务的基本特征

●   Atomic(原子性):事务中的所有元素作为一个整体提交或回滚,事务的个元素是不可分的,事务是一个完整操作。

●   Consistency(一致性):事物完成时,数据必须是一致的,也就是说,和事物开始之前,数据存储中的数据处于一致状态。保证数据的无损。

●   Isolation(隔离性):对数据进行修改的多个事务是彼此隔离的。这表明事务必须是独立的,不应该以任何方式以来于或影响其他事务。

●   Durability(持久性):事务完成之后,它对于系统的影响是永久的,该修改即使出现系统故障也将一直保留,真实的修改了数据库。

https://blog.csdn.net/zdwzzu2006/article/details/5947062

原子性和持久性通过恢复系统保证。一旦事务已提交,我们不能通过中止他来撤销其造成的影响,撤销已提交事务造成的影响的唯一方法就是执行一个补偿事务。书写一个补偿事务的责任留给用户。

一致性和隔离性通过并发控制系统保证。并发控制机制的任务:对并发操作进行正确调度、保证事务的隔离性、保证数据库的一致性。

https://blog.csdn.net/qq_39326472/article/details/88420916

  • 基本封锁类型

排它锁(exclusive lock,简记为X锁)

共享锁(Share lock,简记为S锁)
 

共享锁

共享锁又称为读锁。若事务T对数据对象Q加上S锁,事务T可读但不能写Q,其它事务只能再对Q加S锁,而不能加X锁,直到T释放Q上的S锁。
 

排它锁

排它锁又称为写锁。若事务T对数据对象Q加上X锁,则事务T既可以读又可以写Q,其它任何事务都不能再对Q加任何类型的锁,直到T释放A上的锁。

假设对于某对象,事物j请求A型锁,事物i拥有B型锁。如果事物j可以立刻得到A型锁。则称A与B锁是相容的。

让事务在对数据项最后一次访问后立即释放锁也未必是可取的,因为可能不能保证可串行化。


死锁:一种哪个事物都不能正常执行的状态。当死锁发生时,必须回滚两个事务中的一个。

饥饿/饿死:

不断出现的申请并获得S锁的事务,使申请X锁的事务一直处在等待状态。

饥饿的防止

对申请S锁的事务,如果有先于该事务且等待的加X锁的事务,令申请S锁的事务等待。

 

  • 数据库的乐观锁和悲观锁是什么?

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
  • 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

深入理解乐观锁与悲观锁:https://www.open-open.com/lib/view/open1452046967245.html

  • 数据库死锁原因及解决办法

死锁(Deadlock)

所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。 一种情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其他线程占用并堵塞了的资源。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。计算机系统中,如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。锁有多种实现方式,比如意向锁,共享-排他锁,锁表,树形协议,时间戳协议等等。锁还有多种粒度,比如可以在表上加锁,也可以在记录上加锁。 

产生死锁的原因主要是:

(1)系统资源不足。

(2) 进程运行推进的顺序不合适。

(3)资源分配不当等。

如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

产生死锁的四个必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

  这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

 

处理死锁的基本方法:

1.预防死锁(破坏四个必要条件):

资源一次性分配:(破坏请求和保持条件)

可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)

资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件) 

2.避免死锁(银行家算法):

预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得 较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。

3.检测死锁

首先为每个进程和每个资源指定一个唯一的号码;

然后建立资源分配表和进程等待表,例如:

4.解除死锁:

当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:

剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;

撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。

如何将死锁减至最少

虽然不能完全避免死锁,但可以使死锁的数量减至最少。将死锁减至最少可以增加事务的吞吐量并减少系统开销,因为只有很少的事务回滚,而回滚会取消事务执行的所有工作。由于死锁时回滚而由应用程序重新提交。

下列方法有助于最大限度地降低死锁:

(1)按同一顺序访问对象。

(2)避免事务中的用户交互。

(3)保持事务简短并在一个批处理中。

(4)使用低隔离级别。

(5)使用绑定连接。

1)按同一顺序访问对象

如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。例如,如果两个并发事务获得 Supplier 表上的锁,然后获得 Part 表上的锁,则在其中一个事务完成之前,另一个事务被阻塞在 Supplier 表上。第一个事务提交或回滚后,第二个事务继续进行。不发生死锁。将存储过程用于所有的数据修改可以标准化访问对象的顺序。

2)避免事务中的用户交互

避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,例如答复应用程序请求参数的提示。例如,如果事务正在等待用户输入,而用户去吃午餐了或者甚至回家过周末了,则用户将此事务挂起使之不能完成。这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。

3)保持事务简短并在一个批处理中

在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也就越长,从而堵塞了其它活动并可能导致死锁。

保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。

4)使用低隔离级别

确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺。

5)使用绑定连接

使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。次级连接所获得的任何锁可以象由主连接获得的锁那样持有,反之亦然,因此不会相互阻塞。

用存储过程查出引起死锁的进程和SQL语句

假如发生了死锁,我们怎么去检测具体发生死锁的是哪条SQL语句或存储过程?此时我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和SQL语句。

与锁定有关的两个问题--死锁和阻塞

死锁

死锁是一种条件,不仅仅是在关系数据库管理系统 (RDBMS) 中发生,在任何多用户系统中都可以发生的。当两个用户(或会话)具有不同对象的锁,并且每个用户需要另一个对象的锁时,就会出现死锁。每个用户都等待另一个用户释放他的锁。当两个连接陷入死锁时,Microsoft® SQL Server? 会进行检测。其中一个连接被选作死锁牺牲品。该连接的事务回滚,同时应用程序收到错误。

如果死锁变成单个公用事件,而且它们的回滚造成过多的性能降级,那么就需要再次进行深入彻底的调查。使用跟踪标记 1204。例如,下面的命令从命令提示符启动 SQL Server,并启用跟踪标记 1204:

c:\mssql\binn\sqlservr -T1204

现在所有消息都会显示在启动 SQL Server 的控制台屏幕上和错误日志中。

使用分布式事务时,也可能发生死锁。

阻塞

任何基于锁的并发系统都不可避免地具有可能在某些情况下发生阻塞的特征。当一个连接控制了一个锁,而另一个连接需要冲突的锁类型时,将发生阻塞。其结果是强制第二个连接等待,或在第一个连接上阻塞。

在本主题中,术语"连接"是指数据库的单个登录会话。每个连接都作为系统进程 ID (SPID) 出现。尽管每一个 SPID 一般都不是单独的进程上下文,但这里常常用来指一个进程。更确切的说,每个 SPID 都是由服务器资源和数据结构(为给定客户单个连接的请求提供服务)组成。单个客户应用程序可能有一个或多个连接。就 SQL Server 而言,从单个客户机上的单个客户应用程序来的多个连接和从多个客户应用程序或多个客户机来的多个连接是没有区别的。不管是来自同一应用程序还是来自两台不同客户机上单独的应用程序,一个连接都可以阻塞另一个连接。

https://blog.csdn.net/lemontreey/article/details/53067437

 

  • 使用索引查询一定能提高查询的性能吗?

通常,通过索引查询数据比全表扫描要快,但是我们也必须注意到它的代价。

索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:

1.基于一个范围的检索,一般查询返回结果集小于表中记录数的30%

2.基于非唯一性索引的检索

  • drop、delete与truncate的区别以及使用场景

TRUNCATE 和DELETE只删除数据, DROP则删除整个表(结构和数据)。

速度,一般来说:drop> truncate >delete 

delete语句是DML,这个操作会放到rollback segement中,事务提交之后才生效;
如果有相应的trigger,执行的时候将被触发。truncate,drop是ddl,操作立即生效,原数据不放到rollback segment中,不能回滚。操作不触发trigger。

深入理解:https://blog.csdn.net/ws0513/article/details/49980547

使用场景

1.不再需要一张表的时候,用drop

2.想删除部分数据行时候,用delete,并且带上where子句

3.保留表而删除所有数据的时候用truncate

  • 超键、候选键、主键、外键分别是什么?

    超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。

    候选键:是最小超键,即没有冗余元素的超键。

    主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。

    外键:在一个表中存在的另一个表的主键称此表的外键。

  • 什么是视图?以及视图的使用场景有哪些?

    视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

1.只暴露部分字段给访问者,所以就建一个虚表,就是视图。

2.查询的数据来源于不同的表,而查询者希望以统一的方式查询,这样也可以建立一个视图,把多个表查询结果联合起来,查询者只需要直接从视图中获取数据,不必考虑数据来源于不同表所带来的差异

  • 三个范式

    第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。

     第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。

    第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如 果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表    应该不存在如下依赖关系: 关键字段 → 非关键字段 x → 非关键字段y

https://blog.csdn.net/weixin_30363263/article/details/80114142

 

计网


计算机网络分几层,每层干什么
三次握手,四次挥手。为什么是三次为什么是四次
TCP,UDP区别,两者的数据报头是什么样的
TCP为了可靠传输提供了哪些服务

TCP拥塞控制,流量控制,如何保证包按需到达

前端:HTTP/HTTPS区别,HTTP用TCP支持的,在哪一层,ISO协议栈TCP/IP协议栈区别
UDP适合什么样的软件
DNS如何把网址变成ip地址
ARP(地址解析协议)过程:把mac地址转换

https://blog.csdn.net/weixin_42716620/article/details/82888576

https://blog.csdn.net/JXH_123/article/details/40316081

https://blog.csdn.net/u012856866/article/details/76825075

HTTP、TCP、IP协议基本定义

HTTP:

  (HyperText Transport Protocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。

TCP:

  (Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内 [1]  另一个重要的传输协议。

IP:

  网络之间互连的协议(IP)是Internet Protocol的外语缩写
  网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议

  如今的IP网络使用32位地址,以点分十进制表示,如192.168.0.1。
  地址格式为:IP地址=网络地址+主机地址或 IP地址=网络地址+子网地址+主机地址。

套接字(socket):

套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

Http、TCP/IP协议与Socket之间的区别:https://blog.csdn.net/dongbaoming/article/details/53727421

1)建立起一个TCP连接需要经过“三次握手”。握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开)。

2)由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。

3)建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。

socket则是对TCP/IP协议的封装和应用(程序员层面上)。也可以说,TPC/IP协议是传输层协议,主要解决数据 如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。

通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。

TCP是传输层协议,主要解决数据如何在网络中传输;

HTTP协议是应用层协议,是TCP协议的上层协议,主要用于客户端与服务器 之间的数据传输;

socket是对TCP协议的封装,是一个调用接口。

 
tcp/ip基础知识
TCP/IP全称是Transmission Control Protocol/Internet Protocol。 IP地址共32位,4字节。

IP地址分为两部分:网络标识和主机标识。

A类IP地址:第一段为网络标识,剩下三段为主机标识。网络地址最高位必须为零。网络标识长度为7位,主机标识长度为24位。A类网络的主机数最多可以达到1600多台。

B类IP地址:第一、二段位网络标识,第三、四段为主机标识。网络地址最高位必须为10。网络标识长度为14位,主机标识长度位16位。每个网络最多能容纳6万多台主机。

C类IP地址:前三段位网络标识,剩下一段为主机标识。网络地址最高位必须为110。网络标识长度为21位,主机标识长度为8位。每个网络最多容纳254台主机。

子网掩码也是32位的一个IP地址,它的用途是识别本网络内的计算机。两台不同主机的IP地址同时与子网掩码进行AND运算,如果得出结果相同,则说明这两台计算机处于同一个子网内,可以进行直接通信。 域名的构成:主机名+机构名+网络名+最高层域名。
常见面试题

一、Http的报文结构。

(1)HTTP请求报文
一个HTTP请求报文由请求行、请求头部、空行和请求数据4个部分组成,下图是请求报文的一般格式。

(2)HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。

 

  • 1.      OSI,TCP/IP,五层协议的体系结构

OSI分层(7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

TCP/IP分层(4层):网络接口层、网际层、运输层、应用层。

五层协议(5层):物理层、数据链路层、网络层、运输层、应用层。

每一层的作用如下:

物理层:激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。该层为上层协议提供了一个传输数据的物理媒体。
数据链路层:数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。

网络层:网络层负责对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互连等功能。

传输层:第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。

会话层:会话层管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步。

表示层:表示层对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等。

应用层:为操作系统或网络应用程序提供访问网络服务的接口。

 

  • 2.      IP地址的分类

A类地址:以0开头,第一个字节范围:0~127;

B类地址:以10开头,第一个字节范围:128~191;

C类地址:以110开头,第一个字节范围:192~223;

D类地址:以1110开头,第一个字节范围为224~239;

 

  • 3.      ARP协议的工作原理

  (1)首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。

(2)当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机IP地址,源主机MAC地址,目的主机的IP地址。

(3)当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。

(4)源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

广播发送ARP请求,单播发送ARP响应。

 

  • 4.      路由设备与相关层

物理层:中继器(Repeater,也叫放大器),集线器。

数据链路层:网桥,交换机。

网络层:路由器。

网关:网络层以上的设备。

交换机与路由器有什么区别?

①工作所处的OSI层次不一样,交换机工作在OSI第二层数据链路层,路由器工作在OSI第三层网络层

②寻址方式不同:交换机根据MAC地址寻址,路由器根据IP地址寻址

③转发速不同:交换机的转发速度快,路由器转发速度相对较慢。

 

  • 5.      常见的路由选择协议,以及它们的区别

常见的路由选择协议有:RIP协议、OSPF协议。

RIP协议:底层是贝尔曼福特算法,它选择路由的度量标准(metric)是跳数,最大跳数是15跳,如果大于15跳,它就会丢弃数据包。

OSPF协议:底层是迪杰斯特拉算法,是链路状态路由选择协议,它选择路由的度量标准是带宽,延迟。

 

  • 6.      TCP与UDP的区别

TCP:面向连接,可靠的,速度慢,效率低。

UDP:无连接、不可靠、速度快、效率高。

TCP是传输控制协议,提供的是面向连接、可靠的字节流服务。通信双方彼此交换数据前,必须先通过三次握手协议建立连接,之后才能传输数据。TCP提供超时重传,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

UDP是用户数据报协议,是一个简单的面向无连接的协议。UDP不提供可靠的服务。在数据数据前不用建立连接故而传输速度很快。UDP主要用户流媒体传输,IP电话等对数据可靠性要求不是很高的场合。

 

  • 7.      TCP的可靠性如何保证?

   TCP的可靠性是通过顺序编号和确认(ACK)来实现的。

 

8.      TCP三次握手和四次挥手的全过程

TCP为什么需要3次握手,4次断开?

“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。 client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”。主要目的防止server端一直等待,浪费资源。

为什么4次断开?

因为TCP有个半关闭状态,假设A.B要释放连接,那么A发送一个释放连接报文给B,B收到后发送确认,这个时候A不发数据,但是B如果发数据A还是要接受,这叫半关闭。然后B还要发给A连接释放报文,然后A发确认,所以是4次。

在tcp连接握手时为何ACK是和SYN一起发送,这里ACK却没有和FIN一起发送呢。原因是因为tcp是全双工模式接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据。

 

  • 10.  在浏览器中输入www.baidu.com后执行的全部过程

现在假设如果我们在客户端(客户端)浏览器中输入http://www.baidu.com,而baidu.com为要访问的服务器(服务器),下面详细分析客户端为了访问服务器而执行的一系列关于协议的操作:

  1、客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。

  2、在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。

  3、客户端的网络层不用关系应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,我不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。

  4、客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。

 

  • 11.  HTTP协议包括哪些请求?

GET:请求读取由URL所标志的信息。

POST:给服务器添加信息(如注释)。

PUT:在给定的URL下存储一个文档。

DELETE:删除给定的URL所标志的资源。

 

  • 12.  HTTP中,POST与GET的区别

(1)Get是从服务器上获取数据,Post是向服务器传送数据。

(2)Get是把参数数据队列加到提交表单的Action属性所指向的URL中,值和表单内各个字段一一对应,在URL中科院看到。

(3)Get传送的数据量小,不能大于2KB;post传送的数据量较大,一般被默认为不受限制。

(4)根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。

  I.所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。

II.幂等的意味着对同一URL的多个请求应该返回同样的结果。

 

  • 13.  TCP/IP中,每一层对应的协议

网络层:IP协议、ICMP协议、ARP协议、RARP协议。

传输层:UDP协议、TCP协议。

应用层:FTP(文件传送协议)、Telenet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议。

 

  • 14.  TCP对应的协议和UDP对应的协议

TCP对应的协议:

(1) FTP:定义了文件传输协议,使用21端口。常说某某计算机开了FTP服务便是启动了文件传输服务。下载文件,上传主页,都要用到FTP服务。

(2) Telnet:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于DOS模式下的通信服务。如以前的BBS是-纯字符界面的,支持BBS的服务器将23端口打开,对外提供服务。

(3) SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置-中常看到有这么SMTP端口设置这个栏,服务器开放的是25号端口。

(4) POP3:它是和SMTP对应,POP3用于接收邮件。通常情况下,POP3协议所用的是110端口。也是说,只要你有相应的使用POP3协议的程序(例如Fo-xmail或Outlook),就可以不以Web方式登陆进邮箱界面,直接用邮件程序就可以收到邮件(如是163邮箱就没有必要先进入网易网站,再进入自己的邮-箱来收信)。

(5)HTTP协议:是从Web服务器传输超文本到本地浏览器的传送协议。

UDP对应的协议:

(1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。

(2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。

(3) TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。

 

  • 15.特殊的IP地址

(1)网络地址

   IP地址由网络号(包括子网号)和主机号组成,网络地址的主机号为全0,网络地址代表着整个网络。

(2)广播地址

     广播地址通常称为直接广播地址,是为了区分受限广播地址。

     广播地址与网络地址的主机号正好相反,广播地址中,主机号为全1。当向某个网络的广播地址发送消息时,该网络内的所有主机都能收到该广播消息。

(3)组播地址

    D类地址就是组播地址。

     先回忆下A,B,C,D类地址吧

    A类地址以00开头,第一个字节作为网络号,地址范围为:0.0.0.0~127.255.255.255;

    B类地址以10开头,前两个字节作为网络号,地址范围是:128.0.0.0~191.255.255.255;

    C类地址以110开头,前三个字节作为网络号,地址范围是:192.0.0.0~223.255.255.255。

    D类地址以1110开头,地址范围是224.0.0.0~239.255.255.255,D类地址作为组播地址(一对多的通信);

    E类地址以1111开头,地址范围是240.0.0.0~255.255.255.255,E类地址为保留地址,供以后使用。

    Notice:只有A,B,C有网络号和主机号之分,D类地址和E类地址没有划分网络号和主机号。

 (4)255.255.255.255

     该IP地址指的是受限的广播地址。受限广播地址与一般广播地址(直接广播地址)的区别在于,受限广播地址之只能用于本地网络,路由器不会转发以受限广播地址为目的地址的分组;一般广播地址既可在本地广播,也可跨网段广播。例如:主机192.168.1.1/30上的直接广播数据包后,另外一个网段192.168.1.5/30也能收到该数据报;若发送受限广播数据报,则不能收到。

    Notice:一般的广播地址(直接广播地址)能够通过某些路由器(当然不是所有的路由器),而受限的广播地址不能通过路由器。

    (5)0.0.0.0

       常用于寻找自己的IP地址,例如在我们的RARP,BOOTP和DHCP协议中,若某个未知IP地址的无盘机想要知道自己的IP地址,它就以255.255.255.255为目的地址,向本地范围(具体而言是被各个路由器屏蔽的范围内)的服务器发送IP请求分组。

  (6)回环地址

   127.0.0.0/8被用作回环地址,回环地址表示本机的地址,常用于对本机的测试,用的最多的是127.0.0.1。

  (7)A、B、C类私有地址

   私有地址(private address)也叫专用地址,它们不会在全球使用,只具有本地意义。

   A类私有地址:10.0.0.0/8,范围是:10.0.0.0~10.255.255.255

   B类私有地址:172.16.0.0/12,范围是:172.16.0.0~172.31.255.255

   C类私有地址:192.168.0.0/16,范围是:192.168.0.0~192.168.255.255

 

  • 16.  NAT协议、DHCP协议、DNS协议的作用

NAT协议:网络地址转换(NAT,Network AddressTranslation)属接入广域网(WAN)技术,

是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。

DHCP协议:动态主机设置协议(Dynamic Host ConfigurationProtocol, DHCP)

是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。

DNS协议:DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。

 

  • 17.TCP/IP的流量控制

利用滑动窗口实现流量控制,如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。

 TCP为每一个连接设有一个持续计时器(persistence timer)。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口控测报文段(携1字节的数据),那么收到这个报文段的一方就重新设置持续计时器。

 

  • 18.TCP拥塞控制

防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。

 拥塞控制代价:需要获得网络内部流量分布的信息。在实施拥塞控制之前,还需要在结点之间交换信息和各种命令,以便选择控制的策略和实施控制。这样就产生了额外的开销。拥塞控制还需要将一些资源分配给各个用户单独使用,使得网络资源不能更好地实现共享。

几种拥塞控制方法:

慢开始(slow-start )、拥塞避免(congestion avoidance )、快重传( fastretransmit )和快恢复( fastrecovery )。

慢开始和拥塞避免

发送方维持一个拥塞窗口cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。
    发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
    慢开始算法:当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。因此,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口 cwnd ,可以使分组注入到网络的速率更加合理。

每经过一个传输轮次,拥塞窗口 cwnd 就加倍。一个传输轮次所经历的时间其实就是往返时间RTT。不过“传输轮次”更加强调:把拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。
另,慢开始的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞情况),然后再逐渐增大cwnd。
    为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量(如何设置ssthresh)。慢开始门限ssthresh的用法如下:
    当 cwnd < ssthresh 时,使用上述的慢开始算法。
    当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
    当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。
拥塞避免算法:让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。
    无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。过程图如下:

 

快速重传:

那就是收到3个相同的ACK。TCP在收到乱序到达包时就会立即发送ACK,TCP利用3个相同的ACK来判定数据包的丢失,此时进行快速重传,快速重传做的事情有:

1.     把ssthresh设置为cwnd的一半

2.     把cwnd再设置为ssthresh的值(具体实现有些为ssthresh+3)

3.重新进入拥塞避免阶段。

快速恢复:

1.  当收到3个重复ACK时,把ssthresh设置为cwnd的一半,把cwnd设置为ssthresh的值加3,然后重传丢失的报文段,加3的原因是因为收到3

2.  再收到重复的ACK时,拥塞窗口增加1。

3.  收到新的数据包的ACK时,把cwnd设置为第一步中的ssthresh的值。原因是因为该ACK确认了新的数据,说明从重复ACK时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态。

 

  • 19.ICMP协议

ICMP是InternetControl Message Protocol,因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由器是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。ICMP报文有两种:差错报告报文和询问报文。

Ping,ICMP报文是什么?
  PING (Packet Internet Groper),因特网包探索器,用于测试网络连通性的程序。

  Ping发送一个ICMP(Internet Control Messages Protocol,因特网信报控制协议);回声请求消息给目的地并报告是否收到所希望的ICMPecho (ICMP回声应答)。

  工作原理:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。

为了提高IP数据报交付成功机会,在网络层使用过了网际控制报文协议(ICMP)来允许主机或路由器报告差错和异常情况。ICMP报文作为IP层数据报的数据,加上数据报首部,组成IP数据报发出去。ICMP协议是IP层协议。

  • 20.DHCP协议

动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段。通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

 

  • 8、网桥的作用?

网桥是一个局域网与另一个局域网之间建立连接的桥梁

 

  • 9、数据链路层协议可能提供的服务?

成帧、链路访问、透明传输、可靠交付、流量控制、差错检测、差错纠正、半双工和全双工。最重要的是帧定界(成帧)、透明传输以及差错检测。

 

  • 10、网络接口卡(网卡)的功能?

(1)进行串行/并行转换。

(2)对数据进行缓存。

(3)在计算机的操作系统安装设备驱动程序。

(4)实现以太网协议。

 

  • 11、私有(保留)地址?

       A类:10.0.0.0——10.255.255.255

       B类:172.16.0.0——172.31.255.255

       C类:192.168.0.0——192.168.255.255

 

  • 12、TTL是什么?作用是什么?哪些工具会用到它(ping traceroute ifconfig  netstat)?

TTL是指生存时间,简单来说,它表示了数据包在网络中的时间,经过一个路由器后TTL就减一,这样TTL最终会减为0,当TTL为0时,则将数据包丢弃,这样也就是因为两个路由器之间可能形成环,如果没有TTL的限制,则数据包将会在这个环上一直死转,由于有了TTL,最终TTL为0后,则将数据包丢弃。ping发送数据包里面有TTL,但是并非是必须的,即是没有TTL也是能正常工作的,traceroute正是因为有了TTL才能正常工作,ifconfig是用来配置网卡信息的,不需要TTL,netstat是用来显示路由表的,也是不需要TTL的。

 

  • 13、路由表是做什么用的?在Linux环境中怎么配置一条默认路由?

路由表是用来决定如何将一个数据包从一个子网传送到另一个子网的,换句话说就是用来决定从一个网卡接收到的包应该送到哪一个网卡上去。路由表的每一行至少有目标网络号、子网掩码、到这个子网应该使用的网卡这三条信息。当路由器从一个网卡接收到一个包时,它扫描路由表的每一行,用里面的子网掩码与数据包中的目标IP地址做逻辑与运算(&)找出目标网络号。如果得出的结果网络号与这一行的网络号相同,就将这条路由表六下来作为备用路由。如果已经有备用路由了,就载这两条路由里将网络号最长的留下来,另一条丢掉(这是用无分类编址CIDR的情况才是匹配网络号最长的,其他的情况是找到第一条匹配的行时就可以进行转发了)。如此接着扫描下一行直到结束。如果扫描结束仍没有找到任何路由,就用默认路由。确定路由后,直接将数据包送到对应的网卡上去。在具体的实现中,路由表可能包含更多的信息为选路由算法的细节所用。

linux上可以用“route add default gw<默认路由器 IP>”命令配置一条默认路由。

 

  • 14、RARP?

逆地址解析协议,作用是完成硬件地址到IP地址的映射,主要用于无盘工作站,因为给无盘工作站配置的IP地址不能保存。

 

  • 15、运输层协议与网络层协议的区别?

       网络层协议负责的是提供主机间的逻辑通信

       运输层协议负责的是提供进程间的逻辑通信

 

  • 16、说说静态路由和动态路由有什么区别。

静态路由是由管理员手工配置的,适合比较简单的网络或需要做路由特殊控制。而动态路由则是由动态路由协议自动维护的,不需人工干预,适合比较复杂大型的网络。

路由器能够自动地建立自己的路由表,并且能够根据实际实际情况的变化适时地进行调整。动态路由机制的运作依赖路由器的两个基本功能:对路由表的维护;路由器之间适时的路由信息交换。

 

  • 17、HTTP的长连接和短连接?

HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议.

短连接:浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。

长连接:当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

TCP短连接: client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起 close操作.短连接一般只会在 client/server间传递一次读写操作

 TCP长连接: client向server发起连接,server接受client连接,双方建立连接。Client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

 

  • 18、 IO中同步与异步,阻塞与非阻塞区别

同步和异步关注的是消息通信机制 (synchronous communication/asynchronous communication)
所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
换句话说,就是由*调用者*主动等待这个*调用*的结果。
异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

非阻塞:不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

 

  • 19、ip地址分段

A类网络的IP地址范围为1.0.0.1-127.255.255.254;
B类网络的IP地址范围为:128.1.0.1-191.255.255.254;
C类网络的IP地址范围为:192.0.1.1-223.255.255.254、

 

  • 20、为什么TIME_WAIT状态还需要等2*MSL(Max SegmentLifetime,最大分段生存期)秒之后才能返回到CLOSED状态呢?

因为虽然双方都同意关闭连接了,而且握手的4个报文也都发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SENT状态到ESTABLISH状态那样),但是我们必须假想网络是不可靠的,你无法保证你最后发送的ACK报文一定会被对方收到,就是说对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

  • SYN攻击

  在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.
Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击
netstat -n -p TCP | grep SYN_RECV
一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.
但是不能完全防范syn攻击。

  • HTTP与HTTPS有什么区别?

HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。

简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

HTTPS和HTTP的区别主要如下:

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

 

操作系统

https://blog.csdn.net/qq_40657528/article/details/90209319

1,什么是线程(Thread)
线程是处理代码的执行流,有着自己的程序计数器,用来追踪下一次执行的指令,系统寄存器持有它的变量,栈包含了它的执行历史。
线程间可进行数据共享。当一个线程改变了内存,其他线程亦可以看到。
线程也叫做轻量级进程。线程基于并行工作提高应用程序的性能。线程是一种提高操作系统性能的软件方法,但是其开销小于多进程。
每一个线程都存在一个特定的进程中。没有任何一个线程可存在于一个进程外。线程成功地被用于实现网络服务器和web服务器。
下图就是单进程单线程和单进程多线程示意图。

å¨è¿éæå¥å¾çæè¿°
2,进程和线程的不同

序号进程线程
1进程是重量级,资源密集型轻量级,消耗更小的资源(与进程比)
2进程切换需要与操作系统交互线程切换不需要与操作系统交互
3多进程,相同代码,但每个进程拥有自己的资源所有的线程可共用资源
4当一个进程阻塞,其他进程等待当一个线程阻塞,后续线程可执行
5多进程中不用线程会用更多的资源多线程进程用更傻少的资源
6多进程中,每个进程都是相互独立的一个线程可以改变读,写,改变其它线程的数据

3,线程的优点
线程降低了上下文切换的时间
多线程使得在进程中并发执行任务
有效的通信
线程的创建和切换上下文更加经济
线程使得多处理器架构伸缩性更高、更有效
4,线程的类别
用户级线程——用户管理的线程
内核级线程——操作系统管理线程
4.1 用户级线程
在这种情况下,线程管理内核没有意识到线程的存在。线程库包含了创建和销毁线程的代码,包含了在线程间传递消息和数据的代码,以及调度线程执行和保存、恢复线程上下文的代码。应用被一个线程启动。下图是该类线程的示意图。

å¨è¿éæå¥å¾çæè¿°
4.1.1,优点
线程切换不需要内核模式权限
用户级线程可以在任何操作系统上运行
用户级线程可以快速创建和管理
根据应用特定需要允许进程选择线程调度算法
4.1.2,缺点
多线程程序没有利用多处理器的优势
在传统的操作系统中,大多数系统调用被阻塞
4.2,内核级线程
该线程被操作系统的内核管理,在应用程序中没有线程管理代码。线程的创建、调度、销毁等操作均由内核来管理。内核维护了进程上下文切换以及单个进程中线程间的上下文切换。

4.2.1,优点
内核可以同时调度同一进程的多个线程
如果一个线程被阻塞,内核可以调度另一个
内核本身就是多线程的
4.2.2,缺点
线程创建和管理速度慢
统一进程的线程间的控制传输需要内核的模式切换
5,多线程模型
一些操作系统提供了上述两种线程,比如Solaris系统。在混合操作系统中,同一程序中多个线程可以并行地运行于多个处理器上,一个阻塞的系统调用不会阻塞整个进程进行。多线程模型有三种。

多对多关系
多对一关系
一对一关系
5.1,多对多关系
多对多关系线程模型是任意数量N的用户线程到相等或者小于N的内核线程的多路复用。
下图显示了多对多线程模型,其中6个用户级线程与6个内核级线程进行多路复用。在此模型中,开发人员可以根据需要创建任意数量的用户线程,并且相应的内核线程可以在多处理器计算机上并行运行。此模型提供了并发的最佳准确性,当线程执行阻塞系统调用时,内核可以调度另一个线程来执行。


5.2,多对一关系
多对一模型将许多用户级线程映射到一个内核级线程。线程管理由在用户空间由线程库中完成。当线程进行阻塞系统调用时,整个进程将被阻止。 一次只有一个线程可以访问内核,因此多个线程无法在多处理器上并行运行。
如果用户级线程库在操作系统中以系统不支持它们的方式实现的,则内核线程使用多对一关系模式。

å¨è¿éæå¥å¾çæè¿°
5.3,一对一关系
用户级线程与内核级线程之间存在一对一的关系。与多对一模型相比,此模型提供更多并发性。 当线程进行阻塞系统调用时,它还允许另一个线程运行。 它支持多个线程在微处理器上并行执行。
该模型的缺点是创建用户线程时需要相应的内核线程。 OS / 2,Windows NT和Windows 2000使用一对一的关系模型。

å¨è¿éæå¥å¾çæè¿°

  • 一、进程与线程的关系以及区别

1.定义: 
  进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
  线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 
2.关系: 
  一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. 
  相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 
3. 区别: 
1.粒度性分析:线程粒度小于进程 
2.调度性分析: 
3.系统开销分析: 

è¿éåå¾çæè¿°


  进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。 
简单来记: 
1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 
5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 
4.优缺点及应用场景: 
线程开销小,但不利于资源的管理和保护;进程与之相反。

线程优点:
线程共享进程的地址空间,因此线程间通信比较容易(但是不安全要注意维护),而进程间通信就相比较困难了,因为两个进程看到同一块资源不容易 ------------节约资源,成本低,调度切换快

创建销毁成本低

线程间切换容易

等待慢速I/O的同时,可以干其他事情

进程优点:
更强的容错性,安全,一个进程挂了,不影响其他.

多进程比多线程编写,调试容易。

线程应用场景:
等待慢速I/O时,交给一个线程等待,接着做其他事情

通信,比较容易(注意加锁)

进程的应用场景:
需要安全稳定时用进程,需要速度时用进程,既要速度又要安全。有的书上说,能用多进程解决的尽量不要用多线程

https://blog.csdn.net/baidu_37964044/article/details/81406866

5.进程有哪几种状态?

就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源

运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数

阻塞状态: 进程等待某种条件,在条件满足之前无法执行 

  • 二、Windows下的内存是如何管理的

1.虚拟内存: 
最适合用来管理大型对象或者结构数组 
2.内存映射文件: 
最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行多个进程之间共享数据 
3.内存堆栈: 
最适合用来管理大量的小对象

  • 三、中断和轮询的特点

  对I/O设备的程序轮询的方式,是早期的计算机系统对I/O设备的一种管理方式。它定时对各种设备轮流询问一遍有无处理要求。轮流询问之后,有要求的就加以处理。在处理I/O设备的要求之后,处理机返回继续工作。尽管轮询需要时间,但轮询要比I/O设备的速度要快得多,所以一般不会发生不能及时处理的问题。当然,再快的处理机,能处理的输入输出设备的数量也是有一定限度的。而且,程序轮询毕竟占据了CPU相当一部分处理时间,因此程序轮询是一种效率较低的方式,现代计算机系统中已很少应用。 
  轮询效率低,等待时间很长,CPU利用率不高;中断容易遗漏一些问题,CPU利用率高。

  • 四、什么是临界区、如何解决冲突?

  每个进程中访问临界资源的那段程序称为临界区,每次只准许一个进程进入临界区,进入后不允许其他进程进入。如果有若干个进程要求进入空闲的临界区,一次仅允许一个进程进入。任何时候,处于临界区的进程不可多于一个。如已有进程进入自己的临界区,则其他试图进入临界区的进程必须等待。进入临界区的进程要在有限时间内退出,以便其他进程能及时进入自己的临界区。如果不能进入自己的临界区,就应该让出CPU,避免进程出现忙等等现象。

  • 五、分段和分页的区别?

  页是信息的物理单位,分页是为了实现离散分配方式,以减少内存的外零头,提高内存的利用率。分页仅仅是由于系统管理的需要,而不是用户的需要。 
  段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。 
  页的大小固定且由系统确定,把逻辑地址分为页号和页内地址两部分,由机器硬件实现的。因此一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编写程序在对源代码进行编辑时,根据信息的性质来划分。 
  分页的作业地址空间是一维的,即单一的线性空间。 
  分段的作业地址空间是二维的,程序员在标识一个地址时,既需要给出段名,又需要给出段内地址。

  • 六、进程间通信有哪些方式?它们的区别?

IPC方式:7种 
1.管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在有血缘关系的进程间使用,进程的血缘关系通常是指父子进程关系。 
2.命名管道(named pipe):也是半双工的通信方式,但是它允许无亲缘关系关系进程间通信。

3.信号(signal):是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生。 
4.信号量(semophere):信号量是一个计数器,可用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

5.消息队列(message queue):消息队列是由消息组成的链表,存放在内核中,并由消息队列标识符标识。消息队列克服了信号传递消息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

6.共享内存(shared memory):就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,它是针对其他进程间的通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量等配合使用,来实现进程间的同步和通信。 
7.套接字(socket):套接口也是进程间的通信机制,与其他通信机制不同的是它可用于不同及其间的进程通信。 
几种方式的比较: 
管道:速度慢、容量有限 
消息队列:容量收到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。 
信号量:不能传递复杂信息,只能用来同步。 
共享内存:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全。

深入了解:https://blog.csdn.net/yufaw/article/details/7409596

  • 七、线程间的通信机制

1.锁机制:互斥锁、条件变量、读写锁 
 互斥锁提供了以排他方式防止数据结构被并发修改的方法。 
 读写锁允许多个线程同时读共享数据,而对写操作是互斥的。 
 条件变量可以以原子的方式进行阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。 
2.信号量机制:包括无名信号量和命名线程信号量 
3.信号机制:类似进程间的信号处理 
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

  • 八、线程的同步方式 

  临界区、互斥量、信号量、事件 
  临界区:通过对多线程的串行化来访问公共资源或者一段代码,速度快,适合控制数据访问。 
  互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以可以保证公共资源不会同时被多个线程访问。 
  信号量:它允许多个线程同一时刻访问同一资源,但是需要限制同一时刻访问此资源的最大线程数目。信号量对象与其他前面几种方法不同,信号允许多个线程同时使用共享资源。 
  事件(信号):通过通知操作的方式来保持多线程的同步,还可以方便实现多线程的优先级比较操作。

è¿éåå¾çæè¿° 
 
线程同步不同方式间的总结比较: 
  互斥量和临界区很相似,但是互斥量是可以命名的,它可以跨越进程使用,所以创建互斥量所需要的资源更多,如果只是为了在进程内部使用使用临界区会带来速度上的优势并能够减少资源占用量。 
  互斥量、信号量、事件都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,所以可以使用WaitForSingleObject来等待进程和线程退出。

  • 九、进程间同步与互斥的区别?

互斥:指某一个资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的 
同步:是指在互斥的基础上(大多数情况下),通过其它机制实现访问者对资源的有序访问。大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。 
同步:体现的是一种协作性。互斥:体现的是排它性。 
进程同步的主要任务:是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作。从而使程序的执行具有可再现性。 
同步机制遵循的原则: 
 1.空闲让进; 
 2.忙则等待; 
 3.有限等待; 
 4.让权等待; 
  线程同步是指多个线程同时访问某资源时,采用一系列的机制以保证最多只能一个线程访问该资源。线程同步是多线程中必须考虑和解决的问题,以为很有可能发生多个线程同时访问(主要是写操作)同一资源,如果不进行线程同步,很可能会引起数据混乱,造成线程死锁等问题。

  • 十、什么是死锁?产生条件?如何避免死锁

死锁的概念:在2个或多个并发进程中,如果每个进程持有某有资源而又都等待别的进程释放它或他们现在保持的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗地讲,就是2个或多个进程被无限期地阻塞、相互等待的一种状态。 
死锁产生的原因:系统资源不足,进程推进顺序非法 
产生死锁的必要条件: 
  1.互斥条件:一个资源每次只能被一个进程使用 
  2.不可剥夺条件:进程已获得资源,在未使用完之前,不能被其他进程强行剥夺,只能主动释放 
  3.请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。 
  4.循环等待条件:即进程集合{p0,p1,p2,p3…..pn};p0正在等待p1占用的资源,p1正在等待p2占用的资源,pn正在等待p0占用的资源。 
 只要上述一个条件不成立,就不会发生死锁。 
死锁的解除和预防:理解了死锁的原因,以及产生死锁的四个必要条件,就可以最大可能地避免和预防和解锁死锁。所以在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。对资源的分配要给予合理规划 

解决死锁的基本方法: 预防死锁、避免死锁、检测死锁、解除死锁 

死锁的处理策略:鸵鸟策略、预防策略、避免策略、检测与解除死锁

  • 十一、进程的调度算法有哪些?

  1.先来先服务(FCFS):此算法的原则是按照作业到达后备作业队列(或进程进入就绪队列)的先后次序选择作业(或进程) 
  2.短作业优先(SJF:Shortest Process First):这种算法主要用于作业调度,它从作业后备序列中挑选所需运行时间最短的作业进入主存运行。 
  3.时间片轮转调度算法:当某个进程执行的时间片用完时,调度程序便终止该进程的执行,并将它送到就绪队列的末尾,等待分配下一时间片再执行。然后把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证队列中的所有进程,在已给定的时间内,均能获得一时间片处理机执行时间。 
  4.高响应比优先:按照高响应比(已等待时间+要求运行时间)/要求运行时间 优先的原则,在每次选择作业投入运行时,先计算此时后备作业队列中每个作业的响应比RP。选择最大的作业投入运行。 
  5.优先权调度算法:按照进程的优先权大小来调度。使高优先权进程得到优先处理的调度策略称为优先权调度算法。注意:优先数越多,优先权越小。 
  6.多级队列调度算法:多队列调度是根据作业的性质和类型的不同,将就绪队列再分为若干个队列,所有的作业(进程)按其性质排入相应的队列中,而不同的就绪队列采用不同的调度算法。

  • 什么是缓冲区溢出?有什么危害?其原因是什么?

缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。

危害有以下两点:

  • 程序崩溃,导致拒绝额服务
  • 跳转并且执行一段恶意代码

造成缓冲区溢出的主要原因是程序中没有仔细检查用户输入。 

https://blog.csdn.net/xiongluo0628/article/details/81461053

https://blog.csdn.net/gui951753/article/details/79489748

 

数据结构

二叉树:https://blog.csdn.net/zyc2018/article/details/90408638

排序算法:https://blog.csdn.net/zyc2018/article/details/91407774

动态规划:https://blog.csdn.net/zyc2018/article/details/90270929

STL:https://blog.csdn.net/zyc2018/article/details/88876072

全局变量(局部的静态变量本质也属于此范围)存储于堆内存,该段内存较大,一般不会溢出;函数地址、函数参数、局部变量等信息存储于栈内存,VC6中栈内存默认大小为1M,对于当前日益扩大的程序规模而言,稍有不慎就可能出问题。(动态申请的内存即new出来的内存不在栈中)

程序运行时,有六个地方都可以保存数据:

1、 寄存器:这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹。
  2、 堆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象)。驻留于常规RAM(随机访问存储器)区域。但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些java数据要保存在堆栈里——特别是对象句柄,但java对象并不放到其中。
  3、 堆:存放用new产生的数据。一种常规用途的内存池(也在RAM区域),其中保存了java对象。和堆栈不同:“内存堆”或“堆”最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相碰的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间
  4、 静态域:存放在对象中用static定义的静态成员。这儿的“静态”是指“位于固定位置”。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但java对象本身永远都不会置入静态存储空间。
  5、 常量池:存放常量。常数值通常直接置于程序代码内部。这样做是安全的。因为它们永远都不会改变,有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。
  6、 非RAM存储:硬盘等永久存储空间。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给另一台机器,而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对于这些类型的数据存储,一个特别有用的技艺就是它们能存在于其他媒体中,一旦需要,甚至能将它们恢复成普通的、基于RAM的对象。
https://blog.csdn.net/wangdd_199326/article/details/79035879

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值