《现代操作系统》读书笔记

一:进程与线程

 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) 破坏环路等待条件:对所有资源进行编号,请求必须按照编号的顺序。

原文地址:https://www.cnblogs.com/ygj0930/p/6506001.html