一. 什么是线程 

  1.定义

    线程就像一条工厂车间里的流水线,一个车间里可以用很多流水线,来执行生产每个零部件的任务。

    所以车间可以看作是进程,流水线可以看作是线程。(进程是资源单位,线程是执行单位)

    启动一个进程,至少该进程内有一个线程(主线程,“父线程”)

  2.为什么要用线程?  

    比喻:一个车间需要至少有一条生产线,如果主生产线生产汽车的发动机,如果还想要生产变速箱,底盘,是新开一个车间来生产,还是再开2个生产线进行生产快呢? 并且三大件之间需要彼此共享    合作,所以多个流水线生产很重要!

    总结:线程的特点

      1.同一进程下的多个线程共享该进程内的资源

      2.开启一个线程的开销远远小于开启一个进程

   ps:创建进程需要申请空间,并且该空间内至少一条流水线,创建线程无需申请空间,所以开销小。

    

    

  3.怎么用线程?

    涉及线程的创建和使用场景,请见并发编程多线程--实践部分。

 
二.线程之间的协作关系

  比喻:多个车间都是资源单位,为了生产的流水线,是一种资源竞争关系;而同一个车间的流水线,则是协同关系,协同配合,资源共享,达标完成车间主任部署的生产任务。

  总结:

    进程之间的关系是竞争关系,而线程之间是协作关系。

  

三.线程与进程的区别

  1.Threads share the address space of the process that created it; processes have their own address space.
  线程共享创建它的进程的地址空间; 进程有自己的地址空间。

  2.Threads have direct access to the data segment of its process; processes have their own copy of the data segment of the parent process.
   线程可以直接访问其进程的数据段; 进程拥有自己父进程数据段的副本。

  3.Threads can directly communicate with other threads of its process; processes must use interprocess communication to communicate with sibling processes.
  线程可以直接与其进程的其他线程通信; 进程必须使用进程间通信来与兄弟进程通信。

  4.New threads are easily created; new processes require duplication of the parent process.
   新线程很容易创建; 新流程需要复制父流程。
 
  5.Threads can exercise considerable control over threads of the same process; processes can only exercise control over child processes.
  线程可以对同一进程的线程进行相当大的控制; 进程只能控制子进程。

  6.Changes to the main thread (cancellation, priority change, etc.) may affect the behavior of the other threads of the process; changes to the parent process does not affect child processes.
  对主线程的更改(取消,优先级更改等)可能会影响进程的其他线程的行为; 对父进程的更改不会影响子进程。

四.为何要用多线程

  多线程指的是,在一个进程中开启多个线程,简单一点说:如果多个任务公用一块地址空间,那必须在一个进程内开启多个线程来完成多个任务(联想:word的编辑,定时保存,预览等)。

  详细的讲分为4点:

    1.多线程共享一个进程的地址空间。

    2.线程比进程更轻量级,线程比进程跟容易创建可撤销,在很多操作系统中,创建一个线程比创建一个进程要快10-100倍,在有大量线程需要动态和快速修改时候,这一特性很有用。

    3.若多个线程都是cpu密集型,那么并不能获得性能上的增强,但是如果存在大量的计算和大量的I/O处理,拥有多个线程运行这些活动彼此重叠运行,从而会加速程序的执行速度。

    4.在多个cpu系统中,为了最大限度的利用多核,可以开启多个线程,比开进程开销小的多(这一条不太适用python)

五.多线程的应用举例

  

  例如:Notepad++,打开该程序后开启了一个进程,但是该进程不止做一件事情,有监听键盘输入,文理文字,定时自动保存到硬盘等等操作,而这3个任务操作的都是同一快数据,因而不能用多进程。

  只能在一个进程里并发地开启三个线程,如果是单线程,那就只能,键盘输入的时候,不能够处理文字和自动保存,自动保存的时候又不能输入和处理文字。

六.经典的线程模型(了解)

  

                  图一

  1.图一可知:

  不同进程之间是充满敌意的,彼此抢占,竞争cpu的关系,如360和qq抢占资源。而同一进程是由一个程序员创建的,所以同一进程内的线程是合作关系,一个线程可以访问另外一个线程内的内存地址,进  程的线程共享彼此的内存信息。

  多个线程共享同一进程的地址空间中的资源,是对一台计算机上多个进程的模拟,所以有时候也称之为轻量级的进程。

  而一台计算机上的多个进程,则共享物理内存,磁盘,打印机等其他物理资源。

  多线程的运行与多进程的运行类似,是cpu在多个线程之间的快速切换。

  

              图二

  2.图二可知:

    类似进程,每个线程内部也有自己的堆栈。

    不同于进程,线程库无法利用时钟中断强制线程让出CPU,可以调用thread_yield运行线程自动放弃cpu,让另外一个线程运行。

  3.总结:

    线程通常是有益的,但是带来了不少程序设计难度,线程的问题是:

    1.父进程有多个线程,那么开启的子线程是否需要同样多的线程。

    如果是,那么附近中的某个线程被阻塞,那么copy到子进程后,copy版的线程也要被阻塞吗?想一想nginx的多线程模式接收用户连接。

    

    2.在同一个进程中,如果一个线程关闭了文件,而另外一个线程准备往该文件内写内容呢?

    如果一个线程注意到没有内存了,并开始分配更多的内存,在工作一半时,发生线程切换,新的线程也发现内存不够,又开始分配更多的内存,这样内存就被分配了很多次,这些问题都是多线程编程    的典型问题,需要仔细思考和设计的。

  

    

  

七.POSIX线程(了解)

  为了实现可移植线程程序,IEEE在IEEE标准1003.1c中定义了线程标准,它定义的线程包叫Pthread。大部分Unix系统都支持该系统标准:

  

