计算机综合面经

操作系统

①进程和线程区别

进程是运⾏行行中的程序,线程是进程的内部的⼀一个执⾏行行序列列
进程是资源分配的单元,线程是执⾏单元
进程间切换代价大,线程间切换代价小
进程拥有资源多,线程拥有资源少
多个线程共享进程的资源

2、进程切换代价为什么比线程大:
进程切换时必须保存当前进程的状态,保存上下文
在进程内切换线程,进程的资源是各个线程共享的不用切换。

②进程间有哪些通信方式

1.管道( pipe ):管道是⼀一种半双⼯工的通信⽅方式,数据只能单向流动,⽽而且只能在具有亲缘关
系的进程间使⽤用。进程的亲缘关系通常是指⽗父⼦子进程关系
2.消息队列列通信:消息队列列是由消息的链表,存放在内核中并由消息队列列标识符标识。消息
队列列克服了了信号传递信息少、管道只能承载⽆无格式字节流以及缓冲区⼤大⼩小受限等缺点
3.信号量量: 信号量量是⼀一个计数器器,可以⽤用来控制多个进程对共享资源的访问。它常作为⼀一种
锁机制,防⽌止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间
以及同⼀一进程内不不同线程之间的同步⼿手段。
4.信号:信号是⼀一种⽐比较复杂的通信⽅方式,⽤用于通知接收进程某个事件已经发⽣生。
5.共享内存通信:共享内存就是映射⼀一段能被其他进程所访问的内存,这段共享内存由⼀一个
进程创建,但多个进程都可以访问。共享内存是最快的 IPC ⽅方式,它是针对其他进程间通信
⽅方式运⾏行行效率低⽽而专⻔门设计的。它往往与其他通信机制,如信号两,配合使⽤用,来实现进程
间的同步和通信。
6.socket:套接⼝口也是⼀一种进程间通信机制,与其他通信机制不不同的是,它可⽤用于不不同机器器
间的进程通信。

③线程间有哪些通信方式:

共享变量,共享内存,共享数据库,消息队列等

④epoll中的水平触发和边缘触发有什么不同?

level_triggrted(水平触发):当被监控的文件描述符上有读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据一次性全部读写完,那么下次调用epoll_wait()时,他还会通知你,上次的没写完,如果一直未处理完,它会一直通知你。如果系统中有大量这种通知,会大大降低处理程序检索自己关系就绪文件描述符的效率。
Edge_triggered(边缘触发):当被监控的文件描述符上有读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据一次性全部读写完,那么下次调用epoll_wait()时,不会通知你,也就是仅通知一次。

⑤linux进程调度中有哪些常见的算法及策略

1先来先服务调度
2短作业优先调度
3优先权调度
抢占和非抢占
4时间片轮转调度
5多级队列调度
6多级反馈调度

⑥操作系统如何申请及管理内存(内存工作原理)

虚拟内存是现代操作系统普遍使用的一种技术,
1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址;
2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址;
3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,把相应的页由磁盘调入内存,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法进行页面置换。

⑦系统态和用户态,什么时候会进入系统态

系统态又叫内核态,管态,是操作系统的管理程序运行时的状态,它具有较高的特权级别。可以执行所有指令,包括特权指令。
用户态又叫目态,普通态,具有较低的特权级别。在这种状态下不能使用特权指令,不能直接使用系统资源,并且只能访问这个用户程序自己的存储空间。

当发生系统调用,异常,外围设备中断时会从用户态切换到系统态

⑧LRU算法及其实现方式

LRU 是Least Recently Used, 最近最久未使用算法
LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,物理内存空间已存满数据时,应当把最久没有被访问到的数据淘汰。

⑨简述同步与异步的区别,阻塞和非阻塞的区别:

同步和异步关注的是消息通信机制,同步就是由“调用者”主动等待这个“调用”的结果。
同步:同步是指一个进程在执行某个请求的时候,如果该请求需要一段时间才能返回信息,那么这个进程会一直等待下去,直到收到返回信息才继续执行下去。
异步:异步是指进程不需要一直等待下去,而是继续执行其它下面的操作,当有信息返回的时候会通知进程进行处理,或通过回调函数处理这个调用,这样就可以提高执行的效率了,
阻塞和非阻塞关注的是结果,
阻塞和非阻塞指的是调用者(程序)在等待返回结果(或输入)时的状态。 阻塞时,在调用结果返回前,当前线程会被挂起,并在得到结果之后返回。 非阻塞时,如果不能立刻得到结果,则该调用者不会阻塞当前线程。

⑩简述操作系统缺页中断

