首页 > 测试开发/测试/银行笔面经自我介绍无领导吐血整理秋招全部家当
头像
其华灼灼
编辑于 2020-11-16 16:14
+ 关注

测试开发/测试/银行笔面经自我介绍无领导吐血整理秋招全部家当

秋招笔记

银行面试自我介绍:

尊敬的面试官:
您好,我叫。。。,来自。。。,即将毕业于。。。;
在校期间,学习成绩优异,本科获得保研资格,研究生期间获得一等奖学金和优秀研究生称号;
为了提升自己的组织能力,参加了院研会,担任文艺部部长,组织过多次文艺活动;
为了提升自己的专业能力,本科多次参加竞赛,研究生积极参加项目;
为了尽早适应工作,我参加了字节跳动实习,期间在工作能力上有了很大提升;
我性格。。。;
以上就是我的基本情况,因此我选择申请。。岗,望领导审核,谢谢!

无领导:

推动项目进程、具有团队合作精神(考察重点);
各位考官各位考生大家好,我是几号考生,刚刚听了大家的发言,真是受益匪浅,现在呢跟大家简单交流一下我的想法,针对,,,我的结论是,,,以上呢就是我的发言,请各位批评指正,谢谢大家。
技巧:
1.整体状态:自信大方从容,逻辑清晰(首先,其次,最后/第一、第二、第三,而且要大声说出来,让考生尤其是面试官听到)
2.抢不到重要角色,别人说的时候去听去记去演,笔纸记下来,看着他的眼睛,点头嗯嗯,去记,一定记住动作要大一点,让面试官看到,积极在记录(好处:发言人思路不清晰时,可以提醒他/或者到你这都被说完,你没话说,这时可以说:刚才的话大家已经得到,,,这个是没有问题的了,那么谁和谁的顺序还有一个问题,我认为四怎么怎么样五怎么怎么样,做出自己的总结和补充也很重要)
3.有礼貌,尊重别人,不要急,切忌吵架;组里有人吵起来/要吵起来/打断别人发言我可以说(维持秩序,尽量让面试官听到):大家能不能按照顺序发言呢?/大家能不能不要打断她讲话呢?/我们听完一个人的发言再进行下一个,否则呀这样的争吵是会浪费时间的,我们时间很紧张了
4.吵得激烈插不进嘴怎么办?等他说完之后,我说一句:嗯,好的,刚才你说,,,你说的还蛮好啊/我觉得你说的不错啊(开头),过度之后,我就可以获得发言的机会,发言的时候看着小组同学,不要盯着纸或者角落,要体现小组讨论在沟通;
5.记住别人的名字,可以说谁谁谁同学,避免别人问你名字你分不清

英语自我介绍

I am 。。。, a lively and cheerful girl who majors in computer science;
During my undergraduate period, my academic performance and innovation score were both the first in major, so I was sent to Soochow University;
As a Test Development Engineer, I did an internship at ByteDance for three months from June to August 2020.

笔经面经:

HTTP状态码:
HTTP中常见请求方法的区别:
PUT请求:如果两个请求相同,后一个请求会把第一个请求覆盖掉。(所以PUT用来改资源);
PATCH:是对PUT方法的补充,用来对已知资源进行局部更新;
POST请求:后一个请求不会把第一个请求覆盖掉。(所以POST用来增资源)。
get和post的区别:
1. GET是幂等的,即读取同一个资源,总是得到相同的数据,POST不是幂等的;
2. GET一般用于从服务器获取资源,而POST有可能改变服务器上的资源;
3. 请求形式上:GET请求的数据附在URL之后,在HTTP请求头中;POST请求的数据在请求体中;
4. 安全性:GET请求可被缓存、收藏、保留到历史记录,且其请求数据明文出现在URL中。POST的参数不会被保存,安全性相对较高;
5. GET只允许ASCII字符,POST对数据类型没有要求,也允许二进制数据;
6. GET的长度有限制(操作系统或者浏览器),而POST数据大小无限制
Session与Cookie的区别:
  1. 存在位置不同,Cookie 保存在客户端(浏览器),Session 保存在服务器端。
  2. 存取方式的不同,Cookie 只能保存 ASCII,Session 可以存任意数据类型,一般情况下我们可以在 Session 中保持一些常用变量信息,比如说 UserId 等。
  3. 有效期不同,Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭或者 Session 超时都会失效。
  4. 隐私策略不同,Cookie 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;Session 存储在服务端,安全性相对 Cookie 要好一些。
  5. 存储大小不同, 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie。
浏览器禁用 Cookie:
此时无法使用 Cookie 来保存用户信息,只能使用 Session。除此之外,不能再将 Session ID 存放到 Cookie 中,而是使用 URL 重写技术,将 Session ID 作为 URL 的参数进行传递。
Cookie 与 Session 选择:
  • Cookie 只能存储 ASCII 码字符串,而 Session 则可以存取任何类型的数据,因此在考虑数据复杂性时首选 Session;
  • Cookie 存储在浏览器中,容易被恶意查看。如果非要将一些隐私数据存在 Cookie 中,可以将 Cookie 值进行加密,然后在服务器进行解密;
  • 对于大型网站,如果用户所有的信息都存储在 Session 中,那么开销是非常大的,因此不建议将所有的用户信息都存储到 Session 中。
