操作系统常用知识总结(基本结构+磁盘+进程)

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

基本结构

冯诺依曼计算机模型

现代计算机模型是基于冯诺依曼计算机模型。

计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。

接下来,再取出第二条指令,在控制器的指挥下完成规定操作,依此进行下去。直至遇到停止指令。

计算机组成部分:

在这里插入图片描述

控制器(Control):

  • 功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。

运算器(Datapath):

  • 运算器的功能是对数据进行各种算术运算和逻辑运算,即对数据进行加工处理。

存储器(Memory):

  • 存储器的功能是存储程序、数据和各种信号、命令等信息,并在需要时提供这些信息。

输入(Input system):

  • 输入设备与输出设备合你为外部设备,简称外设,输入设备的作用是将程序、原始数据、文字、字符、控制命令或现场采集的数据等信息输入到计算机。
  • 常见的输入设备有键盘、鼠标器、光电输入机、磁带机、磁盘机、光盘机等。

输出(Output system):

  • 它把外算机的中间结果或最后结果、机内的各种数据符号及文字或各种控制信号等信息输出出来。
  • 微机常用的输出设备有显示终端CRT、打印机、激光印字机、绘图仪及磁带、光盘机等。

磁盘

磁盘调度算法

读写一个磁盘块的时间的影响因素有:

  • 旋转时间(主轴转动盘面,使得磁头移动到适当的扇区上)
  • 寻道时间(制动手臂移动,使得磁头移动到适当的磁道上)
  • 实际的数据传输时间

其中,寻道时间最长,因此磁盘调度的主要目标是使磁盘的平均寻道时间最短。

先来先服务

FCFS, First Come First Served,按照磁盘请求的顺序进行调度。

优点是公平和简单,缺点是:因为未对寻道做任何优化,使平均寻道时间可能较长。

最短寻道时间优先

SSTF,优先调度与当前磁头所在磁道距离最近的磁道。

虽然平均寻道时间比较低,但是不够公平。

如果新到达的磁道请求总是比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。

具体来说,两端的磁道请求更容易出现饥饿现象。

电梯算法

电梯算法(扫描算法)和电梯的运行过程类似,总是按一个方向来进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。

因为考虑了移动方向,因此所有的磁盘请求都会被满足,解决了 SSTF 的饥饿问题。

进程

进程和线程

进程:正在执行的应用程序,线程是轻量级的进程, 进程是分配资源的基础单位。

线程:轻量级进程,是程序执行的基本单位。

线程是进程的一部分,一个线程只能属于一个进程,一个进程可以有多个线程,但至少有一个线程。

每个进程都有独立的代码和数据空间(程序上下文),程序间的切换开销大,每个线程都有自己独立的运行栈和程序计数器(PC),线程间切换开销小。

互斥和同步区别

互斥:是指在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。

同步:是指在不同进程之间的若干程序片断,它们的运行必须严格按照规定的 某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。

孤儿进程

一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。

孤儿进程将被init进程所收养,并由init进程对它们完成状态收集工作。

僵尸进程

一个进程使用fork创建子进程,如果子进程退出,而父进程没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程(这个子进程)称之为僵尸进程。

如何清除僵尸进程?

改写父进程,为子进程收尸:具体做法是接收SIGCHLD信号,子进程死后会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为其(子进程)进行收尸。

就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,默认处理为忽略,我们可以设置一个函数来对其进行处理。

如果把这个子进程(僵尸进程)的父进程杀掉,僵尸进程会变为孤儿进程,由init进程进行管理,init负责进行清理僵尸进程。

守护进程

守护进程就类似于一个后台进程。

进程状态

创建状态:

  • 进程由创建而产生。

就绪状态:

  • 进程已经准备好运行的状态,即进程已分配到除CPU以外所有的必要资源后,只要再获得CPU,便可立即执行。

运行状态:

  • 进程已经获取CPU,其进程处于正在执行的状态。

阻塞状态:

  • 正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态,即进程执行受到阻塞。

终止状态

在这里插入图片描述

进程通信

管道:

写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则。

管道这种通信方式效率低,不适合进程间频繁地交换数据。

消息队列:

消息队列不适合比较大数据的传输,因为在内核中每个消息体都有一个最大长度的限制。

消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销,因为进程写入数据到内核中的消息队列时,会发生从用户态拷贝数据到内核态的过程,同理另一进程读取内核中的消息数据时,会发生从内核态拷贝数据到用户态的过程。

共享内存:

共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。

这样这个进程写入的东西,另外一个进程马上就能看到了,都不需要拷贝来拷贝去,传来传去,大大提高了进程间通信的速度。

信号量:

用了共享内存通信方式,带来新的问题,那就是如果多个进程同时修改同一个共享内存,很有可能就冲突了。