虚拟内存是现代操作系统普遍使用的一种技术,
在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。每当所要访问的页面不在内存是,会产生一次缺页中断,在磁盘中找到所缺的页,在物理内存中找到一个空页框,如果物理内存满了,采用页面置换算法来换出一个页,将磁盘中的页读入内存中,然后更新页表,再次重新执行发生缺页中断的指令。

⑪操作系统中malloc实现原理

Malloc函数用于动态分配内存。malloc基本实现原理就是维护一个内存空闲链表,当申请内存空间时,搜索内存空闲链表,找到适配的空闲内存空间,然后将空间分割成两个内存块,一个变成分配块,一个变成新的空闲块。搜索空闲块最常见的算法有:首次适配,下一次适配,最佳适配。

⑫简述linux的IO模型

在Linux中,为了操作系统的安全性等,进程无法直接操作IO设备,必须通过系统调用来请求内核协助完成IO动作,内核会为每个IO设备维护一个buffer。当用户发起请求后,内核接收到请求,从IO设备中获取数据到buffer中,再将buffer中的数据拷贝到用户进程的地址空间,用户进程获取到数据后在响应客户端。这个过程可以分成两个阶段:
1.等待数据准备
2.将数据从内核拷贝到进程中
在这里插入图片描述

阻塞IO:在Linux中,默认情况下所有的socket都是阻塞的。在IO执行时,用户进程都处于阻塞状态,在等待数据返回的过程中不能进行其他的操作。
非阻塞IO
通过设置socket可使其变为非阻塞的。在IO执行的第一个阶段不是完全阻塞的,第二个阶段是阻塞的。第一阶段通过轮询的方式确认数据是否准备好,通常会浪费cpu时间。
IO多路复用
当用户进程调用了select,进程会被阻塞,此时,内核会“监视”select负责的所有socket,当任何一个socket中的数据准备好了,select就会返回,此时用户进程再调用read操作,将数据从内核拷贝到用户进程中。

IO多路复用的优势是单个进程就可以同时处理多个网络连接的IO,节约系统资源。两个阶段用户进程都是阻塞状态,第一阶段是阻塞在select,而不是IO操作。

异步IO
异步IO在IO操作的两个阶段都是非阻塞的

网络协议

①简述TCP三次握手及四次挥手流程

在这里插入图片描述
· 第一次握手([SYN], Seq = x)
客户端发送一个SYN标记的包,Seq初始序列号x,发送完成后客户端进入SYN_SEND状态。
· · 第二次握手([SYN,ACK], Seq = y, ACK = x + 1)
服务器返回确认包(ACK)应答,同时还要发送一个SYN包回去。ACK = x + 1,表示确认收到(客户端发来的Seq值 + 1),Seq = y, 表示让客户端确认是否能收到。发送完成后服务端进入SYN_RCVD状态。
· · 第三次握手([ACK], ACK = y + 1)
客户端再次发送确认包(ACK),ACK = y + 1, 表示确认收到服务器的包(服务端发来的Seq值 + 1)。客户端发送完毕后,进入ESTABLISHED状态,服务端接收到这个包,也进入ESTABLISHED状态, TCP握手结束。

在这里插入图片描述

②RestFul与RPC的区别是什么,Restful的有点在哪里

Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,
简而言之就是 在A (client) 调用 B (server) 提供的A方法.
区别:
1.restfull和rpc都是client/server模式的,都是在 Server端 把一个个函数封装成接口暴露出去
2.restful使用http协议实现,而rpc则不一定使用http,一般比较常用的是tcp, RPC 可以获得更好的性能(省去了 HTTP 报头等一系列东西),TCP更加高效,而HTTP在实际应用中更加的灵活。
3.从使用上来说:Http接口只关注服务提供方(服务端),对于客户端怎么调用,调用方式怎样并不关心;而RPC服务则需要客户端接口与服务端保持一致,服务端提供一个方法,客户端通过接口直接发起调用。

③http与Https有哪些区别

1,HTTPS协议需要证书颁发机构CA申请证书,HTTP不用申请证书
2,HTTP是超文本传输协议,属于应用层信息传输,Https则是在http协议的基础上增加了SSL安全层的协议,对数据传输进行加密。
3,HTTP和HTTPS使用的是完全不同的连接方式,用到端口也不一样,前者是80,后者是443.
4,HTTP的连接很简单是无状态的;HTTps协议是SSL+http协议构建的可进行加密传输,身份认真的网络协议,比HTTP协议安全。

④一次HTTP请求发生了什么

在这里插入图片描述

域名解析:域名解析是指把域名转化为IP地址
在这里插入图片描述

先在本地缓存中找DNS缓存,如果没有找到,向上递归在DNS服务器找。

