以下的内容是从《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线程有任务了,系统会在某个时刻抽时间调度它——当然,我们希望越快越好。

转载于:https://www.cnblogs.com/ini_always/archive/2011/04/25/2026859.html

Windows中的进程和线程相关推荐

  1. Java中的进程与线程

    2019独角兽企业重金招聘Python工程师标准>>> Java中的进程与线程 概念 进程与线程,本质意义上说, 是操作系统的调度单位,可以看成是一种操作系统 "资源&qu ...

  2. 掌握Android中的进程和线程

    进程和线程是现代网络操作系统的核心概念.Android作为一种优秀的.承袭Linux的移动操作系统,其进程和线程的概念是开发者和安全工作人员需要深入了解的问题.本文将详细介绍Android中的进程.线 ...

  3. Linux中的进程、线程和文件描述符

    说到进程,恐怕面试中最常见的问题就是线程和进程的关系了,那么先说一下答案: 在 Linux 系统中,进程和线程几乎没有区别 . Linux 中的进程就是一个数据结构,看明白就可以理解文件描述符.重定向 ...

  4. pythonmultiprocessing之 queue线程_python中的进程、线程(threading、multiprocessing、Queue、subprocess)...

    Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...

  5. Java中关于进程和线程的理解

    进程:进程是操作系统的基础结构,是一次程序的执行,是一个程序及其数据在处理机上顺序执行所发生的的活动,是程序在数据集合上运行的过程,它是操作系统进行资源调度和分配的一个  独            立 ...

  6. 操作系统中的进程与线程和java中的线程

    简介 在传统的操作系统中,进程拥有独立的内存地址空间和一个用于控制的线程.但是,现在的情况更多的情况下要求在同一地址空间下拥有多个线程并发执行.因此线程被引入操作系统. 为什么需要线程? 如果非要说是 ...

  7. python 协程、进程、线程_Python 中的进程、线程、协程

    1. 进程 进程是正在运行的程序实例,是内核分配资源的最基本的单元.进程拥有自己独立的堆和栈,独立的地址空间,资源句柄.进程由 OS 调度,调度开销较大,在并发的切换过程效率较低. Python 提供 ...

  8. 操作系统中的进程与线程

    简介 在传统的操作系统中,进程拥有独立的内存地址空间和一个用于控制的线程.但是,现在的情况更多的情况下要求在同一地址空间下拥有多个线程并发执行.因此线程被引入操作系统. 为什么需要线程? 如果非要说是 ...

  9. C#中使用Process调取Windows中的进程(应用程序)

    场景 效果 System.Diagnostics.Process 提供对本地和远程进程的访问权限并使你能够启动和停止本地系统进程. 示例代码 using System; using System.Di ...

最新文章

  1. Chrome_调试js出现Uncaught SyntaxError: Unexpected identifier
  2. python使用redis队列_【Python】python使用redis做队列服务
  3. 20145321 《Java程序设计》第7周学习总结
  4. getplotlyoffline(‘http://cdn.plot.ly/plotly-latest.min.js‘)无法下载如何解决
  5. jquery 实现返回顶部功能
  6. django 如何提升性能(高并发)
  7. 结合zxing 和zbar 扫一扫
  8. vue vue-router vuex element-ui axios 写一个代理平台的学习笔记(十一)构思商品页面...
  9. spring-session + redis 实现集群 session 共享
  10. NFS调试linux内核启动卡死在DHCP和RARP上
  11. loewe测试软件,实测Loewe三角包 最轻的小包最贴心的设计
  12. Airflow 中文文档:时区
  13. 【C语言】三子棋游戏
  14. 使用Cmder替换cmd,让开发更高效
  15. 基于SSM实现旅游住宿和导游系统
  16. 【联想拯救者R7000】安装nvidia驱动Perform MOK management 界面键盘失灵现象(已解决)
  17. php正则表达式 w3c,正则表达式 – 匹配规则 | w3cschool菜鸟教程
  18. JavaScript---轮播图片完整代码
  19. html九九乘法口诀表代码,JavaScript九九乘法口诀表的简单实现
  20. 【C语言必经之路——第13节】C语言中的数据类型详解

热门文章

  1. display none的元素重新展示如何撑开页面_关于元素的浮动你了解多少
  2. 如何在geth中创建genesis.json_Adobe XD 入门教程-如何在 Adobe XD 中创建交互式原型?...
  3. 【java】java ssh 远程执行命令 并且获取执行的结果
  4. 【maven】idea左侧External Libraries里,没有Maven的依赖包 代码飘红
  5. 【Flink】FLink 1.12 版本的 Row 类型 中的 RowKind 是干嘛的
  6. 【前端】设计更好的数据表
  7. 【lucene】lucene查询操作
  8. 【Clickhouse】Clickhouse MergeTree家族引擎
  9. 【kafka】消费组 死掉 kafka Marking the coordinator dead for group
  10. mri计算机系统,MRI设备