首页 > 其他分享 >线程概念学习笔记

线程概念学习笔记

时间:2022-11-14 19:57:55浏览次数:36  
标签:请求 并行 笔记 并发 线程 进程 概念学习 多线程

1.进程和线程

1.1 什么叫做线程

定义:线程是CPU的基本调度单位,每个线程执行的都是进程代码的某个片段。

实例演示:用活动监视器的CPU栏目看java进程的线程数的变化

左边进程,右边线程

image-20221102215513657

2. 进程和线程的不同

  1. 起源不同

操作系统的历史是先有进程后有线程,由于处理器的速度往往比外设要快,外设就是那些键盘啊,那些硬盘,处理器速度远远大于他们,所以,为了提高这个cpu的利用率啊,才诞生了这个线程,就是提高程序的执行效率

  1. 概念不同

进程是具有独立功能的一个程序,运行起来的一个活动是一个实体,它也是我们系统分配资源和调度的一个独立的单位,而线程是cpu的基本调度单位

  1. 内存共享方式不同

对于进程而言不同的进程之间,他们都被操作系统会分配到一定的内存,但是不同进程之间的内存通常是不共享的,比如说我们的浏览器,它无法访问,我们正在播放背景音乐的那个qq音乐,他们两个之间呢,是没有办法直接访问内存的,他们要想通信啊,除非使用高级技巧叫做进程间通信ipc,那这个不属于我们现在的重点,要说到线程与线程之间他们共享起来就容易多了,因为他们本身都服务于同一个进程,自然要想服务的好,合作是很重要的,所以两个线程城之间通信起来很容易,他们可以直接访问一定量的共享内存,而不需要任何额外的处理

  1. 拥有资源不同

    线程共享的内容包括:

    1.进程代码段

    2.进程的公有数据(利用这些共享的数据,线程很容易的实现相互的通讯)

    3.进程打开的文件描述符

    4.信号的处理器

    5·进程的当前目录

    6.进程用户ID与进程组ID

    线程独有的内容包括:

    1.线程ID

    2.寄存器组的值

    3.线程的堆栈

    4.错误返回码

    5.线程的信号屏蔽码

  2. 数量不同

进程一个线程可以是多个几百个都没有问题,但是呢一个进程至少要拥有一个线程,否则就没有办法执行了

  1. 开销不同

一个进程可能有多个线程,所以他们的开销自然也不一样,线程始终是比我们的进程更轻量级的,所以它的创建,中只在一个进程内的切换,它都比我们的进程要更轻量,要更节省资源,并且呢,在通信的时候也是一样,线程间的通信,他们有直接可以利用的共享资源

1)线程的创建、终止时间比进程短

2)同一进程内的线程切换时间比进程切换短

3)同一进程的各个线程间共享内存和文件资源,可以不通过内核进行通信

  1. 相似点:生命周期

生命周期上,也就是在状态上,进程和线程他们从生到死,从创建到结束,都有包括就去等待运行,这一系列的状态,在状态上他们是非常相似的。

3.Java语言和多线程的渊源和关系

Java设计之初一一支持多线程
Java语言在服务端开发语言中的地位 一常年高居前三
一对一映射到操作系统的内核线程

JVM自动启动线程

image-20221102221429619

Signal Dispatcher //把操作系统发来的信号分发给适当的处理程序

Finalizer //负责对象的finalize()方法

Reference Handler //和GC、引用相关的线程

main //主线程,用户程序的入口

4. 多线程概念

多线程的概念:如果一个程序允许允许两个或以上的线程,那么它就是多线程程序。

多线程是指在单个进程中运行多个线程。

5. 为什么需要多线程

最主要的目的就是提高CPU利用率

提高处理速度

避免无效等待(IO的时候可以做别的事)

提高用户体验避免卡顿、缩短等待时间

  • 并行处理,提高性能,通常是服务器领域(例如Tomcat),用多个线程去接收进来的HTTP请求,而不是排队等待单一的线程处理

  • 在Android开发中,主线程的重要任务之一是绘制屏幕界面,该线程中不允许进行IO操作或网络请求,目的就是避免卡顿,影响用户的交互

便于编程建模

计算机性能定律:摩尔定律失效,阿姆达尔定律登上舞台

阿姆达尔定律:

处理器越多,程序执行就越快,但有上限,取决于程序中串行部分的比例,并行的比例越高多处理器的效果越明显。

6. 什么场景中会用到多线程?

我们要执行耗时任务,IO读写,网络通信这种情况下新开一个线程去做,带来的好处是非常大的,他不但不会影响到我们主城区的运行,也不会因为磁盘它的速度慢或者网络速度慢而影响到其他任务的运行,有哪些典型的情况。比如说我们想同时做多件事,想开着网页同时听音乐或者在服务端后台去启动一些任务。

7. 多线程的局限

性能问题:上下文切换带来的消耗

异构化任务(任务结构不一样)很难高效并行

带来线程安全问题:包括数据安全问题(例如i++总数不一致)以及线程带来的活跃性问题(线程饥饿、死锁)。

8. 串行、并行、并发

8.1 串行、并行

串行是大家排队一个个来,并行是大家一起来

8.2 并发、并行

概念非常相似,从而难以区分

本身大家对于并发和并行的概念就没有明确:并发可以对应到两个不同的概念

image-20221102224326787

并行:

