操作系统 面试题(二)

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

相关推荐
不爱学习的YY酱2 分钟前
【计网不挂科】计算机网络第二章< 物理层 >习题库(含答案)
java·数据库·计算机网络
一丝晨光10 分钟前
gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?
c语言·开发语言·c++·gnu·clang·gcc·g++
南城花随雪。21 分钟前
Spring框架之装饰者模式 (Decorator Pattern)
java·开发语言·装饰器模式
编程、小哥哥25 分钟前
设计模式之装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)
java·设计模式·装饰器模式
究极无敌暴龙战神X26 分钟前
前端学习之ES6+
开发语言·javascript·ecmascript
虞书欣的632 分钟前
Python小游戏24——小恐龙躲避游戏
开发语言·python·游戏·小程序·pygame
FHYAAAX39 分钟前
【机器学习】任务十:从函数分析到机器学习应用与BP神经网络
开发语言·python
汉克老师1 小时前
GESP4级考试语法知识(贪心算法(四))
开发语言·c++·算法·贪心算法·图论·1024程序员节
nameofworld1 小时前
前端面试笔试(二)
前端·javascript·面试·学习方法·数组去重
摇光932 小时前
promise
前端·面试·promise