【Windows】操作系统之进程(第二篇)

news2024/12/24 2:19:34

目录

一、程序与进程的区别

一、定义与概念

二、主要区别

三、总结

二、进程的空间分配

1. 栈区(Stack)

2. 堆区(Heap)

3. 全局区(静态区,Static Area)

4. 文字常量区(Text Constants Area)

5. 程序代码区(Code Area)

总结

三、进程的创建

函数

示例:

四、进程的案例:实现微信双开


一、程序与进程的区别

程序与进程在计算机领域中是两个重要但不同的概念,它们之间的主要区别可以从以下几个方面进行阐述:

一、定义与概念

  • 程序(Program):程序是一组有序的计算机指令的集合,通常用某种程序设计语言编写,运行于某种目标计算机体系结构上。程序是静态的,它描述了计算机需要完成的操作序列,但本身并不执行任何操作。程序可以被视为计算机软件的“蓝图”或“食谱”,它告诉计算机如何完成任务,但不会自动执行这些任务。
  • 进程(Process):进程是程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单元。换句话说,进程是程序的一次执行实例,它包含了程序计数器、寄存器、堆栈等运行状态信息,以及程序执行所需的数据集合。进程是动态的,它随着程序的执行而创建、运行、暂停和终止。

二、主要区别

  1. 静态与动态
    • 程序是静态的,它只是一组指令的集合,不包含任何执行状态。
    • 进程是动态的,它是程序的一次执行过程,包含了程序的执行状态和数据。
  2. 存在性与生命周期
    • 程序是永久的,只要不被删除或修改,它就可以长期存储在介质上。
    • 进程是暂时的,它具有生命周期,从创建到终止。一旦进程终止,其占用的资源将被释放。
  3. 执行与调度
    • 程序本身不执行任何操作,需要被加载到内存中并由操作系统调度执行。
    • 进程是操作系统调度的基本单位,操作系统通过管理进程来实现对计算机资源的分配和调度。
  4. 并发与并行
    • 程序本身不具备并发或并行的能力,它只能顺序执行。
    • 进程可以并发执行,即多个进程可以同时存在于内存中并交替执行。在某些情况下,多个进程也可以并行执行,即同时占用多个处理器核心进行执行。
  5. 独立性与资源共享
    • 程序是独立的指令集合,不与其他程序共享资源(除非通过外部机制如文件、网络等)。
    • 进程虽然具有一定的独立性(如独立的内存空间),但在某些情况下(如多线程进程)可以共享进程内的资源(如全局变量、文件描述符等)。

三、总结

程序与进程是计算机领域中两个紧密相连但又相互区别的概念。程序是静态的指令集合,而进程是程序的一次动态执行过程。理解这两个概念的区别对于深入理解计算机操作系统和软件开发具有重要意义。在实际应用中,程序员需要编写程序来实现特定的功能,而操作系统则通过管理进程来确保程序的正确执行和资源的高效利用。

二、进程的空间分配

进程的空间分配主要涉及几个关键的内存区域,这些区域从高地址到低地址(或相反,具体取决于操作系统的实现和架构)分布,包括栈区、堆区、全局区(静态区)、文字常量区以及程序代码区。

1. 栈区(Stack)

  • 定义与功能:栈区主要用于存储函数调用的局部变量、函数参数、返回地址等信息。它是一个后进先出(LIFO)的数据结构,由编译器自动管理内存的分配和释放。
  • 特点
    • 分配速度快,因为栈内存的操作通常有专门的指令支持。
    • 空间有限,当栈空间不足时,会导致栈溢出错误。
    • 栈是向低地址扩展的数据结构,即新分配的栈空间地址低于旧的栈空间地址。

2. 堆区(Heap)

  • 定义与功能:堆区用于存储程序运行过程中动态分配的内存。程序员通过调用如mallocnew等函数在堆上分配内存,并通过freedelete等函数释放内存。
  • 特点
    • 分配和释放速度相对较慢,因为需要执行额外的管理操作。
    • 空间大小灵活,理论上可以扩展到整个可用内存空间。
    • 堆是向高地址扩展的数据结构,即新分配的堆空间地址高于旧的堆空间地址。
    • 频繁分配和释放不同大小的堆空间容易产生内存碎片。

