zoukankan      html  css  js  c++  java
  • 《现代操作系统》读书笔记

    一:进程与线程

     1:进程的状态以及转换

       

    2:进程与线程的关系

    线程是进程中执行运算的最小单位,即处理机调度的基本单位。

    线程与进程的关系是:

    一个线程只能属于一个进程,而一个进程可以有多个线程;

    资源分配给进程,同一进程的所有线程共享该进程的所有资源;

    处理机分给线程,即真正在处理机上运行的是线程;

    线程在运行过程中,需要协作同步,不同进程的线程间要利用消息通信的办法实现同步。

    3:进程切换

    操作系统为每个进程维护一个进程表(PCB),当进程P1与P2发生切换时,P1的运行信息存于PCB1,P2的信息存于PCB2。每次进程恢复执行时,从相应的PCB中读取上次执行时留下的信息,接着上次结束时的状态继续执行。

    4:避免竞争条件的关键是不允许多于一个进程同时读写共享数据。

    竞争条件:两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件。

    临界区:对共享内存进行访问的程序片段称作临界区

    5:实现互斥的常用方案

       1)锁变量:设共享(锁)变量,当要进入,测得锁为0方可,并设置为1否则等到变为0

       2)信号量:设置信号量,进入临界区时down(mutex),离开时释放up(mutex)。

    6:信号量解决生产—消费者问题

    typedef int semaphore;
    //把进程共享操作的定义为信号量
    semaphore mutex=1;
    semaphore empty=N;
    semaphore full=0;
    
    void producer()
    { int item;
      while(1)
      {
       item=produce_item();
       //共享的内容用信号量表示,信号量用up/down来操作
       down(&empty);
       down(&mutex);
          insert_item():
       up(&mutex);
       up(&full);
      }
    }
    
    void consumer()
    { int item;
      while(1)
      {
       //共享的内容用信号量表示,信号量用up/down来操作
       down(&full);
       down(&mutex);
          remove_item():
       up(&empty);
       up(&mutex);
      }
    }

    7:信号量实现读者—写者问题

    typedef int semaphore;
    semaphore mutex=1;
    semaphore working_on_db=1;
    int current_count=0;
    //并发读
    void reader()
    {
      while(1)
      {
       down(&mutex);
       current_count++;
       //第一个读者,获得数据库的控制权限
       if(current_count==1) down(&working_on_db);
       up(&mutex);
       read();
       down(&mutex);
       current_count--;
       //最后一位离开的读者释放数据库控制权限
       if(current_count==0) up(&working_on_db);
       up(&mutex);
       update_db();
      }
    }
    //独占写
    void writer() { while(1) { down(&working_on_db); write(); up(&working_on_db); } }

    8:进程调度

    批处理系统调度:

       1)先来先服务:按请求CPU的顺序来使用CPU

       2)最短作业优先:优先运行占用CPU时间短的进程

       3)最短剩余时间优先:使平均等待时间最少

    交互式系统调度:

       1)轮转调度:按时间片来调度,每个进程使用一个时间片就轮到下一个。

       2)优先级调度:优先级高的先运行

    二:存储管理

     物理内存不够用时,有两种处理方法:交换、虚拟内存。

    1:交换技术:把一个进程完整地调入内存运行一段时间再存回磁盘。

         交换技术的内存管理:

                                   1)位示图:内存划分为连续单元,每个单元用0表示空闲,1表示占用

                                   2)链表法:一个结点表示内存中一片区域。针对链表法管理内存时,查找空闲区的交换算法有:首次适配法、下次适应法、最佳适应法、最差适应法

    2:虚拟内存技术:每个程序的地址空间划分为页,这些页被映射到内存中执行,使得程序的一部分调入内存也能正常运行。

        缺页中断:当程序调用了不在内存中的页时,发生缺页中断。此时发生页面置换,把所需的位于磁盘上的页交换到内存中。

        页面置换算法:最优页面置换(每次置换距离下次使用最久者,不可能实现)、最近未使用算法、先进先出算法(链表实现,尾入头出)、第二次机会算法(检查表头最近是否使用过,是则移到表尾)、时钟页面置换(环状链表,指针指向的页面最近未使用则置换)、最近最少使用算法(表头入,表尾出)、工作集模型(不在工作集中的页面就置换)

    3:分页与分段

    分页:把一个程序的地址空间划分为固定大小的块,一块为一页。

    分段:段是逻辑独立的地址空间,大小不定。一个段是一个信息逻辑单位,有其自身的意义。

    4:

    逻辑地址:用户程序经编译之后的每个目标模块都以0为基地址顺序编址,这种地址称为相对地址或逻辑地址。 

    物理地址:内存中各物理存储单元的地址是从统一的基地址顺序编址,这种地址称为绝对地址或物理地址。 

    重定位:程序和数据转入内存时需对目标程序中的地址进行修改,这中把逻辑地址转变为内存的物理地址的过程为重定位。 

    三:文件系统

    1:文件系统布局

       每个操作系统有自身的文件系统,存放于磁盘上。磁盘划分为多个分区,每个分区有一个独立的文件系统。每个文件系统包含引导块、空闲空间管理、根目录、文件和目录等。

    2:文件的存储

       1)连续分配法:把每个文件作为一连串连续的数据块存与磁盘

       2)链表分配法:文件存于一个个磁盘块中,磁盘块以链表的形式相连。每个磁盘块有指针指向下一块(一个磁盘块相当于一个结点)

       3)文件分配表法:文件存于一个个磁盘块中,各块之间的上下文指针关系存于内存中的一个表中,这个表叫文件分配表(FAT)

       4)i节点法:文件增加一个叫i节点的属性,i节点包含了该文件所在的所有磁盘块地址。打开文件时,先把i节点加载到内存,由i节点的内容在磁盘中读取文件信息。

    3:文件共享

       创建一个link数据类型对象,指向要连接到的文件。然后把该对象放在发出连接请求的文件目录下即可。相当于:文件树B需要连接到文件树A,那么创建一个link对象(相当于一条有向边),link对象指向文件树B的根。然后我们把link对象放到文件树A目录下,相当于有向边从文件树A发出。那么就把树A和树B之间联通了起来。

    4:文件系统磁盘空间管理

       几乎所有文件系统都把文件分割成固定大小的块来存储。

       空闲块的管理主要有:块链表、位图 两种方法。

    四:输入输出

    1:直接存储访问(DMA)

       CPU对DMA编程,使得DMA能自动通知磁盘把块读入内存,加快了存储访问速度。

    2:中断:指计算机在执行期间,系统内发生了某一急需处理的事件,使得CPU暂时中止当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回到原来被中断处继续执行。

    3:假脱机:为了解决低速输入/输出设备和CPU速度不匹配的问题,可将用户程序和数据在外围机的控制下,预先从低速输入设备输入到磁带上,当CPU需要这些程序和数据时,再直接从磁带机高速输入到内存;或当程序运行完毕后CPU需要输出时,先高速地把结果输出到磁带上,然后在外围机地控制下,再把磁带上的计算结果由输出设备输出。这种输入/输出方式称为脱机输入输出方式。 采用这种方式大大加快了程序的输入/输出过程,提高了效率。

    4:磁盘臂调度算法

       1)最短寻道优先:总是处理与磁头当前位置最近的请求

       2)电梯算法:保持按照一个方向移动并且总是处理距离最近的请求,直到该方向上无请求则调转方向。

    五:死锁

    1:死锁:当多个进程因竞争资源而造成的一种僵局,在无外力作用下,这些进程将永远不能继续向前推进,我们称这种现象为死锁。

    2:死锁的条件:

          互斥条件:每一个资源要么分配给一个进程,要么是可用的

          占有和等待条件:进程占有资源并请求其他资源

          不剥夺条件:先前得到的资源不可强制被剥夺

          环路条件:进程形成了一个链,每一个进程都在等待链中的下一个进程释放所占有的资源

    3:死锁的检测

        单个资源:检测有无请求环路

        多个资源:可用资源矩阵+当前分配矩阵 > 请求矩阵 的方法去判断

    4:死锁的避免

        银行家算法:利用 仍需求资源矩阵 与 可用资源矩阵 的调配,看能不能把所有进程以某一种调度方式能成功运行完。

    5:死锁的防止

       1) 破坏互斥条件:有些设备(比如打印机可被spooled(假脱机)

       2) 破坏占有和等待条件:在开始时就请求全部资源

       3) 破坏不可抢占条件:这并不是一个可行的方案

       4) 破坏环路等待条件:对所有资源进行编号,请求必须按照编号的顺序。

  • 相关阅读:
    JdbcTemplate
    Spring AOP——基于XML的进阶案例
    Spring
    面试题
    切面编程
    选择题
    Spring核心概念
    缓存
    BFC 神奇背后的原理
    git 教程
  • 原文地址:https://www.cnblogs.com/ygj0930/p/6506001.html
Copyright © 2011-2022 走看看