操作系统

23 篇文章 0 订阅
1 篇文章 0 订阅

1. 什么是操作系统

  1. 操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基⽯;
  2. 操作系统本质上是运⾏在计算机上的软件程序 ;
  3. 操作系统为⽤户提供⼀个与系统交互的操作界⾯ ;
  4. 操作系统分内核与外壳(可以把外壳理解成围绕着内核的应⽤程序,⽽内核就是能操作硬件的程序,内核负责管理系统的进程、内存、设备驱动程序、⽂件和⽹络系统等等,决定着系统的性能和稳定性,是连接应⽤程序和硬件的桥梁)。

2. 系统调⽤

根据进程访问资源的特点,可以把进程在系统上的运⾏分为两个级别:

  1. ⽤户态(user mode) : ⽤户态运⾏的进程或可以直接读取⽤户程序的数据。
  2. 系统态(kernel mode):系统态运⾏的进程⼏乎可以访问计算机的任何资源,而不受限制。

我们运⾏的程序基本都是运⾏在⽤户态,如果我们需要调⽤操作系统提供的系统态级别的⼦功能就需要系统调⽤了。也就是说在我们运⾏的⽤户程序中,凡是与系统态级别的资源有关的操作(如⽂件管理、进程控制、内存管理等),都必须通过系统调⽤⽅式向操作系统提出服务请求,并由操作系统代为完成。

这些系统调⽤按功能⼤致可分为如下⼏类:
设备管理:完成设备的请求或释放,以及设备启动等功能。
⽂件管理:完成⽂件的读、写、创建及删除等功能。
进程控制:完成进程的创建、撤销、阻塞及唤醒等功能。
进程通信:完成进程之间的消息传递或信号传递等功能。
内存管理:完成内存的分配、回收以及获取作业占⽤内存区⼤⼩及地址等功能。

3. 进程和线程的区别

进程:
在操作系统中能够独立运行,并且作为资源分配的基本单位。它表示运行中的程序。系统运行一个程序就是一个进程从创建、运行到消亡的过程。

线程:
线程是进程划分成的更⼩的运⾏单位,⼀个进程在其执⾏的过程中可以产⽣多个线程。多个线程共享进程的堆和⽅法区资源,但是每个线程有⾃⼰的程序计数器、虚拟机栈 和 本地⽅法栈。系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,因此也被称为轻量级进程。

不同点:
线程和进程最⼤的不同在于基本上各进程是独⽴的,⽽各线程则不⼀定,因为同⼀进程中的线程极有可能会相互影响。线程执⾏开销⼩,但不利于资源的管理和保护;⽽进程正相反。

4. 进程有哪⼏种状态?

我们⼀般把进程⼤致分为 5 种状态,这⼀点和线程很像。
创建状态(new) : 进程正在被创建,尚未到就绪状态。
就绪状态(ready) : 进程已处于准备运⾏状态,即进程获得了除了处理器之外的⼀切所需资源,⼀旦得到处理器资源(处理器分配的时间⽚)即可运⾏。
运⾏状态(running) : 进程正在处理器上上运⾏(单核 CPU 下任意时刻只有⼀个进程处于运⾏状态)。
阻塞状态(waiting) : ⼜称为等待状态,进程正在等待某⼀事件⽽暂停运⾏。即使处理器空闲,该进程也不能运⾏。处于阻塞状态的进程,在其等待的事件已经发生后,进程并不马上转入运行状态,而是先转入就绪状态,然后由系统调度在适当的时候将该进程转为运行状态;
结束状态(terminated) : 进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运⾏。

5. 进程间的通信⽅式

每个进程各自有不同的用户地址空间,进程之间要交换数据必须通过内核。在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

