进程
进程是运行中的程序,每个进程都包含独立的内存空间、代码、数据和系统资源。
线程
线程是进程中的一个执行单元,每个线程都有自己的程序计数器、堆栈和局部变量,但是它们共享进程的代码、数据和系统资源。
Goroutine
Goroutine是用户态线程,操作系统对Goroutine是无感知的。Goroutine是在用户态模拟出了程序计数器、堆栈等线程独有的数据结构和上下文,以至于能够在用户态管理Goroutine,所以Goroutine的创建、销毁和切换都是在用户态完成的。
Goroutine的堆栈和线程堆栈的区别
Goroutine 栈和线程栈的区别在于,Goroutine 栈是按需分配的,能够快速创建和销毁,并且可以动态调整栈的大小,而线程栈是在线程创建时就分配好了一定大小的栈空间,不支持动态调整,因此在处理大量并发任务时,Goroutine 比线程更加高效和灵活。
线程的堆栈和堆的关系
线程的堆栈和堆内存是两个不同的概念,但它们都与线程的内存空间有关。
线程的堆栈是一个内存区域,用于保存函数调用的上下文信息和局部变量等数据,所以每个线程都有自己的堆栈。线程的堆栈由操作系统自动分配和管理,当一个函数被调用时,其局部变量和参数会被保存在堆栈上,当函数返回时,这些数据也会从堆栈中移除。
线程的堆内存是线程共享的内存区域,用于动态分配内存,例如使用 malloc 或 new 等函数分配的内存。堆内存由进程管理,多个线程可以在堆内存上分配和释放内存,但需要注意线程安全问题,例如使用锁来保证线程之间的互斥和同步。
总的来说,线程的堆栈和堆内存都与线程的内存空间有关,但它们的作用和管理方式是不同的。线程的堆栈是用于保存函数调用的上下文信息和局部变量的,由操作系统自动分配和管理;线程的堆内存是用于动态分配内存的,由进程管理,多个线程可以在堆内存上分配和释放内存。
为什么线程的切换代价比进程小?
因为线程的切换需要保存和恢复的上下文信息更少。只需要保存和恢复线程的堆栈和程序计数器等少量的上下文信息。因为线程共享进程的虚拟地址空间和资源,所以不需要进行额外的内存和资源的切换操作。