经典面试题6(死锁,线程状态,进程调度算法,缓冲区溢出,缓冲区溢出,三次握手和四次挥手,HTTP 和 HTTPS 协议)

目录

1,什么是死锁,死锁产生的条件?如何解决死锁问题?

2,线程有哪几种状态?

3,有哪些进程调度算法?

4,什么是缓冲区溢出?

5,计算机网络各层有哪些协议?

6,缓冲区溢出的区别?

7,TCP 为什么需要三次握手和四次挥手?

8,HTTP 和 HTTPS 协议的区别?

操作系统和计算机网络

1,什么是死锁,死锁产生的条件?如何解决死锁问题?

        在两个或者多个并发的进程中,如果每个进程持有某种资源而又等待其他的进程释放他们的资源,在一直持续这种状况的情况下,不能向前推进的现象,称为死锁。就是进程之间相互阻塞,相互等待的状态。

        必要条件:

  1. 互斥条件:一个资源一次只能被一个进程调用
  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已经获得的资源不放。
  3. 不剥夺条件:进程获得资源,在其他进程未使用完的情况下,不能强行剥夺。
  4. 循环等待条件:若干进程之间形成一种循环,来等待资源的关系。

        解决办法:

        1,死锁预防

基本思想就是将四个必要条件之中,使其一个不成立即可:

  • 破除互斥条件(一般无法破除)
  • 破除“请求与保持”:实行资源分配策略,在进程运行之前,必须一次性的获取所有的资源,缺点因为进程是动态执行的,无法预知进程执行前所需的全部资源,同时也会降低资源利用率,导致进程的并发性。
  • 破除“不可剥夺”:允许进程强行剥夺资源,当一个已经保持了某些不可以被抢占的资源的进程,提出新的资源请求而不能得到满足的时候 ,他必须释放掉已经保持,拥有的所有资源,之后需要的时候继续申请就行。
  • 破除“循环等待”:实行资源有序分配策略,对所有的资源编号,按照顺序获取资源,将稀缺的采用较大的编号,在申请资源的时候必选按照编号的顺序进行,一个进程只有获得较小的编号才可以申请较大的编号。

        2,死锁避免

        该方法是允许前三个条件,但是通过动态的检测资源的分配状态,以确保循环等待的条件不成立,从而确保系统处于安全的状态(系统可以按照某一个顺序为进程分配资源,系统就是安全的)。

        3,死锁检测

        不限制资源访问或者约束进程行为,操作系统会周期性的执行一个算法,来检测前面的循环等待条件,死锁检测算法是:通过资源分配图来检测是否存在环来实现,从一个节点出发进行深度优先搜索,对访问过的节点进行标记,如果访问了已经标记的节点,就表示有存在环,也就是检测到了死锁的发生。

        4,死锁解除

        常用方法,终止进程和资源抢占。

        进程终止就是简单的终止一个或多个进程以打破循环等待:终止所有死锁进程,终止一个进程直到取消死锁循环为止。

        资源抢从一个或者多个死锁进程那里抢占一个或者多个资源。

        5,鸵鸟策略        

        因为解决死锁的代价很高,因此鸵鸟策略可以不采取任何的措施会获得更好的性能,当发生死锁的时候不会对用户造成很大的影响,或者死锁发生的概率很低,可以采取鸵鸟策略。

2,线程有哪几种状态?

1,创建状态,在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。

2,就绪状态,当调用了线程的start方法之后,该线程就绪状态,到那时此时线程调度程序还没有把该程序设置为当前线程。在线程运行之后,就会处于就绪状态。

3,运行状态,线程调度程序将处于就绪状态的线程设置为当前线程,此时就是运行状态,开始运行run函数。

4,阻塞状态,线程在运行的时候,被暂停,通常因为某个原因放弃Cpu的使用权,暂停或者停止运行(sleep,suspend,wait方法都可以),直到线程进入就绪状态,才有机会获得CPU的注意,再次转入运行状态。

5,死亡状态,如果一个线程run方法执行结束或者调用stop方法后,该线程就会死亡,已经死亡的线程,无法用start使其进入就绪状态。

  • run()方法用来执行线程体中具体的内容
  • start()方法用来启动线程对象,使其进入就绪状态
  • sleep()方法用来使线程进入睡眠状态
  • suspend()方法用来使线程挂起,要通过resume()方法使其重新启动
  • wait()方法用于线程的等待,必须搭配synchronized锁来使用

