【操作系统】阅读小结

操作系统:

下载的pdf与别人总结的

知乎质料:

github质料:

1.介绍一下并行与并发:

我用个很简单的例子来解释一下这二个概念,并发就好像在银行里面一个柜台前面排了二个不同业务的队列去办业务,而柜台在某一时刻只能为一个客户服务,看似是该柜台在办理二种业务,但却不是同时的;而并行是同时的,相对于前面的例子,此时有二个柜台分别办理二种业务。总结就是:并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。回来我们计算机,并发和并行都可以是很多个线程 ,就看这些线程能不能同时被多个cpu执行,如果可以就说明是并行,而并发是多个线程被一个cpu 轮流切换着执行。因此他们的关键点在于是否同时。

2.什么是操作系统

操作系统是运行在计算机上的软件程序,管理计算机硬件与软件资源,可为用户提供一个与系统交互的操作界面。主要分为内核和外壳,外壳是调用内核的应⽤程序,内核是能操作硬件的程序。内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统等,是连接应⽤程序和硬件的桥梁。

架构:用户----外壳----内核----计算机硬件

3.用户态、系统态与系统调用

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

  1. ⽤户态(user mode) : ⽤户态运⾏的进程或可以直接读取⽤户程序的数据。

  2. 系统态(kernel mode):可以简单的理解系统态运⾏的进程或程序⼏乎可以访问计算机的任何资

源,不受限制。

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

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

**注:**申请内存时,malloc会有两种系统调用,第一种是brk系统调用,处理小于128K的内存申请,在内存的堆空间中申请,第二种是mmap系统调用,处理大于128K的内存申请,这两种系统调用申请的都是虚拟内存空间,在访问这些虚拟地址时会通过缺页中断,让内核分配相应的物理内存。

4.介绍一下进程与线程

二者的定义

进程是计算机资源调度的最小单位,线程是cpu运行调度的最小单位,所以一个进程包含了一个或多个线程,CPU实际上处理的是线程的调度而进程之间资源是不共享的,进程内的线程之间资源可以共享,相对进程来说线程的切换开销更小,更能节约性能线程是可以多个在同一个cpu中并发运行的。

注:进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。

二者的区别与联系

进程与线程的联系:

  1. 一个进程可以有多个线程,所有线程共享进程的系统资源;
  2. 一个进程可以并发执行多个线程,线程执行不同的任务
  3. 进程是分配资源的基本单位,而线程是独立运行和调度的基本单位
  4. 线程在执行过程中需要协作同步。不同进程的线程通过消息通信的方法同步

进程与线程的区别:

  1. 拥有资源:进程有独立的内存空间,线程没有,线程可以访问隶属进程的资源。
  2. 系统开销: 由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销(创建仅仅需要堆栈指针与程序计数器)。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。
  3. 调度:线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。
  4. 通信:线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC
  5. 异常方面:进程有独立的地址空间,一个进程崩溃后在保护模式下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径;一个线程崩溃则其进程也崩溃,所以多进程的程序比多线程程序健壮,但进程切换有需要耗费较大的资源,效率差一些。

**总结:**进程独立;线程开销小
在这里插入图片描述

5.进程与线程的状态切换

进程的状态:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qr99n0cH-1619188989250)(C:\Users\Chen\AppData\Roaming\Typora\typora-user-images\1618928150849.png)]

包含三种:

  • 就绪状态(ready):等待被调度
  • 运行状态(running)
  • 阻塞状态(waiting):等待资源

转换

1.就绪—运行: 就绪状态的进程通过调度算法从而获得 CPU 时间,转为运行状态

2.运行—就绪: 运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度 。( **特殊:**在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU)

3.运行—阻塞: 正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求 。

4.阻塞—就绪: 进程所等待的事件已经发生,就进入就绪队列

