进程与线程的理解

个人对于进程和线程概念的理解,可能会有些偏差

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。^1^

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。^2^

百度百科上面的解释是一种比较抽象的解释,看了不是非常容易理解。

可以进程的概念和线程的概念联系到一起进行理解

首先明确一下进程的概念:

“进程是数据集合的运行运动”,这句话简单来说就是将数据进行整合的封装成一个又个文件,而这些文件就是模块。

“线程是操作系统能够进行运算调度的最小单位”,这句话简单来说就是线程把各种文件模块跑起来的单位。

这就需要了解一下一个程序是如何跑起来的了?

一个程序要运行起来需要创建进程,**所有的进程都是别的进程创建的(第一个进程是由操作系统内核创建的)**都是由explorer.exe这个进程创建的。

Explorer是怎么创建进程的?

它调用了一个函数:CreateProcess(),把我们的程序变成了进程

CreateProcess怎么把一个程序变成进程的?

  1. 映射exe文件

  2. 创建内核对象EPROCESS

  3. 映射系统DLL(ntdll.dll)

  4. 创建线程内核对象ETHREAD

  5. 系统启动线程

    5.1 映射DLL(ntdll.LdrlnitializeThunk)

    5.2 线程开始执行

进程提供代码、资源、数据等,使用这些东西的都是线程,不然它就是一个死的

那么该怎么去理解进程和线程

我个人找到了几个理解线程和进程的角度:

生物学的角度

参考有丝分裂的过程来进行进程与线程的理解

根据高中生物学的基础知识来理解,我们都知道生物的有丝分裂的过程是一个高中生物学非常基本的分裂过程。有丝分裂主要分为两个重要的时期,分裂间期和分裂期。根据最基本的高中生物知识可以很容易地知道,分裂间期需要准备资源的过程,也就是蛋白质和DNA复制的过程。分裂期也就是利用资源进行分裂的过程。

我们可以这样理解进程和线程,进程提供代码、资源、数据。线程进行程序的运算。仔细观察线程和进程是不是和生物学中的有丝分裂的分裂间期和分裂期。

我们可以把有丝分裂的分裂间期来看作进程的过程,把有丝分裂的分裂期来看作线程的过程。

这样进行类比,对于进程和线程的理解就非常清晰了。

面向对象的角度

面向对象的思想是现代编程的一个重要思想,通过面向对象的概念可以比较清晰地理解进程和线程的关系。

面向对象是一种抽象的思维过程,有几个比较关键的概念,类,构造函数,析构函数,实例化。在编程过程中,会经常使用到面向对象的思想。

#include <iostream>

class MyObj
{
    int var = 0;
public:
    MyObj() {
        var = 10;
}
    int run() {
        std::cout << "the program running!" << std::endl;
        return 0;
    }
    ~MyObj() {
        var = 0;
    }
};
int main(){
    MyObj* obj = new MyObj();
    obj->run();
    return 0;
}

这是C++中简单的对象格式。

创建对象实例时,实例会进行初始化。对象实例进行初始化的过程中,会初始化对象实例所需的资源代码。

对象实例调用成员方法时,对象就会使用初始化的一些资源进行成员函数的调用。

根据我个人的理解,面向对象的编程过程,其实就和进程与线程的原理相似。可以把进程的准备过程理解成初始化,线程作为成员函数的调用。只不过,进程和线程是一个完全连续的过程,没有线程进程就是死的。


以上是我对于进程和线程的理解,可能略有不足。

参考

  1. 进程(一段程序的执行过程)_百度百科 (baidu.com)
  2. 线程(计算机术语)_百度百科 (baidu.com)