多旋翼无人机

    返回首页    发表留言
本文作者:李德强
          第一节 进程、线程与工作队列
 
 

        今天我们来一起学习多进程、多线程和工作队列的相关内容。提起这几个机制,我们首先要对操作系统的任务调度做一些简单的介绍。

一、任务调度

        早期的处理器都是单一核心的,也就是说处理器在同一时刻只能处理一个工作任务。对于计算机来说,早期的工作任务通常是单一的数学计算。但是经过多年的发展,计算机有了更多通用的功能,加上操作系统的不断发展,通用计算机可以为使用者提供更加多元化的处理功能。例如:查看照片,上网冲浪,播放音乐、视频等等。而对于用户来说,计算机可以“同时”执行这些任务,也就是说,人们可以在查看照片的同时播放音乐,或是上网冲浪。操作系统可以为用户提供多个同时工作的任务,即为并发执行的多进程机制。我们抛开处理器的多核多线程机制不管,来单独谈谈单核心单线程处理器是如何来处理多进程任务的,处理器在执行两任务时,通常是按时间片轮转的方式来分别执行两个任务(早期的操作系统都是按时间片轮转的方式来执行多任务的,现代操作系统有着很多任务调度策略。例如:多级反馈工作队列、实时优先级调度、非实时可变优先级调度等等),执行一小段时间后,处理器将当前任务的状态临时保存(保存现场),转去执行另一个任务,执行一小段时间后,再将这个任务的状态临时保存,再转回第一个任务继续执行(恢复现场)。例如:任务A和任务B, 处理器首先会载入这个任务的相关参数比如各个寄存器的内容、内存堆栈地址、执行代码位置等,并在应该执行代码处开始执行,当执行了一小段时间后将任务A的这些执行状态保存起来,转入任务B,载入任务B的相关参数比如各个寄存器的内容、内存堆栈地址、执行代码位置等,并在应该执行代码处开始执行,再过了一小段时间后将任务B的这些执行状态保存起来,再转到A任务,如此重复执行……

        当然,系统时间片是非常短的,通常只有1毫秒(千分之1秒),当处理器在多个任务之间来回切换执行时,用户几乎感觉不到这样的多个任务执行的停顿,所以当处理器执行多任务时,我们总是觉得多个任务在“同时执行”也就是“并行”,但其实从多任务的本质上来讲多个任务之间都是串行的,只不过在多任务切换时用户几乎察觉不出来。现在个人电脑中的处理器通常是多核心多线程的,但是它们在执行时任务数通常都没有系统中需要执行的程序的任务数多,甚至远远少于系统中需要执行的任务数,所以通常还是以微观上多任务串行机制来实现宏观上的并行效果。上面例子中以时间片轮转的方式来讲述多任务的执行过程,但实际上操作系统有很多算法来计算每一个任务的执行优先级,并按最优的调度算法来执行它们。

 

二、进程

        进程是操作系统执行计算机程序的基本单元。注意:是操作系统执行程序的基本单元,而不是调度的基本单元。我们可以通过一个例子来理解什么是进程:在计算机的外部存储器上(硬盘、U盘、光盘等)有着一个可执行程序文件叫作记事本——notepad,这个notepad就叫做在这个操作系统下的可执行程序。而当用户给操作系统发送执行notepad命令时,在多数图形界面操作系统下通常是用鼠标或触摸屏来点击此文件图标,而在命令行界面下的操作系统通常是输入这个可执行文件的路径和名称,例如./notepad。这样操作系统会载入这个可执行文件,并为其分配相应的内存资源和一个进程控制块PCB(Processing Control Block),并设定其使用的寄存器和数据段内存地址和代码段内存地址,再为其分配一个任务ID(task id),例如是3218,然后将此可执行程序做为一个进程开始任务调度。

        同一个可执行文件notepad可以被操作系统载入多次并执行,也就形成了操作系统中的多个进程。它们在内存中具有相同的代码内存段,但具有独立的数据内存段。虽然它们都是同一个可执行程序,但以多个进程的形式存在于操作系统中。因为每一个进程都有一个独立的任务控制块PCB和任务ID,而且它们在操作系统是“并行”的,也就是说对于用户来说同一个记事本程序被执行了多次,也就是多个叫作notepad的程序在操作系统是作为多个进程同时运行,它们有着不同的任务ID。

        实际上对于操作系统来说,每一个进程都是一个调度的对象,操作系统会按照一定的调度策略使它们能够合理的执行。而对于不同进程来说,它们的内存数据段资源是不同的。例如:上图中Notepad可执行程序执行3次,产生3个进程3218、3219、3220。虽然它们的功能都是记事本,但它们的所记录的内容却有所不同。而WebBrowser浏览器的2个进程3222和3223功能也相同,但它们的数据内容不同,因为这两个进程一个显示A网站的内容,而另一个显示B网站的内容。

 

