程序、进程和线程关系
简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
什么是程序(program)?
程序是存储在磁盘上的一段可执行代码,它是一种静态的描述。可以理解为程序是死的。什么是进程(process) ?
进程是将磁盘上存储的可执行代码,加载到内存执行的一个动态过程。可以理解为进程是活的。进程是应用程序的一个实例要使用的资源的集合。进程是系统分配资源的基本单位,每个进程都有自己的地址空间,进程与进程之间的运行互不影响。什么线程(thread)?
线程可以理解一个逻辑CPU ,线程是在进程中创建的,系统不会为线程单独创建地址空间,同一个进程中的线程共享一块地址空间。
线程是进程的一个实体,是CPU调度和分派的基本单位,线程的划分尺度小,使得多线程程序的并发性高。
进程和线程的主要区别:进程有独立的地址空间,一个进程崩溃后,不会对其它进程产生影响。而线程只是一个进程中的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮。但在进程切换时,耗费资源较大,效率要低,不能满足高并发需求。而且对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
线程基本信息
线程结构:
- 线程内核对象:线程的最基本信息,包含线程属性信息、线程上下文等。
- 线程环境块:线程的try catch块信息。
- 用户模式栈:用于存储线程用到的局部变量和实参。
- 内核模式栈:处理多线程并发时,.NET需要将用户模式栈的数据全部存储到内核模式栈中,保证window内核可以直接读取.NET线程的数据。
多线程上下文的切换
过程:
1、将正在执行的线程的相关实参等数据压入该线程的上下文中
2、选取即将执行的线程
3、将即将执行线程的上下文的数据弹出,并存入至CPU的寄存器中
线程的 3 个基本状态:就绪,执行,阻塞
线程的上下文切换时采用时间片轮转的方式进行的。当一个正在执行的线程时间片用完而未完成任务,且线程等待队列不为空,则执行线程的切换;若线程用完时间片,且将要执行的还是当前线程,则系统不会进行上下文的切换;若线程未用完时间片就完成了任务,那么CPU会提前进行上下文的切换。
Thread类
构造函数:
常用字段:
常用的方法:
Start() : 启动线程
Join() :等待线程完成
Abort() : 终止线程
Sleep() : 睡眠
Finalize() : 释放线程占用的资源
线程可以通过它的Name属性进行命名,