进程与线程的区别与联系

        多进程已经可以很好的实现并发编程的效果了,但是仍然有一个明显的缺点:进程太重了,进程消耗的资源更多,速度更慢。如果进程创建销毁不频繁,那么还好,一旦需要大规模创建和销毁进程,开销就比较大,需要给进程分配给进程分配资源。那么能不能只分配一个简单的pcb。而不去分配后续的这些内存硬盘资源呢?这样应该可以更快,既能够并发的执行任务,又能够提升创建开销的速度,这样的进程称为轻量级进程,也称为线程。

        但是不分配给线程资源,那么线程是否能运行起来呢?当然不能,没有如内存等资源,线程也无法执行任务,那么这不是说线程没有什么用呢?或者应该如何去解决这个问题呢?其实这个问题早就被大佬所发现并解决,创建进程时,先把要用到的计算机资源分配好,后续在创建线程时,让线程在进程内部被创建出来后续进程中的线程,直接复用进程这里创建好的资源就行,因此进程和线程间的关系,可以认为是进程包含了线程。其实,一个进程,至少要包含一个线程,最初创建的进程,可以视为只包含一个线程的进程,此时创建的过程需要分配资源,第一个线程创建开销可能比较大。后续再在这个进程里创建线程,就可以省略资源的过程。如睡单间变成睡宿舍。因此这个进程中的多个线程,共同复用了进程中的各种资源(内存,硬盘等),但是这些线程各自独立的在CPU上进行调度。因此,线程就可以既能够完成并发编程的效果,又可以比较轻量的方式来运行。

        与进程一样,线程同样是通过PCB来描述(Windows上,描述进程和线程是不同的结构体,但在Linux上,复用了PCB这个结构体来描述线程,此时,一个PCB对应一个线程,多个PCB对应一个进程,),不过PCB中的内存指针 文件描述符表,同一个进程的多个PCB中,这两字段的内容都是一样的,但是上下文,状态,优先级,记账信息等支持调度的属性,则这些PCB每个PCB的都不一样,就和睡宿舍一样,所有人共用一个空间,但每个人也有着自己的私人物品,线程在进程中也是一样,同一个进程中PCB中的内存指针和文件描述符表是公共的,但也有着专属于自己的东西。所以可以说,进程是操作系统进行资源分配的基本单位,线程是操作系统进行调度执行的基本单位。

        随着进程中线程的数量增加,整体的效率也会进一步的提高,但这个提高也不是无限的提高,当线程的数量过多时,效率就没有办法提升,甚至线程的调度会拖累整体的效率。说了这么多线程的优点,是不是说明线程比进程更好呢?其实不然,因为线程是在进程中创建与调用,那么如果多个线程之间有了冲突,这可能导致该线程无法完成任务,甚至导致整个进程都无法完成任务了,也就带来了线程安全问题,而进程间却有隔离性,它们之间互不干扰,避免了因一个进程有错误而导致其他的进程无法顺利进行。因此多线程编程和多进程编程相比,确实是有优势(更轻量,创建销毁速度更快),但也有缺点(不像进程那么稳定,容易被其他线程干扰)。

        总结,进程和线程的区别和联系是:

1)进程包含线程,都是为了实现并发编程的方式,线程比进程更轻量。

2)进程是操作系统进行资源分配的基本单位,线程是操作系统进行调度执行的基本单位。创建进程的时候把分配资源(虚拟地址空间,文件描述符表)的工作给做了,后续创建线程,直接共用之前的资源即可。

3)进程有独立的地址空间,彼此之间不会相互影响到,进程的独立性(系统稳定性)

多个线程共用一份地址空间,一个线程一旦抛出异常,就可能导致整个进程异常结束。(多个线程之间容易相互影响)

你可能感兴趣的:(jvm,服务器,运维)