进程间的通信⽅式可分为以下7种:

  1. 管道/匿名管道(Pipes) :⽤于具有亲缘关系的⽗⼦进程间或者兄弟进程之间的通信,存在于内存中的⽂件中。
  2. 有名管道(Names Pipes) : 匿名管道由于没有名字,只能⽤于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁盘⽂件的⽅式存在,可以实现本机任意两个进程通信。
  3. 信号(Signal) :信号是⼀种⽐较复杂的通信⽅式,⽤于通知接收进程某个事件已经发⽣;
  4. 消息队列(Message Queuing) :消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除⼀个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不⼀定要以先进先出的次序读取,也可以按消息的类型读取,⽐ FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载⽆格式字节流以及缓冲区⼤⼩受限等缺点。
  5. 信号量(Semaphores) :信号量是⼀个计数器,⽤于多进程对共享数据的访问,信号量的作用在于进程间同步。这种通信⽅式主要⽤于解决与同步相关的问题并避免竞争条件。
  6. 共享内存(Shared memory) :使得多个进程可以访问同⼀块内存空间,不同进程可以及时看到对⽅进程中对共享内存中数据的更新。这种⽅式需要依靠某种同步操作,如互斥锁和信号量等。
  7. 套接字(Sockets) : 此⽅法主要⽤于在客户端和服务器之间通过⽹络进⾏通信。套接字是⽀持TCP/IP 的⽹络通信的基本操作单元,可以看做是不同主机之间的进程进⾏双向通信的端点,简单的说就是通信的两⽅的⼀种约定,⽤套接字中的相关函数来完成通信过程。

6. 线程间的同步⽅式

线程同步是两个或多个共享关键资源的线程的并发执⾏。应该同步线程以避免关键的资源使⽤冲突。操作系统⼀般有下⾯三种线程同步的⽅式:

  1. 互斥量(Mutex):采⽤互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有⼀个,所以可以保证公共资源不会被多个线程同时访问。⽐如 Java 中的synchronized 关键词和各种 Lock 都是这种机制。
  2. 信号量(Semphares) :它允许同⼀时刻多个线程访问同⼀资源,但是需要控制同⼀时刻访问此资源的最⼤线程数量。
  3. 事件(Event) :Wait/Notify:通过通知操作的⽅式来保持多线程同步,还可以⽅便的实现多线程优先级的⽐较操作。

7. 操作系统中进程的调度算法

为了确定⾸先执⾏哪个进程以及最后执⾏哪个进程以实现最⼤ CPU 利⽤率,定义了⼀些调度算法,它们是:

  1. 先到先服务(FCFS)调度算法 : 从就绪队列中选择⼀个最先进⼊该队列的进程为之分配资源,使它⽴即执⾏并⼀直执⾏到完成或发⽣某事件⽽被阻塞放弃占⽤ CPU 时再重新调度。
  2. 短作业优先(SJF)的调度算法 : 从就绪队列中选出⼀个估计运⾏时间最短的进程为之分配资源,使它⽴即执⾏并⼀直执⾏到完成或发⽣某事件⽽被阻塞放弃占⽤ CPU 时再重新调度。
  3. 时间⽚轮转调度算法 : 时间⽚轮转调度是⼀种最古⽼,最简单,最公平且使⽤最⼴的算法,⼜称 RR(Round robin)调度。每个进程被分配⼀个时间段,称作它的时间⽚,即该进程允许运⾏的时间。
  4. 多级反馈队列调度算法 :前⾯介绍的⼏种进程调度的算法都有⼀定的局限性。如短进程优先的调度算法,仅照顾了短进程⽽忽略了⻓进程 。多级反馈队列调度算法既能使⾼优先级的作业得到响应⼜能使短作业(进程)迅速完成。,因⽽它是⽬前被公认的⼀种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。
  5. 优先级调度 : 为每个流程分配优先级,⾸先执⾏具有最⾼优先级的进程,依此类推。具有相同优先级的进程以 FCFS ⽅式执⾏。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。

8. 物理地址和逻辑(虚拟)地址的区别

物理地址:
加载到内存地址寄存器中的地址,内存单元的真正地址。
逻辑地址:
CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。
例如,在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),和绝对物理地址无关。

9. 操作系统的内存管理主要是做什么

操作系统的内存管理主要负责内存的分配与回收(malloc 函数:申请内存,free 函数:释放内存),以及地址转换也就是将逻辑地址转换成相应的物理地址等功能。

10. 操作系统内存管理机制

