1.定义
进程
在 C# 中,进程(Process)是指一个正在执行的程序实例。它包含有关程序的信息,如它所属的用户、进程标识符、线程以及它所占用的系统资源等。进程是操作系统中资源分配和调度的基本单位。
其中系统资源包含如下部分:
-
内存空间:每个进程都有独立的内存空间,用于存储进程代码、数据、堆栈等。操作系统将为每个进程分配一定数量的内存空间。
-
文件描述符:进程可能打开和使用文件或网络套接字,这些文件和套接字都会占用系统资源。文件描述符是系统为每个打开的文件或套接字所分配的唯一标识符。
-
句柄:进程可以打开操作系统提供的各种句柄,如进程句柄、线程句柄、窗口句柄等。句柄是一种引用或标识系统资源的方式。
-
线程:进程中的线程也是进程的一部分,每个线程都占用一些系统资源,如线程栈空间、线程上下文等。线程也会占用一定的 CPU 时间片。
-
进程上下文:进程中的上下文包括进程的注册表项、环境变量、安全上下文等。这些上下文信息会占用一定的系统资源。
-
进程间通信(IPC):进程可能需要进行进程间通信,比如通过共享内存、管道、消息队列等方式进行数据传输。这些通信机制占用系统资源。
-
系统调用:进程在执行过程中会请求操作系统提供的各种服务和资源,这些系统调用会占用一定的系统资源。
-
其他资源:进程可能还会占用其他系统资源,如图形界面窗口、音频设备、打印机等。
线程
而线程(Thread)是进程中的执行流程,用于执行程序中的指令。一个进程可以包含多个线程,它们共享进程的上下文,包括进程的内存空间、打开的文件、信号处理器等。线程也被称为轻量级进程,因为它们不需要像进程一样创建一个完全独立的执行环境。
线程是进程的一个实体,是独立运行和独立调度的基本单位(CPU上真正运行的是线程)。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
在.NET中,一般以Main()方法作为入口的,当调用此方法时系统就会自动创建一个主线程。
线程主要是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。
CPU寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路,在线程中主要记录当前所执行线程的状态。
调用栈是用来存储有关正在运行的子程序的返回地址的栈,在此主要用于维护线程所调用到的内存与数据,通过访问调用栈,可以查找到调用的子程序。
TLS分为静态和动态两种,就是基于堆栈的全局变量或者静态变量来访问数据,主要用于将将数据和执行的特定的线程联系起来。
参考链接:人狮子-C# —— 进程与线程的理解
2. 区别
- 进程是操作系统中资源分配和调度的基本单位,而线程是处理器进行运算和调度的基本单位,线程也是进程的执行流程。
- 每个进程都有一个独立的内存空间,而线程共享进程的内存空间。
- 进程之间是相互独立的,一个进程的go die不会影响到其他进程的运行,而由于线程共享同一进程下的资源,所以某个线程的意外终止可能导致该进程的崩溃。
- 基于3,多进程程序会更健壮,因此一个应用程序可以创建多个进程来提高程序稳定性。
- 线程创建和销毁的开销比进程小,线程切换的开销也比较小。