17、深入浅出MFC学习笔记,进程与线程简介

简介: 一、基本概念 1、线程是CPU的调度单位。 2、核心对象(kernel object)是系统的一种资源,系统对象一旦产生,任何应用程序都可以开启并使用该对象。系统给予核心对象一个计数值作为管理之用。     前三者用于线程的同步,file-mapping用于内存映射文件。

一、基本概念<?xml:namespace prefix = o />

1、线程是CPU的调度单位。

2、核心对象(kernel object)是系统的一种资源,系统对象一旦产生,任何应用程序都可以开启并使用该对象。系统给予核心对象一个计数值作为管理之用。

wps_clip_image-6534

    前三者用于线程的同步,file-mapping用于内存映射文件。这些核心对象的产生方式不同,但都会获得一个handle作为识别,每次被使用,对应的计数值加1,结束的方式则相当一致,调用CloseHandle

    “进程对象”并不是用来执行程序代码,程序代码的执行是线程的工作,“进程对象”只是一个数据结构,系统用它来管理进程。

3、进程的生命周期

    我们双击程序图标执行程序,其实就是shell调用CreateProcess来激活一个进程,流程如下:

    1Shell调用CreateProcess激活XXX.exe

    2)系统产生一个“进程核心对象”,计数值为1

    3)系统为此进程建立一个4GB地址空间。

    4)加载器将必要的代码加载到上述地址空间中,包括程序,数据,以及所需的动态链接库。这些动态链接库被记录在可执行文件(PE文件格式)的.data section中。

    5)系统为此行程建立一个线程,称为主线程。线程才是CPU时间分配的对象

    6)系统调用C runtime函数库的Startup Code

    7Startup Code调用.exe程序的WinMain函数。

    8)应用程序开始运行。

    9)使用者关闭应用程序,使WinMain中的消息循环结束掉。

    10)回到Startup code

    11)回到系统,系统调用ExitProcess结束进程

     可以说,通过这种方式执行起来的所有Windows程序都使Shell的子进程,本来母进程与子进程之间可以有某些关系存在,但shell调用CreateProcess时已经把母子间的脐带剪断了。

    如果一个进程想结束自己的生命,可以调用:

    VOID ExitProcess(UINT fuExitCode);

    如果一个进程想结束其他进程的生命,可以使用;

    BOOL TerminateProcess(HANDLE hProcess, UINT fuExitCode);

TerminateProcess一般不建议使用。因为一般进程结束时,系统会通知该进程所开启的所有DLL,如果以TerminateProcess结束一个进程,系统不会做这件事,这并不是我们希望的。

4、线程的生命周期

    执行程序代码,是线程的工作。当一个进程建立后,主线程也产生了,我们可以调用CreateThread产生额外的线程,系统会帮我们做如下事情:

    1)配置“线程对象”,其handle将成为CreateHandle的返回值

    2)设定技计数值为1

    3)配置线程的context

    4)保留线程的堆栈

    5)将context中的堆栈指针和指令指针设定好

所谓工作切换就是对线程context的切换。

线程之间不必考虑控制权释放的问题,因为Win32操作系统的特点是强制性多任务的。

线程的结束一种是正常退出结束;另一种是通过ExitThread(做善后工作);或别的线程通过TerminateThread将它终结掉;当然进程结束,线程也就结束了。

还可以以_beginthreadex取代CreateThread

关于线程优先线论述,可以参见[1P44].

参考

[1] 深入浅出MFC

目录
相关文章
|
7月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
5月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
237 67
|
11月前
|
编解码 数据安全/隐私保护 计算机视觉
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
如何使用OpenCV进行同步和异步操作来打开海康摄像头,并提供了相关的代码示例。
652 1
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
|
7月前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
315 0
|
8月前
|
Java Linux 调度
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
167 6
|
9月前
|
调度 开发者
深入理解:进程与线程的本质差异
在操作系统和计算机编程领域,进程和线程是两个核心概念。它们在程序执行和资源管理中扮演着至关重要的角色。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
239 5
|
9月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
326 4
|
10月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
11月前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
125 3
|
12月前
|
Java
直接拿来用:进程&进程池&线程&线程池
直接拿来用:进程&进程池&线程&线程池