**总结:**进程的状态依赖于两个关键因素,一是是否被cup调度,一是自身是否被阻塞:

  1. 正在享用cpu的进程就处于运行状态,运行状态就是进程的指令被cpu执行;
  2. 当他需要发起io(比如读取磁盘)时,状态转换为阻塞,阻塞就是需要等待其他事件完成;
  3. 终于等到自己的io完成了,就可以去cpu那里排队了,进入就绪状态,就绪状态就是排队等cpu资源.

最终目标是提高CPU的使用效率。

注:有些情况会考虑挂起状态。

不少系统引入挂起状态的原因是为了保障系统的稳定运行。如终端用户的请求、父进程请求、负荷调节的需要、操作系统的需要。介绍一下负荷调节的需要这个例子:当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。

在这里插入图片描述

6.进程的调度

  1. **先到先服务(FCFS)调度算法 😗*非抢占式的调度算法,按照请求的顺序进行调度。有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。

  2. 短作业优先(SJF)的调度算法 : 非抢占式的调度算法,按估计运行时间最短的顺序进行调度。长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度

  3. 时间片轮转调度算法 : 将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。

    时间片轮转算法的效率和时间片的大小有很大关系:

    • 因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。
    • 而如果时间片过长,那么实时性就不能得到保证。
  4. 优先级调度 : 为每个进程分配一个优先级,按优先级进行调度。为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。

  5. **多级反馈队列调度算法 :**前⾯介绍的⼏种进程调度的算法都有⼀定的局限性。如短进程优先的调度算法,仅照顾了短进程⽽忽略了⻓进程 。多级反馈队列调度算法既能使⾼优先级的作业得到响应⼜能使短作业(进程)迅速完成。,因⽽它是⽬前被公认的⼀种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。

    一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。

    多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,…。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。

    每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。
    在这里插入图片描述

7.进程的同步与互斥

临界资源:是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。

**临界区:**每个进程中访问临界资源的那段代码称为临界区

**互斥:**是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

举例:假如多个进程同时申请一台打印机,而先申请打印机的一方先使用打印机,当它用完时在给其他进程使用。在一个进程使用打印机期间,其他进程对打印机的使用申请不予满足,这些进程必须等待。

**互斥的实现:**使用互斥量或信号量(为1),采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。(加锁操作(P(S)) -》 执行临界区程序 -》 开锁操作(v(S)),s=1)

**同步:**是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。并发进程在一些关键点上可能需要互相等待或互通消息,这种相互制约的等待或互通消息称为进程同步。

举几个例子:
当两个进程运行时,进程A需要获取进程B此时运行到某一步的运行结果或者信息,才能进行自己的下一步工作,这个时候就得等待进程B与自己通信(发送某一个消息或信号),进程A再继续执行。这种进程之间相互等待对方发送消息或信号的协作就叫做进程同步。或者工厂的流水线,每道工序都有自己特定的任务,前一道工序没有完成或不合格后一道工序就不能进行。再或者ABC三个进程分别负责输入、处理、输出数据,A必须先执行,B次之,最后C。

同步的实现步骤:

  • 使用信号量解决进程同步问题的步骤

    • 确定进程:

      • 包括进程的数量、进程的工作内容。
    • 确定进程同步互斥关系:

      • 根据进程间是竞争临界资源还是相互合作处理上的前后关 系,来确定进程间是互斥还是同步。
    • 确定信号量:

      • 根据进程间的同步互斥关系确定信号量个数、含义、初始值,各进程需要对信号量进行的PV操作。(p是申请资源,申请不到将让权等待;V是归还资源,唤醒进程)
    • 用类程序语言描述算法。

  1. 管程
    使用信号量机制实现的生产者消费者问题需要客户端代码做很多控制,而管程把控制的代码独立出来,不仅不容易出错,也使得客户端代码调用更容易。

8.进程的通信

进程同步与进程通信很容易混淆,它们的区别在于:

  • 进程同步:控制多个进程按一定顺序执行;
  • 进程通信:进程间传输信息。

进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。

**主要分为:**管道、系统IPC(包括消息队列、信号量、共享存储)、SOCKET

**管道主要分为:**普通管道PIPE 、流管道(s_pipe)、命名管道(name_pipe)