例如两个进程都同时写一个地址,那先写的那个进程会发现内容被别人覆盖了 。

为了防止多进程竞争共享资源,而造成的数据错乱,所以需要保护机制,使得共享的资源,在任意时刻只能被一个进程访问。

正好,信号量就实现了这一保护机制。

信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据

信号:

信号是进程间通信机制中唯一的异步通信机制,因为可以在任何时候发送信号给某一进程。

Socket:

要想跨网络与不同主机上的进程之间通信,就需要 Socket 通信了。

操作系统执行一个程序的过程

操作系统检测类型是否是可执行文件。

创建进程,并且将可执行文件映射到该进程。

为该进程设置CPU上下文环境。

将代码和数据从磁盘读入内存。

运行过程中发生缺页异常则重复4。

死锁

多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放其他资源,在未改变这种状态之前都不能向前推进,多个进程无限期相互等待 的一种状态。

四个必要条件

死锁产生的 4 个条件(有一个条件不成立,则不会产生死锁):

互斥:一个资源一次只能被一个进程使用

请求与保持:一个进程因请求资源而阻塞时,对已获得资源保持不放

非抢占:进程获得的资源,在未完全使用完之前,不能强行抢占

循环等待:若干进程之间形成一种头尾相接的环形等待资源关系

死锁处理方法

死锁的四个处理方法:

鸵鸟策略:忽略掉死锁,视而不见

死锁检测与恢复:允许死锁发生,检测它们是否发生,一旦发生死锁,就采取行动解决问题

死锁避免:仔细对资源进行分配,动态地避免死锁,银行家算法是避免死锁的经典算法

死锁预防:破坏引起死锁的 4 个必要条件

银行家算法

银行家算法的主要思想是避免系统进入不安全状态。

在每次进行资源分配时,它首先检查系统是否有足够的资源满足要求,如果有,则先进行分配,并对分配后的新状态进行安全性检查。

如果新状态安全,则正式分配上述资源,否则就拒绝分配上述资源,这样,它保证系统始终处于安全状态,从而避免死锁现象的发生。

安全状态

安全状态与不安全状态的区别是,从安全状态出发,系统能够保证所有的进程都能完成;而从不安全状态出发,没有这样的保证。

活锁

活锁指进程并没有被阻塞,但由于某些条件没有满足,导致一直重复尝试、失败、尝试、失败。

进程仍可以在 CPU 上活动,但 CPU 时间片执行完了之后又下了 CPU,进程没有任何进展但也没有阻塞。

饥饿

进程无限等待的情况。饥饿 ≠ 死锁,但是饥饿至少有一个进程的执行被无限期推迟。

产生饥饿的原因:往往是由于资源分配策略的 不公平性 导致的,比如短作业优先。

此时系统虽然没有发生死锁,某些进程也可能会一直得不到 CPU 的使用权而长时间等待。

当 饥饿 到一定程度,进程任务即使完成也不再具有实际意义时称该进程被饿死。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1486067.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

适配器模式详解和应用

目录 适配器模式适配器模式结构适配器模式适用场景适配器模式优缺点练手题目题目描述输入描述输出描述题解 适配器模式 适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。 适配器模式结构 对象适配器 实现时使用了构成原则: 适…

重复图片查找:巧用Python和OpenCV进行图像哈希与汉明距离检测以从海量图片中找出重复图片

重复图片查找:巧用Python和OpenCV进行图像哈希与汉明距离检测以从海量图片中找出重复图片 1. 导言2. 环境准备3. 图像哈希(pHash)原理4. 汉明距离原理5. 代码实现导入必要的库图像哈希计算函数汉明距离计算函数查找重复图片函数示例使用 在处…

C++:内存管理(new,delete)

目录 C/C内存分布 C语言内存管理 C内存管理: new和delete的原理 new delete malloc/free和new/delete的区别 C/C内存分布 在C/C中,都有一块虚拟地址,内部井然有序的将代码分成了几部分,如下表: 栈:…

C++实现LRU缓存(新手入门详解)

LRU的概念 LRU(Least Recently Used,最近最少使用)是一种常用的缓存淘汰策略,主要目的是在缓存空间有限的情况下,优先淘汰那些最长时间没有被访问的数据项。LRU 策略的核心思想是: 缓存空间有限&#xff1…

深入浅出C语言指针(进阶篇)

深入浅出C语言指针(基础篇) 深入浅出C语言指针(进阶篇) 目录 引言 一、指针和数组 1.数组名的理解 2.指针访问数组 3.一维数组传参的本质 二、二级指针 1.二级指针的概念 2.二级指针的内存表示 3.二级指针的解引用 三、字符指针 1.指针指向单个字符 2.指针指向字…

