当前位置: 首页 > Linux

进程和线程的区别

时间:2023-04-06 03:46:52 Linux

(1)最大的区别是进程是系统资源分配的最小单位,而线程是cpu运行和调度的最小单位。它本质上是一组寄存器的状态,是操作系统对寄存器状态的抽象(2)从创建、切换和通信成本来看:线程创建的成本远低于进程创建.等待)。创建线程就简单多了,只需要确定PC指针和寄存器的值,为线程分配一个栈来执行程序,这个栈可以在同一个进程的多个线程之间复用。因此,创建进程比创建线程慢,进程的内存开销更大。进程上下文切换当一个进程在执行时,CPU所有寄存器中的值、进程的状态、栈中的内容,都称为进程的上下文。当内核需要切换到另一个进程时,需要保存当前进程的所有状态,即保存当前进程的上下文,以便再次执行该进程时,切换时的状态可以获得并执行。在LINUX中,当前进程上下文存储在进程的任务数据结构中。当中断发生时,内核在被中断进程的上下文中执行内核态的中断服务程序。但同时,所有需要使用的资源都被保留,以便在中断服务结束时,可以恢复被中断进程的执行。线程上下文切换线程和进程的区别,线程是调度的基本单位,进程是资源拥有的基本单位。怎么理解呢?内核中所谓的任务调度实际上是对线程进行调度,进程为线程提供虚拟内存、全局变量等资源。也可以这样理解:当进程只有一个线程时,可以认为进程等于线程;当进程有多个线程时,这些线程共享相同的资源,如虚拟内存和全局变量,在上下文切换时不需要修改。当一个线程也有自己的私有数据,比如自己的栈、寄存器等,在上下文切换的时候也需要保存。根据上面的描述,线程上下文切换有两种情况:来回切换的两个线程属于同一个进程,两个线程的资源基本是共享的。切换上下文时,不需要移动共享资源。只有当线程有私有数据时,才切换不共享的数据;来回切换的两个进程不属于同一个进程,这和切换进程上下文时是一样的。同一个进程的线程切换比进程切换消耗的系统资源少,这是多线程相对于多进程的优势。进程中的线程共享地址空间,进程间通信的代价远大于线程间通信管道、FIFO、消息队列、信号量、共享内存、信号、套接字、UNIX套接字。线程之间通信的目的主要是为了线程是同步的,所以线程没有进程通信那样的数据交换的通信机制。互斥锁、读写锁、自旋锁、信号量、条件变量和屏障(3)同一进程中的线程拥有共享资源和独占资源https://cloud.tencent.com/dev..。线程之间唯一的资源是栈区。同时,在函数运行的时候,需要额外的寄存器来保存一些信息,比如一些局部变量。注册信息。线程的栈区、程序计数器、栈指针和函数使用的寄存器都是线程私有的。这些信息有一个统一的名字,threadcontext,threadcontext。TLS->ThreadLocalStorage该区域存储的变量是全局变量,所有线程都可以访问。它是全局的,但是每个线程在访问的时候都会保存一份自己的局部变量,修改不会相互影响。受影响虽然看起来所有线程都访问同一个变量,但是全局变量只属于一个线程,一个线程对这个变量的修改对其他线程是不可见的。实现原理类似于拥有一个全局字典。字典的键是线程id,值是共享全局变量的副本。http://blog.hacksmeta.com/201...线程共享资源代码区编译代码数据区全局变量,静态变量。堆区C/C++中malloc或new得到的数据就存放在这个区域。只要知道指针,任何线程都可以访问指针指向的数据,所以堆区也是线程共享的资源,属于进程。栈区如果一个线程可以从另一个线程的栈帧中得到一个指针,那么这个线程就可以改变另一个线程的栈区,也就是说这些线程可以任意修改栈区中本属于另一个线程的变量.动态链接库动态链接部分生成的库就是我们熟悉的动态链接库。Windows下是DLL结尾的文件,Linux下是so结尾的文件。文件如果程序在运行过程中打开了一些文件,进程地址空间中也保存了打开文件的信息,进程打开的文件也可以被所有线程使用,这也是线程间的共享资源。