操作系统

操作系统基础

什么是操作系统

  1. 操作系统是管理计算机硬件和软件资源的程序,是计算机的基石
  2. 操作系统本质上是一个运行在计算机上的软件程序,用于管理计算机硬件个软件资源
  3. 操作系统的存在屏蔽了硬件层的复杂性
  4. 操作系统的内核时操作系统的核心部分,他负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理

系统调用

根据进程访问的特点,我们可以把进程在系统上的运行分为两个级别

  1. 用户态:用户运行的进程可以直接读取读取用户程序的数据
  2. 系统态:系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制

所以什么是系统调用呢?

在我们运行的用户程序中,凡是与系统态级别的资源有关的操作(如文件管理,进程控制,内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成

比如:设备管理,文件管理,进程控制,进程通信,内存管理

进程和线程

进程和线程的区别

线程是进程划分的更小的运行单位,一个进程在其执行的过程中可以产生多个线程。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响

进程是操作系统进行资源分配的最小单元,线程是操作系统进行运算调度的最小单元

进程的几种状态

创建状态:进程正在被创建,尚未到就绪状态

就绪状态:进程已处于准备运行状态,即进程获得了除了处理器之外的一切所需资源,一旦获得处理器资源即可运行

运行状态:进程正在处理器上运行

阻塞状态:又称为等待状态,进程正在等待某一事件而暂停运行如等待某资源为可用或等待IO操作完成。即使处理器空闲,该进程也不能运行

结束状态:进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运行

进程间的通信方式

管道/匿名管道:用于具有亲缘关系的父子进程或者兄弟进程之间的通信

有名管道:匿名管道由于没有名字,只能用于亲缘关系的进程间通信。因此提出了有名管道,有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信

信号:一种比较复杂的通信方式,用于通知接收进程某个事件已经发生

消息队列:消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点

信号量:信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步

共享内存:使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新

套接字:主要用于客户端和服务器之间通过网络进行通信。、

线程间的同步方式

线程同步就是两个或多个共享关键资源的线程并发执行,一般有下面三种线程同步的方式

  1. 互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公告资源的权限。
  2. 信号量:它允许同一时刻多个线程访问同一资源,但是需要控制同一资源的最大资源数量
  3. 事件:通过通知操作系统的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作

进程的调度算法

  • 先到先服务算法(FCFS):从就绪队列中选择一个最先进入该队列的进程分配资源。
  • 短作业优先调度算法(SJF):从就绪队列中选出一个估计运行时间最短的进程分配资源
  • 时间片轮转调度算法:每个进程被分配一个时间段,称为它的时间片,即该进程允许运行的时间
  • 多级反馈队列调度算法:短进程有限的额调度算法仅照顾了短进程而忽视了长进程。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业迅速完成,是现在公认的较好的进程调度算法
  • 优先级调度:为每个线程分配优先级,首先执行的具有最高优先级的进程

什么是死锁

多个进程/线程同时被阻塞,他们中的一个或者全部都在等待某个资源被释放。由于进程/线程被无限期的阻塞,因此程序不可能正常终止。

死锁的四个必要条件

  • 互斥:资源必须处于非共享模式,即一次只有一个进程可以使用
  • 占有并等待:一个进程至少应该占有一个资源,并等待另一资源,而该资源被其他进程所占有
  • 非抢占:资源不能被抢占。只能在持有资源的进程完成任务后,该资源才会被释放
  • 循环等待:P0等待的资源被P1占有,P1等待的资源被P2占有…,Pn等待的资源被P0占有

注意:这里是必要条件,不是充分条件

解决死锁的办法

预防:采取某种策略,限制并发进程对资源的请求

避免:在分配资源时,根据资源的使用情况提前做出预测,从而避免死锁的发生

检测:系统设有专门的额机构,当死锁发生的时候,该机构能够检测死锁的发生,并精确地确定与死锁有关的进程和资源

解除:与检测相配套的一种措施,用于将进程从死锁状态下解脱出来

避免死锁的经典算法

最具代表性的就是银行家算法,简单的来说就是当一个进程申请使用资源的时候,银行家算法通过先试探分配给该进程资源,然后通过安全性算法判断分配后的系统是否处于安全状态,若不安全则试探分配作废,让该进程继续等待,若能够进入到安全的状态,则就真的分配资源给该进程

操作系统内存管理

内存管理主要是做什么的

主要负责内存的分配与回收,地址转换(将逻辑地址转换为物理地址)也是内存管理做的事情

常见的几种内存管理机制

简单的分为连续分配管理非连续分配管理方式,连续分配包括块式管理,非连续管理分配包括页式管理段式管理

  • 块式管理:将内存分为几个固定大小的块,每个块只有一个进程,当程序运行需要内存的时候,操作系统就分一块给他,这块内存剩下的空间就被浪费了

  • 页式管理:把主存分为大小相等且固定的一页一页的形式,页比较小,相比于块的划分颗粒度更小,减少内存碎片,通过页表对应逻辑地址和物理地址

  • 段式管理:页式管理其中的页并没有实际的意义。段式管理把主存分为一段一段的,段是具有实际意义的,每个段定义了一组逻辑信息,比如主程序段,子程序段等。通过段表对应逻辑地址和逻辑地址

  • 段页式管理:结合了段页式管理的优点,简单的来说就是把主存分为若干段,每个段又分为若干页,也就说段页式管理中段与段以及段的内部都是离散的

分页机制和分段机制的共同点和区别

  • 共同点:
    • 分页和分段都是为了提高内存利用率,减少碎片
    • 页和段都是离散存储的,但是页和段内部式连续的
  • 区别
    • 页的大小式固定的,但是段的大小是不固定的,取决于我们当前运行的程序
    • 页没有信息,但是段是逻辑信息的单位,在程序中可以分为代码段,数据段等

虚拟内存

什么是虚拟内存

虚拟内存是计算机内存管理的一种技术,通过虚拟内存,可以为每一个进程提供一个一致性的,私有的地址空间。虚拟内存的重要意义就是它定义了一个连续的虚拟地址空间,并且把内存扩展到硬盘空间

局部性原理

程序在执行的时候往往呈现局部性规律,也就是说在某个较短的时间段内,程序执行局限于某一小部分,程序访问的存储空间页局限于某个区域

主要表现在

  • 时间局限性
  • 空间局限性

猜测一些大型游戏的加载是不是同样使用了这个原理

虚拟存储器

基于局部性原理,在程序装入的时候,可以将程序的一部分咋恍如内存,而将其他部分留在外村,就可以启动程序的执行。需要的时候再将需要的调入内存,将不需要的资源调出,这样,计算机仿佛就为用户提供了一个比实际内存大得多的储存器,这就是虚拟存储器

技术实现

  • 请求分页存储管理
  • 请求分段存储管理
  • 请求段页式存储管理

和上面的类似,但是不同的是装入作业的时候不是全部装入,而是装入一部分

页面置换算法

地址映射的过程中,若在页面中发现所要的页面不再内存中,则会发生缺页中断,这时如果没有空闲的页面,操作系统就需要淘汰一些页面腾出内存空间为将调入的页面做准备

  • OPT 页面置换算法(最佳页面置换算法):选择以后以后永不使用或者未来最长时间不被使用的的页面淘汰,保证最低的缺页率,但是我们无法知道内存中哪个是未来最长不被使用的,因此这个算法是无法实现的
  • FIFO(First In First Out)算法:看名字就知道是选择最先进入的页面淘汰
  • LRU(Least Recently Used) 页面置换算法(最近最久未使用置换算法):赋予每个页面一个T值记录自上次访问以来经历的时间,每次就挑这个T值最大的淘汰
  • LFU(Least Frequently Used) 页面置换算法(最少使用页面置换算法):选择之前使用次数最少的页面淘汰

操作系统
http://example.com/2022/12/27/OS/
作者
Mercury
发布于
2022年12月27日
许可协议