操作系统 面试题(二)

PART1

1.乐观锁和悲观锁的区别是什么?

2.乐观锁和悲观锁的实现方式分别有哪些?

3.平均周转时间如何计算?

4.银行家算法是什么?

5.IO多路复用是什么?

6.HTTP的头部包含哪些内容?

7.TCP如何保持连接?

8.如何让UDP协议变得可靠?

9.多进程和多线程之间的区别?

  1. HTTP中get和post的区别

PART2

1.乐观锁和悲观锁的区别是什么?

乐观锁认为每次访问共享数据时,其他线程不会修改该共享数据,所以不加锁,只在更新该共享数据时,检查该共享数据在此期间是否被修改。适用于写较少的情况。

悲观锁认为每次访问共享数据时,其他线程会修改共享数据,所以加锁 ,独占共享数据,直到使用完毕才释放锁。适用于写较多的情况。

2.乐观锁和悲观锁的实现方式分别有哪些?

乐观锁:

CAS算法:保留最初访问时共享数据的值,更新前,核对该数据是否与内存中数据相等,若相等,则修改。若不相等,则不修改。比较和替换是一个原子操作。这是一个自旋操作,即不停地重试。

版本号机制:更新数据前,核对版本号,版本号代表数据更新次数,若最初读取数据时的版本号和提交更新时的版本号一致,则修改数据,且版本号加一。否则,不修改。

悲观锁:

java中synchronized关键字,每次只允许一个线程访问synchronized修饰的函数或代码块,其他线程被阻塞。

数据库SQL语句后加for update,锁定该条数据,使得其他用户无法进行增删查改。

3.平均周转时间如何计算?

周转时间 = 作业完成时间 - 作业到达时间

平均周转时间 = 所有作业周转时间/作业数量

4.银行家算法是什么?

当一个进程申请资源时,先试探性地分配给它,然后通过安全性算法判断分配后的系统是否处于安全状态。若不处于,则不分配给该进程,该进程继续等待。

安全性算法:给申请资源的进程分配资源后,查看剩余可用的资源能否使某个进程执行完毕。若没有进程可以执行完毕,那么系统处于不安全状态。若有进程可以执行完毕,则收回该进程的资源,继续判断是否有进程可以执行完毕,直到所有进程都执行完毕,按照进程执行完毕的顺序,可以得到一个安全序列,使得系统处于安全状态,避免死锁。

5.IO多路复用是什么?

IO多路复用是一种同步的I/O模型,允许单个线程处理多个IO请求。通过一次系统调用,检查多个文件描述符。若有文件描述符就绪,就返回该文件描述符,否则阻塞调用进程,直到某个文件描述符就绪或者阻塞时长超出阈值。

6.HTTP的首部包含哪些内容?

HTTP的首部包含了请求行和报文头。

请求行中包括请求方法、URL和HTTP协议和版本。

报文头中包含多个字段(字段名:字段值)

例如Accept指定了可以接收的数据类型

Referer表明了该请求的来源是哪个网页(点击了Referer指明的这个网址来发起的请求)

详细见图:

7.TCP如何保持连接?

有两种方法:

1)在客户端和服务器端设置一个超时时间,在超时时间内如果没有发送数据,就发送一个心跳包来保持连接,同时也可也侦测连接是否异常断开。

2)设置TCP的 keep alive属性,设置方法心跳包的事件间隔。这样TCP会在底层定时发送心跳包,服务器端收到心跳包直接丢弃,这样就保持了长连接。

8.如何让UDP协议变得可靠?

UDP协议没有流控制,没有应答确认机制,不能解决丢包,重发,乱序等问题。

为了实现UDP协议的可靠性,我们可以从以下几点考虑:

1)重传机制:丢包需要进行重传,使用ACK或者NACK来进行应答确认。

2)重排机制:收到乱序数据,使用一个缓冲区来进行数据重拍

3)超时机制:长时间未收到对方回复,需要进行重试。

9.多进程和多线程之间的区别?

|---------|----------------------------------------------|-------------------------|
| | 多进程 | 多线程 |
| 数据共享、同步 | 数据共享复制,需要进行进程间通信。数据分开存储,每个进程有自己独立的地址空间,同步简单。 | 多个线程共享了进程的数据,共享简单,同步复杂。 |
| 内存、CPU | 占用内存多,进程间切换开销大,CPU利用率低 | 占用内存少,切换简单,CPU利用率高 |
| 创建销毁 | 创建销毁的开销大,速度慢 | 创建销毁的开销小,速度块 |
| 可靠性 | 进程间不会互相影响 | 一个线程奔溃,会影响其他线程 |
| 编程调试 | 编程调试简单 | 编程调试复杂 |
| 分布式 | 适合多核、多机分布式 | 适合多核分布式 |

优先使用线程:

  • 频繁创建销毁
  • 大量计算
  • 强相关的任务
  1. HTTP中get和post的区别

|------------------------------|-----------------------------------|
| get | post |
| 请求参数直接附在URL的后面,用户可以在浏览器地址栏看见 | 请求参数放在请求体中 |
| 数据容量有限,因为请求参数是附在URL之后的 | 请求体中的数据容量没有限制 |
| 浏览器会主动缓存get请求 | 浏览器不会主动缓存post请求 |
| 只会发送一个TCP包 | 会发送两个TCP包,先发送报文头,收到服务器的响应后,再发送报文体 |
| 进行回退和刷新不会产生任何影响 | 进行回退和刷新会重新提交请求 |
| 可以收藏书签 | 不可以收藏书签 |

相关推荐
电饭叔20 分钟前
《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学
开发语言·python
Eternal-Student21 分钟前
everyday_question dq20240731
开发语言·arm开发·php
极客先躯25 分钟前
高级java每日一道面试题-2024年10月3日-分布式篇-分布式系统中的容错策略都有哪些?
java·分布式·版本控制·共识算法·超时重试·心跳检测·容错策略
卑微求AC37 分钟前
(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题
c语言·开发语言
夜月行者1 小时前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm
程序猿小D1 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
Yvemil71 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
潘多编程1 小时前
Java中的状态机实现:使用Spring State Machine管理复杂状态流转
java·开发语言·spring
_阿伟_1 小时前
SpringMVC
java·spring
代码在改了1 小时前
springboot厨房达人美食分享平台(源码+文档+调试+答疑)
java·spring boot