您的位置:首页 > 其它

操作系统之并发 2012-02-25 18:01 1731人阅读 评论(0) 收藏

2012-02-25 18:01 190 查看
大家在看任何一本关于操作系统的书的时候都会看到操作系统有一下主要功能:

任务(进程)管理 、内存管理、设备管理、文件管理、给用户提供编程接口。

我们说一下操作系统中的任务管理。

计算机任务管理的基础是并行,所谓并行有两个层次的含义:1,是多个任务在不同处理机上真正并行,如在多核cpu上执行程序。2,是很多任务在分享cpu的工作时间,从宏观上看上去这些进程是并行的。

并行发生是所有问题的基础,我们就是利用一些技术来充分利用计算机的所有资源,像cpu,外围设备、内存等。

我们这里只关心任务的并发,我们知道一个程序一般有 输入 处理 输出,这基本上也是计算机解决问题的模式,一个程序在执行时很大程度上在等待资源,而一个任务在等待资源时,我们不希望它仍然占用着cpu。而是希望有另一个任务接着利用cpu。这就是操作系统任务管理所要解决的问题。其实就是在充分利用cpu这个资源,而这个资源在程序执行时表现为时间。就是让cpu在尽可能的时间上都在干对我们程序有意义的工作。

任务是一个包括程序运行所需要的所有环境的一个整体。要充分利用cpu时间,让程序并发执行,首先要保证任务之间的独立性。每个任务必须是一个完整的能在一个硬件平台运行的程序。操作系统的任务就是生成和管理这些独立的任务。

也就是说,操作系统要干的具体工作是这样的,它要知道一个任务何时产生,何时消亡,在这些已经产生的任务中保证在任意时刻都有一个任务在干有用的工作。产生在cpu上换任务的事件有很多,比如资源缺乏、时间到 等。在操作系统中时间是一个相当重要的资源。

今天我想说的不是关于任务的形态问题(产生、消亡、任务调度)。我想说的是任务之间是独立的,那另外一个问题就很容易出现,他们的合作问题。

我所说的合作,比如说一个任务在更改一个共享的数据,在更改过程中这个任务可能会被打断(cpu切换到其他任务执行),但我们要保证这个新到的任务不能再接着更改这个共享数据(因为上一个还没有更改完)。

并发是我们操作系统设计的目标,独立性是程序并发执行的基础,而互斥和合作是并发执行完成需求的方法。

其实合作应该实现了互斥的功能,但是合作是有意识的行为,操作系统中有很多现象是无法有意识的,比如,有3个任务要使用打印机。任何其中的一个任务并不知道其他任务也要使用打印机,它们之间无法有意识的合作,所以只能互斥,用互斥的方法来实现合作。从而不产生错误的结果。

和互斥相关的概念有:1,原子操作 2,临界段

1, 先说原子操作:一个或者多个指令序列,对外是不可分的;即没有其它的程序可以看到其中间状态或者中断此操作。

操作系统底层代码因为要管理任务的相关信息,而这些信息是整个操作系统的全局信息。操作系统正是通过了解和更改这些信息来管理任务的。因此,在操作系统更改这些信息时应该是原子操作。

实现原子操作的方法

硬件上如关闭cpu中断。关闭了中断后这些在关闭中断后执行的代码就很安全了。

临界区:是一段代码,在这段代码中进程将要访问共享资源,当另外一个进程正在访问时,这个进程就不能在这段代码中执行。

这个是操作系统提供的并发性程序设计语言机制。如信号量 、互斥量等机制等。当然这些是针对任务级的工作策略。

下面就该说一下ucos在上面所说的方面上是怎么实现的。

先说一下另一个有趣的问题:操作系统和普通的应用程序并没有本质区别,也是一段有序的指令序列,但它却实现了管理任务、管理设备等功能。那操作系统是作为一个进程在运行还是作为其他形态?操作系统如果是作为一个进程在运行,那么改怎么控制它那?

关于这个问题,现在的操作系统有下面几种情况,

1, 没有进程的操作系统,作为独立内核运行

2, 在用户空间执行操作系统代码,这样每一个进程就不光包括原来的代码,还包括操作系统的代码

3, 作为进程的操作系统,它设计时把最精简的部分放在内核执行,其他的作为系统服务进程来操作。

其实不管哪种方式,从本质上来讲,操作系统都是凌驾于任务这个概念之上的,因为操作系统的代码要管理这些任务,任务这个概念只是用户层次上的概念。而操作系统是作为一种在特权模式下运行的特殊代码。

而ucos是没有内核进程概念的,它是属于1种的,只是用特殊代码管理任务的一个东西。

在操作系统执行时,为了保证数据的安全,由于它们在运行时可能都想更改任务的核心信息,无法有意识的合作,因此只能用互斥的方法来保证数据安全。Ucos操作系统级代码用的是关闭中断的方法。

而在任务级则提供了并行设计语言的机制,如信号量、消息邮箱、事件组标志等。

从我上面的描述,可以看出,我们最初的设计操作系统的目的是并发,而要实现并发的基本条件是独立性。有了独立性才能实现宏观概念上的并发,而这个独立性有两个层次上的独立,一是操作系统核心级的代码要独立,二是操作系统任务级的代码要提供独立机制。

对第一个问题,所谓独立性就是我更改一个全局信息时要完全独立,要实现这个独立性,方法应该是合作,即不该打扰他人时就不能打扰他人。但合作是有意识的行为,代码本身和问题本身不能实现有意识的行为,那只能通过另一种途径,即互斥,我干的时候就不让别人影响。杂这个层次上实现互斥一般要有硬件支持。如关中断。

二是任务级的独立性。只有独立才能实现宏观的并行。但任务完全独立就不能实现具体的功能,因为任务独立是为了充分利用资源,而解决问题是需要任务之间的合作。这种合作是有意识的,因为这个是编程者的思维展现。这个是操作系统给用户提供的编程接口和并发程序设计的机制。这个具体实现是软件思想。比如我们所说的信号量机制、消息邮箱的机制等。

当然,有些操作系统给用用户留的编程接口是并发程序设计的接口,这些是用户层次的并发设计的软件设计方法。在操作系统内部当然可以用这些机制了,这些是除了硬件保证独立性之外的软件方法。到现在为止,我还没有深入理解复杂的操作系统,像linux。只是在学习了ucos这个操作系统之后的一些心得。好了,先写到这。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