操作系统的内存管理机制可简单的分为连续分配管理⽅式和⾮连续分配管理⽅式这两种。
连续分配管理⽅式是指为⼀个⽤户程序分配⼀个连续的内存空间,常⻅的如 块式管理 。同样地,⾮连续分配管理⽅式允许⼀个程序使⽤的内存分布在离散或者说不相邻的内存中,常⻅的如⻚式管理和段式管理以及段页式管理。

  1. 块式管理 : 早期计算机操系统的内存管理⽅式。将内存分为⼏个固定⼤⼩的块,每个块中只包含⼀个进程。如果程序运⾏需要内存的话,操作系统就分配给它⼀块,如果程序运⾏只需要很⼩的空间的话,分配的这块内存很⼤⼀部分⼏乎被浪费了。而这些在每个块中未被利⽤的空间,称之为碎⽚。
  2. ⻚式管理 :把主存分为⼤⼩相等且固定的⼀⻚⼀⻚的形式,⻚较⼩,相对相⽐于块式管理的划分⼒度更⼤,提⾼了内存利⽤率,减少了碎⽚。⻚式管理通过⻚表对应逻辑地址和物理地址。
  3. 段式管理 : ⻚式管理虽然提⾼了内存利⽤率,但是⻚式管理其中的⻚实际并⽆任何实际意义。段式管理把主存分为⼀段段的,每⼀段的空间⼜要⽐⼀⻚的空间⼩很多 。但是,最重要的是段是有实际意义的,每个段定义了⼀组逻辑信息,例如,有主程序段 MAIN、⼦程序段 X、数据段 D及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。
  4. 段⻚式管理机制 。段⻚式管理机制结合了段式管理和⻚式管理的优点。简单来说段⻚式管理机制就是把主存先分成若⼲段,每个段⼜分成若⼲⻚,也就是说 段⻚式管理机制 中段与段之间以及段的内部的都是离散的。

11. ⻚式管理中快表和多级⻚表

快表和多级⻚表是⻚式内存管理机制中的两个很重要的概念。

快表: 为了提高虚拟地址到物理地址的转换速度而提出的,操作系统在⻚表⽅案 基础之上引⼊了 快表 来加速虚拟地址到物理地址的转换。可以把块表理解为⼀种特殊的⾼速缓冲存储器(Cache),其中的内容是⻚表的⼀部分或者全部内容。作为⻚表的 Cache,它的作⽤与⻚表相似,但是提⾼了访问速率。
使⽤快表之后的地址转换流程是这样的:

  1. 根据虚拟地址中的⻚号查快表;
  2. 如果该⻚在快表中,直接从快表中读取相应的物理地址;
  3. 如果该⻚不在快表中,就访问内存中的⻚表,再从⻚表中得到物理地址,同时将⻚表中的该映射表项添加到快表中;
  4. 当快表填满后,⼜要登记新⻚时,就按照⼀定的淘汰策略淘汰掉快表中的⼀个⻚。

多级⻚表: 引⼊多级⻚表的主要⽬的是为了避免把全部⻚表⼀直放在内存中占⽤过多空间,特别是那些根本就不需要的⻚表就不需要保留在内存中。多级⻚表属于时间换空间的典型场景。

例如采用页目录表+页表,页目录表的每一项对应一个页表,然后再根据页表找到对应的页。这种方式会带来时间的消耗,以上述两级页表为例,每一次访问的时候都要根据页目录表找到页表再找到具体的页。这种思想就类似与书本,如果要查找某一页的内容,首先在页目录表中找到这一页对应的页表,然后再查具体的某一页,这样其他页目录表的页表都不用存储,能节省大量内存;并且保证了页目录表和页表都是连续的,这就意味着可以使用偏移量的形式查找对应的页。

总结
为了提⾼内存的空间性能,提出了多级⻚表的概念;但是提高空间性能是以浪费时间性能为基础的,因此为了补充损失的时间性能,提出了快表(即 TLB)的概念。 不论是快表还是多级⻚表实际上都利⽤到了程序的局部性原理。

12. 分⻚机制和分段机制的共同点和区别

共同点 :

  1. 分⻚机制和分段机制都可以提⾼内存利⽤率,减少内存碎⽚。
  2. ⻚和段都是离散存储的,所以两者都是离散分配内存的⽅式。但是,每个⻚和段中的内存是连续的。

区别 :
3. ⻚的⼤⼩是固定的,由操作系统决定;⽽段的⼤⼩不固定,取决于我们当前运⾏的程序。
4. 分⻚仅仅是为了满⾜操作系统内存管理的需求,⽽段是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更好满⾜⽤户的需要。

13. CPU 寻址、虚拟地址空间

现代处理器使⽤的是⼀种称为 虚拟寻址的寻址⽅式。使⽤虚拟寻址,CPU 需要将虚拟地址(逻辑地址)翻译成物理地址,这样才能访问到真实的物理内存。 实际上完成虚拟地址转换为物理地址转换的硬件是 CPU 中含有的⼀个被称为 内存管理单元(MMU) 的硬件。

