关于线程/进程的理解
最近对线程有了一些的新的理解,再整理一下知识点:
- 线程的执行单位是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/关于线程进程的理解/