**1.匿名管道( pipe ):**管道是一种半双工,基于文件描述符的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系或兄弟进程。

2.有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

3.流管道: 可以双向传输,只能在具有亲缘关系的进程间使用。

**4.信息量:**是一个计数器,用于实现进程间的互斥与同步,表示这个资源最多可以被多少个进程访问。
1)每当有进程申请使用信号量时,通过一个操作对信号量进行-1,当计数器减小到0时说明没有资源了,其他进程需要访问的话就必须等待,当该进程执行完后会执行另一个操作对信号量+1。
2)互斥锁的简单实现就是信号量,一个进程使用互斥锁并通知其他想要该互斥锁的进程,阻止他们访问和使用

**5.共享存储:**共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。不同进程可以及时看到对方进程中对共享内存中数据的更新。这种⽅式需要依靠某种同步操作,如互斥锁和信号量等。

**6.套接字(Sockets) 😗*用于不同机器之间的进程通信,是进程间通信的端点。

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

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

注:管道和消息队列的通信数据都是先进先出的原则。与管道(⽆名管道:只存在于内存中的⽂件;命名管道:存在于实际的磁盘介质或者⽂件系统)不同的是消息队列存放在内****核中,只有在内核重启(即,操作系统重启)或者显示地删除⼀个消息队列时,该消息队列才会被真正的删除。

9.死锁

**死锁的定义:**死锁是指两个或以上的进程在执行过程中,由于竞争互斥资源或者由于彼此通信而造成的一种阻塞的现象,如果没有外力的作用(人为的去干预),他们都将无法继续执行下去。这些进程永远都在互相等待对方释放自己所欲需要的资源,导致无限循环等待的状态就是死锁。

**资源种类:**可以分为 可抢占资源(当前进程所占用的资源可以被另一个进程所抢占) 和 不可抢占资源(当前进程占用的资源必须等待该进程执行完毕后才能被释放),死锁一般发生在不可抢占资源的竞争中。

例子:
当进程p1占用资源R1,p2占用资源R2,且这两种资源都是不可抢占资源,那么当进程继续执行,p1需要占用资源R2,p2需要占用资源R1时,由于两种资源已经被各自进程占用而导致两个进程阻塞,此时就发生了死锁。

**死锁产生的必要条件:**资源互斥(一个资源只能被一个进程使用),不可抢占,请求新资源时继续占用已有资源,阻塞等待。

解决死锁的方法:

  • 鸵鸟策略
  • 死锁检测与死锁恢复
  • 死锁预防
  • 死锁避免

1.鸵鸟策略:忽略它。因为解决死锁问题的代价很高,因此鸵鸟策略这种不采取任务措施的方案会获得更高的性能。当发生死锁时不会对用户造成多大影响,或发生死锁的概率很低,可以采用鸵鸟策略

2.死锁检测与死锁恢复:不试图阻止死锁,而是当检测到死锁发生时,采取措施进行恢复。

注:**检测:**每种类型一个资源的死锁检测算法是通过检测有向图是否存在环来实现,其他是采用标记的方法去查找进程;**恢复:**1.利用抢占恢复 2.利用回滚恢复 3.通过杀死进程恢复

**3.死锁预防:**在程序运行之前预防发生死锁,破坏死锁产生的必要条件。

  1. 破坏互斥条件
  2. 破坏占有和等待条件
  3. 破坏不可抢占条件
  4. 破坏环路等待

**4.死锁避免:**在程序运行时避免发生死锁。(银行家算法,进行状态的安全检查,再选择是否进入 )

10.内存管理

参考资料

**1.操作系统的内存管理主要是做什么?:**操作系统的内存管理主要负责内存的分配与回收(malloc 函数:申请内存,free 函数:释放内存),另外地址转换也就是将逻辑地址转换成相应的物理地址等功能也是操作系统内存管理做的事情。

2.为什么要用虚拟内存:

传统的物理内存分配存在:

1.进程的空间没有隔离,没有权限保护,(使得其他进程可能使用别的进程在使用的内存。)