真正的“同时”运行 一在同一时刻,有多个任务同时执行。
例如,在多核处理器上,有两个线程同时执行同一段代码。
可见,单核处理器是无法实现并行的,因为单核处理器无法在同一时刻执行多个任务。

并发的两种概念

  1. 形容多个任务的执行状态

两个或多个任务可以在重叠的时间段内启动,运行和完成

并行(两个线程同时执行)一定是并发

并不一定意味着并发一定要求是并行

image-20221102224952532

  1. 对“并发性”的简称

不同的部分可以无序或同时执行,且不影响最终的执行结果

在不同核心数的计算机上的不同表现

此时并行和并发的概念并不在同一维度上

9. 是什么让并发并行成为可能

CPU升级

操作系统升级

编程语言升级

10.高并发

什么是高并发?

同时有很多请求发送同一个系统,服务器会并行处理

高并发和多线程的联系和不同?

多线程和高并发是什么:解决方案、状态

多线程和高并发的关系:其中一种重要的解决方案

高并发并不意味着是多线程:Redis

高并发有哪些指标?

QPS ( Queries Per Second )每秒查询数

带宽

PV ( Page View )

UV ( Unique Visitor )

IP和UV的区别

并发连接数(The number of concurrent connections )

服务器平均请求等待时间(Time per request: across all concurrentrequests )

11. 同步异步

被调用者是否主动告诉调用者结果。

同步:同步异步这里指的是被调用者(也就是服务器)的行为,而不是请求方的行为。在没有得到结果之前,服务端就不返回任何结果。

异步:调用在发出之后,服务端会立刻返回,告诉调用方“我收到你的请求了,我会处理的”

12. 阻塞和非阻塞

站在线程状态的角度

站在线程发出请求(通常是HTTP请求)的角度

同步在于请求者发出请求后,需要不断获取被请求的一方的状态,直到被请求一方执行完之后,请求者获取到这个状态,

异步在于请求者发出请求之后,不需要主动获取被请求一方的状态,被请求一方执行完毕以后会主动通知到请求者,

阻塞和非阻塞在于发出请求之后,需不需要等到请求的结果才能执行下一步操作,阻塞则必须等待,非阻塞则不需要。

所以结合起来:同步阻塞,发出请求之后必须等待请求的结果,而请求的结果是需要你不断的查询 。

异步阻塞,发出请求之后必须等待请求的结果,而请求的结果是被请求者主动通知。

同步非阻塞:发出请求之后不用等待请求的结果,可以去做别的操作,但是这个请求的结果是需要你主动的查询 。

异步非阻塞:发出请求之后不用等待请求的结果,可以去做别的操作,但是这个请求的结果是被请求者主动通知。

13.常见面试题

进程和线程的相同和不同?
并行和并发的异同?
高并发是不是就意味着多线程?
有什么反例?
多线程可以提高程序执行效率,你知不知道有有哪些弊端?

什么是同步,什么是异步,什么是堵塞、非堵塞?

在单核CPU上运行多线程程序有意义吗?

标签:请求,并行,笔记,并发,线程,进程,概念学习,多线程
From: https://www.cnblogs.com/mrwyk/p/16890147.html

相关文章

  • python 多进程 多线程 协程
    多进程-进程池1fromconcurrent.futuresimportProcessPoolExecutor23withProcessPoolExecutor(max_workers=10)asexecutor:4results=executor.map......
  • Spring学习笔记(2)实现 Bean 的定义、注册、获取
    代码目录结构small-spring-step-02└──src├──main│└──java│└──cn.bugstack.springframework.beans│├─......
  • Pthread 并发编程(二)——自底向上深入理解线程
    Pthread并发编程(二)——自底向上深入理解线程前言在本篇文章当中主要给大家介绍线程最基本的组成元素,以及在pthread当中给我们提供的一些线程的基本机制,因为很多语言的......
  • 基于TensorFlow和Python的机器学习(笔记4)
    基于TensorFlow和Python的机器学习(笔记4)    lossMSE=MeanSquaredError均方差 Entropy熵CrossEntropy交叉熵熵越大,越不稳定,惊喜度越高......
  • 《线程调度》
    (38条消息)Linux线程调度与优先级_modi000的博客-CSDN博客_linux线程优先级(38条消息)linux线程调度策略简述_独步逍遥&万界仙踪的博客-CSDN博客_linux线程调度......
  • Java:String、StringBuilder、StringJoiner学习笔记
    String创建的俩种方式1.直接赋值Stringstr="HelloWorld!";        当使用直接赋值的方式去创建字符串的时候,虚拟机会去串池里去检查字符串是否存在,如果......
  • B站 MySQL 陈长宏老师讲课笔记day2
    B站MySQL数据库视频1.DQL查询语句的使用1)排序查询 语法:orderby字句 orderby排序字段1排序方式1,排序字段2排序方式2......  排序方式:   ASC:升序,......
  • INFO213 In class exercise - knn (课堂练习笔记)
    KNNLetusimplementtheKNNalgorithmusingasetofexampledataaboutfavoriteprogramminglanguagesfordatascientistsindifferentcities.cities=[(-8......
  • 密码学C/C++语言实现学习笔记——基本运算函数
    密码学C/C++语言实现学习笔记——基本运算函数基础数据结构:typedefunsignedshortclint;typedefunsignedlongclintd;书中所使用环境unsignedshort是16位(2......
  • synchronized学习笔记
    Synchronized1.synchronized的作用能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。2.不使用并发会有什么后果?两个线程同时a++,最后结果......