关于线程/进程的理解

最近对线程有了一些的新的理解,再整理一下知识点:

  • 线程的执行单位是core,一个cpu可以有多个core,所以为啥现在计算就主打多核cpu..
  • 但实际上即使是一个core,也可以实现并发,因为线程之间可以随时切换,因为有thread context这个信息,下面会提。
  • 我们实现一个服务/进程,有多时候都会用多线程来并发处理,那么来看下线程的共享资源单位:
    • 代码区:毫无疑问,就是二进制的代码文件
    • 动态链接库地址:就是依赖的外部库,c/c++在window是ddl,在linux是so
    • 堆区:就是对象,c/c++里是new、malloc的对象,java也是new出来的对象。
    • 栈区:
      • 局部变量
      • thread context,包含函数栈指针、程序计数器等,简单理解就是这个函数可能会调用多个其他函数,比如递归,那么就有个栈指针来记录这个上下文信息
      • 原则上栈区是每个thread独有的,但是依旧是可以被其他thread修改,所以就有多进程里的各种线程锁之类的处理。
  • Spark中,一个executor可以有多个core,但是内存是按照executor来分配的,也就是core越多,多进程的话,就越吃机器的内存。内存分为memory和memoryOverHead,前者应该就是放工作数据的堆区,后者是栈区。

关于线程/进程的理解
http://yoursite.com/2020/12/16/大数据/Spark/关于线程进程的理解/
作者
Wei Lyu
发布于
2020年12月16日
许可协议