http、https的区别:
1. 端口不同:HTTP使用的是80端口,HTTPS使用443端口;
2. HTTP(超文本传输协议)信息是明文传输,HTTPS运行在SSL(Secure Socket Layer,安全套接字层)/TLS(Transport Layer Security,传输层安全协议)之上,添加了加密和认证机制,更加安全;
3. HTTPS由于加密解密会带来更大的CPU和内存开销;
4. HTTPS通信需要证书,一般需要向证书颁发机构(CA)购买;
HTTPS使用的加密方式:非对称加密和对称加密
HTTP 有以下安全性问题:
  • 使用明文进行通信,内容可能会被窃听;
  • 不验证通信方的身份,通信方的身份有可能遭遇伪装;
  • 无法证明报文的完整性,报文有可能遭篡改。
HTTPs(Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。
HTTPs 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信。也就是说 HTTPs 使用了隧道进行通信。
通过使用 SSL,HTTPs 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。
OSI七层模型 、TCP/IP四层模型 、五层协议:
网络层:
ARP地址解析协议,ARP协议完成了IP地址与物理地址的映射。
DHCP动态主机配置协议,是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。
UDP 和 TCP 的特点:
  • 用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),数据单位为用户数据报,首部字段只有 8 个字节,支持一对一、一对多、多对一和多对多的交互通信。例如:视频传输、实时通信
  • 传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),数据单位为报文段,首部字段20个字节,每一条 TCP 连接只能是点对点的(一对一)。
最全电梯测试用例举例:

计算机网络

URL地址解析
URL的一般格式为(带方括号[]的为可选项):
protocol :// hostname[:port] / path /[?query]#fragment
1、protocol ://   为传输协议类型,一般为http://或者https://
2、hostname   为域名或者IP,用来指向存放资源的服务器
3、:port    为端口号,如果省略时则为默认端口,各种传输协议都有默认的端口号,http的默认端口为80
4、path  为路径,有零或者多个“/”符号隔开的字符串,用来指向主机上的一个目录或者文件地址;例如:/jenkins/view/All
5、?query  为查询参数,如:用于给网页传递参数,可以有多个参数,用“&”符号隔开,参数名和值用=“符号隔开,如:?op=view&domain=12345
6、#fragment  为信息片段,用于指定网络资源中的某个片段,打开网页时直接定位到此片段,如:#en/zh
下面是某个网站的URL:
传输协议是http,域名是cat.oa.com,端口没写即默认是80,/cat/r/top是文件路径,?op=view&domain=12345是查询的参数;
DNS:
域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53
从输入网址到获得页面的网络请求过程:
  1. 浏览器查询 DNS获取域名对应的IP地址:
具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询
  1. 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;
  2. TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求
  3. 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
  4. 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;
  5. 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。
在浏览器中输入URL后,执行的全部过程,会用到哪些协议?
1.首先进行域名解析;
2.浏览器发起HTTP请求;
3.接下来到了传输层,选择传输协议,TCP或者UDP,TCP是可靠的传输控制协议,对HTTP请求进行封装,加入了端口号等信息;
4.然后到了网络层,通过IP协议将IP地址封装为IP数据报;然后此时会用到ARP协议,主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址,找到目的MAC地址;
5.接下来到了数据链路层,把网络层交下来的IP数据报添加首部和尾部,封装为MAC帧,现在根据目的mac开始建立TCP连接,三次握手,接收端在收到物理层上交的比特流后,根据首尾的标记,识别帧的开始和结束,将中间的数据部分上交给网络层,然后层层向上传递到应用层;
6.服务器响应请求并请求客户端要的资源,传回给客户端;
7.断开TCP连接,浏览器对页面进行渲染呈现给客户端。
Ipv6规范中,IP地址的位数:128,
这里的位数指的是二进制格式的位数;
IP地址子网划分:
IP分类
公有地址:
IP分类        缺省掩码
A 1-127      /8
B 128-191        /16
C 192-223      /24
D 224-239      组播地址
E 240-247    保留地址
私有地址:
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
host-id全为0,是网络地址,不分配给设备使用;
host-id全为1,是当前网络的广播地址,也不做设备地址使用;
判断合法的主机(IP)地址:
192.168.10.240/24        合法
192.168.10.0/24          不合法,主机位全为0,网络地址
192.168.10.255/24        不合法,主机位全为1,子网广播地址
255.255.255.255              不合法,网络和主机位全为1,全网广播地址
127.x.x.x/8                不合法,本地环回地址
172.16.3.5/24              合法
192.168.5.240/32        合法
224.10.10.10.1              不合法,组播地址
300.2.4.200/24              不合法
IP特殊地址:
  • 本地环回地址:127.0.0.0 – 127.255.255.255,测试主机TCP/IP协议栈是否安装正确。
  • 本地链路地址:169.254.0.0 – 169.254.255.255,自动地址无法获取时系统自动配置占位。
  • 受限广播地址:255.255.255.255,发往这个地址的数据不能跨越三层设备,但本地网络内所有的主机都可以接收到数据
