操作系统 面试题(二)

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包,先发送报文头,收到服务器的响应后,再发送报文体 |
| 进行回退和刷新不会产生任何影响 | 进行回退和刷新会重新提交请求 |
| 可以收藏书签 | 不可以收藏书签 |

相关推荐
晴殇i1 小时前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
孟陬1 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌2 小时前
一站式了解四种限流算法
java·后端·go
绝无仅有2 小时前
Redis过期删除与内存淘汰策略详解
后端·面试·架构
绝无仅有2 小时前
Redis大Key问题排查与解决方案全解析
后端·面试·架构
华仔啊2 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java
AAA梅狸猫3 小时前
Looper.loop() 循环机制
面试
AAA梅狸猫3 小时前
Handler基本概念
面试
也些宝3 小时前
Java单例模式:饿汉、懒汉、DCL三种实现及最佳实践
java