多线程的提出和基本概念

69 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

0 问题的提出

复习: 从我们没有学习多线程之前,我们回想一下我们的程序,都是从一个main方法开始的,每次执行只会跑一个程序。而且在C语言上机实验的时候也是,老师和你说只能有一个main函数,不能多个。碰到要执行别的函数的时候,就执行这个函数,等函数执行结束,我们再回来执行main执行模式如下图:

javaAPI.png

思考: 上述我们都认为是一个程序, 那我们如何使得我们的电脑可以同时执行两个程序呢?一台计算机为何能执行多个程序?它们是怎么执行多个程序的?

首先我们回到第一台计算机中,是使用于军事计算坐标的,可以理解为它只有一个程序,它只干一件事,也只能干这件事。

那万一我们想要使用计算机坐别的计算(上网、看视频,我认为这些都是计算),或者干别的事情,是不是需要删除原来的,再重新安装一个程序,或者购买多个电脑?这样就非常的浪费资源,而且很花钱。

然后我们再来思考一下CPU这个概念,它本质来讲,就是计算机的大脑。回想高中上课,第一节语文课、第二节数学课,那我们的大脑是第一节课处理语文的知识,第二节课就是处理数学课的知识。那我们的大脑对标CPU,那语文数学就是对标程序,那电脑的脑子CPU能不能和我们的大脑一样,切换着计算或者处理信息呢?

切换就是我们电脑“同时”处理两个程序的第一个模式(可能不太严谨,重在理解),因为CPU切换的速度比我们的脑子快,所以有同时在运行的感觉。

上述过程都是在单CPU的情况下,但是现在的CPU都是多核心的,所以现在我们可以一边听音乐,一边写代码,或者做更多的事情,这里主要决绝上面提出的三个问题。

1 核心数、进程、线程

上面介绍了,当我们只有一个核心的时候,我们要做到“同时”运行两个程序的话就要来回的切换。

而我们学过操作系统知道,CPU有进程调度这个概念,而没有程序调度这个概念。进程中含有:程序、数据、PCB。所以程序的切换本质就是CPU对进程的切换。(下图不够严谨,只是对本课程好理解而画的,大家对进程调度感兴趣可以去看一下相关教程或书籍)

javaAPI-16499185778022.png

为什么要引进进程,其实就是为了解决一个计算机上如何”同时“运行两个程序,用操作系统中的语言来说就是程序并发执行,这样大大提高了CPU的利用率。但是进程的创建、撤销、切换要花的时空开销还是比较大,为了更好的并发性,就引入了线程的概念。

线程从很多种方面看和进程都很类似,所以也叫轻性进程,而上面描述的进程叫重性进程。一个进程下面可以有一个或多个线程,在操作系统中也有一句话:进程是资源分配的最小单位,线程是调度的最小单位。

所以进程下面有很多线程,而线程想要资源就必须争抢进程的资源。

所以CPU核心下面有多个进程、进程下面有多个线程。

2 进程和线程的本质区别以及应用

  1. 一个程序拥有一个或者多个进程,一个进程拥有一个或者多个线程
  2. 线程划分尺度小于进程,因此并发性也更高
  3. 进程是资源分配的最小单位,线程是调度的基本单位,所以进程拥有独立的资源,而线程没有、线程依赖所依附的进程的资源。所以当一个进程被破坏的时候,其他进程是不受影响的,但是一个线程被破坏,就同等于这个线程都遭到了破坏。
  4. 每一个独立的线程,都有一个独立的程序运行的入口、顺序执行序列和序列出口,但是不能独立执行,必须依赖在运用程序中
  5. 进程的调度相对健壮,但是并发性差,切换的时候资源消耗大,对于一些要求同时进行并且又要共享某些变量的并发操作只能使用线程,不能使用进程
  6. 从逻辑角度上来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看作多个独立的应用,来实现进程的调度和管理以及资源分配。

并发: 并发操作就是在单核心CPU下,进程进程的调度,来实现应用程序好像是在“同时执行”,其实是进程的切换

并行: 并行就是多核心CPU下,程序是真的在同时进行