⑤TCP常见的拥塞控制算法有哪些

慢开始,拥塞避免,快重传,快恢复
慢开始:
.开始时发送方cwnd=1,发送报文段M1,如果收到确认M1,那么此时增大cwnd=2,并发送M2,M3
2.要注意,发送方每收到一个确认报文段,cwnd+1(不包括缺失重传的确认)
也就是说,每经过一个传输伦次(RTT时间),cwnd加倍。

快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时才进行捎带确认。
当发送方连续收到三个重复确认,就执行“乘法减小”算法,把慢开始门限ssthresh减半。这是为了预防网络发生拥塞。请注意:接下去不执行慢开始算法。
在这里插入图片描述

⑥TCP如何保证可靠传输:
校验和:
序列号和确认应答:
序列号:TCP传输时将每个字节的数据都进行了编号
确认应答:TCP传输过程中,每次接收到数据后都会对传输方进行确认应答。也就 是ACK报文。ACK报文中带有对应的确认序列号,告诉发送方,接受了哪 些数据,下次从哪里法。
超时重传:当发送方发送完数据后,迟迟没有等待到接收方的ACK报文,对刚才的数据进 行重传。
连接管理:三次握手,四次挥手。
流量控制:

	TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发		送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数		据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制		协议是可变大小的滑动窗口协议。

拥塞控制:当网络拥塞时,减少数据的发送

⑦从系统层面上,UDP如何保证尽量可靠?

UDP它不属于连接协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为,他们击鼠丢失一俩个包也不会对接受结果产生太大影响。传输层无法保证数据的可靠传输,只能通过应用层来实现。
1,提高超时重传机制,能避免数据报丢失
2,提供确认序列号,可以对数据进行确认和排序。

⑧TCP的keepalibe和http的keepalive.

在这里插入图片描述

⑨HTTP1.0 1.1,2.0的主要区别

在这里插入图片描述

数据库

MySQL 为什什么使⽤用 B+ 树来作索引,对⽐比 B 树它的优点和缺点是什什么?
在这里插入图片描述

m阶B树的孩子个数最多m个

在这里插入图片描述

在这里插入图片描述

在B+树中叶子节点指向记录信息

在这里插入图片描述

②:
数据库的事务隔离级别有哪些?各有哪些优缺点?
在这里插入图片描述

rc 解决了脏读

③数据库事务的特性:

原子性、一致性、隔离性、持久性

④什么情况下会发生死锁,若何解决死锁?

死锁是指俩个或俩个以上的线程相互等待对方所占有的资源,若无外力作用,双方将会无限期的等待下去。
解决办法:
①最简单的办法就是将系统重启,不过这种方法代价很大。
②撤销进程,剥夺资源,回收它们所占有的资源,从而解决死锁。
俩种:一次性撤销所有死锁进程 或逐步一个一个撤销死锁进程。
③进程回退策略:即让参与死锁的进程回退到没有发生死锁前的某一点,并由此继续执行,以求再次执行时不再发生死锁。(操作起来系统开销大,需要利用堆栈这样的机构记录进程每一步的变化。)

⑤乐观锁和悲观锁的区别以及使用的场景

定义:
乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。 因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。
悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。. 因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。
读取频繁,适合使用乐观锁。(因为如果出现大量的读取操作,每次读取时都会进行加锁,这样会增大锁的开销,降低了系统的吞吐量。)
写入频繁,适合使用悲观锁。(如果大量的写入操作,数据会发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断重新获得数据,这样会大量的增大查询操作,降低了系统的吞吐量。)

⑥聚簇索引和⾮非聚簇索引有什什么区别?什什么情况⽤用聚集索引?

聚簇索引:将数据存储与索引放到了了⼀一块,找到索引也就找到了了数据 Innodb引擎 .IDB
非聚簇索引:将数据存储与索引分开存放,索引结构的叶⼦子节点指向了了数据的对应⾏行行,
myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数
据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什什么索引不不在
key buffer命中时,速度慢的原因

⑦简述脏读和幻读的发生场景,innoDB是如何解决幻读的?

发生脏读的数据库的事务隔离级别为RU(read uncommited)(另一个人读了别人还为提交的数据。)
幻读的数据库的事务隔离级别为RR(repeatable read)
幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的"全部数据行"。. 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入"一行新数据"。. 那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.

⑧唯一索引和普通索引的区别?使用索引会有哪些优缺点?

唯一索引会限定数据唯一
而普通索引不会

9 数据库的ACID分别是什么?

数据库的事务性
原子性,一致性,隔离性,持久性
原子性(atomicity)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值