例:
10.110.12.29/255.255.255.224,按位与得网络号为10.110.12.0,此为该网段的网络地址,不可作为主机地址使用。根据子网掩码可知主机位占5位,主机地址范围是10.110.12.1到10.110.12.30,广播地址是10.110.12.31;
各层常见设备:
应用层:应用网关
传输层:传输网关
网络层:路由器
数据链路层:网桥、交换机
物理层:中继器、集线器
HTTP协议是什么?
HTTP协议是超文本传输协议的缩写,英文是Hyper Text Transfer Protocol。是从万维网服务器传输超文本本地浏览器的传送协议。
原理:
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)的请求应答协议
HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
HTTP协议的ETAG响应头主要用于信息的过期验证;
HTTP1.1中的cache-control响应头主要用于控制信息在浏览器的缓存;
什么是NAT (Network Address Translation, 网络地址转换)?
用于解决内网中的主机要和因特网上的主机通信。由NAT路由器将主机的本地IP地址转换为全球IP地址,NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad。

数据结构

最优二叉树(哈夫曼树):
只有度为2和0的结点,节点总数为2n-1,叶子节点是n,非叶子节点是n-1;
完全二叉树的性质:
n个节点的完全二叉树,当n为奇数,每一个分支节点都有左右儿子,也就没有度为1的点。
当n为偶数,编号最大的那个分支节点只有左儿子,其他分支节点左右儿子都有,也就是会有一个度为1的点。
另外,非空二叉树的叶子节点比度为2的节点数量多1,即n0 = n2 + 1
n层满二叉树的节点数为2^n-1;
第n层最多能容2^(n-1)个结点;
例:一棵完全二叉树有2015个叶子结点,则结点总数为4030(有一个度为1的节点)或4029(没有度为1的节点);
连通图、连通分量
连通图:无向图中,若从顶点u到顶点v有路径,称为u,v是连通的。若图中任意两个顶点均是连通的,则称为连通图。
对某无向图进行次深度优先搜索遍历 ,如果能访问到所有的顶点,则该无向图一定是连通图
连通分量:无向图中极大连通子图称为连通分量
有n个顶点的无向图最多有n(n-1)/2条边,最少有n-1条边;
强连通图、强连通分量
强连通图:有向图中,若从顶点u到顶点v有路径,称为u,v是连通的。若图中任意两个顶点均是连通的,则称为强连通图。
连通分量:向图中极大连通子图称为强连通分量。特:强连通图只有强连通分量(本身),非强连通图有多个强连通分量
有n个顶点的有向图最多有n(n-1)条边,最少有n条边;
深度优先搜索DFS存在某一顶点被第二次访问到,则有回路出现;
有向图/无向图:
总度数(D)等于边数(e)的两倍,即D=2e;
若G是无向图,则0<=e<=n(n-1)/2;恰有n(n-1)/2条边的无向图称无向完全图
若G是有向图,则0<=e<=n(n-1);恰有n(n-1)条边的有向图称为有向完全图
二分查找方法:
采用二分查找方法查找长度为n 的线性表是,每个元素的平均查找长度为O(log2n);

测试

软件测试的目的:
在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。
了解哪些测试方法:
1.从是否关心软件内部结构和具体实现的角度划分:
(1)白盒测试:又称为结构测试逻辑驱动测试,是一种按照程序内部逻辑结构和编码结构,设计测试数据并完成测试的一种测试方法。
(2)黑盒测试:又称为数据驱动测试,把测试对象当做看不见的黑盒,在完全不考虑程序内部结构和处理过程的情况下,测试者仅依据程序功能的需求规范考虑,确定测试用例和推断测试结果的正确性,它是站在使用软件或程序的角度,从输入数据与输出数据的对应关系出发进行的测试。
(3)灰盒测试:是一种综合测试法,它将“黑盒”测试与“白盒”测试结合在一起,是基于程序运行时的外部表现又结合内部逻辑结构来设计用例,执行程序并采集路径执行信息和外部用户接口结果的测试技术。
2.从是否执行代码角度:
静态测试、动态测试;
3.从软件开发的过程按阶段划分有:
单元测试(是白盒测试的一种方式,但也可以采用白盒测试,辅之以黑盒测试)、集成测试、确认测试、系统测试、验收测试、回归测试;其中系统测试包括:性能测试、恢复测试、安全测试、压力测试;
性能测试和压力测试的区别:
白盒测试:
白盒测试法的覆盖标准有逻辑覆盖循环覆盖基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。六种覆盖标准发现错误的能力呈由弱到强的变化:
1.语句覆盖每条语句至少执行一次。 (一遍语句)
2.判定覆盖每个判定的每个分支至少执行一次。(一遍路径)
3.条件覆盖每个判定的每个条件应取到各种可能的值。(一遍条件)
4.判定/条件覆盖同时满足判定覆盖条件覆盖。
5.条件组合覆盖每个判定中各条件的每一种组合至少出现一次。(所有条件)(对代码的覆盖率最高
6.路径覆盖使程序中每一条可能的路径至少执行一次。(所有可能路径)
黑盒测试方法包括
等价类划分、边界值分析、因果图分析、正交分析法、场景法(遍历用例路径上基本流和备选流);
测试工具及对应功能:
  • JMeter:基于JAVA的压力测试工具,Badboy用来进行脚本的录制;
  • Junit:白盒测试工具:针对代码测试;
  • LoadRunner:是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,能够对整个企业架构进行测试;
  • TestLink:用例管理工具;
性能测试,需要关注的性能指标:
  • IO:磁盘的读写指标
  • CPU:本机的CPU占用率
  • QPS:每秒查询率
  • 内存占用率
测试流程:
  1. 需求分析
  2. 制定测试计划
  3. 设计测试用例与编写
  4. 实施测试
  5. 提交缺陷报告
  6. 生成测试总结和报告

Java

什么是面向对象
Java虚拟机(Java Virtual Machine 简称JVM)
是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一。
jvm性能调优监控工具:
其中jstack可以用来查看线程当前运行状态;
java垃圾回收机制:
反射:
当我们的程序在运行时,需要动态的加载一些类这些可能之前用不到所以不用加载到 JVM,而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻。
反射 (Reflection) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。通过 Class 获取 class 信息称之为反射(Reflection)
简而言之,通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。
程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。
反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。
Java 反射框架主要提供以下功能:
  1. 在运行时判断任意一个对象所属的类
  2. 在运行时构造任意一个类的对象
  3. 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用 private 方法)
  4. 在运行时调用任意一个对象的方法
