当前位置: 首页 > news >正文

【操作系统】操作系统基础必知必会

操作系统基础必知必会

简单说下你对并发和并行的理解?

  • 并行是指两个或者多个事件在 同一时刻 发生;而并发是指两个或多个事件在 同一时间间隔 发生;
  • 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件;

同步和异步的区别?

同步:同步是指一个进程在执行某个请求的时候,如果该请求需要一段时间才能返回信息,那么这个进程会一直等待下去,直到收到返回信息才继续执行下去。

异步:异步是指进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程的状态,当有信息返回的时候会通知进程进行处理,这样就可以提高执行的效率了,即异步是我们发出的一个请求,该请求会在后台自动发出并获取数据,然后对数据进行处理,在此过程中,我们可以继续做其他操作,不管它怎么发出请求,不关心它怎么处理数据。

也就是说,同步需要按部就班地走完一整个流程,完成一整个动作。打个比方:同步的时候,你在写程序,然后你妈妈叫你马上拖地,你就必须停止写程序然后拖地,没法同时进行。而异步则不需要按部就班,可以在等待那个动作的时候同时做别的动作,打个比方:你在写程序,然后你妈妈让你马上拖地,而这时你就贿赂你弟弟帮你拖地,于是结果同样是拖好地,你可以继续敲你的代码,而不用管地是怎么拖的。

阻塞和非阻塞?

  • 阻塞:是指调用结果返回前,当前线程会被挂起,即阻塞。
  • 非阻塞:是指即使调用结果没返回,也不会阻塞当前线程。

进程与线程的区别?

  • 进程是资源分配的最小单位,而线程是 CPU 调度的最小单位;
  • 创建进程或撤销进程,系统都要为之分配或回收资源,操作系统开销远大于创建或撤销线程时的开销;
  • 不同进程地址空间相互独立,同一进程内的线程共享同一地址空间。一个进程的线程在另一个进程内是不可见的;
  • 进程间不会相互影响,而一个线程挂掉将可能导致整个进程挂掉;

什么是协程?

协程是用户视角的一种抽象,操作系统并没有这个概念,其主要思想是在用户态实现调度算法,用少量线程完成大量任务的调度。协程需要解决线程遇到的几个问题:

  • 内存占用要小,且创建开销要小。
  • 减少上下文切换的开销。

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。从技术的角度来说,协程就是你可以暂停执行的函数。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

从线程到协程,进一步降低了上下文切换的开销,使得高并发的服务可以使用简单的代码写出来,技术的每一步发展都是为了解决实际问题。

线程与协程的区别?

  • 一个线程可以多个协程,一个进程也可以单独拥有多个协程。
  • 线程进程都是同步机制,而协程则是异步。
  • 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。
  • 线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。
  • 协程并不是取代线程,而且抽象于线程之上,线程是被分割的 CPU 资源,协程是组织好的代码流程,协程需要线程来承载运行,线程是协程的资源,但协程不会直接使用线程,协程直接利用的是执行器(Interceptor),执行器可以关联任意线程或线程池。
  • 线程是协程的资源。协程通过 Interceptor 来间接使用线程这个资源。

进程间的通信方式有哪些?

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC 的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams 等。其中 Socket 和 Streams 支持不同主机上的两个进程 IPC。

  • 管道
    • 它是半双工的,具有固定的读端和写端;
    • 它只能用于父子进程或者兄弟进程之间的进程的通信;
    • 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
  • 命名管道
    • FIFO 可以在无关的进程之间交换数据,与无名管道不同;
    • FIFO 有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。
  • 消息队列
    • 消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符 ID 来标识;
    • 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级;
    • 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除;
    • 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
  • 信号量
    • 信号量(semaphore)是一个计数器。用于实现进程间的互斥与同步,而不是用于存储进程间通信数据;
    • 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存;
    • 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作;
    • 每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数;
    • 支持信号量组。
  • 共享内存
    • 共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区;
    • 共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。

进程的调度算法有哪些?

  • 先来先服务
  • 时间片轮转
  • 短作业优先
  • 最短剩余时间优先
  • 高响应比优先
  • 优先级

死锁和产生死锁的原因?

由于系统中存在一些 不可剥夺资源,而当两个或两个以上进程占有自身资源,并请求对方资源时,会导致每个进程都无法向前推进,这就是死锁。

  • 竞争资源
  • 进程推进顺序不当

死锁产生的必要条件?

  • 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
  • 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
  • 不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
  • 环路等待条件:在发生死锁时,必然存在一个进程-资源的环形链。

解决死锁的基本方法?

  • 预防死锁
  • 避免死锁
  • 检测死锁
  • 解除死锁

