进程与线程
基本概念
任务调度
为了更好的提高CPU的利用率,所以采用了任务调度。任务调度也就是把任务排序,当一个任务不占用CPU的时候,去执行另一任务。总之实现CPU的最大利用。
特点
- 采用时间片轮转的抢占式调度任务轮流执行
- 并发执行:宏观并行,微观串行
如上图所示,任务1执行完之后,接着就是任务2,然后是任务3。因为任务执行的速度很快,所以我们在微观上可以看做是串行执行,也就是每一时刻只有一个任务执行。但在宏观上,我们可以认为是并行执行。
比如杀软进行病毒查杀时,查毒软件进程在下载更新病毒库(A)的同时要进行杀毒(B)
A----B-----A----B
A B交替占用CPU, 由于时间非常短,所以对用户来说宏观上感觉在下载和查毒同时进行。而实际执行为串行执行
进程
进程就是正在运行的程序,程序的动态执行过程。以QQ为例,我们下载的时候,它是一个安装文件。打开之后它就是一个进程。
进程是资源调度和分配的基本单位。计算机给运行的程序分配资源时,比如分内存,设备,是按照进程来分配的。
进程之间是相互独立的。一个程序可以在一台机器上拥有多个进程
线程
为什么引入线程?
因为进程之间是相互独立的,切换代价太大,所以考虑进程内部并发执行。
线程
将一个进程划分为若干个独立的执行流,每一个执行流均称为一个线程。可以把进程形象的看作一个车间,而把线程看作工人。
线程是CPU调度和分配的基本单位。
进程与线程的关系
- 线程是程序执行的最小单位,进程是系统分配资源最小单位
- 一个进程由一个或多个线程组成
- 进程之间相互独立,同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源。某进程内的线程在其他进程不可见;
- 调度和切换:线程上下文切换比进程上下文切换要快得多;线程只占用了cpu和少量寄存器,切换比较容易。
在IDE中观察线程和进程
static void Main(string[] args)
{
string str=Console.ReadLine();
Console.WriteLine(str);
Console.ReadLine();
}
设置断点
然后观察线程和进程窗口
进程
线程
这里注意到,默认会为我们创建一个主线程。因为没有线程,就没有进程,程序就运行不起来。
逻辑内核的数量
利用System.Environment
类提供的静态ProcessorCount
属性,可获取本机可用逻辑内核的数量。
StringBuilder sb = new StringBuilder(); //新建一个可变字符串sb
sb.AppendLine($"本机的逻辑CPU内核数量:{Environment.ProcessorCount}");
sb.AppendLine("是否为64位操作系统:" +( Environment.Is64BitOperatingSystem ? "是" : "否"));
sb.AppendLine("是否为64位进程:" + (Environment.Is64BitProcess ? "是" : "否"));
sb.AppendLine($"系统已启动:{Environment.TickCount}ms");
Console.WriteLine(sb);
Console.ReadLine();
结果如下:
本机的逻辑CPU内核数量:8
是否为64位操作系统:是
是否为64位进程:否
系统已启动:151708656ms