重点:是运行时而不是编译时
主要用途:
很多人都认为反射在实际的 Java 开发应用中并不广泛,其实不然。 当我们在使用IDE(如Eclipse,IDEA)时,当我们输入一个对象或类并想调用它的属性或方法时,一按点号编译器就会自动列出它的属性或方法,这里就会用到反射。
反射最重要的用途就是开发各种通用框架
很多框架(比如 Spring )都是配置化的(比如通过 XML 文件配置 JavaBean,Action 之类的),为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。
注解:
Annontation 是 Java5 开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具或框架使用。Annontation 像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。
Java 注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说 明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在java.lang.annotation 包中。
简单来说:注解其实就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相对应的处理
为什么要用注解:
传统的方式,我们是通过配置文件 .xml 来告诉类是如何运行的;
有了注解技术以后,我们就可以通过注解告诉类如何运行;
Java关键字及其作用详解:
final:
1.final修饰变量,则等同于常量:
声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。
对于基本类型,final 使数值不变;
对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。  ;
2.final修饰方法中的参数,称为最终参数,用来表示这个参数在这个函数内部不允许被修改  ;
3.final修饰类,则类不能被继承;
4.final修饰方法,则方法不能被重写,可以被重载;
5.final 不能修饰抽象类:
abstract修饰类:会使这个类成为一个抽象类,这个类将不能生成对象例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法;
abstract修饰方***使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,实现部分代替。需要子类继承实现(覆盖);
final修饰不能够被改变;
abstract修饰是需要被改变,这两个写在一起就是矛盾。;
static:
1. 静态变量
静态变量在内存中只存在一份,只在类初始化时赋值一次
  • 静态变量:类所有的实例都共享静态变量,可以直接通过类名来访问它;
  • 实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。
注意:不能在成员函数内部定义static变量。
2. 静态方法
静态方法在类加载的时候就存在了,它不依赖于任何实例,所以静态方法必须有实现,也就是说它不能是抽象方法(abstract)。
3. 静态语句块
静态语句块在类初始化时运行一次
4. 静态内部类
内部类的一种,静态内部类不依赖外部类,且不能访问外部类的非静态的变量和方法。
5. 静态导包
import static com.xxx.ClassName.*
在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。
6. 变量赋值顺序
静态变量的赋值和静态语句块的运行优先于实例变量的赋值和普通语句块的运行,静态变量的赋值和静态语句块的运行哪个先执行取决于它们在代码中的顺序。
volatite
volatile 是一个类型修饰符(type specifier),它是被设计用来修饰不同线程访问和修改的变量。在使用 volatile 修饰成员变量后,所有线程在任何时间所看到变量的值都是相同的。此外,使用 volatile 会组织编译器对代码的优化,因此会降低程序的执行效率。所以,除非迫不得已,否则,能不使用 volatile 就尽量不要使用 volatile。
  • 每次访问变量时,总是获取主内存的最新值
  • 每次修改变量后,立刻写回到主内存中
重载和重写/覆盖的区别:
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。
重写的实现
final表示最终的意思,它修饰的类是不能被继承的;final修饰的方法能被继承(Math类里就有),但是不能够被重写。其实关系并不复杂,你只需要记住这样一句话:final可用于声明属性、方法和类,分别表示属性不可变,方法不可重写,类不可继承。当然final修饰的方法是可以被重载的。
构造方法/构造函数:
构造函数是函数的一种特殊形式。特殊在哪里?构造函数中不需要定义返回类型(void 是无需返回值的意思,请注意区分两者),且构造函数的名称与所在的类名完全一致,其余的与函数的特性相同,可以带有参数列表,可以存在函数的重载现象
一般用来初始化一些成员变量,当要生成一个类的对象(实例)的时候就会调用类的构造函数。如果不显示声明类的构造方***自动生成一个默认的不带参数的空的构造函数。
在这里要说明一点,如果在类中我们不声明构造函数,JVM 会帮我们默认生成一个空参数的构造函数;如果在类中我们声明了带参数列表的构造函数,JVM 就不会帮我们默认生成一个空参数的构造函数,我们想要使用空参数的构造函数就必须自己去显式的声明一个空参的构造函数。
Java程序初始化的顺序是怎么样的
在 Java 语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类 成员完成初始化后,才会调用对象所在类的构造函数创建对象。
初始化一般遵循3个原则:
  • 静态对象(变量)优先于非静态对象(变量)初始化,静态对象(变量)只初始化一次,而非静态 对象(变量)可能会初始化多次
  • 父类优先于子类进行初始化;
  • 按照成员变量的定义顺序进行初始化。 即使变量定义散布于方法定义之中,它们依然在任何方法 (包括构造函数)被调用之前先初始化;
