进程是资源分配的最小单位,线程是CPU调度的最小单位。 进程:经典定义是一个执行中的程序的实例。 进程与应用程序的区别:程序是一堆代码和数据的集合,可以作为目标模块存在于磁盘,或作为段存在于地址空间中。进程是程序的一次具体执行过程,它是动态地创建和消亡的,具有一定的生命周期,是暂时存在的。程序总是运行在某个进程的上下文中。
系统中每个程序都是运行在某个进程的上下文中的。上下文是由程序正确运行所需的状态组成,包括存放在存储器中的代码和数据、栈、通用目的寄存器的内容、程序计数器、环境变量和打开文件描述符的集合。进程给应用程序提供了两个关键抽象:
切换到另一个进程的时候,会载入已保存的对应于将要执行的进程的寄存器值,但是由于需要重新为高速缓存热身,会存在切换开销。
多进程优点: 1.每个进程互相独立,有独立的虚拟地址空间,子程序不影响主程序的稳定性,子进程崩溃没关系,比如谷歌浏览器; 2.尽量减少数据共享的安全问题和线程加锁/解锁的影响; 3.可用地址空间比较大,4GB(32位,232),264(64位)。
缺点: 1.独立的地址空间使得进程间共享信息也很困难,必须使用显式的IPC(进程间通信)机制。 2.往往比较慢,因为创建销毁进程,系统都要为之分配和回收较多的资源,同时IPC的开销也比较大。
线程:线程(thread) 就是运行在进程上下文中的逻辑流。是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。每个线程都有它自己的线程上下文(thread context),包括一个唯一的整数线程ID(Thread ID,TID)、栈、程序计数器和局部变量等。所有运行在该进程里的线程共享该进程的整个虚拟地址空间,因此这个共享虚拟地址空间的整个内容,包括它的代码,数据,堆,共享库和打开的文件。
线程的上下文切换开销比进程小得多,也比进程的上下文切换快得多。和一个进程相关的线程组成一个线程池(pool),独立于其他线程创建的线程。主线程和其他线程的区别仅仅是:他总是进程中第一个运行的线程。线程在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
多线程优点: 1.同一进程下线程之间由于使用相同的地址空间,共享大部分数据,所以交换数据非常方便; 2.线程的创建销毁、切换都比较简单,速度较快。 3.使用多线程可以减少程序的响应时间。如果某个操作很耗时或者陷入长时间的等待,比如发送邮件,等待网络响应,在单线程下,此时程序不会响应鼠标和键盘等操作。使用多线程后,可以将耗时的操作分配到一个单独的线程后台执行,保证更好的交互体验。 4.发挥多处理器的强大能力。如果在程序中只有一个线程,那么最多同时只能在一个 处理器上运行。在双处理器系统上,单线程的程序只能使用一半的CPU资源,而在拥有100个 处理器的系统上,将有99%的资源无法使用。同时,对于单处理器系统,如果程序是单线程的,那么 当程序等待某个同步I/O操作完成时,处理器将处于空闲状态。而在多线程程序中,如果一个 线程在等待I/O操作完成,另一个线程可以继续运行,使程序能够在I/O阻塞期间继续运行。
缺点: 1.一个线程的崩溃可能影响到整个程序的稳定性; 2.线程之间的同步和加锁控制比较麻烦; 3.所有线程共用进程的地址空间,受限于4GB地址空间限制(32位),当然64位限制就会很小;
线程安全:一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。 要确保函数线程安全,主要需要考虑的是线程之间的共享变量。属于同一进程的不同线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈、程序计数器。因此,对于同一进程的不同线程来说,每个线程的局部变量都是私有的,而全局变量、局部静态变量、分配于堆的变量都是共享的。在对这些共享变量进行访问时,如果要保证线程安全,一般通过加锁的方式。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。