• Windows中的进程和线程


    以下的内容是从《Windows via C/C++》上面摘出来的,作为复习和参考。



    一般将进程定义成一个正在运行的程序的一个实例,它由以下两部分构成。

    • 一个内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计信息的地方。
    • 一个地址空间,其中包含所有可执行文件或DLL模块的代码和数据。此外,它还包含动态内存分配,比如线程堆栈和堆的分配。

    进程是有“惰性”的。进程要做任何事情,都必须让一个线程在它的上下文中运行。该线程负责执行进程地址空间包含的代码。事实上,一个进程可以有多个线程,所有线程都在进程的地址空间中“同时”执行代码。为此,每个线程都有它自己的一组CPU寄存器和它自己的堆栈。每个进程至少要有一个线程来执行进程地址空间包含的代码。当系统创建一个进程的时候,会自动为进程创建第一个线程,这称为主线程。然后,这个线程再创建更多的线程,后者再创建更多的线程。。。如果没有线程要执行进程地址空间包含的代码,进程就失去了继续存在的理由。这时,系统会自动销毁进程及其地址空间。

    对于所有要运行的线程,操作系统会轮流为每个线程调度一些CPU时间。它会采取循环(轮询或轮流)方式,为每个线程都分配时间片(称为“量程”),从而营造出所有线程都在“并发”运行的假象。

    如果计算机配备了多个CPU,操作系统会采用更复杂的算法为线程分配CPU时间。

    线程也有两个组成部分:

    • 一个是线程的内核对象,操作系统用它管理线程。系统还用内核对象来存放线程统计信息的地方。
    • 一个线程栈,用于维护线程执行时所需的所有函数参数和局部变量。

    进程从来不执行任何东西,它只是一个线程的容器。线程必然是在某个进程的上下文中创建的,而且会在这个进程内部“终其一生”。这意味着线程要在其进程的地址空间内执行代码和处理数据。所以,假如一个进程上下文中有两个以上的线程运行,这些线程将共享同一个地址空间。这些线程可以执行同样的代码,可以处理相同的数据。此外,这些线程还共享内核对象句柄,因为句柄表是针对每一个进程的,而不是针对每一个线程。

    可以看出,相较于线程,进程所使用的系统资源更多。其原因在于地址空间。为一个进程创建一个虚拟的地址空间需要大量系统资源。系统中会发生大量的记录活动,而这需要用到大量内存。而且,由于.exe和.dll文件要加载到一个地址空间,所以还需要用到文件资源。另一方面,线程使用的系统资源要少得多。事实上,线程只有一个内核对象和一个栈;几乎不涉及记录活动,所以不需要占用多少内存。

    每个线程都有一个上下文,后者保存在线程的内核对象中。这个上下文反映了线程上一次执行时CPU寄存器的状态。大约每隔20ms,Windows都会查看所有当前存在的线程内核对象。在这些对象中,只有一些被认为是可调度的。Windows在可调度的线程内核对象中选择一个,并将上次保存在线程上下文中的值载入CPU寄存器。这一操作被称为上下文切换。线程执行代码,并在进程的地址空间中操作数据。又过了大约20ms,Windows将CPU寄存器存回线程的上下文,线程不再运行。系统再次检查剩下的可调度线程内核对象,选择另一个线程的内核对象,将该线程的上下文载入CPU寄存器,然后继续。载入线程上下文、让线程运行、保存上下文并重复的操作在系统启动的时候就开始,然后这样的操作会不断重复,直至系统关闭。

    系统只调度可调度的线程,但是事实上,系统中大多数线程都不是可调度的。例如有些线程对象的挂起计数大于0,这意味着该线程已被挂起,不应该给它调度任何CPU时间。可以通过调用CreateProcess或者CreateThread函数并传入CREATE_SUSPENDED标志来创建一个被挂起的线程。

    除了被挂起的线程之外,还有其他很多线程无法调度,因为它们都在等待某种事件发生。例如,如果运行Notepad程序,但是并不输入任何东西,Notepad线程将什么都不做。系统不会给没有任务的线程分配任何CPU时间。当我们移动Notepad的窗口时,或者其窗口需要重绘内容时,或者我们在其中输入时,系统将自动使其线程变为可调度。这并不意味着Notepad线程将立即获得CPU时间。只不过Notepad线程有任务了,系统会在某个时刻抽时间调度它——当然,我们希望越快越好。

  • 相关阅读:
    CentOS 6.10 安装mysql
    yum安装no more mirrors to try
    mysql密码问题
    tomcat的安装部署(CentOS8)(VM)
    tomcat的安装部署(windows10)
    docker中mongdb常用操作
    iphone手机卡顿解决方案
    常用sql进阶语句
    关键时刻,让你的iphone拒绝掉的所有来电
    jenkins环境安装(windows)
  • 原文地址:https://www.cnblogs.com/ini_always/p/2026859.html
Copyright © 2020-2023  润新知