加载顺序 :
  • 父类(静态变量、静态语句块)
  • 子类(静态变量、静态语句块)
  • 父类(实例变量、普通语句块)
  • 父类(构造函数)
  • 子类(实例变量、普通语句块)
  • 子类(构造函数)
抽象abstract类、接口interface:
1. 一个子类只能继承一个抽象类,但能实现多个接口;
2. 抽象类可以有构造方法,接口没有构造方法;
3. 抽象类可以有普通成员变量,接口没有普通成员变量;
4. 抽象类和接口都可有静态成员变量,抽象类中静态成员变量访问类型任意,接口只能public static final(默认);
5. 抽象类可以没有抽象方法,抽象类可以有普通方法,接口中都是抽象方法;
6. 抽象类可以有静态方法,接口不能有静态方法(接口不可以实现方法,只可以定义方法,所以不能使用静态方法,因为静态方法必须实现);
7. 抽象类中的方法可以是public、protected;接口方法只有public
8.子类继承后,抽象类中的非抽象方法不用重写,其他必须重写,接口的方法必须重写;
有抽象方法的类只能被定义为抽象类;
==和equals():
  • ==:
    • 基础数据类型:比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样;
    • 引用数据类型:比较的是引用的地址是否相同,比如说新建了两个User对象,比较的是两个User的地址是否一样;
  • equals:比较引用的地址;
特别地:1.String、Date这些重写equals()的类,equals()比较的是值;
2.自动拆装箱:
      • 基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;
      • 两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关;
      • 两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true;
      • 基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较;
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
输出true,true;
java异常:
都是Throwable的子类:
1.Exception(异常) :是程序本身可以处理的异常。
2.Error(错误): 是程序无法处理的错误。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,一般不需要程序处理。
3.检查异常(编译器要求必须处置的异常):一般是外部错误,除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
4.非检查异常(编译器不要求处置的异常): 例如运行时异常(RuntimeException与其子类)。
哈希表:
查找效率取决于:哈希函数,处理冲突的方法,装填因子的大小。
hashmap,set,arraylist,都不是线程安全的;
深拷贝与浅拷贝

实习项目中:

testNG注解相关:
断言:
断言(assert)作为一种软件调试的方法,提供了一种在代码中进行正确性检查的机制,目前很多开发语言都支持这种机制。
断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
使用断言可以创建更稳定、品质更好且不易于出错的代码。当需要在一个值为 false 时中断当前操作的话,可以使用断言。单元测试必须使用断言(Junit/JunitX)。
常用断言方法:

通用代码计算:

switch:
switch语句中表达式expression只能返回这几种类型的值:int、byte、short和char。如果比较的数据类型是double型,则不能使用 switch结构;
正则表达式:
例:
匹配18812345678:
  1. /^1\d{10}$/
  2. /1[0-9]{10}/
  3. /^1[0-9]{10}$/
float显示
int类型始终是完全显示
三维数组按行优先存储求某位置的地址
三维数组A[n][m][k],n,m,k三个分量分别称之为行,列,页。
假设A[0][0][0]的存储地址为a,其中每个元素所占内存空间为b,那么计算A[x][y][z]的存储地址的公式为a+(xmk+yk+z)b;
三位数组按行优先存储在内存空间中的存储方式为:
首先将第一行第一列的页存满,再存第一行第二列的页,直到第一行存满后再存下一行。
排序比较次数问题
在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是( )。

