校招经典面试题
操作系统
-
请分别简单说一说进程和线程以及他们的区别
- 进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是操作系统进行资源调度和分配的独立单位
- 线程是进程的实体,是CPU调度和分配的基本单位,一个进程可以有多个线程
- 区别:进程占有独立的内存空间,一个进程的多个线程之间共享线程的资源和空间
-
线程同步的方式有哪些
- 互斥量:只有拥有互斥对象的线程才能访问公共资源的权限,互斥量只有一个,所以可以保证公共资源不会被多个线程同时访问
- 信号量:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问资源最大线程数量
- 事件(信号):通过通知操作的方式来保持多线程同步,还能够实现多线程优先级的比较
-
进程的通信方式有哪些
- 管道
- 信号量:用来控制多个进程对共享资源的访问
- 消息队列:消息的链表,存放在内核中并由消息队列标识符标识
- 信号:是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生
- 共享内存:由一个进程映射一段能被其他进程访问的内存
-
什么是缓冲区溢出?有什么危害?造成的原因是什么
- 缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲去本身的容量,溢出的数据会覆盖在合法数据上
- 危害:造成程序崩溃或者跳转并执行一段恶意代码
- 原因:程序中没有检查用户的输入
-
什么是死锁?死锁产生的条件?解决死锁的方法?
- 在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其他进程释放他们现在保持的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲就是一个或者多个进程无限期的阻塞,相互等待的一种状态
- 产生的条件
- 1.互斥条件:一个资源一次只能被一个进程使用
- 2.请求与保持条件:一个进程因请求资源而阻塞时,对已经获得的资源不释放
- 3.不可剥夺条件:进程获得的资源,在未完全使用之前不得强行剥夺
- 4.循环等待条件:若干进程之间形成一种头尾相接的环形等待资源的关系
- 解决方法
- 预防死锁:资源一次性分配(破坏请求与保持条件);可剥夺资源(当某进程新的资源未满足时,释放已占有的资源),资源有序分配(系统给每类资源赋予一个编号,每一个进程按编号递增顺序请求资源,释放则相反)
- 避免死锁:允许进程动态申请资源,但是系统在进行资源分配之前预先计算资源分配的安全性(银行家算法)
- 检测死锁:为每个进程和资源指定唯一的号码
- 解除死锁:当发现有进程死锁后,立即剥夺资源或者撤销进程
-
进程有哪几种状态?
- 就绪状态:进程已经获得除处理机以外所需要的资源,等待分配处理机资源
- 运行状态:占用处理机资源运行
- 阻塞状态:进程等待某种条件,在条件满足之前无法运行
-
进程调度策略有哪几种?
- FCFS(先来先服务)
- 优先级调度算法
- 时间片轮转算法
- 多级反馈队列
-
为什么在存储中引入虚拟存储器
- 弥补物理内存不足的缺陷
-
内核的作用
- 管理CPU调度
- 对进程进行管理
- 对内存进行管理
- 对文件系统进行管理
- 管理其他硬件设备
-
用户态和内核态
-
当一个进程因为系统调用而陷入内核代码中执行时处于内核运行态
-
当一个进程在执行自己的代码时处于用户运行态
-
数据结构和算法
- 什么是数据结构
- 数据结构是计算机存储,组织数据的方式,是相互之间存在一种或者多种特定关系的数据元素的集合,因此我们在解决实际问题时需要根据各种数据结构的特点选取最合适的数据结构
- 有哪些常见的数据结构
- 数组,链表,栈,队列,树,图,哈希表
- 常见的排序算法
- 插入排序(O(n2)):在有序的序列中插入一个数,基本思想是将每一个待排序的记录,按照其关键码值的大小插入前面已经排序的数据中适当位置上,直到插入完为止
- 冒泡排序(O(n2)):数组排序算法,思想是:假设从小到大排序,从第一位开始,如果左边的数比右边的数大,则交换他们的位置,直到最后一位,每一轮遍历都能找到最大的数
- 选择排序(O(n2)):每次从未排好序的数据中找到最小的数,插入到已经排序好的数据系列里面去
- 快速排序(O(nlogn)):是对冒泡排序的改进,思想:通过一趟排序将要排序的数据分割成独立的两部分,其中过一趟排序的数据被分割成独立的两部分,其中一部分数据比另外一部分的所有数据都要小,然后再按相同的方法对两部分数据分别进行快速排序,整个排序可以递归
- 归并排序(O(nlogn)):将数据堆中的数据两两排序,对于排序好的进行四四排序,直至最后变成一个整个的堆
- 堆排序(O(nlogn)):堆排序是将数据看成完全二叉树,根据完全二叉树的特性来进行排序的算法,最大堆要求子节点的元素都要小于自己,最小堆要求节点元素不大于其左右孩子,那么处于最大堆的根节点的元素一定是堆中的最大值
- 图的遍历
- BFS(广度优先搜索)
- DFS(深度优先搜索)
计算机网络
-
浏览器中输入url回车发生的事情
- DNS解析域名对应的IP地址
- 三次握手建立连接
- http协议请求获取响应
- 四次挥手断开连接
- 浏览器渲染解析页面
-
DNS域名解析过程
- 浏览器检查缓存中有没有这个域名对应的解析过的ip地址,如果有该解析过程将会结束
- 检查本地hosts文件是否有网址映射关系
- 如果hosts文件中没有该域名映射,查找本地DNS解析器缓存,如果有则直接返回
- 如果没有,则查询ISP(网络服务提供商)的DNS服务器
- 如果还是查不到,就会向根域名服务器发出请求,进行迭代查询,然后再递归告诉客户机,同时将查询到的记录缓存一份
-
DNS解析失败的原因
- 网络不可用
- 域名劫持(通过攻击域名解析服务器,或伪造域名解析服务器的方法,把目标网站域名解析到错误的地址从而实现用户无法访问目标网站的目的)
- 域名是否被禁止解析
- 各项记录及缓存是否更新生效
-
TCP三次握手和四次挥手
-
三次握手
- 第一次握手:客户端连接请求报文段,将SYN置为1,Sequence Number为x,然后客户端进入SYN_SEND状态,等待服务端的确认
- 第二次握手:服务器收到客户端的SYN报文段,需要对SYN报文段进行确认,设置Acknowledgement number为x+1,同时,自己还要发送SYN请求信息,将SYN也置为1,Sequence Number为y,服务器发送ACK+SYN报文段给客户端,此时服务器进入SYN_RECV状态
- 第三次握手:客户端收到服务器的SYN+ACK报文段,然后将Acknowledgement NUmber置为y+1,向服务器发送ACK报文段,这个报文段发送完毕后,客户端和服务器都进入ESTABLISHED状态,完成TCP三次握手
-
四次挥手
- 第一次挥手:主机1(可以是客户端和服务器端),设置Sequence Number,向主机2发送一个FIN报文段,此时,主机1进入FIN_WAIT_1状态
- 第二次挥手:主机2收到主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgement Number = 主机1发送的序列号+1,主机1进入FIN_WAIT_2状态,主机2告诉主机1,我“同意”你的关闭请求
- 第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态
- 第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态,主机2收到主机1的ACK报文段以后,就关闭连接,此时,主机1等待2MSL(最大报文生存事件)后依然没有收到回复,则证明服务器端正常关闭,那么主机1也关闭连接
-
为什么要三次握手
- 三次握手是确保通信双方能发送能接收的最低值
-
为什么要TIME_WAIT?
- 为了确保A发送的最后一个ACK报文段能够到达B,A给B发送ACK可能会丢失,B收不到A发送的确认,B会超时重传FIN+ACK报文段,此时A处于2MSL时间内,就看看有收到B重传的FIN+ACK报文段,接着A重传一次确认,再重启2MSL计时器,最后,A和B都能够正常进入到CLOSED状态
-
讲一下TCP的拥塞控制
- TCP拥塞控制的目标就是最大化利用网络上瓶颈链路的带宽,简单来说就是把网络链路比喻成一根水管,如果我们希望尽可能的使用网络传输数据,方法就是给水管注水,为了保证水管不会爆管,TCP维护一个拥塞窗口cwnd,用来估计在一段时间内这条链路可以承载和运输的数据的数量,拥塞窗口的大小取决于网络的拥塞程度,并且动态的变化,为了达到最大的传输效率,一个简单的方法就是不但增加传输的水量,直到水管破裂为止,意思就是只要网络中没有出现拥塞,拥塞窗口的值就可以一直增大,以便发送更多的数据包,但是只要网络出现拥塞,拥塞窗口的值就应该减少一些,以减少注入到网络中的数据包数
-
讲一讲TCP的流量控制
- 滑动窗口是传输层进行流控的一种措施,接收方告知发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送速度过快而导致自己被淹没的目的
-
有哪些私有的IP地址
- 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
-
讲一下ARP协议的工作过程
- 首先,每个主机都会在自己的ARP缓冲区建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系
- 当源主机要发送数据时,首先检查ARP列表中是否有对应的IP地址的目的主机的MAC地址,如果有,直接发送数据,如果没有,向本网段的所有主机发送ARP数据包,该数据包包括主要有:源主机IP地址,源主机MAC地址,目的主机IP地址
- 当本网络的所有主机收到ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP响应包中,告诉源主机自己是他想要的MAC地址
- 源主机收到ARP响应包后,将目的主机IP和MAC地址写入到ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应的数据包,表示ARP查询失败
-
GET和POST请求区别
-
GET重点在从服务器上获取资源
POST重点在向服务器发送数据
-
GET传输数据通过URL请求,以field(字段 ) = value的形式,置于URL后,并用“?”连接,多个请求数据间“&”连接
POST传输数据通过http的post机制,将字段与对应值封存在请求实体中发送服务器,这个过程对用户是不可见的
-
GET传输数据量小,因为受URL长度限制,但效率较高
POST可以传输大量数据,所以上传文件时只能用post方式
-
GET是不安全的,因为URL是可见的,可能会泄露私密信息
POST较GET安全性较高
-
GET方式只能支持ASCII字符,向服务器传中文字符可能会乱码
POST支持标准字符集,可以正确传递中文字符
-
-
http常用的状态码有哪些
- 200 请求成功
- 301 永久重定向
- 302 临时重定向
- 304 服务器资源未变化
- 400 错误的请求,请求语法错误
- 401 未授权
- 403 资源禁止访问
- 404 请求的资源不存在
- 499 nginx发现post提交过快,nginx觉得是不安全连接
- 500 服务器内部错误
- 502 错误的网关
- 503 服务器不可用,服务器超时
- 504 网关超时
-
sesssion和cookie的区别
- http无状态协议,不能区分用户是否是同一个网站上来的,同一个用户请求不同的页面不能看作同一用户
- session存储在服务器,cookie保存在客户端,session比较安全,cookie用某些手段修改,不安全。session依赖于cookie进行传递
- 禁用cookie后,session不能正常使用,session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗,目前可以通过redis来保存session信息,session保存在服务器端的文件或者数据库中。默认保存在文件中,session文件时共有的
- cookie的存储量有限,只允许写4kb,而session是无限量的,不要将敏感数据放到cookie中,这样是不安全的
-
https的加密,解密过程了解吗?
- 客户端发起HTTPS请求
- 服务器的配置,采用https协议的服务器必须要有一套证书,证书包含公钥和密钥等信息
- 传递证书,这个证书包含:网站的地址,证书的颁发机构,过期时间
- 客户端解析证书,首先验证证书是否合法,如果是受信用的证书,浏览器上面就会显示一把小锁,否则就会警告如果证书受信任,用户接收了受信任的证书,浏览器会生成一串随机值,并使用证书的公钥对该随机值加密
- 传递加密随机值
- 服务器解密随机值,服务器使用证书的私钥进行解密,得到客户端传过来的随机值
- 传输加密后的信息,把需要传递的信息通过该值进行对称加密
- 客户端解密信息。客户端用之前生产的私钥(随机值)解密服务端传过来的信息,获取解密后的内容
-
五层模型协议栈
- 应用层:http\ftp\smtp\telnet
- 传输层:TCP\UDP
- 网络层:IP
- 数据连接层
- 物理层
-
交换机和路由器的区别
- 交换机工作处于数据链路层,路由器工作在网络层
- 交换机通过MAC地址寻址,路由器通过IP地址寻址
- 交换机的作用是构建局域网,路由器是跨网端通信
-
FTP(文件传输协议)协议端口和模式的问题
- 默认情况下FTP协议使用TCP端口的20和21这两个端口,其中20用于传输数据,21传输控制信息。但是,是否使用20作为传输端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20,如果采用被动模式,则具体最终使用哪个端口要服务器和客户端协商决定
-