3,有哪些进程调度算法?

        进程的调度就是,在多个进程存在,并且处理机数量小于进程进程数量的时候,就存在进程争用的情况,就需要一种合适的方法来对进程就行管理,实现进程的并发就行。

        为了设计调度的算法,我们就需要设计评价标准:

  1. CPU的利用率,尽可能是的CPU保持工作状态资源利用率越高越好。
  2. 系统吞吐量,单位时间内CPU完成作业的数量。短作业,需要消耗的处理机时间较短,对于长作业需要消耗较长的时间啊你,会降低系统的吞吐量。
  3. 周转时间:周转时间指的是,作业提交到作业完成所经历的时间,包括作业等待,就绪状态排队,处理机运行以及输入输出所发挥的时间总和。
  4. 等待时间:进程处于等待处理机状态的时间之和。等待的时间越长,用户的满意度就越低。处理机调度算法并不影响作业执行或者输入输出操作的时间,只影响作业在就绪队列中等待所花的时间,因此,衡量一个调度算法的优劣,只用判断等待时间就可以。
  5. 响应时间:用户提交请求到系统首次产生响应所用的时间。由于周转时间不是最准确的评价性能的标准,所以采用响应时间来衡量调度算法才是最重要的方法。应该尽可能的去降低响应时间。

调度算法:

先来先服务调度算法:

        FCFS是一种简单的调度算法,它可以用于作业的调度,也可以用以进程的调度,他是不可剥夺算法,他对于每一个作业或者进程都是公平的鹅,但是如果有个长作业先到带系统,就会使后面许多的短作业等待很长的时间。

        特点:算法简单,效率低下,对长作业有利,不利于短作业。利于CPU繁忙型作业,不利于I/O繁忙型作业。

短作业优先算法:

        SJF:指的是对短作业的优先调度方法,首先从后备队列中选取一个或者若干个运行时间最短的作业,将他们调入内存。短进程优先(SPF)调度算法是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给他,直到完成或者阻塞。

        特点:对长作业不利,SJF中长时间的周转时间会增加;长时间不去处理长作业,可能会导致长作业饿死在后备队列之中。

优先级调度算法:

        优先级调度算法,既可以调度作业,也可以调度进程,该算法的优先级用于描述作业运行的紧迫程度。

        规则:调度室选择优先级最高的进程或者作业。

        思想:要根据任务的紧迫程度来决定处理的顺序。

        抢占式,非抢占式的都有,非抢占式的只需要在进程主动的放弃处理机进行调度即可,抢占式的须在就绪队列变化时,检查是否会发生抢占。

        优缺点:适用于实时操作系统,可以灵活的调整作业或者进程的偏好程度;如果有源源不断的高优先级进程到来,可能会导致饥饿。

高响应比优先调度算法:

        规则:在每次准备调度的时候,计算各个进程的响应比(等待时间+服务时间/服务时间)。

        思想:总和考虑进程的等待时间和服务时间。

        非抢占式算法,只有当前的运行的进程主动的放弃CPU(正常/不正常完成,主动阻塞)的时候,才需要进程调度,调度时计算机的所有就绪进程的响应比,选响应比最高的进程上处理机器。

        优缺点:综合考虑了等待时间和服务时间的问题,等待时间相同的时候,服务时间短的优先(短作业优先的优点),服务时间相同时,等待时间长的优先(先来先服务的优点),对于长作业来说,等待时间越长,响应比越大,避免长作业的饥饿问题。

时间片轮转调度算法:

         规则:按照进程到达就绪队列的顺序,轮流的让每一个进程执行一个时间片,如果进程在一个时间片内没有执行完,则剥夺处理机,将进程重新放到就绪队列的尾部。

        思想:公平的,轮流的为某个进程服务,让每一个进程在一定的时间内可以得到响应。

        如果进程没有在时间片内完成,将强行剥夺处理机使用权,因此属于抢占式算法,由时钟装置发出时钟中断来通知CPU时间片已到。

        优缺点:公平,响应快,适用于分时操作系统;由于高频率的进程切换,因此有一定的开销,不区分任务的紧迫程度。

多级反馈队列算法:

        规则:设置多级的就绪队列,各级队列优先级从高到低,时间片从小到大,新进程到达时,放下第一级队列,按照先来先服务的原则排队等待分配时间片,如果时间片用完进程还未执行完,则放到下一级就绪队列尾部,如果已经在最低级队列,则重新放到队列的尾部。只有第K级队列为空时,才会为K+1队列的进程分配时间片。

        思想:对其他调度算法的折中权衡。

        抢占式的算法,在k级队列的进程运行过程之中,如果更上级的队列中进入了一个新的进程,由于新的进程处于优先级更加高的队列。因此新的进程会抢占处理机,原来运行的进程放回k级队列队尾。

        优缺点:(FCFS优点)对各种类型的进程相对于公平,(RR优点)每个新到达的进程都可以很快得到响应,(SPF的优点)短进程只用较少的时间就可以完成。不必实现估计进程运行的时间。

4,什么是缓冲区溢出?

        计算机向缓冲区(一段可读写的内存区域)填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。

        危害:

  1. 程序崩溃,导致拒绝服务。
  2. 跳转并且执行恶意代码。

        原因:

        造成缓冲区溢出的主要原因是程序中没有仔细检查用户的输入。

5,计算机网络各层有哪些协议?