3. 全局区(静态区,Static Area)

  • 定义与功能:全局区用于存储全局变量和静态变量。这些变量在程序的整个运行期间都存在。
  • 特点
    • 初始化的全局变量和静态变量存储在.data段,未初始化的全局变量和静态变量存储在.bss段(.bss段不占用磁盘空间,只在内存中分配)。
    • 程序结束后,由操作系统释放这些变量所占用的内存。

4. 文字常量区(Text Constants Area)

  • 定义与功能:文字常量区用于存储字符串常量等文字信息。这些常量在程序编译时就已经确定,并在程序运行过程中保持不变。
  • 特点
    • 该区域的内容通常是只读的,以防止程序修改常量值。
    • 程序结束后,由操作系统释放该区域所占用的内存。

5. 程序代码区(Code Area)

  • 定义与功能:程序代码区用于存储程序的机器指令代码,即程序的二进制可执行代码。
  • 特点
    • 该区域的内容在程序运行前就已经确定,并且在程序运行过程中保持不变。
    • 该区域通常是只读的,以防止程序意外修改代码。
    • 程序结束后,由操作系统回收该区域的内存(但在某些情况下,如共享库,代码区可能不会被立即回收)。

总结

进程的空间分配是一个复杂的过程,涉及多个内存区域的协同工作。每个区域都有其特定的用途和特点,共同支持程序的正常运行。了解这些内存区域的工作原理对于编写高效、稳定的程序至关重要。

此外,需要注意的是,不同的操作系统和编程语言在实现进程空间分配时可能会有所不同。因此,在编写跨平台或特定于语言的程序时,需要仔细考虑这些差异并采取相应的措施来确保程序的正确性和效率。

三、进程的创建

函数

Windows系统中创建进程的API 是CreateProcess.

BOOL CreateProcessA(
  [in, optional]      LPCSTR                lpApplicationName,
  [in, out, optional] LPSTR                 lpCommandLine,
  [in, optional]      LPSECURITY_ATTRIBUTES lpProcessAttributes,
  [in, optional]      LPSECURITY_ATTRIBUTES lpThreadAttributes,
  [in]                BOOL                  bInheritHandles,
  [in]                DWORD                 dwCreationFlags,
  [in, optional]      LPVOID                lpEnvironment,
  [in, optional]      LPCSTR                lpCurrentDirectory,
  [in]                LPSTARTUPINFOA        lpStartupInfo,
  [out]               LPPROCESS_INFORMATION lpProcessInformation
);

示例:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain( int argc, TCHAR *argv[] )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( argc != 2 )
    {
        printf("Usage: %s [cmdline]\n", argv[0]);
        return;
    }

    // Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
        argv[1],        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

四、进程的案例:实现微信双开

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
   
  
    //创建进程--  szbuf存储的是微信的安装路径
    char szbuf[MAX_PATH] = "D:\\Program Files (x86)\\Tencent\\WeChat\\WeChat.exe";
   // [命令+空格+] 文件的名称
    STARTUPINFOA si= {sizeof(STARTUPINFOA)};
    PROCESS_INFORMATION pi;
    CreateProcessA(NULL, //应用程序名称
                  szbuf, //命令
                  0, //进程的安全属性
                  0,//线程的安全属性
                  0,//继承性
                  NORMAL_PRIORITY_CLASS,//优先级
                  0,//环境块
                  0,//路径
                  &si,
                  &pi
                   );
    CreateProcessA(NULL, //应用程序名称
                   szbuf, //命令
                   0, //进程的安全属性
                   0,//线程的安全属性
                   0,//继承性
                   NORMAL_PRIORITY_CLASS,//优先级
                   0,//环境块
                   0,//路径
                   &si,
                   &pi
                   );
    while(1)Sleep(1);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抓紧上车!中国学者用最新数据发一区top | GBD数据库周报(7.10~7.16)

