操作系统

Posted 一星一辰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统相关的知识,希望对你有一定的参考价值。

进程管理与实体

操作系统主要功能:

  • 处理器资源管理
  • 存储器管理
  • I\\O设备管理
  • 文件管理
  • 操作系统统一管理这些计算机资源

优点:用户无需面向硬件接口编程(直接面向操作系统编程)、I\\O设备管理软件提供读写接口、文件管理软件提供操作文件接口、操作系统实现了对计算机资源的抽象,提供了用户与计算机的接口:图形窗口的形式、命令的形式、系统调用的形式

image-20210603061004401

没有配置OS之前,资源就是属于当前的程序

配置OS之后,引入多道程序设计的概念

合理的隔离资源、运行环境、提高资源的利用率

操作系统相关概念

单处理器:程序是并发的执行

双处理器或者多处理器:每个处理器上的程序都是交替运行的某个时刻程序都是并行执行的

  • 并发性(在一个时间间隔里前面任务执行完我在执行完):

    并发性:指两个或者两个以上事件可以在同一时间间隔发生
    这两个事件或者多个事件不是并行的也就是说不是同一时刻发生的
    
  • 并行性(一起在一个时刻开始执行):

    并行性:指两个或者两个以上的事件可以在同一时刻发生
    
  • 共享性:

    操作系统中的资源可供多个并发的程序共同使用,这种共同使用的形式就称为资源共享
    多个程序可以使用主存的资源,资源共享有两种形式:
    	互斥共享:当资源被程序A占用时,其他资源想使用的话必须等待,只用进程A使用完成后,其他进程才能使用该资源
    	同时访问的形式:某个资源在一段时间内并发地被多个程序访问(这个同时是宏观的,从宏观去看资源是可以被同时访问的)时间快宏观体现快,微观是互斥的
    
  • 虚拟性:把一个物理实体(真实存在的)转变成若干个逻辑实体(虚拟的)

    技术主要有:
    	时分复用技术:资源在时间上进行复用,不同的程序并发使用,多道程序分时使用计算机的硬件资源提高了资源的利用率
    	虚拟处理器技术借助多道程序设计为每个程序建立进程多个程序分时复用处理器
    	虚拟设备技术把一个物理设备虚拟为多个逻辑设备,每个程序占用一个逻辑设备,多个程序通过逻辑设备并发访问
    	空分复用技术:用来实现虚拟磁盘,虚拟内存等等,提高了资源的利用率,提升了编程效率
    	虚拟磁盘技术:把物理磁盘虚拟为多个逻辑磁盘(一个c盘可以虚拟为d盘e盘等等)使用起来更安全方便
    	虚拟内存的技术:在逻辑上扩大程序的存储容量,程序使用上就可以使用比实际内存更大的容量,大大提升编程效率
    
  • 异步性:在多道程序环境下,允许多个进程并发执行,进程在使用资源时可能需要等待或者放弃。进程的执行并不是一气呵成的,而是以走走停停的形式推进的。

进程(位于内存)Process

image-20210603045848008

  • 进程是系统进行资源分配和调度的最小单位
  • 进程作为程序独立运行的载体保障程序正常运行
  • 进程的存在使得操作系统资源的利用率大幅度的提升

程序是静态性的、一般只是安安静静的存储在外存中。

运行程序时、程序会被操作系统加载到内存中,生成相当于的进程,它是动态的。

这个过程中,CPU会不断的访问内存、执行进程给出的指令来完成相当于的任务。

进程的实体

程序被加载到内存之后:会被划分为程序段和数据段和PCB(进程控制块:进程的数据段和程序段位置记录)

image-20210603044953025

PCB(进程控制块)

用于描述和控制进程运行的通用数据结构

image-20210603045440987

当程序运行的时候,操作系统会为该进程构建一个叫进程控制块(PCB)的数据结构,用以记录该进程的各种信息。
进程实体 = PCB + 程序段 + 数据段。 (进程实体 别名 进程映像)

  • 记录进程当前状态和控制进程运行的全部信息
  • PCB使得进程是能够独立运行的最小基本单位
  • PCB是操作系统进行调度经常会被读取的信息
  • PCB是常驻内存的,存放在系统专门开辟的PCB区域中

image-20210603044600063

  • 标识符:标识符唯一标记一个进程、用于区别其他进程
  • 状态:标记进程的状态,如:运行态、阻塞态
  • 程序计数器:进程即将被执行的下一条指令的地址
  • 内存指针:程序代码、进程数据的相关指针
  • 上下文数据:进程执行的时候处理器存储的数据
  • I\\O状态信息:被进程I\\O操作所占用的文件列表
  • 记账信息:使用处理器的时间、时钟数总和

image-20210603044918865

链接方式

链接方式会按照进程的状态将PCB分为多个队列,操作系统持有各个队列的指针。

