面试问题之操作系统
时间:2022-07-28
本文章向大家介绍面试问题之操作系统,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
操作系统
服务器、手机、智能家居
关注点在业务逻辑:让我们的程序与操作系统打交道,其他细节交给操作系统与设备。
进程与线程?(Process vs. Thread?)
进程和线程基础(偏理论概念)
1. 定义
进程是资源(CPU、内存等)分配的基本单位,具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是独立运行和独立调度的基本单位(CPU上真正运行的是线程)。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
2.区别
- 进程是资源分配的基本(最小)单位;线程是程序执行的基本(最小)单位。
- 进程拥有自己的资源空间,没启动一个进程,系统就会为它分配地址空间;而线程与CPU资源分配无关,多个线程共享同一进程内的资源,使用相同的地址空间。
- 一个进程可以包含若干个线程。
3. 区别带来的优劣势
- 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
- 线程的调度与切换比进程快很多,同时创建一个线程的开销也比进程要小很多。
- 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
为什么这个问题是面试高频?
既然这个问题是面试当中会被经常问到的,所以我去网上找一个答案,背出来不就好了。
但是,真的背答案就可以了吗?
我们要知道面试官可能根本想听到的并不是一个书本上概念的重复,他究竟想考到什么?
- 侧重点一:面试官想要了解面试者对操作系统的理解程度,因为这是操作系统中不得不提的一个概念。如果这个概念回答不上来,意味着面试者对操作系统的学习并不深。
- 侧重点二:面试官可以对你的回答作进一步展开,通过你的回答某个侧重点方向来进一步提问你对这个问题的了解程度。(这个高频问题的价值所在)。
比如:
- 当你回答:内存结构不同。进程与进程之间不能共享内存,而线程可以。那么就深入提问,内存如何寻址?
- 当你回答:线程之间通信很方便,进程与进程通信不方便。那么问题就又来了,你给我说一下进程之间怎么通信?进程之间通信方法有哪些?不同通信方法有哪些优劣点?
如何用自己的理解向面试官展示一个满意的答案?
进程:(是一个容器)
- 进程与进程之间相对独立
- 进程包括几个或者上百个线程在跑
- 内存(逻辑内存)包括在进程里面,每个进程的内存都是互相独立的
- 进程共有文件/网络句柄(handle),打开同一个文件,抢同一个网端端口
线程:(真正运行的一个一个地线程)
- 调用栈(堆栈):主线程的入门main函数,进行函数调用,参数和返回地址、局部变量等压入栈内
- PC(Program Couner),地址,PC的指针指向代码所在的内存。 缓冲区溢出:检测用户名长度不要超过存储程序那部分
- TLS(Thread local storage):分配内存,存放变量
展开内容:
- 怎么交互:进程可以通过TCP/IP端口交互,而线程会共享内存,指针指向同一个内容,交互很容易。
- 进程开销很大,进程只需要分配栈,分配一个PC就好。
推荐先看一下阮一峰的一篇博客:进程与线程的一个简单解释,用图解释十分生动形象。
存储与寻址
存储
硬盘(容量大)-->内存(快速随机访问)--> 缓存 --> 寄存器
寻址
寻址空间:指针能寻找到的地址
- 32位 --> 4G
- 64位 --> ~10^18 Bytes
- 64位JVM --> 可使用更大内存,需重新编译
// 寻址
int n = *p; // --> MOV EAX, [EBX]
过程解释:
分页
进程管理、内存管理和文件管理是操作系统的三大核心功能。
- 内存是操作系统里面的另一个核心概念。它是进程的存放场所。如何对内存进行管理,使得数据的读写具有高效率、高安全、高空间利用率和位置透明的特性是内存管理所要达到的目的。
- 文件是操作系统提供的外部存储设备的抽象,它是程序和数据的最终存放地点。如何让用户的数据存放变得容易、方便、可靠和安全是文件系统要解决的问题。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Scrapy中将item字段转为简体or繁体
- Mac OS 安装Fiddler
- Python requests模块解析XML
- python requests提示警告InsecureRequestWarning
- python进程池:multiprocessing.pool
- AttributeError: 'list' object has no attribute 'keys'
- raise ValueError("Cannot convert {0!r} to Excel".format(value))
- ImportError: cannot import name 'Process' from 'multiprocessing'
- mac卸载mysql
- 不可错过的Webpack核心知识点
- APP+Web混合全局版的几种布署方法
- 关于合并pdf文件出现的问题
- Python中的with是测试常用到的资源打开利
- python批量运行py文件
- beautifulsoup的使用