计算机操作系统学习笔记

计算机操作系统学习笔记

一、基础

1、物理内存和虚拟内存

1.1、物理内存

1.1.1、应用中的描述

物理内存是计算机上的最重要的资源之一。Windows的内存管理器负责给活动进程、设备驱动,和操作系统自己分配内存。因为绝大多数系统所能访问的数据和代码远比物理内存多,所以从本质上来说,物理内存是代码和数据在其中运行的窗口。所以内存容量对性能有影响,因为如果进程或者操作系统所需的代码或者数据不存在,内存管理器就需要从磁盘中读取这些内容。

1.1.2、CPU中的描述

物理内存,CPU的地址线可以直接进行寻址的内存空间大小。比如8086只有20根地址线,那它的寻址空间就是1MB。我们就说8086能支持1MB的物理内存。即使我们安装了128M的内存条在板子上,我们也只能说8086拥有1MB的物理内存空间。同理32位的386以上CPU,就可以支持最大4GB的物理内存空间了。

1.2虚拟内存

虚拟内存是对主存和磁盘 I/O 设备的抽象表示,是操作系统为每个进程分配的连续的虚拟地址空间。
内存和外存之和为虚拟内存

1.3区别

虚拟内存就与物理内存相反,是指根据系统需要从硬盘虚拟地匀出来的内存空间,是一种计算机系统内存管理技术,属于计算机程序,而物理内存为硬件。因为有时候当你处理大的程序时候系统内存不够用,此时就会把硬盘当内存来使用,来交换数据缓存区,不过物理内存的处理速度是虚拟内存的30倍以上。

2、缓存IO和直接IO

I/O:输入/输出(Input/Output),分为IO设备和IO接口两个部分。在POSIX兼容的系统上,例如Linux系统,I/O操作可以有多种方式,比如DIO(Direct I/O),AIO(Asynchronous I/O, 异步I/O),Memory-Mapped I/O(内存映射I/O)等,不同的I/O方式有不同的实现方式和性能,在不同的应用中可以按情况选择不同的I/O方式。

2.1、缓存io

缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,数据先从磁盘复制(DMA copy)到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序的地址空间。

DMA:IO设备和内存之间的数据传输方式。DMA(直接内存访问,Direct Memory Access),不经过Cpu而直接进行磁盘和内存的数据交换。在DMA模式下,CPU只需要向DMA控制器下达指令,让DMA控制器来处理数据的传输,DMA控制器通过系统总线来传输数据,传送完毕再通知CPU,这样在很大程度上降低了CPU占用率,大大节省了系统资源。

读操作:操作系统检查内核的缓冲区有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回;否则从磁盘中读取,然后缓存在操作系统的缓存中。

写操作:将数据从用户空间复制到内核空间的缓存中。这时对用户程序来说写操作就已经完成,至于什么时候再写到磁盘中由操作系统决定,除非显示地调用了sync同步命令。

缓存I/O的优点:首先,在一定程度上分离了内核空间和用户空间,保护系统本身的运行安全;其次,可以减少读盘的次数,从而提高性能。

缓存I/O的缺点:在缓存 I/O 机制中,DMA 方式可以将数据直接从磁盘读到页缓存中,或者将数据从页缓存直接写回到磁盘上,而不能直接在应用程序地址空间和磁盘之间进行数据传输,这样,数据在传输过程中需要在应用程序地址空间(用户空间)和缓存(内核空间)之间进行多次数据拷贝操作,这些数据拷贝操作所带来的CPU以及内存开销是非常大的。

2.2 、直接io

直接IO就是应用程序直接访问磁盘数据,而不经过内核缓冲区,也就是绕过内核缓冲区,自己管理IO缓存区,这样做的目的是减少一次内核缓冲区到用户程序缓存的数据复制。

引入内核缓冲区的目的在于提高磁盘文件的访问性能,因为当进程需要读取磁盘文件时,如果文件内容已经在内核缓冲区中,那么就不需要再次访问磁盘。而当进程需要向文件写入数据是,实际上只是写到了内核缓冲区便告诉进程已经写成功,而真正写入磁盘是通过一定的策略进行延时的。

然而,对于一些较复杂的应用,比如数据库服务器,他们为了充分提高性能。希望绕过内核缓冲区,由自己在用户态空间时间并管理IO缓冲区,包括缓存机制和写延迟机制等,以支持独特的查询机制,比如数据库可以根据加合理的策略来提高查询缓存命中率。另一方面,绕过内核缓冲区也可以减少系统内存的开销,因为内核缓冲区本身就在使用系统内存。

直接IO的缺点:如果访问的数据不在应用程序缓存中,那么每次数据都会直接从磁盘加载,这种直接加载会非常缓存。通常直接IO与异步IO结合使用,会得到比较好的性能。(异步IO:当访问数据的线程发出请求之后,线程会接着去处理其他事,而不是阻塞等待)。

3、进程调度算法

操作系统中常用的进程调度算法,主要有三种优先调度算法、高优先权先调度算法和基于时间片的轮转调度算法:

3.1、优先调度算法

  • 先来先服务调度算法(FCFS)
    每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存运行,分配执行资源。
  • 短作业(进程)优先调度算法(SFJ)
    每次都是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们放入内存运行,分配执行资源。
    TIP:采用优先调度算法时,线程一旦获得CPU执行权限,将一直执行到完成,或发生某事件而被阻塞放弃处理时才会再重新调度
    缺点:优先调度算法未考虑到紧迫型作业。

3.2、高优先权优先调度算法