全球疾病负担&#xff08;GBD&#xff09;是迄今为止规模最大、最全面的一项研究&#xff0c;旨在量化不同地区和不同时期的健康损失&#xff0c;从而改善卫生系统并消除差异。 该研究由华盛顿大学健康指标与评估研究所 (IHME) 牵头&#xff0c;是一项真正的全球性研究&#xf…

JVM:常用工具总结

文章目录 一、jstat工具 一、jstat工具 Jstat工具是JDK自带的一款监控工具&#xff0c;可以提供各种垃圾回收、类加载、编译信息等不同的数据。使用方法为&#xff1a;jstat -gc进程ID每次统计的时间间隔&#xff08;毫秒&#xff09;统计次数。 C代表Capacity容量&#xff0c…

高性能系统架构设计之:多级缓存

前言 为了提高系统的性能&#xff0c;一般会引入“缓存机制”&#xff0c;将部分热点数据存入缓存中&#xff0c;用空间换取时间&#xff0c;以达到快速响应的目的。 其实&#xff0c;缓存的应用远远不止存在于服务层&#xff08;传统的Redis缓存&#xff09;&#xff0c;从客户…

AIGC Kolors可图IP-Adapter-Plus风格参考模型使用案例

参考: https://huggingface.co/Kwai-Kolors/Kolors-IP-Adapter-Plus 代码环境安装: git clone https://github.com/Kwai-Kolors/Kolors cd Kolors conda create --name kolors python=3.8 conda activate kolors pip install -r requirements.txt python3 setup.py install…

2-39 基于matlab的二维拉普拉斯方程求解

基于matlab的二维拉普拉斯方程求解&#xff0c;用有限差分法求解二维拉普拉斯方程 所用的数值方案是空间二阶中心差分法 (5 点差分&#xff09;。输出三维求解结果。程序已调通&#xff0c;可直接运行。 2-39 matlab 二维拉普拉斯方程求解 - 小红书 (xiaohongshu.com)

PDF-Extract-Kit (PDF内容抽取开源项目)

Github 地址&#xff1a;https://github.com/opendatalab/PDF-Extract-Kit 整体介绍 PDF文档中包含大量知识信息&#xff0c;例如文本、表格、图像、公式等。此外&#xff0c;PDF的文档布局也相当复杂&#xff0c;页眉、页脚、表格标题、图片标题等等&#xff0c;提取高质量的…

Nature子刊 | ATAC-seq、RNA-seq和蛋白组联合分析揭示脂质激活转录因子PPARα在肾脏代偿性肥大的作用机制

2023年6月&#xff0c;美国国立心肺血液研究所的研究团队在Nature Communications上发表题为“Signaling mechanisms in renal compensatory hypertrophy revealed by multi-omics”的文章&#xff0c;该研究通过在单侧肾切除的小鼠模型中使用多组学方法&#xff08;蛋白质组学…

十一、面向对象进阶

文章目录 学习目标一、类方法和静态方法二、单例模式三、Python的继承3.1 继承的基本使用3.2 Python继承的特点3.3 私有属性的继承特点3.4 新式类和经典类四、对象相关的运算符和内置函数五、多态的使用5.1 子类重写父类的方法5.2 多态的使用学习目标 说出类方法和实例方法的区…

Spring中的IOC详解

文章目录 IOCIOC容器的工作原理Bean的生命周期Bean的自动装配AutowiredResourceInject 使用Spring底层组件 IOC Spring的核心之一是IOC&#xff0c;IOC全称为Inversion of Control&#xff0c;中文译为控制反转&#xff0c;是面向对象编程中的一种设计原则&#xff0c;可以用来…

栈和队列(一) ------基本概念,循环队列

