zoukankan      html  css  js  c++  java
  • 多线程概念初识

    操作系统是多个进程的容器,进程是多个线程的容器 。

    二者不同之处 :

    起源不同:回顾操作系统起源,是现有进程再有线程,后来由于处理器速度比外设要快,所以为了提高cpu的利用率才产生的线程,目的就是提高程序的执行效率。

    概念不同:进程是独立运行的一个程序,是一个示例,也是操作系统资源分配的示例(像内存cpu这些都是以进程为单位进程分配的),而线程是cup调度的基本单位 。 

    内存共享方式不同:不同进程都会被操作系统分配到不同的内存,一般情况下不同进程是不共享的。线程与线程一般服务于同一个进程,所以他们可以一定量的访问共享内存。

    拥有资源不同:线程是进程的一部分,所以线程拥有的资源一定是小于进程的,不同线程共享(代码段,进程共有数据,打开的文件描述符,进程id......),线程与线程之前独有的(线程id,现成的堆栈...)

    数量不同 : 一个进程至少要拥有一个线程。

    开销不同:两个不是同一个数量级的,线程比进程更轻量级,(1)线程的创建和终止比进程时间短(2)进程内线程切换时间比进程切换短(3)通信开销,进程间通信比较难需要借助其他的东西,但是同一进程内线程由于共享内存和文件资源,就可以不用通过内核进行通讯。

    相似点 : 生命周期,都有就绪运行等待等。

    Java语言与多线程的关系:

    1.观察任务管理器会发现,如果我们代码里创建了100个线程,但是任务管理器会显示100多个线程,这是由于jvm会自动启动其他线程(即使代码里不显示的创建线程,在运行main时,jvm也会自动启动其他线程)有其他一下几个java虚拟机帮我们创建的线程:

    Signal Dispatcher : 把操作系统发来的新号分发给适当的处理程序 ??

    Finalizer : 负责对象的finalize()方法(不再推荐)

    Reference Hander : 与GC,会把每个对象的引用记录下来,配合GC进进行垃圾回收。

    main : 主线程,用户程序入口   

    多线程:

    什么是多线程:如果一个程序允许两个或者两个以上的线程,那么它就是多线程程序,多线程是指在单个进程中运行多个线程。

    为什么要用多线程:为了提高cup的利用率(处理速度),避免无效等待(读取磁盘io的时候可以去做其他的事),提高用户体验:避免卡顿、缩短等待时间(多线程可以同时接受多个用户的http请求,而不是排队等单一线程处理)。。。还有任务裁剪(可以用多线程去执行不同的任务)

    阿姆达尔定律:处理器越多,程序执行越快,但有上限,程序一般是由串行部分和并行部分组成(因为有些操作必须串行实现:比如代码必须一行一行执行,可能上下文依赖),并行比例越高处理器效果越明显。

    什么场景会用到多线程:需要耗时操作的时候,为了同时做多件不同的事:1)开网页同时听音乐 2)后台定时任务 。为了提高工作效率处理能力:1)tomcat 2)并行下载 3) NIO.  需要同时有很大的并发量的时候:1)压力测试

    多线程的局限:上下文切换带来的消耗(保存cpu需要的数据,比如代码执行到哪里了),异构化任务(任务结构不一样)很难高效并行,线程安全:相互配合(i++总数不一致)以及线程带来的的活跃性问题(死锁):线程互相拥有对象需要的资源(饥饿):等待导致一直得不到资源运行

     串行,并行,并发

    串行:各个线程顺序执行,一个执行结束下一个再执行

    并行 :多个线程同时执行

    并发: 多个任务逻辑上同时执行

    并发是只有一个处理器,逻辑上同时执行,并不是物理上的,并行是多核的物理上的同时执行,真正有多个任务在同时执行。 关键是一个同时执行一个交替执行。

    是什么让并行和并发成为可能 :

    1.cpu升级  2.caouzo操作系统升级  3.编程语言升级

    高并发 : 同时有多个请求发送给服务器,多线程是一种编程方法,为了防止高并发带来的线程安全问题及高并发带来的响应慢等问题,多线程初期是为了解决高并发的一种解决方案 。 但是高并发不一定要通过多线程来解决 (Redies:内部机制单线程)

    几个名词:QPS(Query Per Second) 每秒查询数 , 带宽。PV(Page View)综合访问量 ,UV(Unique Visitor)

    IP/UV 网线断线,断电重新拨号都会是IP>UV)(同一个局域网内多个用户都会是IP<UV)

    并发连接数:某个时刻服务器接收到的请求个数 

    服务器平均请求等待时间:平均服务器处理一个请求需要的时间

    同步异步,阻塞非阻塞 : 

    同步:被调用者不会主动告诉我们(调用者)执行已经结束,我们需要一直等待直到结束

    异步:服务器会主动告诉用户我在帮你准备,你可以去做其他的事情,准备结束会告诉用户执行结束

    阻塞: 调用者在被调用方执行的过程中即结果返回之前不能坐任何事,必须一致等待。

    非阻塞: 调用者在被调用方法返回结果之前可以去做其他的事情

    注意:同步异步指的是被调用者的行为,阻塞非阻塞指的是调用方的行为

    单核cpu运行多线程的意义:(意义通常不大的吧)(知乎:https://www.zhihu.com/question/37396742

     单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已, 系统给每个线程分配时间片来执行, 每个时间片大概10ms左右, 看起来像是同时跑, 但实际上是每个线程跑一点点就换到其它线程继续跑,单核CPU时使用多线程,通常是有线程要处于等待状态。

  • 相关阅读:
    全排列(next_permutation)
    Codeforces Round #321 (Div. 2)C(tree dfs)
    cf_ducational Codeforces Round 16_D(gcd)
    cf455a(简单dp)
    cf584a(水题)
    cf112a(水题)
    冒泡排序
    Python内置类型性能分析
    常见时间复杂度
    MongoDB 备份
  • 原文地址:https://www.cnblogs.com/wygm/p/12071362.html
Copyright © 2011-2022 走看看