A.希尔排序
B.冒泡排序
C.插入排序
D.选择排序
选D 希尔排序和冒泡排序都属于插入排序,它们通过数据元素的交换来逐步消除线性表中的逆序,所以关键字比较的次数与记录的初始排列次序有关。而选择排序是指扫描整个线性表,从中选出最小的元素,将它交换到表的前面,然后对剩下的字表采用同样的办法,所以关键字比较的次数与记录的初始排列次序无关。
c语言:
字符串特点/考察点:
C语言和C++语言中都是以ASCII值为零的字符作为字符串的结尾标志;
指针:
1.
char str[]="ABCD";
*p=str;
printf("%d\n",*(p+4));
str的类型是char[5],并且里面的值分别是'A'、'B'、'C'、'D'、'\0'。
显然p指向str[0],所以p+4指向str[4],也就是'\0',即输出0;
如果指针越界,比如这里把p+4改成p+5,即输出不确定的值;
2.
char *p=new char[100];
p在栈上,new出来的在堆上;
在堆上开辟了100个字节的空间,p为指针,指向该空间,p在栈上;
new是动态内存分配,new出来的空间在堆上;
new出来的东西要自己delete掉,否则会造成内存泄漏;
按位异或:
当前位的两个二进制表示不同则为1相同则为0
数据类型转化及占用字节数:
不同数据类型之间运算自动转换为最高的:
sizeof():
用来获取占用的字节数;
结构体的sizeof
结构体/类大小遵循以下两条原则:
1)数据对齐原则---内存按结构体成员的先后顺序排列,当排到该成员时,其前面已开辟的空间字节数必须是该成员类型所占字节数的整数倍,如果不够则补齐,依次向后类推。
2)整体空间是占用空间最大的成员类型所占字节数的整数倍。
struct c{
int x; //4字节
float y; //4字节
}a[3];
a[3]位数组,sizeof(a)计算数组大小位8*3=24
假如结构体改为下面这样:
struct c{
double x; //8字节
char y; //1字节 总:8+1
int z; //4字节,前面字节和9字节,不满足第一条所以为(9+3)+4=16
}总数16,满足第二条。
类sizeof()
sizeof的本质是得到某个类型的大小,确切的来说就是当创建这个类型的一个对象(或变量)的时候,需要为它分配的空间的大小。而类也可以理解为类似于int、float这样的一种类型,当类中出现static成员变量的时候,static成员变量是存储在静态区当中的,它是一个共享的量,因此,在为这个类创建一个实例对象的时候,是无需再为static成员变量分配空间的,所以,这个类的实例对象所需要分配的空间是要排除static成员变量的,于是,当sizeof计算类的大小的时候会忽略static成员变量的大小;
char a 为1 static 不增加大小 1+8 --> 8+8   +8=24  多个虚拟指针值算一个的大小;
char存储详解:
char类型默认情况下是有符号的,其表示的值的范围为[-128,127],在计算机系统中,数值一律用补码来表示(存储);正数的补码与其原码一致;负数的补码:符号位为1,其余位为该数绝对值的原码按位取反,然后整个数加1;例如-256,原码:1100000000,补码:1100000000(符号位不变,其余位取反+1),对于char类型来说发生了溢出,只能存储低8位为0,即为字符‘\0’的ascii码;
sizeof()用来获取占用的字节数(字符串要算上\0的长度);
strlen()返回字符串的长度,遇到'\0'结束;
#include <stdio.h>
#include <string.h>
例1:
char c1[]={'a','b','\0','d','e'};
char c2[]="hello";
int a=sizeof(c1);
int b=strlen(c1);
int c=sizeof(c2);
int d=strlen(c2);
printf("%d,%d,%d,%d",a,b,c,d);
输出5,2,6,5;
例2:
void incr(){
int x=1;
x *=x+1;
printf("%d\n",x);
}
int main(void) {
int i;
for(i=1;i<=2;i++)incr();
return 0;
}
输出2,2;若将x变量定义为局部静态变量(前面加static),输出2,6;
例3:
char st[] ={"abcd","efgh","ijkl","mnop"};
printf("%s",*(st+1)+1);
输出fgh;
例4:
int  a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d",*(ptr-1));
输出5;
strcat()函数:
char*strcat(char* strDestination, const char* strSource);
参数说明:
  • strDestination:目的字符串;
  • strSource:源字符串。
strcat() 函数把 strSource 所指向的字符串追加到 strDestination 所指向的字符串的结尾,所以必须要保证 strDestination 有足够的内存空间来容纳两个字符串,否则会导致溢出错误。
注意:strDestination 末尾的\0会被覆盖,strSource 末尾的\0会一起被复制过去,最终的字符串只有一个\0

数据库

SQL DML 和 DDL
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。
查询和更新指令构成了 SQL 的 DML 部分:
  • SELECT - 从数据库表中获取数据
  • UPDATE - 更新数据库表中的数据
  • DELETE - 从数据库表中删除数据
  • INSERT INTO - 向数据库表中插入数据
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL 中最重要的 DDL 语句:
  • CREATE DATABASE - 创建新数据库
  • ALTER DATABASE - 修改数据库
  • CREATE TABLE - 创建新表
  • ALTER TABLE - 变更(改变)数据库表
  • DROP TABLE - 删除表
  • CREATE INDEX - 创建索引(搜索键)
  • DROP INDEX - 删除索引
RDBMS
RDBMS 指的是关系型数据库管理系统。
RDBMS 是 SQL 的基础,同样也是所有现代数据库系统的基础,比如 MS SQL Server, IBM DB2, Oracle, MySQL 以及 Microsoft Access。
RDBMS 中的数据存储在被称为表(tables)的数据库对象中。
表是相关的数据项的集合,它由列和行组成。
select语句写顺序/执行顺序:
SELECT select_list
FROM table_source
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ](默认为升序)
[<LIMIT clause>]
执行顺序:
• from
• join
• on
• where
• group by
• avg,sum,count等各种函数
• having
• select
• distinct
• order by(asc(升序),desc(降序))
• LIMIT
SQL通配符:
%:代表0个或多个字符;
常见的封锁类型:
  • 排它锁(Exclusive Lock)/ X锁:事务对数据加上X锁时,只允许此事务读取和修改此数据,并且其它事务不能对该数据加任何锁,SELECT * FROM table_name WHERE ... FOR UPDATE(MySQL)
  • 共享锁(Shared Lock)/ S锁:加了S锁后,该事务只能对数据进行读取而不能修改,并且其它事务只能加S锁,不能加X锁,SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE(MySQL)
  • 意向锁(Intention Locks):
    • 一个事务在获得某个数据行对象的 S 锁之前,必须先获得整个表的 IS 锁或更强的锁;
    • 一个事务在获得某个数据行对象的 X 锁之前,必须先获得整个表的 IX 锁;
    • IS/IX 锁之间都是兼容的;
    • 好处:如果一个事务想要对整个表加X锁,就需要先检测是否有其它事务对该表或者该表中的某一行加了锁,这种检测非常耗时。有了意向锁之后,只需要检测整个表是否存在IX/IS/X/S锁就行了
