进程与线程的基本概念与区别

进程与线程

基本概念

任务调度

为了更好的提高CPU的利用率,所以采用了任务调度。任务调度也就是把任务排序,当一个任务不占用CPU的时候,去执行另一任务。总之实现CPU的最大利用。

特点
  • 采用时间片轮转的抢占式调度任务轮流执行
  • 并发执行:宏观并行,微观串行

image-20200316121445109

如上图所示,任务1执行完之后,接着就是任务2,然后是任务3。因为任务执行的速度很快,所以我们在微观上可以看做是串行执行,也就是每一时刻只有一个任务执行。但在宏观上,我们可以认为是并行执行。

比如杀软进行病毒查杀时,查毒软件进程在下载更新病毒库(A)的同时要进行杀毒(B)

A----B-----A----B

A B交替占用CPU, 由于时间非常短,所以对用户来说宏观上感觉在下载和查毒同时进行。而实际执行为串行执行

进程

进程就是正在运行的程序,程序的动态执行过程。以QQ为例,我们下载的时候,它是一个安装文件。打开之后它就是一个进程。

进程是资源调度和分配的基本单位。计算机给运行的程序分配资源时,比如分内存,设备,是按照进程来分配的。

进程之间是相互独立的。一个程序可以在一台机器上拥有多个进程

线程

image-20200316111402267

为什么引入线程?

因为进程之间是相互独立的,切换代价太大,所以考虑进程内部并发执行。

线程

将一个进程划分为若干个独立的执行流,每一个执行流均称为一个线程。可以把进程形象的看作一个车间,而把线程看作工人

线程是CPU调度和分配的基本单位。

进程与线程的关系
  • 线程是程序执行的最小单位,进程是系统分配资源最小单位
  • 一个进程由一个或多个线程组成
  • 进程之间相互独立,同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源。某进程内的线程在其他进程不可见
  • 调度和切换:线程上下文切换比进程上下文切换要快得多;线程只占用了cpu和少量寄存器,切换比较容易。
在IDE中观察线程和进程
 static void Main(string[] args)
        {
            string str=Console.ReadLine();
            Console.WriteLine(str);
            Console.ReadLine();
        }

设置断点

image-20200316121355133
然后观察线程和进程窗口

image-20200316120734893

进程

image-20200316113844413
线程

image-20200316121052582

这里注意到,默认会为我们创建一个主线程。因为没有线程,就没有进程,程序就运行不起来。

逻辑内核的数量

利用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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章