为什么要有虚拟地址空间呢?
当没有虚拟地址空间的时候,程序直接访问和操作的都是物理内存 。但是这样会出现一些问题:

  1. ⽤户程序可以访问任意内存,这样就很容易(有意或者⽆意)破坏操作系统,造成操作系统崩溃。
  2. 想要同时运⾏多个程序特别困难,⽐如你想同时运⾏⼀个微信和⼀个QQ,微信在运⾏的时候给某一内存地址赋值后,如果QQ也同样给该内存地址赋值,那么 QQ 对内存的赋值就会覆盖微信之前所赋的值,这就造成了微信这个程序
    就会崩溃。

即如果直接把物理地址暴露出来的话会带来严重问题,⽐如可能对操作系统造成伤害以及给同时运⾏多个程序造成困难。

而通过虚拟地址访问内存有以下优势:

  1. 程序可以使⽤⼀系列相邻的虚拟地址来访问物理内存中不相邻的内存缓冲区。
  2. 程序可以使⽤⼀系列虚拟地址来访问⼤于可⽤物理内存的内存缓冲区。当物理内存的供应量变⼩时,内存管理器会将物理内存⻚(通常⼤⼩为 4 KB)保存到磁盘⽂件。数据或代码⻚会根据需要在物理内存与磁盘之间移动。
  3. 不同进程使⽤的虚拟地址彼此隔离。⼀个进程中的代码⽆法更改正在由另⼀进程或操作系统使⽤的物理内存。

14. 计算机中的存储器

内存: 内存又称主存,是CPU能直接寻址的存储空间,它的特点是存取速率快。内存是电脑中主要部件,是一个相对于外存的概念。内存一般采用半导体存储单元,包括随机存储器(RAM)、只读存储器(ROM)和高级缓存(Cache)。

RAM(Random Access Memory): 高速存取,支持读写数据,读写时间相等,且与地址无关,但是断电后其中的数据会丢失。

ROM(Read Only Memory): 断电后信息不丢失,如计算机启动用的BIOS芯片。存取速度很低,(较RAM而言)且不能改写。由于不能改写信息,不能升级,现已很少使用。

Cache: 介于CPU与内存之间,常用有一级缓存(L1)、二级缓存(L2)、三级缓存(L3)(一般存在于Intel系列)。它的读写速度比内存还快,当CPU在内存中读取或写入数据时,数据会被保存在高级缓冲存储器中,当下次访问该数据时,CPU直接读取高级缓冲存储器,而不是更慢的内存。

外存: 外储存器是指除计算机内存及CPU缓存以外的储存器,此类储存器一般断电后仍然能保存数据。外存需要通过I/O系统与之交换数据,又称为辅助存储器。常见的外储存器有硬盘、软盘、光盘、U盘等

15. 虚拟内存

很多时候我们使⽤点开了很多占内存的软件,这些软件占⽤的内存可能已经远远超出了我们电脑本身具有的物理内存。之所以可以实现上述功能,正是因为 虚拟内存 的存在,虚拟内存是计算机系统内存管理的⼀种技术,我们可以⼿动设置⾃⼰电脑的虚拟内存。
虚拟内存的重要意义是它定义了⼀个连续的虚拟地址空间,并且把内存扩展到硬盘空间。它使得应⽤程序认为它拥有连续的可⽤的内存(⼀个连续完整的地址空间),⽽实际上,它通常是被分隔成多个物理内存碎⽚,还有部分暂时存储在外部磁盘存储器上,在需要时进⾏数据交换。与没有使⽤虚拟内存技术的系统相⽐,使⽤这种技术的系统使得⼤型程序的编写变得更容易,对真正的物理内存(例如 RAM)的使⽤也更有效率。⽬前,⼤多数操作系统都使⽤了虚拟内存,如Windows 家族的“虚拟内存”;Linux 的“交换空间”等。

16. 局部性原理

局部性原理是虚拟内存技术的基础,正是因为程序运⾏具有局部性原理,才可以只装⼊部分程序到内存就开始运⾏。

局部性原理表现在以下两个⽅⾯:

  1. 时间局部性 : 如果程序中的某条指令⼀旦执⾏,不久以后该指令可能再次执⾏;如果某数据被访问过,不久以后该数据可能再次被访问。产⽣时间局部性的典型原因,是由于在程序中存在着⼤量的循环操作。
  2. 空间局部性 : ⼀旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在⼀段时间内所访问的地址,可能集中在⼀定的范围之内,这是因为指令通常是顺序存放、顺序执⾏的,数据也⼀般是以向量、数组、表等形式簇聚存储的。