目录 栈 python实现 队列 python实现 循环队列 力扣622- --循环队列 力扣20 ----有效括号判断 分析 代码 栈 python实现 在Python中实现一个栈&#xff08;Stack&#xff09;可以通过使用列表&#xff08;list&#xff09;来完成&#xff0c;因为列表提供了动态数…

【网络安全的神秘世界】Error:Archives directory /var/cache/apt/archives/partial is missing.

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 ✨问题描述 在kali中想要安装beef-xss软件包时&#xff0c;发生如下报错&#xff1a; Error: Archives directory /var/cac…

d3d12.dll 文件缺失如何解决?五种修复丢失问题的方法

d3d12.dll 文件缺失如何解决&#xff1f;它为什么会不见呢&#xff1f;今天&#xff0c;我们将探讨 d3d12.dll 文件的重要性、原因以及丢失时的解决策略。本文将全面介绍 d3d12.dll 文件&#xff0c;并提供五种修复丢失问题的方法。 d3d12.dll文件是什么的详细介绍 d3d12.dll …

【RAGFlow】Ubuntu系统下实现源码启动RAGFlow

一、RAGFlow 是什么&#xff1f; RAGFlow 是一款基于深度文档理解构建的开源 RAG&#xff08;Retrieval-Augmented Generation&#xff09;引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程&#xff0c;结合大语言模型&#xff08;LLM&#xff09;针对用…

【C语言初阶】C语言数组基础:从定义到遍历的全面指南

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言函数 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀数组 &#x1f4d2;1. 什么是数组…

【医学影像】X86+FPGA:支持AI医学影像设备应用的工控主板,赋能CT、MRI、X线、超声等医学影像设备

支持AI医学影像设备应用的工控主板 在我国人口老龄化问题不断加剧&#xff0c;对影像诊断需求持续增长&#xff0c;和国家利好高端医学影像市场发展的系列法规和政策接连出台的大环境下&#xff0c;AI医学影像设备产业迎来发展黄金期。紧跟发展大势&#xff0c;基于12/13代 In…

天途无人机林业应用解决方案

林业应用现状分析 森林环境较为复杂&#xff0c;人员无法快速到达现场&#xff0c;工作人员通常会面临监控盲区&#xff0c;林区爬山涉水困难多&#xff1b;森林防火重要性不可忽视&#xff0c;2019年全国共发生森林火灾2345起&#xff0c;森林防火仍为重中之重&#xff1b;环…

SAPUI5基础知识16 - 深入理解MVC架构

1. 背景 经过一系列的练习&#xff0c;相信大家对于SAPUI5的应用程序已经有了直观的认识&#xff0c;我们在练习中介绍了视图、控制器、模型的概念和用法。在本篇博客中&#xff0c;让我们回顾总结下这些知识点&#xff0c;更深入地理解SAPUI5的MVC架构。 首先&#xff0c;让…

Jvm基础(一)

目录 JVM是什么运行时数据区域线程私有1.程序计数器2.虚拟机栈3.本地方法栈 线程共享1.方法区2.堆 二、对象创建1.给对象分配空间(1)指针碰撞(2)空闲列表 2.对象的内存布局对象的组成Mark Word类型指针实例数据&#xff1a;对齐填充 对象的访问定位句柄法 三、垃圾收集器和内存…

React基础学习-Day04

React基础学习-Day04 常见的钩子函数及基础使用方式 1.useState useState 是 React 的一个 Hook&#xff0c;用于在函数组件中添加状态。它返回一个状态变量和一个更新该状态的函数。与类组件的 this.state 和 this.setState 相对应&#xff0c;useState 让函数组件也能拥有…

【第10章】Spring Cloud之Nacos动态配置

文章目录 前言一、上下文1. 新增配置2. 启动类3. 效果 二、注解 ( 推荐 ) \color{#00FF00}{(推荐)} (推荐)1. 获取配置2. 测试2.1 未配置2.2 配置值2.3 修改值 总结 前言 这一章我们通过两个案例来学习Nacos动态配置&#xff0c;通过在控制台修改服务端配置文件值&#xff0c;…