image-20210603045135569

以上所有的信息都被放置于内存之中。阻塞队列可能还会被划分为因等待什么事件而阻塞。

索引方式

索引方式会按照进程的状态将PCB建立几张索引表,操作系统持有各个索引表的指针。

image-20210603050504870

由于异步性会导致并发进程执行结果的不确定性,所以操作系统需要提供"进程同步"机制来解决异步问题

线程Thread

  • 一个进程可以有多个线程
  • 线程是操作系统进行运行调度的最小单位(进程是系统进行资源分配和调度的最小单位)
  • 包含在进程中,是进程中实际运行工作的单位
  • 进程可以并发多个线程,每个线程执行不同的任务
  • 进程的线程共享进程的资源

五状态模型

  • 就绪状态:

    特点:
    ​	当进程被分配到除CPU以外所有必要资源后
    
    ​	只要再获得CPU的使用权,就立即执行、其他
    
    ​	其他资源(进程控制块、内存、栈空间、堆空间等等)都准备好、只差CPU资源的状态
    
    ​	在一个系统中多个处于就绪状态的进程通常排成一个队列
    
    ​	一个就绪队列有多个就绪进程
    

    image-20210603055137818

  • 阻塞状态:

    特点:
    ​	当进程因为某种原因如:其他设备未就绪而无法继续执行从而放弃CPU的状态称为阻塞状态
    
    ​	阻塞队列存在一个或者多个阻塞进程
    

    image-20210603055054942

  • 执行状态:

    特点:
    ​	当进程获得CPU,其程序正在执行称为执行状态(在CPU内是运行的)
    
    ​	在单处理器中,在某个时刻只有一个进程是处于执行状态的
    
  • 创建状态:

    第一步:分配PCB
    第二步:插入就绪队列
    创建进程时就拥有PCB但其他资源尚未就绪的状态称为创建状态
    
  • 终止状态:

    第一步:系统清理第二步:PCB归还进程结束由系统清理或者PCB归还PCB的状态称为终止状态
    

image-20210603055209041

进程同步

生产者--消费者问题

image-20210603065944674

image-20210603070007037

这里面的缓冲区也叫临界资源

当生产者,生产出东西投入缓冲区的时候,进行+1,当消费者从缓冲区取出的时候,进行-1。

然后来简要的说一下,+1/-1,到底是怎么进行的。

首先我们明白一点,缓冲是在Cache上的,当我们操作缓冲区的时候,实际上是这三个步骤:

(1)register = count
(2)register = register + 1
(3)count = register

单这个模型跑在单进程中,肯定是没有问题的,而如果这个任务并发地去执行在多个进程中就会出差错,因为他们访问的是同一块存储区域,就有可能出现脏读等问题。

image-20210603070618140

当放入缓冲区和拿出缓冲区的程序同时执行的时候,就会出现这种问题。

就比如说,a=0,然后一个线程只执行a+1,一个线程只执行a-1,各执行100w次,结果肯定不是理想化的0.
除非加同步锁。

哲学家进餐问题

image-20210603071315079

image-20210603071337212

这根源的问题,也就是因为五个哲学家,也就是五个进程之间,没有进行通信而导致的。

而如果我们能做到对竞争资源在多进程之间进行使用次序的协调,就可以让并发执行的多个进程之间可以有效使用资源和相互合作。(需要进程间的同步)

在这里,我们称筷子本身为——临界资源。

临界资源

临界资源指的是,一些虽然可以作为共享资源但是又无法同时被多个线程共同访问的共享资源。当有进程在使用临界资源的时候,其他进程必须依据操作系统的同步机制等待占用进程释放该共享资源才可重新竞争使用共享资源,不然就会死锁。

进程间同步的原则:

  • 空闲让进:资源无占用,允许使用
  • 忙则等待:资源有占用,请求进程等待
  • 有限等待:保证有限等待时间能够使用资源
  • 让权等待:等待时,进程需要让出CPU

让进程间同步的三个方法有:

  • 消息队列
  • 共享存储
  • 信号量

当多个线程使用进程资源时,进程内的线程也需要同步

线程同步和进程同步是一样的理解。进程作为获得CPU资源的单位,而线程则是共享自己进程的资源。他们自然也需要互相保证同步,不然也会发生和进程同样的并发的问题。

让线程进行同步的方法有

  • 互斥量
  • 读写锁
  • 自旋锁
  • 条件变量

以上是关于操作系统的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段15——git命令操作一个完整流程

为啥尽管源代码没有变化,但从一个系统到另一个系统的片段数量却有很大差异?

VSCode 如何操作用户自定义代码片段(快捷键)

C#程序员经常用到的10个实用代码片段 - 操作系统

代码片段 - Golang 实现集合操作

Apollo Codegen 没有找到生成代码的操作或片段