2.内存利用率低:如果内存是连续分配的会造成有很多没有被利用的碎片。

虚拟内存的作用和基本思想:

一是方便进程进行内存的访问,虚拟内存的地址都是连续的。

每个程序拥有自己的地址空间,这个空间被分割成很多页,每一页地址都是连续的地址范围。这些页被映射到物理内存,但不要求是连续的物理内存,也不需要所有的页都映射到物理内存,而是按需分配,在程序片段需要分配内存时由硬件执行映射(通常是内存管理单元 MMU),调入内存中执行。

二是可以使有限的物理内存运行一个比它大很多的程序。

虚拟内存允许程序不用将全部地址空间都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序成为可能。如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。 (页面置换算法)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xOBoGhYP-1619188989253)(C:\Users\Chen\AppData\Roaming\Typora\typora-user-images\1619079528451.png)]

3.操作系统的内存管理机制了解吗?内存管理有哪⼏种⽅式?

⻚式管理 、 段式管理、段⻚式管理机制:

1.⻚式管理 :把主存分为⼤⼩相等且固定的⼀⻚⼀⻚的形式,⻚较⼩。⻚式管理通过⻚表对应逻辑地址和物理地址。( 将地址空间划分成固定大小的页,每一页再与内存进行映射 )

2.段式管理 : ⻚式管理虽然提⾼了内存利⽤率,但是⻚式管理其中的⻚实际并⽆任何实际意义。段式管理把主存分为⼀段段的,每⼀段的空间⼜要⽐⼀⻚的空间⼩很多 ,每个段的长度可以不同,并且可以动态增长。最重要的是段是有实际意义的,每个段定义了⼀组逻辑信息,例如,有“代码段”、“数据段”、“堆栈段”等。段式管理通过段表对应逻辑地址和物理地址。

**3.段⻚式管理机制:**段⻚式管理机制结合了段式管理和⻚式管理的优点。简单来说段⻚式管理机制就是把主存先分成若⼲段,每个段⼜分成若⼲⻚,

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

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

不同点:

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

5.页面置换算法:

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

**1.最佳页面置换算法OPT:**置换算法所选择的被淘汰页面将是以后永不使⽤的,或者是在最⻓时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于⼈们目前无法预知进程在内存下的若干⻚⾯中哪个是未来最⻓时间内不再被访问的,因⽽该算法⽆法实现。⼀般作为衡量其他置换算法的⽅法。

**2.先进先出⻚⾯置换算法FIFO:**总是淘汰最先进⼊内存的⻚⾯,即选择在内存中驻留时间最久的⻚⾯进⾏淘汰。

**3.最近最久未使用页面置换算法LRU:**LRU算法赋予每个⻚⾯⼀个访问字段,⽤来记录⼀个⻚⾯⾃上次被访问以来所经历的时间 T,当须淘汰⼀个⻚⾯时,选择现有⻚⾯中其 T 值最⼤的,即最近最久未使⽤的⻚⾯予以淘汰。

则叫做页面置换算法,

**1.最佳页面置换算法OPT:**置换算法所选择的被淘汰页面将是以后永不使⽤的,或者是在最⻓时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于⼈们目前无法预知进程在内存下的若干⻚⾯中哪个是未来最⻓时间内不再被访问的,因⽽该算法⽆法实现。⼀般作为衡量其他置换算法的⽅法。

**2.先进先出⻚⾯置换算法FIFO:**总是淘汰最先进⼊内存的⻚⾯,即选择在内存中驻留时间最久的⻚⾯进⾏淘汰。

**3.最近最久未使用页面置换算法LRU:**LRU算法赋予每个⻚⾯⼀个访问字段,⽤来记录⼀个⻚⾯⾃上次被访问以来所经历的时间 T,当须淘汰⼀个⻚⾯时,选择现有⻚⾯中其 T 值最⼤的,即最近最久未使⽤的⻚⾯予以淘汰。

4.最少使用页面置换算法LFU: 该置换算法选择在之前时期使⽤最少的⻚⾯作为淘汰⻚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值