【浅谈】进程、线程、多线程

快速理解:线程和进程都是对CPU时间段的描述,只不过颗粒大小不同。

举个例子:如果将进程比作一辆汽车,那么线程相当于动力系统、转向系统、操控系统等。只有动力系统,汽车也可以行使,这就是进程必须有一个主线程(一个进程含有大≥1个线程),多个系统共同负责汽车的行使即多线程。

①关系:进程是程序的一次执行,进程可以有多个线程,且至少有一个主线程。

②定位:进程是资源分配的基本单位,线程是系统调度的基本单位。


一、概念

1、进程(process)

狭义定义:正在运行的程序的实例。

广义定义:进程是一个实体,是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态运行的基本单元,在传统的操作系统中,进程是分配和运行的基本单元。

进程的概念主要有两点:

1)进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器运行的代码;数据区域存储变量和进程运行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

2)进程是一个“正在运行的程序”,是动态的。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统运行之后),它才能成为一个活动的实体,我们称其为进程,提出进程也可以更好的描述系统资源的动态特征

特点:①动态性:一次运行,动态产生,动态消亡。②并发性:可以与其他进程一同运行。③独立性:是分配和调度运行基本单位。④异步性:进程收到调度间接运行,运行时间未知。⑤结构特征:由程序、数据和进程控制块三部分组成。

状态:对进程创建之后在三个状态中转换,最终进程被终止。

1)就绪态(Ready):进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器,进程就可运行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪态时,排入高优先级队列。时间片完,运行>就绪;进程调度,就绪>运行。

2)运行态(Running):进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。

3)阻塞态(Blocked):由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理器资源分配给该进程,也无法运行。

2、线程(thread)

概念:线程是操作系统调度的最小单位,包含在进程中,是进程的实际运作单位。线程是进程中一个单一顺序的控制流,一个进程中可以并发有多个线程,每条线程执行不同的任务。因为线程比进程小,所以基本上不拥有系统资源,从而使系统在调用线程时的消耗较小,提高了系统多程序并发的效率。

假设进程A,拥有线程a、b、c,那么a、b、c共享了进程的上下文,拥有更小的CPU时间片段。

分类:由于线程是独立调度和分派的基本单位。所以线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。

关系:同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。

状态:

1)新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。

2)就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。

3)运行状态(Running) : 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。

4)阻塞状态(Blocked)  : 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

     (a) 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。

     (b) 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。

     (c) 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

⑤死亡状态(Dead) : 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

3、多进程(multiprocessing)

概念:在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。。

二、区分

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

1) 所以一个程序至少有一个进程,一个进程至少有一个线程。

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

占坑....更多补充,未完待续

参考资料:百度百科、简书:简书的王布斯

发布了8 篇原创文章 · 获赞 19 · 访问量 6121

猜你喜欢

转载自blog.csdn.net/smartzzg/article/details/88980716