`
brandNewUser
  • 浏览: 444732 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

操作系统——进程与线程

阅读更多

 (仅作自己学习使用)

操作系统中最核心的概念是进程,这是对正在运行程序的一个抽象。即使可以利用的CPU只有一个,但它们也支持并发操作的能力。

 

1.   进程

在任何多道程序设计系统中,CPU由一个进程快速切换到另一个进程,使每个进程各运行几十或几百毫秒,这就产生了并行的错觉。

 

1.1          进程模型

在进程模型中,计算机上的所有软件(包括操作系统)被组织成若干顺序进程。一个进程就是一个正在执行程序的实例,包括程序计数器、寄存器和变量当前值。由于CPU在各进程之间来回快速切换,每个进程执行其运算的速度是不确定的。

 

进程和程序间的区别非常微妙,一个进程是某种类型的一个活动,有程序、输入、输出以及状态。单个处理器可以被若干进程共享,使用某种类型调度算法决定何时停止一个进程的工作并转而为另一个进程提供服务。如果一个程序执行了两遍,那么就会被算作两个进程。

 

1.2          创建进程

4种主要事件会导致进程的创建:

1)  系统初始化;

2)  执行了正在运行的进程所调用的进程创建系统调用;

3)  用户请求创建一个进程;

4)  一个批处理作业的初始化。

 

启动操作系统时,通常会创建若干个进程,有些是前台进程,可以与用户进行交互操作,有些是后台进程,具有某些专门的功能。

 

除了在启动创建阶段创建进程以外,新的进程也可以在以后创建。一个正在运行的进程经常会发起系统调用,以便创建一个或多个新进程协助其工作。所要从事的工作可以容易地被划分为多个相关但没有相互作用的进程时,创建新的进程就非常有用。

 

在交互式系统中,输入一串命令或双击一个图标就可以启动一个程序,新建一个进程,并在其中运行启动的程序。

 

最后一种情形仅在大型机的批处理系统中应用。用户在这种系统提交批处理作业,当操作系统认为有资源可运行另一个作业时,它创建一个新的进程,并运行其输入队列中的下一个作业。

 

从技术上看来,新进程都是由于一个已存在的进程执行了一个用于创建进程的系统调用而创建的,这个进程所要做的工作就是,执行一个用来创建新进程的系统调用,通知操作系统创建一个新的进程,并直接或间接地指定该进程中运行的程序。

 

1.3          进程的终止

进程在创建之后开始运行,完成工作,直至终止,终止的条件可能会由下面条件导致:

l  正常退出,自愿:多数进程都是完成其工作之后正常退出;

l  错误退出,自愿:进程发现了严重错误,例如引用的文件不存在,程序出错退出;

l  严重错误,非自愿:进程引起错误,引用了不存在的内存,执行非法指令;

l  被其他进程杀死,非自愿:某个进程执行一个系统调用通知操作系统杀死某个其他进程,例如kill命令;

 

1.4          进程层次结构

当进程创建了另一个进程之后,父进程和子进程就以某种形式继续保持关联。子进程还可以继续创建更多的进程,形成一个进程的层次结构。UNIX系统中进程和其所有子进程共同组成一个进程组;Windows中没有进程层次的概念,所有的进程都是地位相同的。

 

1.5          进程的状态

尽管每个进程是一个独立的实体,有其自己的程序计数器和内部状态,但进程之间经常需要相互作用,一个进程的输出结果可能作为另一个进程的输入,这典型地在shell中的管道命令中被使用。

 

下图中显示出了进程的三种状态:

 

 

l  运行态:占用CPU

l  就绪态:可运行,但由于其他进程运行而暂时停止;

l  阻塞态:除非某些外部事件发生,否则进程不能运行;

 

在操作系统发现进程不能继续运行下去之后,发生转换1;转换23是由进程调度程序引起的,进程调度程序是操作系统的一部分。系统认为一个运行进程占用处理器的时间已经过长,决定让其他进程使用CPU时间时,会发生转换2;在系统已经让所有其他进程享有了它们应有的公平待遇而重新轮到第一个进程再次占用CPU运行时,会发生转换3;当进程等待的一个外部事件发生时,则发生转换4,如果此时没有任何进程执行,直接发生转换3,该进程便开始运行。

 

1.6          进程的实现

为实现进程管理,操作系统维护着一张进程表(一个结构数组),每个进程占用一个进程表项(或称为进程控制块)。该表项包含了进程状态的重要信息,包括程序计数器,堆栈指针,内存分配状况,所打开文件状态,帐号和调度信息,以及其他在进程由运行态转换为阻塞态或就绪态时必须保持的信息,从而使得该进程随后能够再次启动,就像从来没有被中断过一样。下图中展示了一个典型系统中进程表的关键字段:

 

 

 

在了解进程表后,就可以对单个CPU上如何维持多个顺序进程做更多的阐述。与每一个I/O类关联的是一个称作中断向量的位置,包含中断服务程序的入口地址。中断程序会将程序计数器,程序状态字,寄存器压入堆栈,随即跳转到中断向量所指示的地址。

 

所有的中断都是从保存寄存器开始,随后会从堆栈中删除由中断硬件机制存入堆栈的那部分信息,并将堆栈指针指向一个由进程处理程序指定的临时堆栈。该例程结束后,会使某些进程就绪,调用调度程序决定随后进行哪些进程,为当前的进程装入寄存器值以及内存映射并启动该进程运行。

 

1.7          多道程序设计模型

采用多道程序设计可以提高CPU的利用率,从概率的角度来看CPU的利用率,假设一个进程等待I/O的时间与其停留在内存的时间比为p,当内存中有n个进程时,所有n个进程都在等待I/O的概率是p^n, CPU的利用率为1-p^n

 

 

 

为了使CPU的利用率变高,在内存中就要尽量多地存放进程,但不同比率的程序会有着不同的吞吐量提升空间。

 

2.   线程

传统操作系统中,每个进程有一个地址空间和一个控制线程。经常存在在同一个地址空间中并行运行多个控制线程的情形,这些线程就像分离的进程,共享地址空间。

 

2.1          线程的使用

人们需要线程主要原因是,在许多应用中同时发生着多种活动,其中某些活动随着时间的推移会被阻塞,通过将这些应用程序分解成准并行运行的多个顺序线程,程序模型会变得更简单。

 

多线程概念中加入了一种新的元素:并行实体共享同一个地址空间和所有可用数据的能力;由于线程比进程更加轻量级,比进程更容易创建和撤消;若多个线程都是CPU密集型的,并不能获得性能上的提升,但如果存在着大量计算和I/O处理,拥有多个线程允许这些活动交叉运行,加快应用程序执行速度。在多CPU系统中,多线程是有益的,这样的系统中真正的并行有了实现的可能。

 

考虑一个多线程发挥作用的例子:web服务器,对页面的请求发给服务器,而所请求的页面发回给客户端。

 

 

 

一个成为分派程序的线程从web读入请求,挑选一个空转(阻塞)的工作线程,提高该请求并分派线程唤醒睡眠的工作线程,将其从阻塞态转为就绪状态。在工作线程被唤醒后,检查有关的请求是否被放在web页面高速缓存(所有线程均可访问)中。如果没有,该线程开始从一个磁盘调入页面的read操作,阻塞直到磁盘完成。在阻塞的过程中,为了完成更多的请求,分派线程可能挑选另一个线程运行。

 

假设没有多线程可用,web服务器的主循环获得请求,在取下一个请求之前完成工作,在等待磁盘操作时,服务器CPU就会空转,不处理任何到来的其他请求。

 

多线程使得顺序进程的思想得以保留下来,这种顺序进程阻塞了系统调用(如磁盘I/O),但依旧实现了并行性。单线程服务器虽然保留了阻塞系统调用的简易型,但放弃了性能。体现多线程作用的一个例子是那些必须处理大量数据的应用,有关的线程可以用一个输入线程,一个输出线程和一个处理线程组成。输入线程把数据读入到输入缓冲区;处理线程从输入缓冲区中读出并处理数据,将结果放到输出缓冲区中;输出线程将这些数据写到磁盘中。三个线程可以同时进行。当然,这种模型只有当系统调用只阻塞调用线程而不是进程时才会起作用。

 

2.2          经典的线程模型

线程给进程模型增加了一项内容,即在同一个进程环境中,允许彼此之间有较大独立性的多个线程同时执行。在同一个进程中并行运行着多个线程,是对在同一个计算机上并行运行多个进程的模拟。前一种情况下,多个线程共享一个地址空间和其他资源。而在后一种情形中,多个进程共享物理内存,磁盘,打印机和其他资源。线程有时会被称为轻量级进程。

 

所有的线程都有完全一样的地址空间,这意味着他们共享同样的全局变量。由于多个线程都可以访问进程地址空间的每一个内存地址,所以一个线程可以读,写,甚至清除另一个线程的堆栈。线程之间没有保护,这是因为不可能也没有必要。不同进程来自不同的用户,一个进程总是由某个用户所拥有,线程之间除了共享地址空间之外,还共享同一个打开文件集,子进程,报警和信号等。

 

和传统进程一样,线程可以处于若干种状态的任何一个:运行,阻塞,就绪和终止。每个线程都有自己的堆栈,每个线程都会有一帧,供各个被调用但还没有从中返回的过程使用。

 

多线程情况下,进程通常会从当前的单个线程开始创建;当一个线程完成工作后,可以通过调用一个库过程退出,不再可调度。

 

2.3          用户空间中实现线程

 

 

 

在用户空间管理线程时,每个进程需要有其专用的线程表用来跟踪该进程中的线程。和内核中的进程表类似,不过它仅仅记录各个线程的属性,如每个线程的程序计数器,堆栈指针,寄存器状态等等。线程表由运行时系统管理,当一个线程转换到就绪状态或阻塞状态时,在该线程表中存放重新启动该线程所需的信息。

 

当某个线程阻塞之后,在线程表中保存该线程的寄存器,查看表中可运行的就绪线程,并把新线程的保存值重新装入机器的寄存器中。只要堆栈指针和寄存器被切换,新的线程自动投入运行,整个线程的切换可以在几条指令内完成。进行类似这样的线程切换至少比陷入内核快一个数量级,这是用户级线程的最大优点。用户级线程可以允许每个进程拥有自己定制的调度算法,用户级线程还具有较好的可扩展性。

 

如果一个线程运行,那么在该进程中的其他线程就不能运行,除非第一个线程自动放弃CPU。在一个单独的进程内部,没有时钟中断,不可能采用轮转调度的方式调度线程。

 

2.4          内核中实现线程

 

 

内核管理线程的情况下,每个进程中不存在线程表了,在内核中有用来记录系统中所有线程的线程表。当某个线程希望创建一个新线程或撤消一个已有线程时,进行一个系统调用,这个系统调用通过对线程表的更新来完成线程创建和撤消工作。

 

内核的线程表中保存了每个线程的寄存器,状态和其他信息,信息与在用户空间的一样,只是存储的空间不一样。此外,内核还维护了传统的进程表以便于跟踪进程的状态。

 

所有能够阻塞线程的调用都以系统调用的形式实现,当一个线程阻塞时,内核根据其选择可以运行同一个进程中的另一个线程或其他进程中的线程。而在用户级线程中,运行时系统始终运行自己进程中的线程,直到内核剥夺了其CPU为止。

 

2.5          混合实现

 

 

人们已经研究了多种可以将用户级线程的优点和内核级线程的优点结合起来的方法。一种方法是使用内核级线程,然后将用户级线程与某些或者全部内核线程多路复用起来。内核只识别内核级线程并对其进行调度,其中一些内核级线程会被多个用户级线程多路复用。在这种模型中,每个内核级线程有一个可以轮流使用的用户级线程集合。

 

 

 

 

  • 大小: 18.1 KB
  • 大小: 34.4 KB
  • 大小: 19 KB
  • 大小: 24.7 KB
  • 大小: 22.1 KB
  • 大小: 16.7 KB
  • 大小: 19.1 KB
分享到:
评论

相关推荐

    操作系统实验报告——线程与进程同步

    操作系统实验报告,原创,写得很认真的。 内容为进程与线程同步,有流程图及源代码等

    操作系统——进程的控制与描述

    随着多道系统的出现,进程作为资源分配和处理器调度的基本单位,是操作... 为了避免进程切换使得系统付出的开销过大,现代操作系统在进程的基础上又引入了“线程”的概念,用线程代替进程成为处理器调度的基本单位。

    MFC高级编程——进程与线程

    进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。一个应用程序可以有一个或多个进程,一个进程可以有一个或多个线程,其中一个是主线程。

    操作形同实验——进程同步和互斥

    操作形同实验——进程同步和互斥 (1) 通过编写程序实现进程同步和互斥,掌握有关进程(线程)同步与互斥的原理,以及解决进程(线程)同步和互斥的算法,从而进一步巩固进程(线程)同步和互斥等有关的内容。 (2...

    操作系统——实验四 windows中线程的创建和同步控制

    在windows的环境下,创建一个控制台进程,此进程创建两个并发线程,一个是读线程,另一个是写线程。这两个线程共享一个数组A,写线程对数组分别进行10次写操作,每次写操作对A的每个元素赋一个相同的值;读线程对数组...

    操作系统面试——程序、进程、线程[借鉴].pdf

    操作系统面试——程序、进程、线程[借鉴].pdf

    操作系统复习笔记2——进程管理

    操作系统复习笔记2——进程管理,涵盖进程、线程、CPU调度、进程同步和死锁

    操作系统实验——进程的同步与互斥(读者写者问题)

    以生产者消费者模型为基础,在Windows环境下创建一个控制台进程,在该进程中创建读者写者线程模拟生产者和消费者。写者线程写入数据,然后将数据放置在一个空缓冲区中供读者线程读取。读者线程从缓冲区中获得数据,...

    操作系统——司机和售票员进程同步

    司机和售票员进程同步的完整课程设计实验报告

    疯狂内核之——进程管理子系统

    1.2 Linux的线程——轻量级进程 15 1.3 进程的创建——do_fork()函数详解 19 1.4 执行进程间切换 33 1.4.1 进程切换之前的工作 33 1.4.2 进程切换实务 —— switch_to宏 37 1.4.3 __switch_to函数 39 1.5 fork与...

    操作系统——生产者与消费者

    利用Windows提供的API函数,编写程序,解决生产者与消费者问题,实现进程的互斥与同步。 背景知识 1. 本实验要求设计在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供...

    操作系统——Linux信号量机制

    在Linux环境下实现一个多线程对临界资源的互斥操作,利用信号量实现对临界资源的保护,支持Linux下文件输入输出,提高对Linux环境下多进程、多线程、信号量机制和文件操作等知识的理解。 设有进程A、B、C,分别调用...

    操作系统实验——获取当前系统运行进程的信息

    新创建的线程与主线程均不断地循环,并输出shared_var 的值。主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对shared_var 进行减1 操作,即每次循环shared_var...

    操作系统——单处理器任务调度2

    说明:与前一个资源不一样,是同一个任务的不同代码。 在Linux环境下实现任务调度仿真,利用多线程实现任务池中的多个任务,支持先来先服务、轮转和反馈三种调度策略 设有任务A、B、C、D、E,分别具有不同的优先级...

    操作系统——单处理器任务调度

    在Linux环境下实现任务调度仿真,利用多线程实现任务池中的多个任务,...2.通过一个调度进程实现任务调度 3.有输出界面,在每个时间点输出任务状态、每个任务已经占用CPU时间和还需CPU时间,已经执行的任务顺序和时间。

    Win丨linux丨操作系统实验二:生产者——消费者问题

    操作系统实验二:生产者——消费者问题 1. 在Windows操作系统上,利用Win32 API提供的信号量机制,编写应用程序实现生产者——消费者问题。 2. 在Linux操作系统上,利用Pthread API提供的信号量机制,编写应用程序...

    操作系统课程设计——模拟生产者与消费者(java)

    在学习操作系统课程的基础上,通过实践加深对进程同步的认识,同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、...

    《操作系统原理与设计》全本

    3.4.2 多线程环境中的进程与线程 65 3.4.3 线程的实现 69 3.4.4 实例研究:JAVA语言中的线程 71 3.5 实例研究:SOLARIS的进程与线程 78 3.5.1 Solaris中的进程与线程概念 78 3.5.2 Solaris的进程结构 79 3.5.3 ...

Global site tag (gtag.js) - Google Analytics