zoukankan      html  css  js  c++  java
  • 线程浅谈

    Multi Threads

    进程空间

    clipboard.png

    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

    线程空间

    clipboard.png

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

    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通信和同步

    clipboard.png

    所有的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有着存在即合理的一面。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 有任何问题请随时交流~ Email: araise1@163.com
  • 相关阅读:
    Atitit  技术经理职责与流程表总结
    Atitit.pagging  翻页功能解决方案专题 与 目录大纲 v3 r44.docx
    Atitit 翻页功能的解决方案与版本历史 v4 r49
    Atitit 数据库表文档生成解决方案
    Atiit 常见功能 常用功能与模块的最快速解决方案
    Atitit 列出wifi热点以及连接
    Atiitt 使用java语言编写sql函数或存储过程
    Atitit 数据库 标准库  sdk 函数库 编程语言 mysql oracle  attilax总结
    Atitit 纯java项目的提升进度大法通用json dsl接口
    Atitit 数据融合merge功能v3新特性.docx
  • 原文地址:https://www.cnblogs.com/seasen/p/14744318.html
Copyright © 2011-2022 走看看