锁的作用:用于管理对共享资源的并发访问,保证数据库的完整性和一致性
范式:
1.第一范式 (1NF)
属性不可分。
2. 第二范式 (2NF)
每个非主属性完全函数依赖于键码。
可以通过分解来满足。
分解前
无法复制加载中的内容
以上学生课程关系中,{Sno, Cname} 为键码,有如下函数依赖:
  • Sno -> Sname, Sdept
  • Sdept -> Mname
  • Sno, Cname-> Grade
Grade 完全函数依赖于键码,它没有任何冗余数据,每个学生的每门课都有特定的成绩。
Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门课时,这些数据就会出现多次,造成大量冗余数据。
分解后
关系-1
无法复制加载中的内容
有以下函数依赖:
  • Sno -> Sname, Sdept
  • Sdept -> Mname
关系-2
无法复制加载中的内容
有以下函数依赖:
  • Sno, Cname -> Grade
3. 第三范式 (3NF)
非主属性不传递函数依赖于键码。
上面的 关系-1 中存在以下传递函数依赖:
  • Sno -> Sdept -> Mname
可以进行以下分解:
关系-11
无法复制加载中的内容
关系-12
无法复制加载中的内容
MySQL数据类型之CHAR和VARCHAR的区别:
  • 一种是定长的,一种是变长的。
VARCHAR 这种变长类型能够节省空间,因为只需要存储必要的内容。但是在执行 UPDATE 时可能会使行变得比原来长,当超出一个页所能容纳的大小时,就要执行额外的操作。MyISAM 会将行拆成不同的片段存储,而 InnoDB 则需要分裂页来使行放进页内。
  • VARCHAR 会保留字符串末尾的空格,而 CHAR 会删除。
convert(varchar,getdate(),120)
参数1:值类型---- varchar
参数2:值内容 ---- getdate()
参数3:值格式 ---- 120
格式120 对应的样式是 yyyy-mm-dd hh:mm:ss
Drop/Delete/Truncate的区别?
  • Delete用来删除表的全部或者部分数据,执行delete之后,用户需要提交之后才会执行,会触发表上的DELETE触发器(包含一个OLD的虚拟表,可以只读访问被删除的数据),DELETE之后表结构还在,删除很慢,一行一行地删,因为会记录日志,可以利用日志还原数据;
  • Truncate删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器。操作比DELETE快很多(直接把表drop掉,再创建一个新表,删除的数据不能找回)。如果表中有自增(AUTO_INCREMENT)列,则重置为1;
  • Drop命令从数据库中删除,所有的数据行,索引和约束都会被删除;不能回滚,不会触发触发器;
SQL——GROUP BY:
sql查询中having必须跟group by一起使用;
聚合函数通过作用于一组数据而只返回一个单个值,因此,在SELECT语句中出现的元素要么为一个聚合函数的输入值,要么为GROUP BY语句的参数,否则会出错,例:
SQL语法规定,用了group by,则select之后的字段除了聚集函数外都必须出现在group by中,你可以少于group by中的字段,但不能包含group by中没有的字段;
mysql:null和空值:
关系型数据库和非关系型数据库的区别?
SQL查询:
然而,如果没有这样的第二最高工资,这个解决方案将被判断为 “错误答案”,因为本表可能只有一项记录。为了克服这个问题,我们可以将其作为临时表,表为空时,即可返回NULL;
细节注意:不要忘记降序(desc)、去重(distinct) 、重命名(as);


Linux:

一次显示一页内容:more
UNIX输入输出重定向符号:
输出重定向:
>
>>
输入重定向:
<
<<

操作系统

进程和线程有什么区别?
* 进程(Process)是系统进行资源分配和调度的基本单位,线程(Thread)是CPU调度和分派的基本单位;
* 线程依赖于进程而存在,一个进程至少有一个线程;
* 进程有自己的独立地址空间,线程共享所属进程的地址空间;(线程之间通信,比进程之间通信效率高
* 进程是拥有系统资源的一个独立单位,而线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),和其他线程共享本进程的相关资源如内存、I/O、cpu等;
* 在进程切换时,涉及到整个当前进程CPU环境的保存环境的设置以及新被调度运行的CPU环境的设置,而线程切换只需保存和设置少量的寄存器的内容,并不涉及存储器管理方面的操作,可见,进程切换的开销远大于线程切换的开销
* 线程之间的通信更方便,同一进程下的线程共享全局变量等数据,而进程之间的通信需要以进程间通信(IPC)的方式进行;
* 多线程程序只要有一个线程崩溃,整个程序就崩溃了,但多进程程序中一个进程崩溃并不会对其它进程造成影响,因为进程有自己的独立地址空间,因此多进程更加健壮;
进程通信:
进程同步与进程通信很容易混淆,它们的区别在于:
进程同步:控制多个进程按一定顺序执行;
进程通信:进程间传输信息。
进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需
要让进程进行通信,传输一些进程同步所需要的信息。
  1. 管道