三、线程

        通常我们并不希望操作系统的最小调度单位是进程。换句话来说,我们希望某一个进程在执行时,这个进程本身也可以“并行”执行多个任务,而不是只能执行一项任务。于是操作系统就引入了线程的概念。下面,我们通过一个具体的例子来说明这进程和线程的关系:有一个可执行程序,它的功能是可以将当前用户所输入内容保存到某一个文件当中去。我们打开它两次,也就是让操作系统产生两个进程:

        首先,我们知道这是两个进程,它们在操作系统的调度下具有独立的数据段,它们的功能和数据内容互不影响。我们可以在第1个进程中输入Hello,并将其内容保存到文件A中,而在第2个进程中输入Wold,并将其内容保存到文件B中。由于这两个进程是“并行”的,所以可以同时执行。

        接下来,由于文件A是存放在外存上的,外存的存取速度要远远低于内存,所以在将Hello这个内容写入文件A时,需要花更多的时间(实际上Hello这个字符串很短,写文件A时会很快完成,而对于理多内容的数据写入文件时会很慢)。当我们输入了Hello之后,点击OK按钮,将内容保存到文件A中,由于保存的时间会很长,这时我们不能再在输入框中再次输入内容。如果进程时操作系统调度的最小单元,在这个单元中只能执行一个任务,也就是说在第1个进程在执行“保存”时,这个进程就不能再做其它的工作了。但是我们希望这进程在执行“保存”功能的同时,不影响“输入”功能,也就是希望“保存”和“输入”可以同时执行。所以操作系统引入了“线程”机制,它允许在一个进程中可以创建多个可并行的调度单元,即为线程。所以“线程”机制可以使一个进程在同一时刻中可以执行多个任务(同时“输入”和“保存”)。例如在上面例子中,我们可以为进程创建3个线程:输入、显示和保存。这3个线程都是操作系统的调度单元,也就是说,这3个线程是并行执行。

        多个进程在操作系统中运行的过程通常被称为“多进程”,一个进程中的多个线程运行的过程通常被称为“多线程”。操作系统在为进程创建线程时也会为其分配PCB和任务ID,但与进程不同的是,一个进程中的多个线程都会共享这个进程中的内存资源。

 

四、工作队列

        在操作系统创建进程和线程时,需要为其分配PCB进而方便对其做调度,也就是前面所讲述到的保存现场与还原现场。所以每一个进程和线程被创建时,都要消耗掉一些额外的内存空间。这对于内存较大的服务器和个人计算机来说,并不是什么大事,而对于嵌入式的操作系统来说,内存资源非常有限,所以为了节省内存的消耗,操作系统通常都会为用户提供一种叫做工作队列的机制——workqueue。工作队列在操作系统中也是一个普通的进程,也是操作系统的一个调度单元,但其中可以为用户保存多个工作任务。用户可以向工作队列中加入等待执行的功能函数。操作系统在执行工作队列时就会调用这些预先保存的功能函数。

        操作系统在执行工作队列时,会按顺序执行所有需要执行的函数(当前时间片中需要执行的函数,而不是全部函数)。工作队列中的功能函数排列的顺序是按用户加入队列时所指定的时间间隔顺序,通常是按操作系统调度的TICK作为单位。

    返回首页    返回顶部
  看不清?点击刷新

 

  Copyright © 2015-2023 问渠网 辽ICP备15013245号