操作系统基础知识(1)

进程描述

 

为了能使程序并发执行,并且可以对并发执行的程序加以描述和控制,人们引入“进程”概念,为使得参与并发执行的每个程序能独立的运行在操作系统 中为其配置一个专门的数据结构—进程控制块(Proses Control Block,PCB),

进程的特征(进程和程序的区别)

进程和程序是两个完全不同的概念除了进程具有程序没有的PCB之外还具有一下特性:

1.动态性:动态性是进程的最基本的特性,表现在“其是由创建而产生,由调度执行,由撤销而消亡”而程序知识一组有序的指令集合,静态的存放于某种介质中

2.并发性:指的是多个进程同处于内存中且可以在一段时间内同时运行,引入进程的目的正是为了并发,而程序没有PCB所以不能参与并发。

3.独立性,异步性。

 

进程的三种基本状态

就绪(进程被分配到了除了CPU以外的所有必要的资源)、执行、阻塞

三种状态的转化:

为了满足PCB对数据及操作的完整性要求以及增强管理的灵活性。再增加创建状态和终止状态。

 

 

挂起操作和进程状态的转化

为了系统和用户观察和分析进程的需要,引入了挂起操作,为方便程序运行时能实时的禁止活动。并方便开发者在运行出现问题时可以修改程序

引入挂起原语suspend和激活原语active

进程状态的转化

1. 活动就绪-->静止就绪

2. 活动阻塞-->静止阻塞

3. 静止就绪-->活动就绪

4. 静止阻塞-->活动阻塞

状态转化图:

 

 

 

PCB的作用

使一个在多道程序环境下不能独立运行的程序成为一个能够独立运行的基本单位

1.作为独立运行的基本单位的标志

2.能实现间断性运行的方式

3.提供进程管理和调度所需要的信息

4.实现与其他进程的同步和运行

进程同步工具--管程

线程的引入:资源调度的基本单位

为减小程序在并发执行时所付出的时空开销并同时让系统具体更好的并发性而存在。

 

处理机调度的层次:

外存到内存:为作业调度

 

调度分类

 

高级调度:又称做作业调度或长程调度,操作对象是作业,其功能呢,根据某种算法。决定将外存上处于后备队列中那几个作业调入内存,为它创建进程分配必要资源,并将他们放到就绪队列。

低级调度:又称进程调度,对象是进程,功能是通过某种算法决定就绪队列中那个进程应该获得处理机。

 

调度的目标:

1.提高资源利用率

2.公平性

3.平衡性

4.使得策略强制执行

其中不同类型的操作系统的目标也不相同

分时系统:响应时间快、追求均衡性

实时系统:截止时间的到保证,有可预测性

 

作业的三个阶段和三个状态

三阶段:收容——运行——完成

三状态:后备队列状态——运行状态——完成状态

 

调度算法:

先来先服务调度算法(FCFS):

谁先来处理谁

短作业优先调度算法(SJF)

谁短谁先

优先级调度算法(PSA)

基于作业的紧迫程度由外部赋予优先级,该调度可以是进程调度也可以是作业调度

高响应比调度算法

优先权=(等待时间+要求服务时间)/要求服务的时间

进程调度的任务

1.保存处理机的现场信息

2.按某种算法选取进程

3.把处理器分配给进程

轮转法原则:根据时间片进行轮询,时间片大小自行设置。

 

进程底层实现

信号量机制:

实现PV操作(pv操作即wait、signal)

分类:

整型信号量:不让权

记录型信号量:让权

and型信号量,不会产生死锁,但浪费资源

生产者-消费者生产模式:

没有考虑,互斥和同步

如何解决?

假定具有n个缓冲区(在缓冲池中)这时利用互斥信号量mutex实现各进程对缓冲区的互斥使用,利用信号量empty和full分别表示缓冲区空的个数和缓冲区满的个数,他们的个数相加等于n

 

实际例子:

问题:桌上有一个哦案子,每次只能放一个水果,爸爸专门向盘中放苹果,妈妈专门向盘中放橘子,他们有一儿一女,儿子专等着吃橘子,女儿专门等着苹果。

伪代码表示:

Semphor mutex = 1;//互斥信号量
//初始化各变量
semphor orange=0;
semphor apple = 0;
semphor empty = 1;

/*"生产者-father”*/
father(){
while(1)
   {
        p(empty);//申请缓冲区
        p(mutex);//互斥信号量,相当于上锁
          把苹果放入盘子中;
        v(mutex);//释放锁
        v(apple);//释放缓冲区

     }
}

/*"生产者-mom”*/
mom(){
while(1)
   {
        p(empty);//申请缓冲区
        p(mutex);//互斥信号量,相当于上锁
           把橘子放入盘子中;
        v(mutex);//释放锁
        v(orange);//释放缓冲区

     }
}

/*"消费者-son”*/
son(){
while(1)
   {
        p(orange);//申请缓冲区
        从盘子拿一个橘子;
        v(empty);//释放缓冲区

     }
}

/*"消费者-daughter”*/
daughter(){
while(1)
   {
        p(apple);//申请缓冲区
        从盘子拿一个苹果;
        v(empty);//释放缓冲区

     }
}

  

利用and信号量解决生产者-消费者问题

  (事实上合并了empty和mutex操作)

利用管程解决生产者-消费者问题

1.建立一个管程

2.put(x)过程

3.get(x)过程

4.两个方法共享count资源,让其访问同一个资源

 

哲学家进餐问题(利用记录型信号量解决)

问题描述:现在有五个哲学家,每个哲学家面前有一只筷子,而且每个哲学家只能拿左右相邻的哲学家面前的筷子,如何保证哲学家们正常用餐

伪代码:

semaphore chopstick = 1,1,1,1,1;
//所有信号量初始化为1.第i位哲学家活动可以描述为
do{
        wait(chopstick[i]);//申请自己的筷子
        wait(chopstick[i+1]%5);//申请邻座的筷子
         i.eat();
         signal(chopstick[i]);//释放自己的筷子
         signal(chopstick[i+1]%5);//释放邻座的筷子
         i.think();
}while

  

读者-写者问题

这个问题比哲学家问题多一个互斥信号量

一个是,读者和写者之间的互斥

一个是,读者和读者之间的互斥

进程之间的通信

1.共享存储器

(1)基于数据结构的通信方式

(2)基于共享存储区的通信系统

2.管道通信

该方式必须提供三方面的协调:1. 同步 2. 互斥 3. 确定对方是否存在

3.消息传递系统

4.c/s模式下系统

三大类:

套接字

远程过程调用(rpc)

远程方法调用

 

 

 

 

posted @ 2020-07-05 18:55  鑫鑫怪  阅读(403)  评论(0)    收藏  举报