程序、进程、线程的详解

本质区别:

程序只是一组指令的有序集合,本身没有任何运行的含义,只是一个静态的实体。

进程是操作系统资源分配的基本单位,有自己的生命周期,是一个动态的实体,是具有一定独立功能的程序关于某个数据集合上的一次运行活动。

线程是CPU任务调度和执行的基本单位。

简言之,一个程序至少有一个进程,一个进程至少有一个线程线程的划分尺度小于进程,使得多线程程序的并发性高。

 

开销方面:

每个进程都有独立的代码和数据空间(程序上下文),进程之间的切换会有较大的开销。

线程可以看做是轻量级的进程,同一类线程共享代码和数据空间。每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。

 

所处环境:

在操作系统中能同时运行多个线程(程序);

而在同一个进程中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)。

 

内存分配方面:

系统在运行的时候会为每个进程分配不同的内存空间;

线程而言,除CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源,即一个进程中的多个线程共享内存

 

包含关系:

没有线程进程可以看做是单线程

若一个进程有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;

线程进程的一部分,所以线程也被称为轻权进程或轻量级进程。

 

系统执行方面:

应用程序在执行过程中存在一个内存空间的初始入口点地址,一个程序执行过程中的代码执行序列,以及一个用于标识进程结束的内存出口点地址。在进程执行过程中的每一个时间点均有唯一的处理器指令内存单元地址相对应

Java语言中定义的线程(Thread)同样包括一个内存入口点地址、一个出口点地址以及能够顺序执行的代码序列。但是进程与线程的重要区别在于线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代码流

Unix操作系统和Microsoft Windows操作系统支持多用户、多进程的并发执行,而Java语言支持应用程序进程内部的多个执行线程的并发执行。

多线程的意义在于一个应用程序的多个逻辑单元可以并发地执行。但是多线程并不意味着多个用户进程在执行,操作系统也不把每个线程作为独立的进程来分配独立的系统资源。

进程可以创建其子进程子进程父进程拥有不同的可执行代码和数据内存空间。而在用于代表应用程序的进程中多个线程共享数据内存空间,但保持每个线程拥有独立的执行堆栈和程序执行上下文(Context)。

基于上述区别,线程也可以称为轻型进程 (Light Weight Process,LWP)。不同线程间允许任务协作和数据交换,使得在计算机系统资源消耗等方面非常廉价。

线程需要操作系统的支持,不是所有类型的计算机都支持多线程应用程序。JAVA程序语言将线程支持与语言运行环境结合在一起,提供了多任务并发执行的能力。


在应用程序中使用多线程不会增加 CPU 的数据处理能力。只有在多CPU 的计算机或者在网络计算体系结构下,将Java程序划分为多个并发执行线程后,同时启动多个线程运行,使不同的线程运行在基于不同处理器的Java虚拟机中,才能提高应用程序的执行效率。

C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。这时,处在可执行状态中的应用程序称为进程。从用户角度来看,进程是应用程序的一个执行过程。从操作系统核心角度来看,进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境。

进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体。多任务环境下应用程序进程的主要特点包括:

● 进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间;

● 进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型;

● 从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。

在Unix操作系统启动过程中,系统自动创建swapper、init等系统进程,用于管理内存资源以及对用户进程进行调度等。在Unix环境下无论是由操作系统创建的进程还要由应用程序执行创建的进程,均拥有唯一的进程标识(PID)。


 

总结:

一个最基础的事实是,CPU处理速度很快,只有寄存器能跟得上其速度,RAM和别的挂在各总线上的设备完全望其项背。

当多个任务要执行时,在CPU看来多任务就是轮流处理:

执行一段程序代码,实现一个功能的过程介绍,当得到CPU的时候,相关的资源必须也已经就位,就是RAM,显卡,GPS等必须就位,然后CPU开始执行。这里除了CPU以外所有的就构成了这个程序的执行环境,也就是我们所定义的程序上下文。当这个程序执行完了,或者分配给他的CPU执行时间用完了,那它就要被切换出去,等待下一次CPU对该程序的执行。在被切换出去的最后一步工作就是保存程序上下文,因为这个是下次它被CPU执行的运行环境,必须保存。

具体的轮流方法就是:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文

 

进程和线程不过是对应的CPU时间段的描述,不过是颗粒大小不同。

进程:就是包括上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文

线程:

进程的颗粒度太大,每次都要有上下的调入,保存,调出。如果我们把进程比喻为一个运行在电脑上的软件,那么一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成。那么这里具体的执行就可能变成:

程序A得到CPU-->CPU加载上下文-->开始执行程序A的a小段,然后执行A的b小段,然后再执行A的c小段-->最后CPU保存A的上下文。

这里a,b,c的执行是共享了A的上下文,CPU在执行的时候没有进行上下文切换的。这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境的更为细小的CPU时间段。

 

参考:

https://blog.csdn.net/kuangsonghan/article/details/80674777

https://blog.csdn.net/a3192048/article/details/82085422

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值