【目标检测】Anaconda+PyTorch配置

前言 本文主要介绍在windows系统上的Anaconda、PyTorch关键步骤安装,为使用yolo所需的环境配置完善。同时也算是记录下我的配置流程,为以后用到的时候能笔记查阅。 Anaconda 软件安装 Anaconda官网:https://www.anaconda.com/ 另外&#…

Golang | Leetcode Golang题解之第278题第一个错误的版本

题目: 题解: func firstBadVersion(n int) int {return sort.Search(n, func(version int) bool { return isBadVersion(version) }) }

Elasticsearch基础(六):使用Kibana Lens进行数据可视化

文章目录 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 二、基础可视化 1、指标可视化 2、垂直堆积条形图 3、表格 三、高级可视化 1、多图层和索引 2、子桶 3、树状图 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 在Kibana主页,单击页面…

vxe-table——实现切换页码时排序状态的回显问题(ant-design+elementUi中table排序不同时回显的bug)——js技能提升

之前写的后台管理系统,都是用的antdelement,table组件中的【排序】问题是有一定的缺陷的。 想要实现的效果: antv——table组件一次只支持一个参数的排序 如下图: 就算是可以自行将排序字段拼接到列表接口的入参中&#xff0c…

Druid【基础 01】是什么+主要特点+设计原则+架构+数据结构(简单入门Druid)

Druid入门 1. 是什么2. 主要特点3. 三个设计原则4. Architecture 架构5. 数据结构5.1 DataSource 结构5.2 Segment 结构 Druid 非中文官网,内容不少且介绍的挺详细的,需要英文阅读能力或者翻译工具进行辅助。 1. 是什么 先看看官网怎么说: A…

请你谈谈:spring bean的生命周期 - 阶段5:BeanPostProcessor前置处理-自定义初始化逻辑-BeanPostProcess后置处理

BeanPostProcessor的postProcessBeforeInitialization方法是在bean的依赖注入(即属性填充)完成后,但在bean的初始化回调(如PostConstruct注解的方法或InitializingBean接口的afterPropertiesSet方法)之前被调用的。 具…

证书上的服务器名错误解决方法

方法 win r ,输入mmc 点击文件——>添加/删除管理单元 找到证书——> 添加 根据自己的存放选择存放位置 点击控制台根节点——> 受信任的根证书颁发机构——>导入 若还出现问题,则参考https://blog.csdn.net/mm120138687/article/details/…

立创梁山派--移植开源的SFUD万能的串行 Flash 通用驱动库

SFUD是什么 关于SFUD库的介绍,其开源链接(gitee,github)已经详细的阐述了. 这里是截取自它的一部分介绍: SFUD 是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差异, SF…

Apache Tomcat文件包含漏洞复现(详细教程)

1.漏洞原理 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,其安装后会默认开启ajp连接器,方便与其他web服务器通过ajp协议进行交互。属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和…

【接口自动化_07课_Pytest+Excel+Allure完整框架集成_下】

目标:优化框架场景 1. 生成对应的接口关联【重点】 2. 优化URL基础路径封装【理解】 3. 利用PySQL操作数据库应用【理解】--- 怎么用python连接数据库、mysql 4. 通过数据库进行数据库断言【重点】 5. 通过数据库进行关联操作【重点】 一、接口关联&#xff1a…

MSP430M03507最小系统板的keil环境搭配,用keil编辑ti单片机

转载自嘉立创MSP430M03507开发手册 这篇文章只是因为我的keil版本与嘉立创的不一样,所以添加了我自己遇到的问题解析 先说说为什么要用keil编辑,因为ti单片机自己的ccs编译环境需要对应仿真器,那个加芯片都240了,哪有那么多钱买…

node.js中nodemon : 无法加载和使用问题,这是由于windows安全策略影起的按如下操作即可

1、用管理员权限打开vscode 2、文件终端中打开,输入 Set-ExecutionPolicy -Scope CurrentUser 3、再输入RemoteSigned 4、使用get-ExecutionPolicy查看权限,可以看到变为了RemoteSigned 重启问题解决

MySQL面试索引篇

1、什么是索引? 作为一个数据库,首要任务就是把数据存储好,并快速查询出用户需要的数据,而索引就相当于图书的目录一样,是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。 …

TypeScript 教程(九):类型声明文件与异步编程

目录 前言回顾装饰器与高级类型操控1. 类型声明文件a. 什么是类型声明文件(.d.ts)b. 编写和使用类型声明文件 2. 异步编程a. Promise 类型b. async/awaitc. 异步迭代器 3. 并行执行与错误处理a. Promise.allb. Promise.racec. 错误处理 结语 前言 在前几…

华为云.云日志服务LTS及其基本使用

云计算 云日志服务LTS及其基本使用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550…