浅谈线程,进程,多任务,多线程,多进程

进程和线程

我们知道,计算机的核心是CPU,它承担了所有的计算任务,而操作系统是计算机的管理者,其负责任务的调度,资源的分配和管理,管理整台计算机的硬件。程序是具有某种功能的模块,程序是运行于操作系统之上的。
进程:
简单来说进程可以理解为执行在计算机上单独的任务,或者称为模块。

进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。其实。
线程:
线程也被称做轻量级进程,线程是进程的执行单位。

就像进程在操作系统中的地位一样,线程在程序中是独立的,并发的执行流。线程可以拥有自己的堆栈,自己的程序设计器和自己的局部变量,但不拥有系统资源,它可以与其他线程共享父进程中的共享变量及部分环境,相互之间协同来完成进程所要完成的任务。。当进程被初始化后,主线程即被创建。对于绝大多数的应用程序来说,通常仅要求有一个主线程,但也可以在该进程内创建多条顺序执行流,这些顺序执行流就是线程,每个线程也是互相独立的。
简言之,线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程。
进程

多任务

在以往的单CPU时代,单任务在一个时间片内只能执行单一程序。随着计算机在社会应用中的深入,单一任务已经很难满足当今社会的软件的要求。之后发展到的多任务阶段,虽然并不是真正意义上的“同一时间点”,却是多个任务或进程交由操作系统来完成多任务间对CPU的运行切换,共享一个CPU,以使得每个任务都有机会获得一定的时间片运行,达到一定程度上的多任务。
多任务的要求使程序不再能假设独占所有的CPU时间、所有的内存和其他计算机资源。健康良好的程序应该在不再使用这些资源时对其进行释放,以使得后续程序能有机会使用。多任务
而随着时代的发展,更现代的计算机伴随着多核CPU的出现,也就意味着不同的线程能被不同的CPU核得到真正意义的并行执行,计算机不再只是单个CPU核心,而是到2核、4核等多核心,服务器级别的CPU甚至达到了128核。核数的增加,带来的不仅仅是性能的提升,同时也是对于传统单核心单任务和单核心多任务的程序设计方式和体系的挑战。

多任务新的处理方式也应运而生,多核心下,实现多任务可以由多进程,多线程两种实现。

多进程,使得计算机同时执行多个进程,一般是同时运行多个软件。
多线程,使得在一个程序内部能拥有多个线程并行执行。

多进程
1· 当前的操作系统都是多任务OS
2·每个独立执行的任务就是一个进程
3· OS将时间划分为多个时间片(时间很短)
4· 每个时间片内将CPU分配给某一个任务,时间片结束, CPU将自动回收,再分配给另外任务。从外部看,所有任 务是同时在执行。但是在CPU上,任务是按照串行依次运 行(单核CPU)。如果是多核,多个进程任务可以并行。 但是单个核上,多进程只能串行执行。
多进程可以同时运行多个任务 ,程序因IO堵塞时,可以释放CPU,让CPU为其他程序服务。当系统有多个CPU时,可以为多个程序同时服务 。另外,CPU因为发展方向的转变,主要的发展方向不再是提高频率,而是提高核数 ,这也使得多进程更加方便,另外, 2005年Herb Sutter的文章The free lunch is over中指明多核和并行程序才是提高程序性能的唯一办法。然而, 多进程也有缺点,太笨重,不好管理 ,不好切换,数据共享程度低。

多线程
1·一个程序可以包括多个子任务,可串/并行
2·每个子任务可以称为一个线程
3·如果一个子任务阻塞,程序可以将CPU调度另外一个子任 务进行工作。这样CPU还是保留在本程序中,而不是被调 度到别的程序(进程)去。这样,提高本程序所获得CPU时间 和利用率。
多个线程共享父进程里的全部资源,所以线程间资源调配更加方便;但必须更加谨慎,因为需要确保线程不会妨碍同一进程里的其他线程。这也就是为什么多线程比多任务更加有挑战。多线程是在同一个程序内部并行执行,因此会对相同的内存空间进行并发读写操作。
在这里插入图片描述
多进程vs多线程
1·线程共享数据
2·线程通讯更高效
3·线程更轻量级,更容易切换
4·多个线程更容易管理

想象一个场景:

一个线程在读内存的数据时,另一个线程正向该内存区域进行写操作,那进行读操作的那个线程将会怎样呢?这可能是在单线程程序中从来不会遇到的问题,这些错误也未必会在单CPU机器上出现,因为两个线程从来不会得到真正的并行执行。那么结果是什么呢?是写操作之前旧的值?还是写操作成功之后的新值?亦或是一半新一半旧的值?再或者,若是多个线程同时写同一个内存,在操作完成后将会是什么结果呢?是前面的线程写入的值?还是后面的线程写入的值?还是多个线程写入的一个混合值?因此如没有合适的预防措施,任何结果都是可能的。而且这种行为的发生甚至不能预测,所以结果也是不确定性的。
这也是接下来要讲的多线程的并发协作和数据共享与保护等方面要解决的问题。
这里补充讲一下并行和并发的区别:
并行和并发:
并行指在同一时刻,有多条机器指令在多个处理器上同时执行; 并发指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行, 使得在宏观上具有多个进程同时执行的效果。 从逻辑角度来看,多线程存在于一个应用程序中,让一个应用程序中可以有多个执行部分同时执行,但操作系统无须将多个线程看做多个独立的用,对多线程实现调度和管理以及资源分配。线程的调度和管理有进程本身负责完成。