Windows—进程

一、概念

想要理解进程,首先要知道什么是进程。举一个简单的例子。当我们打开任务管理器时,会看到列表中有很多的条目,如下:
在这里插入图片描述

而这一行行的数据就是windows的进程。同时,我们可以发现这些进程都是以exe来命名的。事实上,当我们鼠标双击exe时,系统就会为这个exe创建一个对应的进程。

现在,我们已经知道进程是什么了。那么接下来开始讨论“进程的本质是什么”。

二、进程的本质

关于进程的本质,其实就是理解进程在windows中扮演的角色是什么,并且如何存在于系统中的。

1)进程的角色

当我们想要在系统中做一件事时,首先第一件事就是创建一个进程。比如:打开英雄联盟、打开qq、打开微信、打开浏览器。而这些所谓的打开,其实就是创建了一个进程。当我们打开浏览器时,实际上就是运行了浏览器的exe文件。用谷歌浏览器举例的话就是chrome.exe文件。所以我们会在任务管理器看到一个和chrome.exe文件对应的进程。当我们关闭这个进程时,浏览器也会被自动关闭。所以,在操作系统中这些所有能看到的东西,其实都一一对应了一个进程。这里的概念可能会比较模糊,所以需要介绍一下窗口的概念。我们能看到的这些浏览器、英雄联盟、微信。他们其实都是一个一个的窗口。有标题栏、窗口内容之类的。典型的窗口就是文件夹。
在这里插入图片描述

而这些窗口都是隶属于一个进程的。在一个进程中,可以创建很多窗口。这就是为什么qq可以有好多个聊天窗口一样。

综上,windows其实就是由无数个进程组成的。我们所看到的形形色色的窗口,他们都有属于自己的进程。就像文件夹这个窗口一样,他其实隶属于explorer.exe这个进程。假如你把这个进程杀掉。那么你的文件夹窗口就会消失。事实上,不止文件夹窗口,连通最下面的任务栏和桌面一起都会消失。因为这些窗口其实都是explorer.exe这个进程创建的。所以有的时候如果桌面崩溃了,下面的任务栏也没了,那其实就是explorer.exe这个进程崩溃了。你只需要重新创建一下explorer.exe进程,那么桌面就会自动恢复。
在这里插入图片描述
在这里插入图片描述

经过上面的举例,我相信大家应该都了解进程在windows中扮演了怎样的角色了吧。其实操作系统本身就是一个大进程集合,它是由若干个进程分工组成的。例如:System、smss、winlogon、explorer、csrss之类的。他们都负责了操作系统中的某一个功能的实现。

2)进程的存在形式

上面讲的都是宏观上的概念,主要就是理解进程的定位。那么接下来就是深入到系统内部。来观察进程在系统内部的存在形式。

首先,要谈到一个概念“内存”。什么是内存?内存其实就是我们通常装机说的内存条。比如4G、8G、16G之类的。如下图:
在这里插入图片描述

这个内存条是操作系统最重要的硬件之一。因为cpu在执行任务的时候,就是从内存中拿数据的。我们看到的所有的这些进程,就是存放在内存中的。只要我们想让cpu做一件事,那我们必须要将做的这件事先放到内存中,这样cpu才能找得到。

而所谓的32位、64位系统。其实就是地址总线的区别。而这个地址总线就是用来读内存数据的。例如32位。他的意思就是,有32根地址总线。而每一根线能表示的状态是1和0。所以32位能表示的状态就是2的32次方,也就是4 294 967 296这么大的数据,换算成GB的话,就是4G这么多。所以一个32位的系统,最大可以看到的内存地址范围就是0 - 4G这么大。这就是为啥我们以前的老电脑,32位系统最大只能支持4G内存的原因了。因为再大了,地址总线就表达不出来。

在了解了内存之后,我们就应该形成一个概念,就是电脑上所有的进程都是存放在内存中的。每当cpu要执行一个进程时,他总是会去内存中找到这个进程的地址。然后去执行地址处的代码。
在这里插入图片描述

上面的工具,是专门用来调试进程用的OllyDbg。可以看到,左边第一栏是一个地址列。这就是内存中的地址。内存中存放了各种各样的数据。所有我们用到的数据都会存放在内存中。像图上的005A2188这里存放的就是进程的可执行代码。cpu在执行进程时,其实就是一条一条的执行这些指令。

那么,接下来我们来分析进程在内存中的分布式是怎样的。如下图:
在这里插入图片描述

可以看到,这里的内存是由很多部分组成的。其中的内存低地址意思就是从0那头开始。下面地址小,上面的地址大。

这里简单介绍一部分内容。
命令行:
这个其实就是在创建进程时传递的参数。
调用栈:
当我们在执行函数的时候,所有的局部变量都是存放在调用栈中的。
堆:
这个堆就是我们通常说的动态分配。比如调用malloc或者new的时候,就是从堆这里分配的内存。
静态数据区:
这里就是那些全局变量,静态变量,字符串存放的地方。
代码:
这里就是exe可执行代码存放的位置。cpu执行进程任务的时候,就是从这里的代码区读取指令的。

以上就是进程在内存中存在的形式。其实这里有一个知识点,虚拟内存。拿32位系统举例。一个进程在4G的内存中其实只占2G。就是0-2G的范围属于进程,而后面的2G则是操作系统占用的。那么这里就有一个问题,如果有很多进程怎么办,他们的分布又是怎样的。其实所有的进程空间都是0-2G这个范围。而不是每个进程占用一小部分。举例:现在有0-2G内存,如果有2个进程同时加载到内存中。可能就会有人觉得2个进程的内存分布是,0-1G,1G-2G这样的。其实并不是,这里两个进程会同时享有0-2G范围的内存。那就会有人问,这样不就导致两个进程重合了么。事实上操作系统并不会让这种重合发生,这就是虚拟内存的强大之处。当两个进程同时访问100这个地址时,操作系统会分别为他们映射不同的物理内存。也就是进程A在访问内存100时,系统会自动重定向地址,让你访问物理内存的120。而当进程B访问100时,系统可能就会重定向到150这里。所以进程用的地址都是一个虚拟的地址。真正的内存访问是由操作系统自己管理的。而这个功能就是大名鼎鼎的MMU分页内存管理单元。他欺骗了所有进程,让所有进程都认为自己独享0-2G的内存。

三、进程的运行

就像上面提到过的,整个操作系统都是由无数个进程组成的。那进程又是如何在系统中运行的呢?

事实上所有的进程本身是不具备执行代码的能力的。正真负责执行指令代码的是“线程”。进程就像一个工厂一样,提供各种材料、设备。而线程则像一个一个的工人,负责操控这些资源。

所以,一个进程通常都包含了若干个线程。而这些线程会不停的执行进程的代码指令。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤月丶星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值