目录
简历相关:
测试:
1.测试方法
2.软件测试流程?测试用例?
3.用过的测试工具
11.测登录界面,有自动登录功能
12.纸杯如何测试,笔如何测试
计网:
1.网络分层结构讲一下
2.浏览器请求,浏览器输入一个连接,到展示到页面,经过了什么
3.介绍 TCP,TCP是怎么保证可靠传输的
4.TCP三次握手,四次挥手,为什么不是三次挥手
5.TCP与 UDP区别(传输层)
6.HTTP请求,HTTPS请求
7.HTTP状态码
9.HTTP和HTTPS区别
10.GET和POST区别
11.ARP请求?ARP攻击?
12.测试网络协议有什么思路
13.IPv4和IPv6区别
14.给一个地址如何判断是不是IP地址?
15.浏览器发送的超文本都有哪些文件
数据库:
事务 事务隔离级别
索引原理(底层是B树)
关系型数据库和非关系型数据库有什么区别
操作系统:
进程线程区别
什么时候使用多线程,什么时候使用多进程
那如果有很多任务,创建线程越多越好吗?
进程状态了解吗?线程状态?
僵尸进程,孤儿进程
进程同步方式
平时用到哪些linux下的命令
windows下如何查看进程
FHS标准
开机启动操作系统做了哪些事情
编程语言:
Java和C++的区别
C++特性
重写和重载的区别
内存,栈和堆的区别
虚函数
指针和引用的区别
空指针,野指针(两个指针的区别)
new和malloc的区别
深拷贝和浅拷贝
排序算法
编程:
1.自我介绍
2.实习经历(深挖)
3.项目经历,项目难点
4. 说一个实习中遇到的最难的事情?说了个令人头大的事。再遇到这种事情怎么处理?
5. 怎么学一门新技术,关注什么网站论坛,testerhome 关注哪方面
6. 遇到一个技术难题怎么解决
7. 你的专业上些什么课
单元测试,集成测试,系统测试,验收测试,回归测试
回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。
黑盒测试,白盒测试方法
黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。
白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否以经过检查。
常用的黑盒测试方法:等价类划分法、边界值分析法、正交实验设计法、因果图法、决策表法。
常用的白盒测试方法:(强度由弱到强)语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖
测试分析,测试计划,测试设计,用例设计,用例执行
用例编号、用例名称、测试背景、前置条件、优先级、重要级、测试数据、测试步骤、预期结果、备注;(用例不包含实际结果
jmeter,UFT(自动化测试)Loadrunner,Testbed
抓包工具:Wireshark
Loadrunner运行顺序:
2进入Virtual User Generator主界面。
3进入录制选项页面, 开始录制脚本。
4工具将打开IE浏览器,填写注册信息,进行注册操作。
5停止录制,弹出脚本页面。
6配置“Parameters”参数化
7参数替换
8修改迭代次数
9运行回放按钮。
10.进入飞机订票系统网页,输入用户名,密码,验证新注册用户是否注册成功。
4.测试数据前期准备
5. bug 的优先级和重要程度,很不常见的 bug 但是危害很大怎么办,优先级怎么分
6.怎么看待测试和测开?有没有接触什么前沿的技术。
7.开发和测试沟通最容易出现什么问题,站在开发角度怎么做,测试角度怎么做
8.对业务和开发的比重有侧重吗
9.设计一个上传文件功能模块的测试用例
10.测试一个上传文本框
功能测试:
1.用户名正确/不正确 密码正确/不正确 组合 四种
2.用户名为空
3.密码为空
4.什么都不输入直接点击登录
5.用户名输入空格
6.密码输入空格
7.输入正确的用户名和密码 检查能否正常登录
8.登录按钮点击是否有效
9.登录后是否跳转到主页
10.双击登录按钮是否会发生错误
11.断网的情况下登录
12.弱网的情况下登录,如网络延迟过大,如果多少秒内服务器无响应,应该要有提示
界面:
1.用户名密码文本框是否对齐
2.用户名密码长度、高度是否合理
3.界面的文字是否正确,提示语是否简单易懂
4.颜色搭配、控件是否合理
兼容性:
1.IE6,7,8,9 Chrome Firefox Safari等浏览器界面显示是否正常 功能是否正常 注意移动设备的浏览器是否进行自适应
2.不同操作系统 Windows Mac 移动设备
安全:
1.用户名和密码是否加密后发送给服务器,一般用MD5加密 还有就是启用https
2.是否防止了sql注入 一般是对 ' “ 进行过滤就ok
3.同一账号是否允许不同机器同时登录
4.连续登错几次 会出现提示
性能:
1.访问登录界面,多长时间加载完整个界面
2.点击登录按钮后,几秒登录成功进入主界面
3.同时有100或者更多用户登录,系统响应时间
性能(杯子漏不漏水、有没有盖子密封性怎样)、质量(是否耐高温、材料有毒与否、容量)、用户体验(易用否、是否美观)。
13.qq发送文件的测试用例
14.测试微信聊天界面
OSI七层模型:从下往上:物理层,数据链路层,网络层,传输层,应用层,表示层,会话层
TCP/IP四层模型:网际接口层,网络层,传输层,应用层
(1). 浏览器查询 DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;
(2). 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;
(3). TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;
(4). 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
(5). 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;
(6). 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。
数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据;
对失序数据包重排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;
丢弃重复数据:对于重复数据,能够丢弃重复数据;
应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;
超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;
流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。
TCP 三次握手
第一次握手:客户端尝试连接服务器,向服务器发送 syn 包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入 SYN_SEND 状态等待服务器确认
第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个 SYN包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
TCP四次挥手
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。
为什么关闭连接却是四次握手?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
HTTP工作流程
1.建立TCP/IP连接,客户端与服务器通过Socket三次握手进行连接
客户端向服务端发起HTTP请求(例如:POST/login.html http/1.1)
2.客户端发送请求头信息,请求内容,最后会发送一空白行,标示客户端请求完毕
3.服务器做出应答,表示对于客户端请求的应答,例如:HTTP/1.1 200 OK
4.服务器向客户端发送应答头信息
5.服务器向客户端发送请求头信息后,也会发送一空白行,标示应答头信息发送完毕,接着就以Content-type要求的数据格式发送数据给客户端。
6.服务端关闭TCP连接,如果服务器或者客户端增Connection:keep-alive就表示客户端与服务器端继续保存连接,在下次请求时可以继续使用这次的连接。
HTTPS 默认工作在 TCP 协议443端口,它的工作流程一般如以下方式:
1.客户使用https的url访问服务器,要求服务器建立ssl连接。
2.服务器接收请求之后,把证书(包含公钥)传输给客户。
3.客户端和服务器端开始协商ssl链接的安全等级(加密等级)
4.协商完成后,客户端浏览器建立会话秘钥,并用网站的公钥加密会话秘钥,传输给服务器端。
5.服务器端通过自己的私钥解密出会话秘钥
6.服务器通过会话秘钥加密
100 Continue 继续。客户端应继续其请求 101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 200 OK 请求成功。一般用于GET与POST请求 201 Created 已创建。成功请求并创建了新的资源 202 Accepted 已接受。已经接受请求,但未处理完成 203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 206 Partial Content 部分内容。服务器成功处理了部分GET请求 300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI 303 See Other 查看其它地址。与301类似。使用GET和POST请求查看 304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 305 Use Proxy 使用代理。所请求的资源必须通过代理访问 306 Unused 已经被废弃的HTTP状态码 307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向 400 Bad Request 客户端请求的语法错误,服务器无法理解 401 Unauthorized 请求要求用户的身份认证 402 Payment Required 保留,将来使用 403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求 404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 405 Method Not Allowed 客户端请求中的方法被禁止 406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求 407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 408 Request Time-out 服务器等待客户端发送的请求时间过长,超时 409 Conflict 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息 412 Precondition Failed 客户端请求信息的先决条件错误 413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理 415 Unsupported Media Type 服务器无法处理请求附带的媒体格式 416 Requested range not satisfiable 客户端请求的范围无效 417 Expectation Failed 服务器无法满足Expect的请求头信息 500 Internal Server Error 服务器内部错误,无法完成请求 501 Not Implemented 服务器不支持请求的功能,无法完成请求 502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求 505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理
cookies,session
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗。考虑到安全应当使用session。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
所以个人建议:将登陆信息等重要信息存放为SESSION,其他信息如果需要保留,可以放在COOKIE中。
1) HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好。
2) 使用 HTTPS 协议需要到 CA(Certificate Authority,数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等。
3) HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包。
4) http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
5) HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源。
1、url可见性:get,参数url可见;post,url参数不可见
2、数据传输上:get,通过拼接url进行传递参数;post,通过body体传输参数
3、缓存性:get请求是可以缓存的post请求不可以缓存
4、后退页面的反应:get请求页面后退时,不产生影响;post请求页面后退时,会重新提交请求
5、传输数据的大小:get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大);post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。
6、安全性:原则上post肯定要比get安全,毕竟传输参数时url不可见。
主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;
主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;
当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:
第1步:根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。
第2步:如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。
ARP攻击是指攻击者利用ARP协议的缺陷,发送ARP响应报文,把网关对应的MAC地址变成欺骗的MAC地址,从而导致网络中断或数据劫持的目的。
可以在客户端设置静态的ARP映射表,这样就不会受到ARP的欺骗;也可以在交换机上设置访问控制,对于所有流经交换机但IP地址和MAC地址与网关不匹配的情况进行过滤,从而避免了ARP的攻击。
1、一致性测试:
检测协议实现本身与协议规范的符合程度。
2、互操作性测试:
基于某一协议检测不同协议实现间互操作互通信的能力
3、性能测试:
检测协议实现的性能指标,比如数据传输速度,连接时间,执行速度,吞吐量,并发度,
4、健壮性测试:
检测协议是现在各种恶劣环境下运行的能力,比如注入干扰报文,通信故障,信道被切断https://blog.csdn.net/pingsha_luoyan/article/details/93305200
- 地址空间不同,IPv4中规定IP地址长度为32,而IPv6中IP地址的长度为128。
- 路由表大小不同,IPv6的路由表相比IPv4的更小。
- IPv6的组播支持以及对流的支持要强于IPv4
- 安全性不同,IPv6的安全性更高,在使用IPv6的网络时,用户可对网络层的数据进行加密。
- 协议扩充不同,IPv6允许协议进行扩充而IPv4不允许。
先判断它是不是由4段数字用点号“.”分隔开
再判断每段数字的十进e69da5e6ba90e799bee5baa631333431353363制是不是在0-255之间,满足条件就是正确的IP地址。
HTTP的几种方法
GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器
POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。(put自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不用)
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
事务(Transaction)是并发控制单位,是用户定义的一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位。ACID:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)
原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
1.)n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。
2.)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.)所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
4.)B+ 树中,数据对象的插入和删除仅在叶节点上进行。
5.)B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。
B树插入删除
答曰:B树左子树比根节点关键码小,右子树关键码比根节点大,插入的时候把她放到结尾,递归保证每个子树保持这个结构
删除的话删除最上边的元素,把最后的元素放到根节点,也是递归保持这个结构
B树和B+树有什么区别
在B树中,你可以将键和值存放在内部节点和叶子节点;但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值。
B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。
索引建立越多越好吗
不是
①创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大
② 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)
③ 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长
SELECT *
FROM 成绩表 AS a
WHERE 成绩 < (
SELECT AVG(成绩)
FROM 成绩表 AS b
WHERE a.课程号 = b.课程号)
关系型数据库:指采用了关系模型来组织数据的数据库。
关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。非关系型数据库:指非关系型的,分布式的,且一般不保证遵循
ACID
原则的数据存储系统。非关系型数据库结构
非关系型数据库以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,不局限于固定的结构,可以减少一些时间和空间的开销。
https://www.jianshu.com/p/fd7b422d5f93
(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。
(3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
(4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
(6)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志
进程创建和撤销的开销比较大,每次创建和取消都要分配一个进程控制块,比如频繁建立连接,cpu频繁切换使用多线程。
但是多进程可以使用在多机分布式系统,需要扩展到其他机器上,使用多进程
不是,创建线程越多,对共享资源同步要求多,设计同步容易出错。另外多线程并发容易导致资源分配问题
那有没有优化的方式呢?很多线程任务,怎么解决呢
多线程:解决多任务同时执行的需求,合理使用CPU资源。多线程的运行是根据CPU切换完成,如何切换由CPU决定,因此多线程运行具有不确定性。
线程池:基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。
线程池的优点
1)避免线程的创建和销毁带来的性能开销。
2)避免大量的线程间因互相抢占系统资源导致的阻塞现象。
3}能够对线程进行简单的管理并提供定时执行、间隔执行等功能。
进程主要是就绪,运行,阻塞状态
就绪:当一个进程获得了除了CPU以外的所有资源,处于就绪状态
运行:获得CPU以后,任务调度,转换到执行状态,如果时间片用完,又会回到就绪状态
阻塞:处于执行过程中的进程,由于I/O请求,变到阻塞状态
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
1、线程间的通信方式
(1)使用全局变量
主要由于多个线程可能更改全局变量,因此全局变量最好声明为volatile
(2)使用消息实现通信
在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息队列和消息循环,工作线程需要手动实现消息循环),因此可以采用消息进行线程间通信sendMessage,postMessage。
(3)使用事件CEvent类实现线程间通信
Event对象有两种状态:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。
线程间的同步方式有四种
临界区
临界区对应着一个CcriticalSection对象,当线程需要访问保护数据时,调用EnterCriticalSection函数;当对保护数据的操作完成之后,调用LeaveCriticalSection函数释放对临界区对象的拥有权,以使另一个线程可以夺取临界区对象并访问受保护的数据。
PS:关键段对象会记录拥有该对象的线程句柄即其具有“线程所有权”概念,即进入代码段的线程在leave之前,可以重复进入关键代码区域。所以关键段可以用于线程间的互斥,但不可以用于同步(同步需要在一个线程进入,在另一个线程leave)
互斥量
互斥与临界区很相似,但是使用时相对复杂一些(互斥量为内核对象),不仅可以在同一应用程序的线程间实现同步,还可以在不同的进程间实现同步,从而实现资源的安全共享。
PS:1、互斥量由于也有线程所有权的概念,故也只能进行线程间的资源互斥访问,不能由于线程同步;
2、由于互斥量是内核对象,因此其可以进行进程间通信,同时还具有一个很好的特性,就是在进程间通信时完美的解决了"遗弃"问题
信号量
信号量的用法和互斥的用法很相似,不同的是它可以同一时刻允许多个线程访问同一个资源,PV操作
PS:事件可以完美解决线程间的同步问题,同时信号量也属于内核对象,可用于进程间的通信
事件
事件分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。由SetEvent()来触发,由ResetEvent()来设成未触发。
PS:事件是内核对象,可以解决线程间同步问题,因此也能解决互斥问题
3、进程间通信方式
进程间通信又称IPC(Inter-Process Communication),指多个进程之间相互通信,交换信息的方法。根据进程通信时信息量大小的不同,可以将进程通信划分为两大类型:
1、低级通信,控制信息的通信(主要用于进程之间的同步,互斥,终止和挂起等等控制信息的传递)
2、高级通信,大批数据信息的通信(主要用于进程间数据块数据的交换和共享,常见的高级通信有管道,消息队列,共享内存等).
管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。不是用于交换大批数据,而用于多线程之间的同步.常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号 ( signal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
[共享内存( shared memory )] :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
linux查询所在位置路径:pwd
linux切换目录:cd
linux创建目录文件:mkdir
参数:-p 递归创建
[root@www /]# mkdir 123
[root@www /]# mkdir -p /123/123
linux查看命令:ls
linux复制命令:cp
linux删除命令:rm
参数:- r 递归 - f 强制 两个一起用你可以删掉世界(很暴力很血腥,危险的命令)
[root@www /]# rm -rf /123 /456
linux创建查看文件内容:cat
显示所有进程 ps a
赋予所有权限 Chmod 777 *
创建空文件 touch +文件名
查看内存的命令(top/free)
查看一个文件里面的第x行到x行的内容(cat filename head-n 1000 tail -n 50啥的)
压缩(tar zxvf)
打包(tar zcvf)
文件统计有多少行数据 wc -l filename
查看自己的mac地址(ipconfig)
chmod [who] [+ | - | =] [mode] 文件名¼
命令中各选项的含义为:
操作对象who可是下述字母中的任一个或者它们的组合:
u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
操作符号可以是:
+ 添加某个权限。
- 取消某个权限。
= 赋予给定权限并取消其他所有权限(如果有的话)。
设置mode所表示的权限可用下述字母的任意组合:
r 可读。
w 可写。
x 可执行。
X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
t 保存程序的文本到交换设备上。
u 与文件属主拥有一样的权限。
g 与和文件属主同组的用户拥有一样的权限。
o 与其他用户拥有一样的权限。
查看所有进程:netstat -ano
查看指定端口的程序:netstat -ano | findstr "8080"杀死相关的进程:tasklist
tasklist | more
tasklist | findstr 相关字段
taskkill /f /t /im 进程名称
/f 杀死所有进程及子进程
/t 强制杀死
/im 用镜像名称作为进程信息
/pid 用进程id作为进程信息
FHS定义了两层规范,第一层是, / 下面的各个目录应该要放什么文件数据,例如/etc应该要放置设置文件,/bin与/sbin则应该要放置可执行文件等等。
第二层则是针对/usr及/var这两个目录的子目录来定义。例如/var/log放置系统登录文件、/usr/share放置共享数据等等。
给你个C:\log.txt,查找文件中‘ABCD’出现的次数.
cat log.txt | grep -o 'ABCD'|wc -l
一、第一个阶段:BIOS
1.1、硬件自检 1.2、启动程序
二、第二阶段:主引导程序
2.1、主引导记录的结构2.2、分区表
三、第三阶段:硬盘启动
四、第四阶段:操作系统
https://blog.csdn.net/martinmateng/article/details/51262545
1. Java是解释型语言。源码会先经过一次编译,成为中间码,中间码再被解释器解释成机器码。对于Java而言,中间码就是字节码(.class),而解释器在JVM中内置了。C++是编译型语言。源码一次编译,直接在编译的过程中链接了,形成了机器码。
2.java运行在虚拟机上,号称与平台无关。也就是你开发的java程序无论是unix,linux还是windows都可以正常运行。但是实际上这是一个良好的愿望,实际跨平台时还会有各种各样的问题。c和c++都是直接编译成可执行文件,是否能跨平台主要看你用到的编译器特性是否有多平台支持。
3.因为c和c++是直接编译成可执行文件,所以运行效率要比java高。
4. java因为是运行在虚拟机上,不需要考虑内存管理和垃圾回收机制。也是就你可以声明一个对象而不用考虑释放他,虚拟机帮你做这事情。而c和c++语言本身没有多少内存管理的概念,写c和c++程序如果用到指针就一定要考虑内存申请和释放。内存泄漏是c和c++最头疼的问题。
5. 代码重用:java中有一个根类object,所有的类都是其子类,通过这种方式将容器和算法分离,实现一种操作作用于多种对象,提高代码重用。c++中没有总根对象,但是c++提供了另一个更强大的功能“模板”,同样高效地实现了一种操作作用于多种对象,提供了高效的代码重用方法。
6. C++支持多继承,Java中类都是单继承的。但是继承都有传递性,同时Java中的接口是多继承,类对接口的实现也是多实现。
C++的特性是封装继承多态。封装和继承使代码重用,多态则是接口重用
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法。必须具有不同的参数列表
重写是子类需要修改父类的一些方法进行扩展,增大功能。重写的参数列表,返回的类型必须完全与被重写的方法相同。
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。
生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈效率更高
指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法,派生类仅仅只是继承函数的接口。在基类中实现纯虚函数的方法是在函数原型后加“=0”,virtual void funtion1()=0
定义纯虚函数就是为了让基类不可实例化,因为实例化这样的抽象数据结构本身并没有意义。含有纯虚拟函数的类称为抽象类,它不能生成对象。
定义一个函数为虚函数,不代表函数为不被实现的函数。定义虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数,才代表函数没有被实现。定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的子类必须实现这个函数。
1.引用不可以为空,但指针可以为空。引用是对象的别名,引用为空,对象都不存在,怎么可能有别名,故定义一个引用的时候,必须初始化。但是指针可以为空。
2.引用不可以改变指向,但是指针可以改变指向,而指向其它对象。虽然引用不可以改变指向,但是可以改变初始化对象的内容。例如就++操作而言,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容。
3.从内存上分配看,程序为指针变量分配内存区域,而不用为引用分配内存区域
野指针就是不知道指向哪里,或者说不知道指向的内存是否可以使用,一般都是刚刚声明但没有初始化的指针
空指针不是指向常数0,只指向地址0,即NULL
指针的本质就是地址嘛,空指针就是指针本身的值(地址)为0
空指针的作用是防止野指针的出现,因为我们不能知道野指针到底指向哪里,所以我们也无法判断一个指针是否是野指针
- 属性 new和delete是C++关键字,需要编译器支持;malloc和free是库函数,需要头文件支持。
- 参数 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。
- 返回类型 new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
- 自定义类型 new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。
- 重载 C++允许重载new/delete操作符,malloc不允许重载。
- 内存区域
new做两件事:分配内存和调用类的构造函数,delete是:调用类的析构函数和释放内存。而malloc和free只是分配和释放内存。
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,如上所述,布局new就可以不位于堆中。
- 分配失败 new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。
- 内存泄漏 内存泄漏对于new和malloc都能检测出来,而new可以指明是哪个文件的哪一行,malloc确不可以。
https://blog.csdn.net/nyist_zxp/article/details/80810742
简单的来说,【浅拷贝】是增加了一个指针,指向原来已经存在的内存。而【深拷贝】是增加了一个指针,并新开辟了一块空间,让指针指向这块新开辟的空间。
【浅拷贝】在多个对象指向一块空间的时候,释放一个空间会导致其他对象所使用的空间也被释放了,再次释放便会出现错误
Test(const Test& a) { this->p = new int(*a.p);//深拷贝 cout << "对象被创建" << endl; }
1. 插入排序:直接插入排序,折半插入排序,希尔排序
2. 交换排序:冒泡排序,快速排序
3. 选择排序:直接选择排序,堆排序
4. 归并排序
快排思路:
选择轴值(pivot)
将序列划分为两个子序列L和R,使得L中所有记录都小于或等于轴值,R中记录都大于轴值
对子序列L和R递归进行快速排序