17. 虚拟存储器

基于局部性原理,在程序装⼊时,可以将程序的⼀部分装⼊内存,⽽将其他部分留在外存,就可以启动程序执⾏。由于外存往往⽐内存⼤很多,所以我们运⾏的软件的内存⼤⼩实际上是可以⽐计算机系统实际的内存⼤⼩⼤的。在程序执⾏过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调⼊内存,然后继续执⾏程序。另⼀⽅⾯,操作系统将内存中暂时不使⽤的内容换到外存上,从⽽腾出空间存放将要调⼊内存的信息。这样,计算机好像为⽤户提供了⼀个⽐实际内存⼤的多的存储器——虚拟存储器。

18. 虚拟内存的技术实现

虚拟内存的实现需要建⽴在离散分配的内存管理⽅式的基础上。其实现有以下三种⽅式:请求分⻚存储管理、请求分段存储管理、请求段⻚式存储管理

下面以请求分⻚存储管理为例来进行说明:
请求分⻚是⽬前最常⽤的⼀种实现虚拟存储器的⽅法。请求分⻚存储管理建⽴在分⻚管理之上,为了⽀持虚拟存储器功能⽽增加了请求调⻚功能和⻚⾯置换功能。在请求分⻚存储管理系统中,作业开始运⾏之前,仅需要装⼊当前要执⾏的部分段即可运⾏。如果需执⾏的指令或访问的数据尚未在内存(称为缺⻚或缺段),则由处理器通知操作系统按照对应的⻚⾯置换算法将相应的⻚⾯调⼊到主存,同时操作系统也可以将暂时不⽤的⻚⾯置换到外存中。

请求分⻚与分⻚存储管理的区别

请求分⻚存储管理建⽴在分⻚管理之上。它们之间的根本区别在于是否将⼀作业的全部地址空间同时装⼊主存。请求分⻚存储管理不要求将作业全部地址空间同时装⼊主存,仅需要装⼊当前要执⾏的部分即可运⾏。基于这⼀点,请求分⻚存储管理可以提供虚拟内存,⽽分⻚存储管理却不能提供虚拟内存。

两者都需要逻辑地址到物理地址的变换。

19. 虚拟内存的⻚⾯置换算法

⻚⾯置换算法是虚拟内存管理中的⼀个概念。

页面置换算法:

地址映射过程中,若在⻚⾯中发现所要访问的⻚⾯不在内存中,则发⽣缺⻚中断 。缺⻚中断 就是要访问的⻚不在主存,需要操作系统将其调⼊主存后再进⾏访问。当发⽣缺⻚中断时,如果当前内存中并没有空闲的⻚⾯,操作系统就必须在内存选择⼀个⻚⾯将其移出内存,以便为即将调⼊的⻚⾯让出空间。⽤来选择淘汰哪⼀⻚的规则叫做⻚⾯置换算法,我们可以把⻚⾯置换算法看成是淘汰⻚⾯的规则。

页面置换算法大概可以分为以下几类:

  1. OPT ⻚⾯置换算法(最佳⻚⾯置换算法) :最佳置换算法所选择的被淘汰⻚⾯将是以后永不使⽤的,或者是在最⻓时间内不再被访问的⻚⾯,这样可以保证获得最低的缺⻚率。但由于⼈们⽬前⽆法预知进程在内存下的若千⻚⾯中哪个是未来最⻓时间内不再被访问的,因⽽该算法⽆法实现。⼀般作为衡量其他置换算法的⽅法。
  2. FIFO(First In First Out) ⻚⾯置换算法(先进先出⻚⾯置换算法) : 总是淘汰最先进⼊内存的⻚⾯,即选择在内存中驻留时间最久的⻚⾯进⾏淘汰。
  3. LRU (Least Currently Used)⻚⾯置换算法(最近最久未使⽤⻚⾯置换算法) :LRU算法赋予每个⻚⾯⼀个访问字段,⽤来记录⼀个⻚⾯⾃上次被访问以来所经历的时间 T,当须淘汰⼀个⻚⾯时,选择现有⻚⾯中其 T 值最⼤的,即最近最久未使⽤的⻚⾯予以淘汰。
  4. LFU (Least Frequently Used)⻚⾯置换算法(最少使⽤⻚⾯置换算法) : 该置换算法选择在之前时期使⽤最少的⻚⾯作为淘汰⻚。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值