《Windows内核原理与实现笔记》(四)Windows进程线程概念

85 篇文章 6 订阅
83 篇文章 9 订阅

进程概念

进程是各种资源的容器,它定义了一个地址空间作为基本的执行环境;而线程是一个指令执行序列,它可以直接访问所属进程中的资源。每个进程都至少有一个线程,而每个线程在任一时刻都一定属于某一特定的进程。

多进程模型

把时间细分,然后在某个适当的时间粒度上轮流执行这些任务,让每个任务都有机会被执行到。只要在人所能感知的时间粒度上(差不多是100~200ms)每个任务都有机会做一点事情,用户就会认为这些任务是同时在执行。这种并行也被称为伪并行,而这样的系统被称为分时系统。有时候,计算机可能配有多个处理器,伪并行也有可能变成真并行。

每个进程都有自己的运行时间轴,感觉就像在一个单独的处理器上运行一样。系统负责切换这些进程,让它们得以轮流执行。系统通过某种硬件机制或软件机制获得控制权,保留好这个进程的环境信息,包括内存空间、寄存器和指令流信息,然后挑选下一个要被执行的进程,恢复此进程的环境信息,并把控制权交给它,由它使用下一个时间片段。

操作系统需要做的事情是:维护一个全局的进程表,记录下当前有哪些进程正在被执行;把时间分成适当的片段,可以通过设置时钟中断来完成,因而每次时钟中断到来时系统就会获得控制权,在进程间实施切换。

一个C/C++程序的典型布局结构如下:

内存区域有三种类型:静态数据区、动态数据区,以及维护控制流信息和局部状态的调用栈区域。 

关于操作系统如何控制进程的创建和终止,首先,操作系统在引导过程中,必须把系统运行所必要的进程全部创建起来。所谓创建一个进程是指建立起基本的进程执行环境,然后把它加入到系统的全局进程表中,使它有机会得到处理器时间和其他系统资源,操作系统会创建一组初始的进程,这是在系统引导时完成的。

其次进程在必要时候可以请求系统帮他传教一个进程,也可以为了响应用户创建一个新进程。

进程完成操作之后,可以通知操作系统终止,当一个进程完成了所有预定的功能以后,它的使命便已结束,最后的职责是通知操作系统,自己要终止了。操作系统接到请求以后,清理掉这个进程所占据的各种资源,使它们能被回收,并且将该进程从系统的全局进程表中移除,在现代操作系统结构中,进程可以有多个控制流,每个控制流对应一个调用栈。操作系统在创建进程时仅建立一个控制流,但是在该控制流的执行过程中,它又可以创建额外的控制流,这样便形成了一个进程多个控制流的情形。

线程概念

线程不仅仅是一个控制流,它还有更多的内容。线程的调用栈(call stack)记录了它作为控制流的状态信息,包括每一层函数调用和返回的指令地址。线程一定隶属于某个进程,其控制流可以访问这个进程中的资源,包括所有的内存数据以及系统分配给此进程的其他资源。

线程模型

在现代计算机结构中,先后提出过两种线程模型:用户级线程(user-level threads)和内核级线程(kernel-level threads)。

所谓用户级线程是指,应用程序在操作系统提供的单个控制流的基础上,通过在某些控制点(比如系统调用)上分离出一些虚拟的控制流,从而模拟多个控制流的行为。用户级线程模型的优势是线程切换效率高,因为它不涉及系统内核模式和用户模式之间的切换;另一个好处是应用程序可以采用适合自己特点的线程选择算法,可以根据应用程序的逻辑来定义线程的优先级,当线程数量很大时,这一优势尤为明显。但是会增加复杂度。

用户级线程模型的优势是线程切换效率高,因为它不涉及系统内核模式和用户模式之间的切换;另一个好处是应用程序可以采用适合自己特点的线程选择算法,可以根据应用程序的逻辑来定义线程的优先级,当线程数量很大时,这一优势尤为明显。

内核级线程往往指操作系统提供的线程语义,由于操作系统对指令流有完全的控制能力,甚至可以通过硬件中断来强迫一个进程或线程暂停执行,以便把处理器时间移交给其他的进程或线程。所以,内核级线程有可能应用各种算法来分配处理器时间。处理器的时间通常是按线程而非进程来分配,因此,系统有必要维护一个全局的线程表,在线程表中记录每个线程的寄存器、状态以及其他一些信息。然后,系统在适当的时候挂起一个正在执行的线程,选择一个新的线程在当前处理器上继续执行。内核级线程的好处是,应用程序无须考虑是否要在适当的时候把控制权交给其他的线程,不必担心自己霸占处理器而导致其他线程得不到处理器时间。

内核级线程切换是个问题,因为涉及到用户模式切内核模式,但是现在cpu这部分时间可以接受。

线程的创建和删除也是一个重要的考虑指标。当应用程序或系统进程需要的线程数量可能比较多时,通常可采用线程池技术作为一种优化措施,以降低创建和删除线程以及线程频繁切换而带来的开销。

在支持内核级线程的系统环境中,进程可以容纳多个线程,这导致了多线程程序设计(multithreaded programming)模型。由于多个线程在同一个进程环境中共享了几乎所有的资源,所以,线程之间的通信要方便和高效得多,这往往是进程间通信(IPC,Inter-Process Communication)所无法比拟的,但是也很容易使线程之间因同步不正确而导致数据被破坏,而且,这种错误存在不确定性,因而相对来说难以发现和调试。

线程调度算法

如果一个操作系统支持内核级线程,那么处理器资源的调度通常在线程而非进程粒度上进行。

一个线程调度算法要考虑公平性,CPU的有效利用。

从大的分类来讲,调度算法可以分为非抢占式算法和抢占式算法。在非抢占式系统中,一个线程一旦被选择在处理器上运行,就将一直运行下去,直到阻塞(比如等待I/O或等待一个信号量)或者自愿放弃或退出。在抢占式系统中,一个线程被选中在处理器上运行以后,允许运行的时间长度有最大限制,一旦达到了这么长时间,就将被迫放弃执行权,交由系统挑选其他的线程来运行,或者若找不到其他的线程,则再把执行权交还给它,让它继续运行。抢占式调度算法需要一个时钟中断来获得对处理器的控制权,而非抢占式算法并不需要时钟中断。

典型的线程调度算法有(1) 先到先服务算法。(2) 时间片轮转调度算法。(3) 优先级调度算法。

Windows的调度算法是一个抢占式的、支持多处理器的优先级调度算法,它为每个处理器定义了一个链表数组,相同优先级的线程挂在同一个链表中,不同优先级的线程分别属于不同的链表。当一个线程满足了执行条件时,它首先被挂到当前处理器的一个待分配的链表(称为延迟的就绪链表)中,然后调度器会在适当的时候(当它获得了控制权时)把待分配链表上的线程分配到某个处理器的对应优先级的线程链表中。当这个处理器在选择下一个要运行的线程时,会根据优先级准则选择此线程(如果没有同等或更高优先级的线程也在等待运行的话)。Windows中线程的优先级调整考虑到了很多因素,例如前台线程、等待I/O完成后的线程也有轻微的优先级提升,这是一些来自实践经验的设计细节,它们使得Windows操作系统对于交互式应用程序有更好的性能表现。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值