-
怎么应对反爬虫机制(2次) 答:selenium,beautifulsoup 分析:发现仅有的两张验证码图片是未拼完整的背景图和拼图块,通常的网站大多数是未拼完整的背景图和完整背景图,这样的话就要另辟蹊径了。 思路:由于这个网站的滑动验证码没有原图,于是使用了cv2这个库的一些方法进行滑块和缺口位置的匹配,找到最相似的坐标然后进行移动,因为有些滑块图和验证码图片相似度较高,所以可能会出现失败的情况(事实上在实验过程中证实确实如此),于是写了一个循环,失败了就重新获取图片并且再次尝试滑动,直到成功为止。这个滑动验证码没有滑动轨迹的要求(如不可以匀速滑动等),所以不需要做拖动滑块时的加速度设置。(灰度处理,图像匹配算法) -
爬虫使用到哪些库 答:beautifulsoup -
给你个网站,你要怎么测试 -
测试登陆界面(2次) 答:1.测试的流程:需求分析,测试点的提取,设计测试用例,测试 2.按测试类别进行分类 功能测试:我认为可以按接口测试的方法进行,如果存在调用其他接口也存在接口测试的必要。 1.什么都不输入,点击提交按钮,看提示信息。
2.输入正确的用户名和密码,点击提交按钮,验证是否能正确登录。
3.输入错误的用户名或者密码, 验证登录会失败,并且提示相应的错误信息。
4.登录成功后能否能否跳转到正确的页面
5.用户名和密码,如果太短或者太长,应该怎么处理
6.用户名和密码,中有特殊字符(比如空格),和其他非英文的情况
7.记住用户名的功能
8.登陆失败后,不能记录密码的功能
9.用户名和密码前后有空格的处理
10.密码是否加密显示(星号圆点等)
11.牵扯到验证码的,还要考虑文字是否扭曲过度导致辨认难度大,考虑颜色(色盲使用者),刷新或换一个按钮是否好用
12.登录页面中的注册、忘记密码,登出用另一帐号登陆等链接是否正确
13.输入密码的时候,大写键盘开启的时候要有提示信息。
界面测试:
1.布局是否合理,2个testbox 和一个按钮是否对齐
2.testbox和按钮的长度,高度是否复合要求
3. 界面的设计风格是否与UI的设计风格统一
4. 界面中的文字简洁易懂,没有错别字。
性能测试:
1.打开登录页面,需要几秒
2.输入正确的用户名和密码后,登录成功跳转到新页面,不超过5秒
安全测试:
1.登录成功后生成的Cookie,是否是httponly (否则容易被脚本盗取)
2.用户名和密码是否通过加密的方式,发送给Web服务器
3.用户名和密码的验证,应该是用服务器端验证, 而不能单单是在客户端用javascript验证
4.用户名和密码的输入框,应该屏蔽SQL 注入攻击
5.用户名和密码的的输入框,应该禁止输入脚本 (防止XSS攻击)
6.错误登陆的次数限制(防止暴力破解)
7. 考虑是否支持多用户在同一机器上登录;
8. 考虑一用户在多台机器上登录
可用性测试:
1. 是否可以全用键盘操作,是否有快捷键
2. 输入用户名,密码后按回车,是否可以登陆
3. 输入框能否可以以Tab键切换
兼容性测试:
1.主流的浏览器下能否显示正常已经功能正常(IE,6,7,8,9, Firefox, Chrome, Safari,等)
2.不同的平台是否能正常工作,比如Windows, Mac
3.移动设备上是否正常工作,比如Iphone, Andriod
4.不同的分辨率
7.项目是否是用到https,证书如何签发。 证书可以自己制作。 国内许多公司的做法:自己做根证书CA(自己充当类似于VeriSign的角色),然后让用户下载安装根CA(当然了,其中只含有公钥)到机器中,12306就是这样干的(SRCA就是12306的根证书),然后再自己给自己颁发服务器证书,这样用户机器上也有他的CA,服务器发来的服务器证书也是这本CA颁发的,当然也顺利通过了
-
测试一个百度搜索框 -
两部电梯验证它的算法(测试电梯的响应规律?)(2次) (1):那么首先, 你要反问面试官,需求是什么样的,比如测什么样的电梯,是普通电梯,观光电梯,还是其他 (2):如果回答没有,那么你的思路应该就是:没有需求文档,但我了解电梯的基本业务功能,以此依据,从下面几个方面进行分析: 功能测试:(单个功能,逻辑业务/功能交互),界面测试,易用性测试,兼容性测试,安全性测试,性能(压力)测试 (3):把以上几个方面的测试点分类列举一下,能想到多少说多少,在描述的过程中尽力量把所有的方面覆盖全,语句描述尽量附带测试分类,比如“从界面测试可以考虑电梯是否…”,了解到你的测试思维的完整性。 电梯: 功能测试——-单个功能: 1,电梯内分楼层键是否正常 2,电梯内开关门键是否正常 3,电梯内的报警键是否正常 4,电梯外的上下键是否正常 5,同时关注显示屏,电梯内外的显示屏显示的电梯层数,运行方向是否正常 6,有障碍物时,电梯门的感应系统是否有效 功能测试——逻辑业务/功能交互 1.功能与功能模块间的集成,可根据电梯当前状态是上行,下行还是停止来设计测试点,以保障覆盖率 ?电梯当前状态是上行时,有人在X楼按下上升/下降键,电梯是否会停止 ?电梯当前状态是下行时,有人在X楼按下 上升/下降键,电梯是否会停止 ?在搭载满员的情况下,如果有人在X楼按下上升/下降键,电梯是否会停止 2.功能设备与设备间的集成,关注功能接口,比如: ? 电梯和大楼层,电梯和摄像头,电梯与空调,电梯和对讲机(报警装置),电梯与显示屏,电梯与其他电梯的协作能力 ?例如:一栋楼有2部电梯,一部停在2楼,一部停在4楼,有人1楼按电梯,是否2楼的电梯下降到一楼开 界面测试 1,查看电梯的外观,按钮的图标显示,电梯内部张贴的的说明(比如报警装置的说明,称重量等) 易用性测试 1.楼层按键高度(小孩和一些身高矮的用户会按键不方便) 2.电梯是否有地毯,夏天是否有空调,通风条件,照明条件,手机信号是否通畅 3.电梯是否有扶手,是否有专针对残疾人的扶手等等 兼容性测试 1,电梯的整体和其他设备的兼容性,与大楼的兼容,与海地隧道的兼容等等 2,不同类型的电压是否兼容 安全性测试 1,下坠时是否有制动装置 2,暴力破坏电梯时是否报警,超重是否报警 3,停电情况下电梯是否有应急电源装置 性能测试 : 1,测试电梯负载单人时运行情况(基准测试) 2,多人时的运行情况(负载测试) 3,一定人数下较长时间的运作(稳定性测试) 4,更长时间运作时的运行情况(疲劳测试) 5,不断增加人数导致电梯报警(拐点压力测试) -
如果一款路由器产品马上要上市,但是发现有1%的死机率的bug,你会怎么做; -
讲下sql注入 答:1、检查变量数据类型和格式 如果你的SQL语句是类似where id={$id}这种形式,数据库里所有的id都是数字,那么就应该在SQL被执行前,检查确保变量id是int类型;如果是接受邮箱,那就应该检查并严格确保变量一定是邮箱的格式,其他的类型比如日期、时间等也是一个道理。总结起来:只要是有固定格式的变量,在SQL语句执行前,应该严格按照固定格式去检查,确保变量是我们预想的格式,这样很大程度上可以避免SQL注入攻击。 比如,我们前面接受username参数例子中,我们的产品设计应该是在用户注册的一开始,就有一个用户名的规则,比如5-20个字符,只能由大小写字母、数字以及一些安全的符号组成,不包含特殊字符。此时我们应该有一个check_username的函数来进行统一的检查。不过,仍然有很多例外情况并不能应用到这一准则,比如文章发布系统,评论系统等必须要允许用户提交任意字符串的场景,这就需要采用过滤等其他方案了。 2、过滤特殊符号 对于无法确定固定格式的变量,一定要进行特殊符号过滤或转义处理。 3、绑定变量,使用预编译语句 MySQL的mysqli驱动提供了预编译语句的支持,不同的程序语言,都分别有使用预编译语句的方法 实际上,绑定变量使用预编译语句是预防SQL注入的最佳方式,使用预编译的SQL语句语义不会发生改变,在SQL语句中,变量用问号?表示,黑客即使本事再大,也无法改变SQL语句的结构 -
学校内网到外网的网络架构 -
学校每日熄灯断网,其实只是关闭认证,你能绕过去吗?怎么做? -
ipv4 ipv6传输 答:IP协议详解及IPv4与IPv6协议的区别 -
宿舍wifi故障排查 -
家庭断网怎么检查判断 -
对系统测试怎么看(11次) 答:职位描述 从路由器到摄像头,从单一设备到解决方案; 从嵌入式到APP,从传统算法到机器学习; 从用户需求调研到设计方案评审,从测试方法构建到自动化工具开发; 系统测试工程师,满足你对产品、技术、用户的一切想象。 1.按照产品架构和业务要求,制定测试策略,设计测试方法,组织并进行产品的系统测试。 2.制定企业和产品标准,对产品做出客观、公正的评价,并推动产品技术可靠性和用户体验的提升。 3.参与产品需求和架构设计评审,保证产品的需求质量和可测试性。 4.设计自动化测试解决方案,开发自动化测试平台、脚本。 5.针对用户场景模拟、并发压力测试、算法性能评估等复杂测试需求,设计和开发灵活多样的测试设备,解决产品评价的难点和死角 -
为什么选择做测试(6次) -
自己的优点缺点 -
交换机和路由器的区别 答:https://jingyan.baidu.com/article/0eb457e5dbf88003f1a905a1.html -
说一些常用的网络设备:路由器、交换机、集线器,作用和原理 答:集线器、交换机都是做端口扩展的,就是扩大局域网(通常都是以太网)的接入点,也就是能让局域网可以连进来更多的电脑。 路由器是用来做网间连接,也就是用来连接不同的网络。 -
tcp三次握手(5次) 答:通信双方建立TCP链接的过程。(1)第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers);第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。 -
四次挥手 答:第一次挥手:Client将FIN置为1,发送一个序列号seq给Server;进入FIN_WAIT_1状态; 第二次挥手:Server收到FIN之后,发送一个ACK=1,acknowledge number=收到的序列号+1;进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。 第三次挥手:Server将FIN置1,发送一个序列号给Client;进入LAST_ACK状态; 第四次挥手:Client收到服务器的FIN后,进入TIME_WAIT状态;接着将ACK置1,发送一个acknowledge number=序列号+1给服务器;服务器收到后,确认acknowledge number后,变为CLOSED状态,不再向客户端发送数据。客户端等待2MSL(报文段最长寿命)时间后,也进入CLOSED状态。完成四次挥手。 为什么不能把服务器发送的ACK和FIN合并起来,变成三次挥手(CLOSE_WAIT状态意义是什么)? 展开 因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复ACK,表示接收到了断开连接的请求。等到数据发完之后再发FIN,断开服务器到客户端的数据传送。 如果第二次挥手时服务器的ACK没有送达客户端,会怎样? 展开 客户端没有收到ACK确认,会重新发送FIN请求。 客户端TIME_WAIT状态的意义是什么? 展开 第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果Server没有收到ACK,就会重发FIN,如果Client在2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止Server没有收到ACK而不断重发FIN。 MSL(Maximum Segment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。 -
TCP的拥塞控制算法(2次) 答:拥塞控制主要由四个算法组成:慢启动(Slow Start)、拥塞避免(Congestion voidance)、快重传 (Fast Retransmit)、快恢复(Fast Recovery) 慢启动:刚开始发送数据时,先把拥塞窗口(congestion window)设置为一个最大报文段MSS的数值,每收到一个新的确认报文之后,就把拥塞窗口加1个MSS。这样每经过一个传输轮次(或者说是每经过一个往返时间RTT),拥塞窗口的大小就会加倍 slow start 拥塞避免:当拥塞窗口的大小达到慢开始门限(slow start threshold)时,开始执行拥塞避免算法,拥塞窗口大小不再指数增加,而是线性增加,即每经过一个传输轮次只增加1MSS. 无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。(这是不使用快重传的情况) 快重传:快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。 快恢复:当发送方连续收到三个重复确认时,就把慢开始门限减半,然后执行拥塞避免算法。不执行慢开始算法的原因:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方认为现在网络可能没有出现拥塞。 也有的快重传是把开始时的拥塞窗口cwnd值再增大一点,即等于 ssthresh + 3*MSS 。这样做的理由是:既然发送方收到三个重复的确认,就表明有三个分组已经离开了网络。这三个分组不再消耗网络的资源而是停留在接收方的缓存中。可见现在网络中减少了三个分组。因此可以适当把拥塞窗口扩大些。 发送窗口的上限为接受窗口和拥塞窗口中的较小值。接受窗口表明了接收方的接收能力,拥塞窗口表明了网络的传送能力。 -
tcp的流量控制(2次) 答:使用滑动窗口协议实现流量控制。防止发送方发送速率太快,接收方缓存区不够导致溢出。接收方会维护一个接收窗口 receiver window(窗口大小单位是字节),接受窗口的大小是根据自己的资源情况动态调整的,在返回ACK时将接受窗口大小放在TCP报文中的窗口字段告知发送方。发送窗口的大小不能超过接受窗口的大小,只有当发送方发送并收到确认之后,才能将发送窗口右移。 -
tcp头部长度 答:IP、TCP、UDP头部长度汇总 -
可靠连接与不可靠连接 答:TCP是可靠的,UDP不可靠; TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多; TCP是面向字节流的,UDP是面向报文的; 无连接的网络服务(数据报服务)-- 面向连接的网络服务(虚电路服务) 虚电路服务:首先建立连接,所有的数据包经过相同的路径,服务质量有较好的保证; 数据报服务:每个数据包含目的地址,数据路由相互独立(路径可能变化);网络尽最大努力交付数据,但不保证不丢失、不保证先后顺序、不保证在时限内交付;网络发生拥塞时,可能会将一些分组丢弃; TCP如何保证传输的可靠性 数据包校验 对失序数据包重新排序(TCP报文具有序列号) 丢弃重复数据 应答机制:接收方收到数据之后,会发送一个确认(通常延迟几分之一秒); 超时重发:发送方发出数据之后,启动一个定时器,超时未收到接收方的确认,则重新发送这个数据; 流量控制:确保接收端能够接收发送方的数据而不会缓冲区溢出 -
TCP和UDP的区别(8次) 答:区别一是否基于连接。TCP是面向连接的协议,而UDP是无连接的协议。即TCP面向连接; UDP是无连接的,所以发送数据之前不需要建立连接。区别二可靠性和有序性区别。TCP 提供交付保证(Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输),无差错,不丢失,不重复,且按序到达,也保证了消息的有序性。该消息将以从服务器端发出的同样的顺序发送到客户端,尽管这些消息到网络的另一端时可能是无序的。TCP协议将会为你排好序。UDP不提供任何有序性或序列性的保证。UDP尽最大努力交付,数据包将以任何可能的顺序到达。TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。区别三实时性。UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。区别四、资源占用TCP对系统资源要求较多,UDP对系统资源要求较少。TCP被认为是重量级的协议,而与之相比,UDP协议则是一个轻量级的协议。因为UDP传输的信息中不承担任何间接创造连接,保证交货或秩序的的信息。综上,UDP优点是简单、传输快,缺点是不可靠、不稳定;TCP优点是可靠、稳定,缺点是效率低、占用资源高。 -
UDP为什么效率高? UDP有哪些应用 -
两台计算机之间建立TCP连接,可能是哪一层出现问题 -
int 和 char的占用 答:在C语言中,int ,char 等几种数据类型所占用的空间 -
volatile和static关键字 答: volatile关键字用于对 jvm 说"警告,此变量可能在其他线程中修改"。如果没有此关键字,JVM 可以自由地进行一些优化,例如从不刷新某些线程中的本地副本(也就无法保证从主内存加载到线程工作内存的值是最新的)。volatile会强制线程更新每个副本变量在堆中变量的值。 volatile声明了变量值的一致性;而static声明变量的唯一性。static不能保证工作区与主存区变量值的一致性;除非变量的值是不可变的,即再加上final的修饰符,否则static声明的变量,不是线程安全的。 -
HTML与CSS区别 答:CSS和HTML的区别 -
视频通话用的是其中的哪个协议 :UDP -
排序算法有哪些,排序,O(n) 答: -
编码方式(UTF-8这些) -
香农定理的内容(2次) 提出的意义 答:https://waynegao.blog.csdn.net/article/details/112272677 -
100M的带宽传 2GB的文件需要多久 -
psutil模块用的什么协议 -
Python的数据类型、Python的数据结构? -
python实现word中常用的文本查找替换功能,怎么做:replace; -
python中如何获得字符串的最后一位:-1 -
json和xml的区别 答:JSON与XML的区别比较 -
json和 python里面dict区别 答:json的key只能是字符串,python的dict可以是任何可hash对象(hashtable type); json的key可以是有序、重复的;dict的key不可以重复。 json的value只能是字符串、浮点数、布尔值或者null,或者它们构成的数组或者对象。 json任意key存在默认值undefined,dict默认没有默认值; json访问方式可以是[],也可以是.,遍历方式分in、of;dict的value仅可以下标访问。 json的字符串强制双引号,dict字符串可以单引号、双引号; dict可以嵌套tuple,json里只有数组。 json:true、false、null python:True、False、None,没有null。 -
python装饰器 (4次) 答:python装饰器详解 -
lambda 答:关于Python中的lambda,这篇阅读量10万+的文章可能是你见过的最完整的讲解 -
python的基本知识,深拷贝浅拷贝直接赋值,异常处理等(python默认浅拷贝) -
python,往字典添加元素有什么方法 答:Python之字典添加元素 -
python中的库函数和模块有哪些?请举几例。 答:time、os、copy、sys、pickle、glob、math、random等。 -
import的包不在当前的工作目录该如何处理 -
python中是如何管理内存的? 答:(1)引用计数。Python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。比如,x=4,y=x,fun(x),a=[1,x,3]等对象创建计数会+1;而delx, x=789(别名赋值),list.remove(x), del object时计数-1。(2)循环引用。当计数遭遇两个对象相互对指时会出现计数永远不等于0,即永远得不到回收的情况。(3)垃圾回收机制。当内存中有不再被使用的部分时,垃圾收集器可以将他们清理掉。它们会检查那些计数为0的对象,然后清除其所在的内存空间,或者清理掉循环引用的两个对象。(4)内存池机制。由于python申请内存通常都是小块内存,且在运行时大量的进行内存申请分配和释放操作,影响运行效率。因此python的内存池机制可以将不需要的内存空间放到内存池中而不是返回给操作系统。python中所有小于256字节的对象(小内存)都是用pymalloc(pool)来实现分配器,而大的对象才使用系统的malloc,并且整数、浮点数和列表都有私有的内存池,不会被其他对象共享。 -
内存溢出和内存泄漏的区别 (python中) 答:(1)内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。对于python这种支持垃圾回收的语言来说,也会有内存泄露,大致有三种原因:1.所用到的用 C 语言开发的底层模块中出现了内存泄露。2.代码中用到了全局的list、 dict或其它容器,不停的往这些容器中插入对象,而忘记了在使用完之后进行删除回收。3.代码中有“引用循环”,并且被循环引用的对象定义了__del__方法,就会发生内存泄露。诊断内存是否泄露用到可用gc模块和objgraph模块。gc模块是Python的垃圾收集器模块,而objgraph 是一个用于诊断内存问题的工具。当在程序中选出诊断点后,插入以下语句: import gc import objgraph #强制进行垃圾回收 gc.collect() #打印出对象数目最多的 50 个类型信息 objgraph.show_most_common_types(limit=50) (2)内存溢出是指存储的数据超出了指定空间的大小,这时数据就会越界,一般是指栈空间里,分配了超过数组长度的数据的溢出。Python中内存溢出的原因可能是1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据2.集合类中有对对象的引用,使用完后未清空,产生了堆积,使得JVM不能回收3.代码中存在死循环或循环产生过多重复的对象实体4.启动参数内存值设定的过小。通常解决方案是1.修改JVM启动参数,直接增加内存(-Xms,-Xmx参数一定不要忘记加) 2.检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。3.对代码进行走查和分析,找出可能发生内存溢出的位置。 总而言之,内存溢出是指向JVM申请内存空间时没有足够的可用内存了,就会抛出OOM即内存溢出。内存泄漏是指,向JVM申请了一块内存空间,使用完后没有释放,由于没有释放,这块内存区域其他类加载的时候无法申请,同时当前类又没有这块内存空间的内存地址了也无法使用,相当于丢了一块内存,这就是内存泄漏。显然,内存泄漏最终会导致内存溢出。 -
白噪音是什么 -
ARP协议(3次) 答:我们经常遇到这样的问题L已经知道一个机器(主机或路由器)的IP地址,需要找到其相应的硬件地址。地址解析协议ARP就是用来解决这样的问题的。地址解析协议ARP解决这个这个问题的方法是在主机ARP告诉缓存中存放一个从IP地址到硬件地址的映射表,并且这个映射表还经常动态更新(新增或超时删除)。 -
子网掩码 -
黑盒测试and白盒测试 (2次) 答:白盒测试也称为结构测试,主要用于检测软件编码过程中的错误,做一些细节性的检查工作。程序员的编程经验、对编程软件的掌握程度、工作状态等因素都会影响到编程质量,导致代码错误,比如逻辑错误、测试用例不全等。 黑盒测试又称为功能测试,主要检测软件的每一个功能是否能够正常使用。在测试过程中,将程序看成不能打开的黑盒子,不考虑程序内部结构和特性的基础上通过程序接口进行测试,检查程序功能是否按照设计需求以及说明书的规定能够正常打开使用即可。 灰盒测试介于二者之间,不仅要看功能是否正常,也需要对部分关键代码进行检查。常见的白盒测试方法有:程序流程路径检查、逻辑条件覆盖等;常见的黑盒测试方法有:等价类划分、边界值法、因果图法等。 -
你的缺点是什么 -
如果让你测试手机链接wifi的性能 怎么测试 -
公共wifi安全吗?应该怎么解决 (2次) -
IP地址和MAC地址的区别 -
对TPlink的了解 深圳这边是什么部门 (5次) -
计算机网络的体系结构 -
五层协议分别是啥,然后每一层说一个具体的协议 -
自己有哪些方面可以胜任此职业 -
vlan -
进程和线程、进程如何通信、线程如何通信 答:进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整的过程,这个过程也是进程本身从产生,发展到最终消亡的过程。线程是比进程更小的执行单位,线程是进程的基础之上进行进一步的划分。 1)进程: 每个进程有自己的地址空间。两个进程中的地址即使值相同,实际指向的位置也不同。 进程间通信一般通过操作系统的公共区进行。 2)线程 同一进程中的线程因属同一地址空间,可直接通信。 不仅是系统内部独立运行的实体,而且是独立竞争资源的实体。 线程也被称为轻权进程,同一进程的线程共享全局变量和内存,使得线程之间共享数据很容易也很方便,但会带来某些共享数据的互斥问题。 线程间通信:由于多线程共享地址空间和数据空间,所以多个线程间的通信是一个线程的数据可以直接提供给其他线程使用,而不必通过操作系统(也就是内核的调度)。 进程间的通信则不同,它的数据空间的独立性决定了它的通信相对比较复杂,需要通过操作系统。以前进程间的通信只能是单机版的,现在操作系统都继承了基于套接字(socket)的进程间的通信机制。这样进程间的通信就不局限于单台计算机了,实现了网络通信。 一、进程间的通信方式 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 有名管道 (namedpipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 信号量(semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 消息队列( messagequeue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 信号 (sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 共享内存(shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。 套接字(socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。 二、线程间的通信方式 锁机制:包括互斥锁、条件变量、读写锁 互斥锁提供了以排他方式防止数据结构被并发修改的方法。 读写锁允许多个线程同时读共享数据,而对写操作是互斥的。 条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。 信号量机制(Semaphore):包括无名线程信号量和命名线程信号量 信号机制(Signal):类似进程间的信号处理 线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。 -
加载网页的过程(因为我有一个web开发的课程项目),涉及到什么协议,DNS是什么(3次),DNS为什么默认用UDP,怎么去修改DNS ,DNS解析过程 -
https的具体过程顺便讲讲对称加密和非对称加密 -
http和https的区别 (2次)SSL层怎么连接的? 答:HTTP是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。二者主要区别在于:1、HTTPS 协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。4、HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。 -
抓包软件(显示明文)的原理 -
icmp -
python 直接a= 1,为什么C要int a=1 -
对class的理解 -
c++ 内存管理机制(2次) -
有无用到多进程,多线程 答:多进程操作系统能同时达运行多个进程(程序),由于 CPU 具备分时机制,所以每个进程都能循环获得自己的CPU 时间片。由于 CPU 执行速度非常快,使得所有程序好像是在同时运行一样。 多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发的一个基本单位。线程是比进程更小的执行单位,线程是进程的基础之上进行进一步的划分。所谓多线程是指一个进程在执行过程中可以产生多个更小的程序单元,这些更小的单元称为线程,这些线程可以同时存在,同时运行,一个进程可能包含多个同时执行的线程。 Java中线程实现的方式 在 Java 中实现多线程有两种手段,一种是继承 Thread 类,另一种就是实现 Runnable 接口。下面我们就分别来介绍这两种方式的使用。 实现 Runnable 接口 从程序可以看出,现在的两个线程对象是交错运行的,哪个线程对象抢到了 CPU 资源,哪个线程就可以运行,所以程序每次的运行结果肯定是不一样的,在线程启动虽然调用的是 start() 方法,但实际上调用的却是 run() 方法定义的主体。 Thread 类和 Runnable 接口 通过 Thread 类和 Runable 接口都可以实现多线程,那么两者有哪些联系和区别呢?下面我们观察 Thread 类的定义。 public class Thread extends Object implements Runnable 从 Thread 类的定义可以清楚的发现,Thread 类也是 Runnable 接口的子类,但在Thread类中并没有完全实现 Runnable 接口中的 run() 方法,下面是 Thread 类的部分定义。 线程的状态变化 要想实现多线程,必须在主线程中创建新的线程对象。任何线程一般具有5种状态,即创建,就绪,运行,阻塞,终止。 -
浏览器输入url后都发生了什么 (8次),用到哪些协议(2次) 答:浏览器中输入的url是域名,需要首先进行DNS解析,获得web服务器域名对应的ip地址;客户端根据ip地址去寻找相应的服务器;然后建立TCP连接,包括三次握手的过程:第一次握手,客户端向服务器端发送请求,等待服务器确认。第二次握手:服务器收到请求并确认,回复一个指令。第三次握手:客户端收到服务器的回复指令并返回确认;随后客户端向web服务器发送http请求,web服务器接受请求并处理后返回响应;浏览器对返回的响应进行解码、渲染、显示;在界面显示完成后,浏览器发送异步请求;最后进行TCP四次挥手断开连接。 //浏览器要将URL解析为IP地址,解析域名就要用到DNS协议,首先主机会查询DNS的缓存,如果没有就给本地DNS发送查询请求。DNS查询分为两种方式,一种是递归查询,一种是迭代查询。如果是迭代查询,本地的DNS服务器,向根域名服务器发送查询请求,根域名服务器告知该域名的一级域名服务器,然后本地服务器给该一级域名服务器发送查询请求,然后依次类推直到查询到该域名的IP地址。DNS服务器是基于UDP的,因此会用到UDP协议。 得到IP地址后,浏览器就要与服务器建立一个http连接。因此要用到http协议。http生成一个get请求报文,将该报文传给TCP层处理,所以还会用到TCP协议。如果采用https还会使用https协议先对http数据进行加密。TCP层如果有需要先将HTTP数据包分片,分片依据路径MTU和MSS。TCP的数据包然后会发送给IP层,用到IP协议。IP层通过路由选路,一跳一跳发送到目的地址。当然在一个网段内的寻址是通过以太网协议实现(也可以是其他物理层协议,比如PPP,SLIP),以太网协议需要直到目的IP地址的物理地址,有需要ARP协议。 -
判断括号字符串是否闭合 (2次) 答:判断字符串括号是否闭合(){}[] -
连不上网该如何排查(2次) 答:电脑连不上网故障排查思路 -
讲下有哪些攻击方式(洪泛攻击,DOS攻击,中间人攻击) -
他写一段程序,你能想到测试哪些内容 -
网页搜索时,输入内容按回车,网页会弹出搜索内容页面,问在这个过程中会有哪些操作 -
二叉树遍历的三种方法 答:前序遍历(根-左-右);中序遍历(左-根-右);后序遍历(左-右-根),还有一种层序遍历(按层自上而下,自左而右)。 -
AVL树 算法 -
如何判断链表中是否有环?有没有空间复杂度O(1)的方案? 答:利用快慢指针法能够实现。把链表比作一条跑道,链表中有环,那么这条跑道就是一条圆环跑道,在一条圆环跑道中,两个人有速度差(比如a是b的2倍),那么迟早两个人会相遇,只要相遇那么就说明有环。可以想象一下,只要两个指针跑进了环里,那么因为存在速度差,他们之间的距离总会由远及近,然后相遇,在远离。 -
数组和链表的区别是什么? 答:这两种数据结构都属于线性表。数组:1.在内存中,数组是一块连续的区域。比如看电影,观众在电影院必须连续的坐在一起。2.数组需要预留空间,在使用前要先申请占内存的大小,可能会浪费内存空间和不便于拓展。3.插入数据和删除数据效率低,插入数据时,这个位置后面的数据在内存中都要向后移。删除数据时,这个数据后面的数据都要往前移动。4.随机读取效率很高。因为数组是连续的,知道每一个数据的内存地址,可以直接找到给地址的数据,时间复杂度是O(1);链表:1.在内存中,链表元素是分散的,利用指针指向下一个数据的内存地址把彼此串联起来。第一个人知道第二个人的座位号,第二个人知道第三个人的座位号。2.增加数据和删除数据很容易。链表中只需要改变节点中的“指针”的指向即可实现。3.查找数据时效率低,因为不具有随机访问性,所以访问某个位置的数据都要从第一个数据开始访问,然后根据第一个数据保存的下一个数据的地址找到第二个数据,以此类推,时间复杂度是O(n);4.不指定大小,扩容便利。链表大小不用定义,数据随意增删。 -
栈和堆的区别 答:1、栈 什么是栈,它是你的电脑内存的一个特别区域,它用来存储被每一个function(包括mian()方法)创建的临时变量。栈是FILO,就是先进后出原则的结构体,它密切的被CPU管理和充分利用。每次function声明一个新的变量,它就会被“推”到栈中。然后每次一个function退出时,所有关于这个函数中定义的变量都会被释放(换句话说就是删除)。一旦栈中的变量释放,这块区域就会变成可用的,提供给其他栈中的变量。 用栈存储变量的好处是,内存是被你管理的。你不用手动的创建内存,不用当你不在需要它的时候手动释放内存。另外,由于CPU组织栈内存很高效。读出和写入栈变量是很快的。 理解栈的关键是理解概念,当一个function退出时,所有它的变量都会从栈中弹出,以后都会永远消失。因此栈中的变量本质是局部的。这和我们原来理解为变量作用域或者本地或者全局变量是相关的。在C中,一个公共的bug 是从你程序中的一个function外尝试访问一个在栈中的这个function的变量(在该function已经退出后)。 关于栈的另一个特点我们应该记住,就是存储再栈中的变量的大小有限制。而堆上创建变量不用考虑。 总结栈: a、栈的生长和伸缩就是函数压入或者推出局部变量。 b、我们不用自己去管理内存,变量创建和释放都是自动的。 c、栈中的变量只有在函数创建运行时存在。 2、 堆 堆也是我们的计算机内存中的一个区域,但是他不是自动管理的。而且也不是被CPU密切的管理着。它是一片更加自由的内存区域(很大)。要想在堆上创建内存,我们必须使用malloc() 或者calloc(),他们都是C语言编译的。一旦你在堆上分配内存,当你不在需要的时候你必须用free()去销毁。如果你不销毁或者销毁失败,你的程序就会有内存泄露。换句话说就是堆内存会一直在,其他进程无法使用。我们将会再调试部分看到,那里有一个叫做Valgrind的东西,它可以帮助你发现内存泄露。 不像栈,堆没有变量大小的限制(除了你电脑的物理限制条件外)。堆内存读出和写入都比较慢,因为它必须使用指针图访问堆内存。我们将会下面讲解指针。 3、栈和堆的优缺点 栈: a、快速访问。 b、没有必要明确的创建分类变量,因为它是自动管理的。 c、空间被CPU高效地管理着,内存不会变成碎片。 d、只有局部变量 e、受限于栈大小(取决于操作系统) f、变量不能调整大小。 堆: a、变量可以被全局访问 b、没有内存大小限制 c、(相对)访问比较慢 d、没有高效地使用空间,随着块内存的创建和销毁,内存可能会变成碎片。 e、你必须管理内存(变量的创建和销毁你必须要负责) f、变量大小可以用realloc( )调整 -
假设针对你自己地项目给开发提意见,你觉得从哪方面能够提升性能 -
给定一个整数数组nums和一个正整数k,找出是否有可能把这个数分成k个非空子集,其总和都相等。 -
java中的泛型是什么,泛型是如何实现的? -
内核态相关 答:用户态和内核态的区别 根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别: 用户态(user mode) : 用户态运行的进程或可以直接读取用户程序的数据。 系统态(kernel mode):可以简单的理解系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。 说了用户态和系统态之后,那么什么是系统调用呢? 我们运行的程序基本都是运行在用户态,如果我们调用操作系统提供的系统态级别的子功能咋办呢?那就需要系统调用了! 也就是说在我们运行的用户程序中,凡是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。
智力题:
1.简单的爬楼梯问题,100的阶梯,每次1步或者2步,多少种方法;如果对于100000阶楼梯,递归算法显然不好,问还有什么别的更好的解决办法? 2.25匹马,每场5匹马,最少几次确定前三 答:前三名:7次。马分五组进行比赛,得到各组名次,并记录---- 5次;2,取每组的第一名,比赛后,第一名直接晋级,淘汰没希望进前三的马,剩下两匹;3,第一名组的2,3名补上,第二名组的第1,2名,加上第三名,比赛取前两名,就可以了 (共7次比赛),前五名则需要9次,逻辑一样。 3.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢,至少需要多少根绳子 答:2根香为A和B 1 将A的两端,B的一端3个端点同时点燃; 2 A燃尽时开始计时并将B的另一端点燃;得15分钟 4.n个点有几个三角形 5.两个人抛硬币吃苹果,抛到正的人可以吃到,问先抛的人吃到苹果的概率。 答:第一个人吃苹果的,以第一个人的视角来看,抛硬币的次数为奇数。则: 假设抛了一轮:p = 0.5(正) 假设抛了两轮:p = 0.5(反)?0.5(反)?0.5(正)=0.5^3 假设抛了三轮:p = 0.5(反)?0.5(反)?0.5(反)?0.5(反)?0.5(正)=0.5^5 …… N 轮后:p = 0.5^(2N-1) 故等比为0.25数列求和:0.5?(1-0.25^N)/(1-0.25) = 0.5/0.75 = 2/3因此,无限次数下,先抛硬币的人吃到苹果概率约为2/3,后抛的1/3. 6.用7g和2g砝码以及天平分140g物品最少称量几次 50 90 答上来面试官又问了60和80 7.有五个相邻狐狸洞,狐狸每晚一定会到旁边相邻的一个洞去,白天可以选择一个洞查看,问如何查看能抓住狐狸 8.rand5()生成rand7() 9.一共 1000 瓶药水,其中 1 瓶有毒药。已知小白鼠喝毒药一天内死,若想在一天内找到毒药,最少需要几只小白鼠? 答案:10 只。
解析:二进制思想。
0 000 000 001表示 1 号老鼠,喝了药水 1 。 0 000 000 010表示 2 号老鼠,喝了药水 2 。 0 000 000 011表示 1 号、 2 号老鼠,喝了药水 3 。 … … 1 111 101 000表示 4、6、7、8、9、10号老鼠,喝了药水 1000。
按照上述的方法依次喝
第一回合,1 号老鼠喝药水 1
第二回合,2 号老鼠喝药水 2
…
第一千回合,4、6、7、8、9、10号老鼠喝药水 1000
喝完一天时,看 10 只老鼠的状态,根据老鼠状态就知道哪瓶药水有毒了。
比如最后只是 2 号老鼠死了,那就说明第2瓶药水有毒;如果4、6、7、8、9、10死了,那就说明第1000瓶药水有毒!
想明白这个道理,再来看怎么答案为何是10
我们需要让二进制表示的种类数>=药水总数(1000)
求的是最小值,显然,为10的时候满足要求
也可以这么计算:? log N ?,log底数为2 10.给20个小球,其中有一个是轻的,有一个天平,请问至少称几次能能找出那个轻的 答:n次称,最多可以从3^n个球中找出次品。原理是尽可能将每次称的球划分为数量相当的三组,一组放下,另外两组去称。如20个球1个次品,只需要3次即可。(1)将20/3=6…2,故分成7,7,6三组,让7和7去称,如果平,则6又分成2,2,2三组,选两组去称,如果平则在剩下那个2称出,如果不平,也在不平那个2去称出;7和7如果不平,则继续分成7/3=2…1,即2,2,3三组,用2去称或用2+1去称即可。 11.往一辆公交车里塞满乒乓球,需要多少个乒乓球 12.有100盏灯,只有开关两种状态。开始都是关着的状态,然后有100个人,第一个人把100盏灯的开关都拨一遍,第二个人,拨第2,4,6,8…盏灯的开关,第三个人拨第3,6,9,12…盏灯的开关,后面的人依此类推,问最后哪些灯是亮着的,哪些灯是灭了的。 答:这个问题有一个数学上的解决方法。可以看出,被按了奇数次的灯泡应该是亮着的,被按了偶数次的灯泡应该是灭的。那么什么样的灯泡被按了奇数次?什么样的灯泡又被按了偶数次呢?从按的过程可以发现,如果一个灯泡的编号具有偶数个因子,那么该灯泡就被按了偶数次,反之按了奇数次。现在的问题又变成,什么样的编号具有奇数个因子,什么样的编号具有偶数个因子?这涉及到一个叫做质因数分解的定理,大概的意思是说,任何正数都能被唯一表示成多个质因数幂次乘积的方式。 例如: 14=2?7 50=2^5?2 … 100=22*25
也就是N=(p[1]e[1])(p[2]e[2])…(p[k]^e[k]),其中p[i]是质数,e[i]是p[i]的幂次。而由这个公式我们又可以导出一个数有多少个因子的计算公式:FactorNumber(N)=(e[1]+1)(e[2]+1)…*(e[k]+1)。
那么什么条件下满足FactorNumber(N)是奇数呢?显然必须所有的e[1],e[2],…,e[k]都必须是偶数,这样才能保证e[i]+1是奇数,结果乘积才能是奇数。而由于e[1],e[2],…,e[k]都是偶数,那么N一定是一个完全平方数(因为sqrt(N)=(p1)*(p2)…(p[k]^(e[k]/2))是整数) 。回到按灯泡的问题上来,1~100中完全平方数有1,4,9,16,25,36,49,64,81,100这10个数,也就是说最后只有编号为这10个数的灯是亮着的。
13.甲乙丙三人参加M个比赛项目且均包揽前三名,每个项目前三名的积分为X、Y、Z,且X>Y>Z。比赛结束后,甲共获得22分,乙和丙均获得9分。 问:共有几个项目(求M)?跳高比赛的第二名是谁? 14.26开根号是多少 保留两位小数 不用计算器 15.沙漏 16.扔鸡蛋问题不过换成路由器bug率了,40到80,只能测两台,怎么测 17.100层泡2个鸡蛋问题
|