它具有以下限制:
只支持半双工通信(单向传输);
只能在父子进程中使用。
  1. FIFO 也称为命名管道,去除了管道只能在父子进程中使用的限制。
FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户进程和服务器进程之间传递数据。
  1. 消息队列
相比于 FIFO,消息队列具有以下优点:
消息队列可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难;
避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法;
读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。
  1. 信号量
它是一个计数器,用于为多个进程提供对共享数据对象的访问。
  1. 共享存储
允许多个进程共享一个给定的存储区。因为数据不需要在进程之间复制,所以这是最快的一种 IPC。
需要使用信号量用来同步对共享存储的访问。
多个进程可以将同一个文件映射到它们的地址空间从而实现共享内存。另外 XSI 共享内存不是使用文件,而是使用使用内存的匿名段。
  1. 套接字
与其它通信机制不同的是,它可用于不同机器间的进程通信。
线程状态切换:
例:多选题哪些语句能确保线程由running状态切换成其他状态?
sleep(),yield()是Thread类方法,wait(),notify()是Object方法;
interrupt() 方法只是改变中断状态而已,它不会中断一个正在运行的线程
wait()必须在同步(Synchronized)方法/代码块中调用;
sleep()和wait()方法都可以让程序进入阻塞状态,从运行状态转变成阻塞状态;yield()方法可以让当前正在运行的线程暂停,但它不会阻塞该线程,他只是让该线程进入了就绪状态
线程同步有哪些方式?
1互斥量 Mutex:互斥量是内核对象,只有拥有互斥对象的线程才有访问互斥资源的权限。因为互斥对象只有一个,所以可以保证互斥资源不会被多个线程同时访问;当前拥有互斥对象的线程处理完任务后必须将互斥对象交出,以便其他线程访问该资源;
2信号量 Semaphore:信号量是内核对象,它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。信号量对象保存了最大资源计数和当前可用资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就减1,只要当前可用资源计数大于0,就可以发出信号量信号,如果为0,则将线程放入一个队列中等待。线程处理完共享资源后,应在离开的同时通过ReleaseSemaphore函数将当前可用资源数加1。如果信号量的取值只能为0或1,那么信号量就成为了互斥量;
3事件 Event:允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。事件分为手动重置事件和自动重置事件。手动重置事件被设置为激发状态后,会唤醒所有等待的线程,而且一直保持为激发状态,直到程序重新把它设置为未激发状态。自动重置事件被设置为激发状态后,会唤醒一个等待中的线程,然后自动恢复为未激发状态。
4临界区 Critical Section:任意时刻只允许一个线程对临界资源进行访问。拥有临界区对象的线程可以访问该临界资源,其它试图访问该资源的线程将被挂起,直到临界区对象被释放。
进程有哪几种状态?
  • 就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源
  • 运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数
  • 阻塞状态: 进程等待某种条件,在条件满足之前无法执行
什么是死锁?
两个或者多个并发进程中,每个进程持有某种资源而又等待其它进程释放它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁(deadlock)。
死锁产生的必要条件?
* 互斥:一个资源一次只能被一个进程使用;
* 占有并等待/请求和保持:一个进程至少占有一个资源,并在等待另一个被其它进程占用的资源;
* 非抢占/不可剥夺:已经分配给一个进程的资源不能被强制性抢占,只能由进程完成任务之后自愿释放;
* 循环等待:若干进程之间形成一种头尾相接的环形等待资源关系,该环路中的每个进程都在等待下一个进程所占有的资源。
解决死锁的基本方法如下:
  1. 预防死锁:
  • 资源一次性分配:(破坏请求和保持条件)
  • 可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)
  • 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
  • 例如假脱机打印机技术允许若干个进程同时输出,唯一真正请求物理打印机的进程是打印机守护进程。(把互斥地封装成可以同时访问的,例如:打印机的缓存)(破坏互斥条件)
  1. 避免死锁:
预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法
  1. 检测死锁:
首先为每个进程和每个资源指定一个唯一的号码;
然后建立资源分配表和进程等待表;
  1. 解除死锁:
当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
  • 剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
  • 撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。
解决死锁的常用策略如下:
鸵鸟策略、预防策略、避免策略、检测与解除死锁
安全状态与不安全状态:
安全状态指系统能按某种进程顺序来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺利完成。若系统不存在这样一个序列, 则称系统处于不安全状态。
产生死锁的原因:
(1)竞争系统资源 (2)进程的推进顺序不当
其他:

计算机组成:


冯.诺依曼理论体系下的计算机五大逻辑部件分别是: 控制器、运算器、存储器、输入/输出设备;

其他:

决定局域***征的主要有3个方面的技术分别是什么?
1、用于传输数据的传输介质。
2、用以连接各种设备的拓扑结构。
3、用以共享资源的介质访问方法(最重要)
拓扑排序:
正常步骤为(方法不一定唯一):
  • 从DGA图中找到一个没有前驱的顶点输出。(可以遍历,也可以用优先队列维护)
  • 删除以这个点为起点的边。(它的指向的边删除,为了找到下个没有前驱的顶点)
  • 重复上述,直到最后一个顶点被输出。如果还有顶点未被输出,则说明有环!

全部评论

(5) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

近期精华帖

热门推荐