1,应用层:为特定的程序提供数据传输服务,有HTTP,DNS等协议,数据单位为报文。

2,传输层:为进程提供通用数据传输服务,由于应用层协议很多,定义通用的传输层协议就可以支持不断增多的应用层协议。传输层包括两种协议,传输控制协议TCP,提供面向连接,可靠的数据传输服务,数据的单位为报文段;用户数据报协议UDP,提供无连接,尽最大的努力的数据传输服务,数据单位为用户数据报。TCP提供完整性服务,UDP主要提供及时性服务。

3,网络层:为主机提供数据传输服务,而传输层协议是为主机中的进程提供数据传输服务,网络层把传输层传递下来的报文段或者数据封装成分组。

4,数据链路层:网络层针对的还是主机之间的数据传输服务,而主机之间可以有很多链路,链路层协议就是为同一链路的主机提供数据传输服务,数据链路层把网络层传下来的分组封装为帧。

5,物理层:在传输媒体上传输数据比特流,物理层的作用就是尽可能屏蔽传输媒体和通信手段的差异,使数据链路层感觉不到这些差异。

6,TCP 和 UDP 协议的区别?

        TCP:传输控制协议,面向连接的,可靠的,基于字节流的传输层通信协议。

        UDP:用户数据报协议,无连接的传输协议,为应用程序提供了一种无需连接就可以发送封装的IP数据包的方法。

        区别:

  1. TCP面向连接,通过三次握手来建立连接,四次挥手解除连接,UDP是无连接的,即发送数据之前 不需要连接,UDP的传输效率很高,到那时无法确保数据的发送成功。
  2. TCP是可靠的通信方式,通过TCP连接传送数据,TCP要通过超时重传,数据校验等方式来确保数据无差错,不丢失,不重复,且按序到达,而UDP由于无需连接的原因,将会以最大的速度进行传输,但是不保证可靠交付,可能会出现丢失,重复的问题。
  3. TCP是面向字节流,实际上是TCP把数据看成一连串无结构的字节流,由于连接问题,当网络出现波动,可能会出现响应问题,UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送效率降低。
  4. 每一条TCP连接只能是点到点,UDP不建立连接, 所以可以支持,一对一,一对多,多对一,多对多的交互通信,也就是可以同时接受多人的包。
  5.  TCP需要建立连接,首部开销20字节相比8个字节的UDP显得比较大。
  6. TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。

7,TCP 为什么需要三次握手和四次挥手?

        1,TCP的三次握手:为了确保连接可靠的方式。

        第一次:A给B发短信说:“B,你现在有空吗?”(建立连接,客户端A发送SYN包(SYN=j)到服务器B,并且进入SYN_SENT状态,等待服务器A确认,SYN:同步序列编号)

        第二次:B接收到A的消息,B对A说:“我有空,你呢?”(服务器B收到SYN包,必须确认客户A的SYN(ack=j+1),同时自己也要发送一个SYN包(SYN=k),SYN+ack包,此时服务器B进入SYN_RECV状态)

        第三次:A接收到B的消息,A对B说:“我也有,那我给你说个事情”(客户端A接收到服务器B的SYN+ack包,向服务器B发送确认包ACK(ack=k+1),此时包发送完毕,客户端A和服务器B进入ESTABLISHED(TCP连接成功)状态)

        在三次握手之后,A和B都可以确认的是,双方的通信可以流畅的进行,这样双方就可以开始进行正常的对话了。

        2,TCP的四次挥手:为了确保连接可靠关闭的方式:

        第一次挥手: A给B发短信说:“B,任务处理完毕,我希望断开连接”(客户端A的应用程序通知TCP数据已经发送完毕时,TCP向服务器B发送一个带有FIN附加标记的报文段)

        第二次挥手: B此时收到了A的信息,然后先对A说: “ 哦,是吗?请稍等,我准备一下。等待片刻后……”(服务器B收到这个FIN报文段之后,不立即用FIN回复客户端A,而是先向客户端A发送一个确认序列号ACK,同时通知自己的应用程序:客户端A要求关闭连接(目的就是先发送ACK防止客户端A再次发送FIN))

        第三次挥手: B对A说到: “ 我准备好了. 可以断开连接”然后断开连接,(服务器B告诉客户端A,我要彻底关闭连接,TCP 向客户端A发送一个FIN报文段)

        第四次挥手: A此时收到了B的确认信息,然后想B发一个包说:“好的,谢谢合作。”这时才断开连接。(客户端A收到FIN报文段之后,向服务器B发送一个ACK表示彻底断开连接)

        在四次挥手之后,A和B都能确定这么一件事: 双方的通信可以正常关闭。 这样,双方就可以确定对方已经完全知晓自己确认要关闭连接。

8,HTTP 和 HTTPS 协议的区别?

1、HTTPS  协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。

2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。

3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、HTTP 的连接很简单,是无状态的(其数据包的发送、传输和接收都是相互独立的。)。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会Java的MING

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值