八.在用户空间实现的线程(了解)

  线程的实现可以分为2类:用户级线程(User-Level Thread) 和内核级线程(Kernel-Level Thread),后者又称之为内核支持的线程或者轻量级线程。

  在多线程操作系统中,各个系统的实现方式并不同,在有的  系统中实现了用户级线程,有的系统中实现了内核级线程。

  

  因此,在用户空间模拟操作系统对进程的调度,来调用一个进程中的线程,每个进程中都会有一个运行时的系统,用来调度线程。

  此时当该进程后去cpu的时候,进程内再调度出一个线程去执行,同一时刻只有一个线程执行。

九.在内核空间实现的线程(了解)

  

  

  内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。

  切换完毕要从内核态返回用户态;

  可以很好的利用smp,即利用多核cpu。windows线程就是这样的。

十.用户级与内核级线程的对比(了解)

  1.用户级与内核级的线程区别:

  

  2.内核线程的优缺点

    优点:

      当有多个处理机制的时候,一个进程的多个线程可以同时执行。

    缺点:

      由内核进行调度

  3.用户线程的优缺点

    优点:

      1):线程的调度不需要内核直接参与,控制简单

      2):可以在不支持线程的操作系统中实现

      3):创建和销毁线程,线程切换等线程管理的代价比内核线程少的的多

      4):运行每个进程控制自己的调度算法,线程管理比较灵活

      5):线程能够利用的表空间和堆栈空间比内核级线程多

      6):同一个进程中只能同时有一个线程在运行,如果一个线程使用了系统调用二阻塞,那么整个进程都会被挂起。另外,页面失效也会产生同样的问题。

    缺点:

      资源调度按照进程进行,多个处理机制下,同一个进程中的线程只能在同一个处理机制下分时复用。

  

    

十一.混合实现(了解)

  用户级与内核级的多路复用,内核同一调度内核线程,每个内核线程对应n个用户线程。

  

十二.线程小故事

  关于线程的小故事

python week08 并发编程之多线程--理论部分的更多相关文章

  1. python week08 并发编程之多进程--理论部分

    一 什么是进程 进程:正在进行的一个过程或者说一个任务.       而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): Jame在一个时间段内有很多任务要做:python学习任 ...

  2. python week08 并发编程之多线程--实践部分

    一. threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.pytho ...

  3. python week08 并发编程之多进程--实践部分

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  4. Python之旅:并发编程之多线程理论部分

    一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 车间负责把资源整合 ...

  5. 29 python 并发编程之多线程理论

    一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 车间负责把资源整合 ...

  6. 三 python并发编程之多线程-理论

    一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 车间负责把资源整合 ...

  7. python并发编程之多线程理论部分

    阅读目录 一 什么是线程 二 线程的创建开销小 三 线程与进程的区别 四 为何要用多线程 五 多线程的应用举例 六 经典的线程模型(了解) 七 POSIX线程(了解) 八 在用户空间实现的线程(了解) ...

  8. 第十篇.3、ython并发编程之多线程理论部分

    一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程 车间负责把资源整合 ...

  9. day31 python学习 并发编程之多进程理论部分

    一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): 二 进程与程序的区别 程序仅仅只是一堆代码而已,而进程指的是程序的运行 ...

随机推荐

  1. 监听textarea数值变化

    监听textarea数值变化 $('#id').bind('input propertychange', function(){ //TODO });

  2. shell命令cut

    cut命令用来操作字符串,可以理解为剪切字符串的工具: cut有两种用法: 1.剪切字符串中的单个字符(-c参数) 例如: str=abcdef echo $str | cut -c 1-1 输出:a ...

  3. 卓越管理的实践技巧(4)如何才能给予有效的反馈 Guide to Giving Effective Feedback

    Guide to Giving Effective Feedback 前文卓越管理的秘密(Behind Closed Doors)最后一部分提到了总结的13条卓越管理的实践技巧并列出了所有实践技巧名称 ...

  4. coredata栈

    上下文包含所有信息 NSManagedObjectModel The NSManagedObjectModel instance describes the data that is going to ...

  5. [神经网络]一步一步使用Mobile-Net完成视觉识别(一)

    1.环境配置 2.数据集获取 3.训练集获取 4.训练 5.调用测试训练结果 6.代码讲解 本文是第一篇,环境配置篇. 先打开tensorflow object detection api 看看需要什 ...

  6. Python中Numpy ndarray的使用

    本文主讲Python中Numpy数组的类型.全0全1数组的生成.随机数组.数组操作.矩阵的简单运算.矩阵的数学运算. 尽管可以用python中list嵌套来模拟矩阵,但使用Numpy库更方便. 定义数 ...

  7. Hybrid App开发之Html基本标签使用

    前言: 前面简单学习了html简单标签的使用,今天学习一下其他的标签的使用. HTML的超链接 1.)创建一个超链接 <div> <p> <a href="ht ...

  8. 使用HelpProvide组件调用帮助文件

    实现效果: 知识运用: HelpProvider组件的HelpNameSpace属性 //于对象关联的帮助文件名 public virtual string HelpNameSpace {get; s ...

  9. OO第三次电梯作业优化

    目录 第三次电梯作业个人优化 前言 优化思路 一.调度器 二.电梯 第三次电梯作业个人优化 前言 由于个人能力有限,第二次电梯作业只能完成正确性设计,没能进行优化,也因此损失了强测分数,于是第三次电梯 ...

  10. npm WARN saveError ENOENT: no such file or directory, open 'C:\Users\James\package.json'

    在运行如下命令时, 遇到了问题: npm install --registry=https://registry.npm.taobao.org npm run dev 错误提示: 解决办法: 生成一个 ...