怎么预防死锁?

  • 破坏请求条件:一次性分配所有资源,这样就不会再有请求了;
  • 破坏请保持条件:只要有一个资源得不到分配,也不给这个进程分配其他的资源:
  • 破坏不可剥夺条件:当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源;
  • 破坏环路等待条件:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反。

怎么避免死锁?

  • 银行家算法
  • 安全序列
  • 系统安全序列

怎么解除死锁?

  • 资源剥夺:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他死锁进程(但应该防止被挂起的进程长时间得不到资源);
  • 撤销进程:强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源(撤销的原则可以按进程优先级和撤销进程代价的高低进行);
  • 进程回退:让一个或多个进程回退到足以避免死锁的地步。进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。

分页与分段的区别?

  • 段是信息的逻辑单位,它是根据用户的需要划分的,因此段对用户是可见的 ;页是信息的物理单位,是为了管理主存的方便而划分的,对用户是透明的;
  • 段的大小不固定,有它所完成的功能决定;页大大小固定,由系统决定;
  • 段向用户提供二维地址空间;页向用户提供的是一维地址空间;
  • 段是信息的逻辑单位,便于存储保护和信息的共享,页的保护和共享受到限制。

物理地址、逻辑地址、虚拟内存的概念。

  • 物理地址:它是地址转换的最终地址,进程在运行时执行指令和访问数据最后都要通过物理地址从主存中存取,是内存单元真正的地址
  • 逻辑地址:是指计算机用户看到的地址。例如:当创建一个长度为 100 的整型数组时,操作系统返回一个逻辑上的连续空间:指针指向数组第一个元素的内存地址。由于整型元素的大小为 4 个字节,故第二个元素的地址时起始地址加 4,以此类推。事实上,逻辑地址并不一定是元素存储的真实地址,即数组元素的物理地址(在内存条中所处的位置),并非是连续的,只是操作系统通过地址映射,将逻辑地址映射成连续的,这样更符合人们的直观思维。
  • 虚拟内存:是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

页面置换算法有哪些?

  • 先进先出置换算法(FIFO):先进先出,即淘汰最早调入的页面。
  • 最佳置换算法(OPT):选未来最远将使用的页淘汰,是一种最优的方案,可以证明缺页数最小。
  • 最近最久未使用(LRU)算法:即选择最近最久未使用的页面予以淘汰
  • 时钟(Clock)置换算法:也叫最近未用算法 NRU(Not RecentlyUsed)。该算法为每个页面设置一位访问位,将内存中的所有页面都通过链接指针链成一个循环队列。

相关文章:

  • 容错限流框架之Hystrix上
  • ES6模块
  • vim 多行注释
  • 基于MATLAB的迭代学习控制(Iterative Learning Control,ILC)算法的仿真与分析
  • 【LEACH协议】基于matlab最佳簇半径的无线传感器网络分簇路由算法【含Matlab源码 2087期】
  • PDA手持机轻松解决库存盘点难题支持一维二维码扫描
  • vscode启动不了,折腾了半天发现已经不支持win7
  • 【智能优化算法-麻雀搜索算法】基于萤火虫结合麻雀搜索算法求解单目标优化问题附matlab代码
  • 22-09-04 西安 谷粒商城(01)MySQL主从复制、MyCat读写分离、MyCat分库分表
  • 猿创征文|Python3,10分钟写了一个WIFI 万(破) 能 (解) 钥 (神) 匙 (器),YYDS。
  • 【每日一练】图解:链表内指定区间反转
  • Java 进阶多线程(一)
  • Softing物联网(IoT)方案之OT/IT数据集成
  • 第13讲:DCL类型的SQL语句之用户管理
  • Python实战回归模型-消费者人群画像-信用智能评分(基于中国移动用户数据)
  • 【347天】每日项目总结系列085(2018.01.18)
  • 3.7、@ResponseBody 和 @RestController
  • create-react-app项目添加less配置
  • ES6 ...操作符
  • input实现文字超出省略号功能
  • JavaScript服务器推送技术之 WebSocket
  • js操作时间(持续更新)
  • Meteor的表单提交:Form
  • Promise初体验
  • Protobuf3语言指南
  • Spring-boot 启动时碰到的错误
  • storm drpc实例
  • vue的全局变量和全局拦截请求器
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 多线程事务回滚
  • 给第三方使用接口的 URL 签名实现
  • 和 || 运算
  • 前端设计模式
  • 如何用vue打造一个移动端音乐播放器
  • 思否第一天
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #android不同版本废弃api,新api。
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)RocketMQ初步认识
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net打印*三角形
  • .stream().map与.stream().flatMap的使用
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @RequestMapping-占位符映射
  • [2016.7 day.5] T2
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大