(仅作自己学习使用)
操作系统中最核心的概念是进程,这是对正在运行程序的一个抽象。即使可以利用的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;转换2和3是由进程调度程序引起的,进程调度程序是操作系统的一部分。系统认为一个运行进程占用处理器的时间已经过长,决定让其他进程使用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 混合实现
人们已经研究了多种可以将用户级线程的优点和内核级线程的优点结合起来的方法。一种方法是使用内核级线程,然后将用户级线程与某些或者全部内核线程多路复用起来。内核只识别内核级线程并对其进行调度,其中一些内核级线程会被多个用户级线程多路复用。在这种模型中,每个内核级线程有一个可以轮流使用的用户级线程集合。
相关推荐
操作系统实验报告——线程与进程同步,主要探讨了在Linux环境下如何实现进程和线程的同步,以解决经典的生产者-消费者问题。该实验旨在帮助学生掌握操作系统提供的同步机制,并深化对经典同步问题的理解。 实验内容...
随着多道系统的出现,进程作为资源分配和处理器调度的基本单位,是操作... 为了避免进程切换使得系统付出的开销过大,现代操作系统在进程的基础上又引入了“线程”的概念,用线程代替进程成为处理器调度的基本单位。
进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。一个应用程序可以有一个或多个进程,一个进程可以有一个或多个线程,其中一个是主线程。
在本项目"操作系统课程设计——简单多线程"中,我们将深入探讨多线程这一关键概念,以及它在操作系统中的实现。 多线程是指在一个进程中同时执行多个线程,每个线程都具有独立的执行路径,可以并行处理任务,提高...
在这个基于Java实现的操作系统实验——进程管理系统中,我们将深入探讨与进程管理相关的概念和技术。 首先,我们需要理解什么是进程。在操作系统中,进程是程序在执行过程中的一个实例,包含程序代码、数据、环境...
总结来说,操作系统进程管理涉及的内容广泛,包括进程的创建、销毁、同步、通信、调度等,这些知识点对于理解和优化系统性能至关重要,也是操作系统设计与分析的基础。理解这些概念和技术对于软件开发、系统管理员...
《操作系统——并发与分布式软件设计》是一本由英国学者Jean Bacon和Tim Harris共同编著的专业书籍,它深入探讨了操作系统中的关键概念,特别是并发和分布式系统的设计原理。这本书旨在为读者提供一个全面的理解,...
操作形同实验——进程同步和互斥 (1) 通过编写程序实现进程同步和互斥,掌握有关进程(线程)同步与互斥的原理,以及解决进程(线程)同步和互斥的算法,从而进一步巩固进程(线程)同步和互斥等有关的内容。 (2...
操作系统中的线程是执行上下文的一个基本单位,它在进程的范围内运行,共享同一内存空间。线程模型的引入使得程序能实现并发执行,提高了系统的并行性和资源利用率。在这个主题中,我们将深入探讨线程的概念、类型、...
"操作系统面试——程序、进程、线程" 在操作系统中,程序、进程和线程是三个紧密相关的概念。程序是指一组静态的指令集合,存储在磁盘上,以文件的形式存在。进程则是指程序的实例,运行在自己的地址空间中,拥有...
通过实践,你可以深入理解进程在操作系统中的运行机制,以及如何通过编程接口与操作系统交互。在分析源代码时,注意理解每个API函数的作用,以及它们如何协同工作以实现进程的创建。同时,文档部分应该详细记录实验...
操作系统实验报告——进程同步与互斥 本实验报告的主要目的是掌握基本的进程同步与互斥算法,理解生产者-消费者问题,并学习使用 Windows 2000/XP 中基本的同步对象,掌握相关 API 的使用方法。 一、进程同步与...
在windows的环境下,创建一个控制台进程,此进程创建两个并发线程,一个是读线程,另一个是写线程。这两个线程共享一个数组A,写线程对数组分别进行10次写操作,每次写操作对A的每个元素赋一个相同的值;读线程对数组...
操作系统复习笔记2——进程管理 操作系统中的进程管理是指操作系统对进程的创建、调度、同步和通信的管理。下面是关于进程管理的详细知识点: 1. 进程概念 进程是一个程序在执行时的实体。它包括进程控制块(PCB...
以生产者消费者模型为基础,在Windows环境下创建一个控制台进程,在该进程中创建读者写者线程模拟生产者和消费者。写者线程写入数据,然后将数据放置在一个空缓冲区中供读者线程读取。读者线程从缓冲区中获得数据,...
### Linux高级编程知识点总结——进程线程 #### 进程与程序的区别及PCB - **进程与程序的区别**: - **程序**:指一组指令的有序集合,以文件形式存储在磁盘等存储媒介上,是一个静态的概念。 - **进程**:是一...
在Linux操作系统中,进程是通过一系列复杂的数据结构来描述和管理的。这些数据结构提供了对进程生命周期、状态转换以及资源管理的支持。 **主要数据结构包括:** - **`struct task_struct`**:这是最重要的进程...
操作系统实验报告——进程同步与互斥 该实验报告的目的旨在掌握基本的进程同步与互斥算法,理解生产者-消费者问题,并学习使用 Windows 2000/XP 中基本的同步对象,掌握相关API 的使用方法。实验环境采用 Windows ...
《操作系统——精髓与设计原理(原书第6版)》是一本深入探讨这一主题的经典教材,对于深入理解操作系统的本质和设计思路具有重要价值。 本书主要涵盖以下几个关键知识点: 1. **操作系统概述**:介绍操作系统的基本...
"操作系统实验报告——进程同步和互斥" 本实验报告的主要目的是设计和实现生产者-消费者模型,以掌握基本的进程同步和互斥算法,理解生产者-消费者问题。在 Windows 2000/XP 环境下,使用 Visual C++ 6.0 创建一个...