线程浅谈

Multi Threads

进程空间

线程浅谈

Text segment (ELF):

代码段,从虚拟内存地址00400000开始,使用pmap $$可以查看到,这个地址是固定的

00400000地址段用于存放程序的可执行文件,fork一个子进程,之后调用execve加载可执行文件,execve即将文件加载到该段地址中

Data segment:

数据段,用于存放已初始化全局变量

BSS segment:

存放全局的未初始化的变量段,bss段与data段的区别是,编译时需为data段分配空间,而bss段不用。数据存放于bss段,减小了可执行程序的文件大小

Heap:

堆,c库中的malloc调用就是从该段获取内存空间

Memory Map segment:

内存映射段,使用mmap将此进程内容映射到内存空间,不同进程通过映射到同一块物理内存,可以实现共享内存,完成进程间通信

Stack:

栈区,存放局部变量

kernel space:

内核空间,所有进程共享,存放PCB

线程空间

线程浅谈

多个线程共享进程的大部分内容,维护私有的小部分内容

  1. Kernel space
    • Stack pointer
    • Registers
    • Scheduling properties (such as policy or priority)
    • Set of pending and blocked signals
    • Thread specific data.
  2. User space
    • stack

Threads通信和同步

线程浅谈

所有的IPC(inter process communication)方法都适用于thread间的通信

常用IPC包括

message queue:

管道,半双工,需有共同父进程,通常在父子进程通信时使用

FIFO:

命名管道,半双工,不相关的进程也能交换数据,类似于在进程中使用文件来传输数据

MQ:

消息队列,是个链表,可实现全双工,一般作为semaphore和sharememory的折中方案

sharememory:

共享内存,最快的一种IPC,两个或多个进程共享一个给定的存储区

semaphore:

信号量,本质是个计数器,访问同一资源时,并发计数超出限制则多余的进程(or线程)会被堵塞

socket:

套接字,这就不多说了,网络间通信,浏览器和server本来就是俩进程

signal:

信号,通知进程发生了异步事件,类似于硬件的中断指令,这个两句话讲不太清,想要了解推荐[这个文章][https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html]

Multi Threads应用场景

写了这么多,那到底什么时候可以应用多线程来解决问题呢?根据经验,一般下面一些场景我们可以考虑使用多线程。

  • 多核处理器,任务比较容易切分为并行处理的小块。如果是计算密集型的,线程数量可以考虑跟core的数量相当。
  • 有delay比较多的IO操作,可以考虑将IO的操作分离给单独的线程。
  • 有人机交互和实时响应等实时性要求较高任务,可以考虑分离为优先级较高的线程。
  • 有大量实时要求不高的计算,可以考虑分离为优先级较低的后台任务。
*上述内容借鉴了[此博客][https://segmentfault.com/a/1190000004557912]大部分内容,还有一些其他博客的讲解也对本人理解帮助很大,但是由于太杂不再列出。

来说下python的线程

  • Python threads are real system threads
    • POSIX threads (pthreads)
    • Windows threads
  • Fully managed by the host operating system
  • Represent threaded execution of the Python interpreter process (written in C)

我们都知道使用CPython解释器时,python的线程并不是真正的并发执行,但并不代表python的线程不是真正的线程,python线程的底层实现和其他语言的实现相同,使用pthreads或Windows threads,并且线程的调度管理也由操作系统实现。

我们也同样知道不能真正并发执行的原因是CPython中使用了GIL,关于GIL我准备另起一节专门讲解,但请先不要臆断的把GIL看做是一个弊端,GIL有着存在即合理的一面。

上一篇:二进制安全基本常识


下一篇:Java - "JUC线程池" 线程状态与拒绝策略源码分析