为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入了最高优先权优先(FPF)调度算法,当把该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业装入内存。当用于进程调度时,该算法是把处理机分配给就绪队列中优先权最高的进程。

  • 非抢占式优先权算法
    • 特点:系统一旦把处理机分配给了就绪队列中优先权最高的进城后,该进程便会一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时。
    • 适用系统:这种调度算法主要用于批处理中,也可用于某些对实时性要求不严的实时系统中。
  • 抢占式优先权调度算法
    • 特点:当在系统执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给信道的优先权最高的进程。
    • 适用系统:显然,这种抢占式的优先权调度算法能更好的满足紧迫作业的要求,故而常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。

3.3、高响应比优先调度算法

原理:在短作业优先算法的基础上,为每个作业引入优先权,并使作业的优先级随着等待事件的增加而增加,则长作业在等待一定时间后,必然有机会分配到处理机。
特点:

  • 如果作业的等待时间相同,则要求服务的时间越短,其优先权越高,因而该算法有利于短作业;
  • 当要求服务的时间相同时,作业的优先权决定于其等待时间,等待时间越长,其优先权越高,因而它实现的是先来先服务;
  • 对于长作业,作业的优先级可以随等待时间的增加而提高,当其等待时间足够长时,其优先级便可升的很高,从而也可获得处理机。
    优点:该算法即照顾了短作业,又考虑了作业到达的先后次序,不会使长作业长期得不到服务。
    缺点:在利用该算法时,每当要进行调度之前,都须先做响应比计算,这会增加系统开销。

3.4、基于时间片的轮转调度算法

实现:

  • 系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片;
  • 当执行的时间片用完时;由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;
  • 然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一给顶的时间内均能获得一时间片的处理机执行时间。

3.5、多级反馈队列调度算法

实现:

  • 设置多个就绪队列,并未各个队列赋予不同的优先级与不同时间片。第一个队列的优先级最高,第二个队列次之,其余个队列的优先级逐个降低。在优先权越高的队列中,为每个进程所规定的执行时间片就越小。例如,第二个队列的时间片要比第一个队列的时间片长一倍。。,第i+1个队列的时间片要比第i个队列的时间片长1倍;
  • 当一个新进程进入内存后,首先将它放到第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统,如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样按FCFS原则等待调度执行;如果它在第二队列中运行一个时间片仍未完成,再依次将它放入第三队列。。。如此下去,当一个长作业(进程)从第一队列依次降到第n队列后,在第n队列便采取按时间片轮转的方式运行;
  • 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行。仅当第1-(i-1)队列均为空,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列中,则此时新进程将抢占正在运行进程的处理及,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理及分配给新的高优先权进程。TIP:在多级反馈队列调度算法中,如果规定了第一队列的时间片略大于大多数人机交互所需之处理时间时,便能够较好的满足个类型用户的需要。

4、线程和进程

参考:进程和线程的区别(超详细)_ThinkWon的博客-CSDN博客_进程和线程的区别

5、进程和线程的调度

参考:进程和线程的调度_Ryan-S的博客-CSDN博客_进程和线程的调度

6、线程的创建和结束

参考:(1条消息) 第七章_线程 : 线程的概念、创建与终止_马踏飞燕&lin_li的博客-CSDN博客

7、线程状态

参考:(1条消息) Java线程的6种状态及切换(透彻讲解)_潘建南的博客-CSDN博客_线程状态

8、线程间通信与线程同步机制

参考:
面试官:说说进程间通信和线程间通信的几种方式及区别 - 知乎 (zhihu.com)
线程间的通信、同步方式与进程间通信方式 - 简书 (jianshu.com)

9、互斥锁和信号量

参考:详解信号量和互斥锁之间的区别和联系

10、线程池

参考:java线程池 面试题

11、消费者和生产者

参考:http://t.csdn.cn/vW5QO

12、死锁

参考:死锁是什么?如何避免死锁? - 简书 (jianshu.com)

13、并发和并行

参考:面试必考的:并发和并行有什么区别? - 腾讯云开发者社区-腾讯云 (tencent.com)

二、面试题

1、什么是纤程?

  • 定义
    纤程是 fiber , 是由操作系统实现的一种轻量化线程上的一个执行结构。 通常是多个fiber共享一个固定的线程, 然后他们通过互相主动切换到其他fiber来交出线程的执行权.。各个子任务之间的关系非常强。

在Windows2000/XP中,纤程(fiber)相当于用户级别的线程或轻进程.纤程由Win32库函数支持,对核心是不可见的.纤程可以通过SwitchToFiber切换至另一合作纤程,以实现合作纤程之间的协同。

  • 优缺点
    • 优点:消耗小,切换快,一个进程可以创建成千上万个纤程。小任务顺序编程很符合人的思维方式, 规避纯异步编程中状态机的复杂性. 使得使用纤程写的程序将更加的直观, 逻辑描述方便, 简化编程.纤程用于化异步为同步, 你可以进行一个异步操作以后就切换纤程,等到异步操作完成以后在切换回来,这样,在逻辑上相关的代码就可以写到一个函数里面,而不用人为的分到多个回调函数中。没有了线程所谓的安全问题, 避免锁机制。
    • 缺点:纤程一般只支持所有的纤程函数在一个线程里面跑. 无法充分利用多核CPU, 除非把所有的IO和计算操作都剥离成单独的线程。关于跨平台的纤程的实现和使用资料较少。
  • 参考:
    • JVM之线程实现的不同方式、以及协程、纤程(基于《深入理解Java虚拟机》之第12章Java内存模型与线程)(下)_slow is fast.的博客-CSDN博客
    • 纤程_king_weng的博客-CSDN博客