进程是什么?
程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是一系列机器指令的集合,是静态的;进程是程序的一次执行活动,属于动态概念。
在多任务编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行,注意这里并发和并行的区别,并发实质上是宏观上同时执行,微观上串行执行,而并行就是多个cpu同时执行多个互不相干的任务,是真正的同时执行。进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多任务编程而提出的。
线程是什么?
在计算机中正在执行的程序中,独立运行的程序"片段"就叫做线程,也可以理解为进程中顺序执行时的单一“控制流”,也可以理解为轻量级的进程。
思考:有了进程为什么还要线程?
进程可以实现多任务编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。那么进程既然有这么多的优点,为什么还要线程呢?主要原因如下:
线程的优点:
因为要并发,计算机的大牛们提出了进程,为了从微观上更加的并发,进而又发明了线程。因此,进程和线程的并发层次不同:进程属于在处理器这一层上提供的抽象;线程则属于在进程这个层次上再提供了一层并发的抽象。当然我们会发现,计算机的流水线也通用是并发,只不过这个并发是真正在单cpu上实现了多条指令同时处理,只不过把每条指令的整个执行过程分开做罢了,而且流水线的并发是指令层次的并发,是最微观的并发,由此可见,在计算机的世界里,并发无处不在。
总结进程、线程和流水线并发的特点:
进 程:cpu层次上并发的抽象
线 程:进程层次上的并发抽象
流水线:指令层次上并发的抽象
进程的切换:
我们知道,cpu提供了对多进程的调度运行机制,即每一个时刻只有一个进程在运行(针对单cpu而言),当这个进程的时间片耗费完了之后,cpu就会从等待执行的队列当中根据决策算法选择出另外一个进程执行,依次类推……,这也就是所谓的进程之间的切换,那这里就存在一个问题,当cpu从A进程切换到B进程去执行,执行完后如何才能切换回来?切换回来能不能继续执行?这就涉及到进程切换的时候关于保护现场对的问题,如果不保护现场,是不能返回继续执行的,进程上下文保存的具体如下:
(1)可执行程序、堆、栈(坚决澄清堆就是堆,栈就是栈)以及静态与动态分配的内存指针
(2)cpu寄存器组中包含执行下一条指令的指针信息
(3)描述进程状态的一些信息,比如进程是被挂起还是被阻塞,以及进程的优先级等
(4)进程中打开的文件描述符和读写指针
(5)当前进程的内存信息以及规划信息
总结:进程状态的具体体现是由CPU的寄存器:比如程序计数器(PC),栈指针(SP),通用寄存器的值以及MMU(Memory Management Uinit)页表信息,然后还有内存中的内容,磁盘文件,以及其他外设。这些信息从宏观上就分为:CPU内部寄存器信息和内存中的相关数据信息两大部分,由于ARM是单总线结构,所以可以把外设也归结到内存中去,这些信息已经全面的描述了一个进程的所有信息。我们所说的现场保护,保护的其实就是这些东西,具体实现过程是:当进程切换时,先保存所有的cpu寄存器到切换出cpu的进程的进程结构中,同时把内存中的相关数据进行压栈操作;然后,用切换进cpu的进程的进程结构体中保存的cpu寄存器的值和内存中压栈的数据恢复cpu的状态。
线程的切换 :
线程作为并发的一种机制,同样存在线程上下文,相比进程的上下文切换,线程的切换具有以下特点:
(1)线程不需要地址空间,线程包含在进程的地址空间中。
(2)线程的上下文只包含一个堆栈、一个寄存器组(pc、sp)和一个优先权。
(3)线程的代码是和他的进程共享的,进程拥有的所有资源线程都可以拥有,因此与资源相关的所有信息不实线程上下文部分,还有比如规划信息、计数信息都是由进程所定义,无需包含在线程的上下文中。
总结:线程上下文切换原理与进程上下文切换原理类似,只是线程是在同一地址空间中,不需要MMU的切换,只需要切换必要的CPU寄存器,因此,线程切换时需要保存的线程上下文信息相对较少,所以线程切换要比进程切换快的多。
由于线程是进程层次的并发,因此线程提高了进程的并发度,除此之外,线程还有个好处,就是可以有效地利用多处理器和多核计算机。现在的处理器有个趋势就是朝着多核方向发展,在没有线程之前,多核并不能让一个进程的执行速度提高,原因很简单:一个单独的进程始终只能在CPU层次上运行,且不能再进行"细分",比如我们假设一个进程的总共任务是1,那么如果CPU每次能执行整个任务的十分之一,那么这个进程由cpu切换10次时才可以把所有的任务完成,这样并不能充分利用多核,因为进程从cpu层次的,而多核指的是一个cpu中的多个核。但如果把一个进程分解为若干个线程,则可以让不同的线程运行在不同的核上,这样就可以提高进程的执行速度。
例如:我们经常使用kugou音乐播放器播放音乐,在播放音乐的同时下载音乐,这实际上就打开了多个线程。这些线程中有专门负责显示界面的线程,有专门负责音乐播放的线程,有专门负责从网络下载歌曲的线程等等。这些线程一起运行,让我们感觉到播放音乐和下载音乐在同时进行,如果是多核的cpu,那么这几个线程可能同时在不同的核上运行,如果是单核cpu,那么这些线程同样是“轮流”执行,即:宏观上同时,微观不同时,因此线程的出现,充分的利用了cpu的多核,提高了程序的执行效率。这样带来的好处就是:用户感觉多个线程是同时运行的,并没有先后之分,实质上是"欺骗了用户",但是这种“欺骗”并没有任何坏处,与之而来的是程序运行效率的大幅度提高和良好的用户体验。
以上分别详细说明和总结了进程和线程的各自特点,接下来说一下,进程和线程之间的联系与区别:
进程是资源分配的最小单位,线程是cpu调度运行的最小单位
一、进程和线程的关系
(1)一个线程只能属于一个进程,而一个进程可以有多个线程。
(2)资源分配给进程,同一进程中的所有线程共享该进程的所有资源。
(3)处理剂分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步,不同进程的线程之间要利用消息通信的办法实现同步。
二、进程和线程的区别
(1)调度:线程作为调度和分配的最小单位,进程作为拥有资源的基本单位
(2)并发性:进程之间可以并发,同一个进程的多个线程之间也可以并发执行
(3)拥有资源:进程是拥有资源的几个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源
(4)系统开销:在创建或者撤销进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或者撤销线程时的开销。
(5)安全性:进程拥有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间并没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
阅读(788) | 评论(0) | 转发(0) |