线程的概念

目录

进程和程序的联系

线程和进程的联系

JAVA线程 


补充并发并行串行的概念

拿餐厅吃饭举例子,餐厅来了三个客人,有这些菜的需求

  • 串行:就是这个餐厅只有一个厨师,想要满足3个客人的要求,只能一道一道的去做菜,先满足完你的三道菜的需求,才能去满足我的三道菜的需求。这种按顺序一道一道满足的模式就是串行处理方式
  • 并行:这个餐厅有三个厨师,每个厨师去服务自己的客户,这样就是同时满足三个客户的需求,这种处理模式就是并行处理方式
  • 并发:餐厅还是只有一个厨师,但是我给其中一个客户做了一道菜,然后就转向给另一个用户做菜,按照一种时间片的概念去处理,每个时间片可能处理的事情是不一样的
  • 如果厨师做菜的速度非常快,1分钟就能出一道菜,那么我上了一道菜,然后过了3分钟又出了一道菜,那么在现实生活中,我们就会感觉这个厨师就是专门在为我们服务,将这种思想用到计算机中,我们知道CPU的处理速度是非常快的,基本是以ns为单位的处理速度,所以在CPU在并发的执行计算机任务,在我们主观的意识中,我们就感觉这个CPU是在并行的处理任务

进程和程序的联系

什么是程序

程序就是一系列有组织的文件,封装操作系统的各种API,实现不同的效果(程序就是指令序列,程序的代码放入程序段中,输出和输入的数据放入数据段中),比如QQ就是一个程序

什么是进程

进程就是程序执行的一次执行过程,是系统进行资源分配的一个独立最小单位(资源指CPU,内存等关键系统资源)

 比如我登录了两次QQ,那么我在后台任务管理器,出现了两次QQ的进程,每个进程都是QQ执行的一次过程

为何引入进程

因为当代操作系统都是具有多道程序技术实现并发处理,在内存中会放入多个程序,那么会存在多个程序段和数据段,操作系统如何正确找到对应的程序和数据段,所以引入了进程的概念(为了使程序可以并发的执行,并且可以对并发执行的程序加以描述和控制

进程和程序的区别

  1. 进程是动态的,程序是静态的
  2. 进程可以并发执行,但是程序不可以
  3. 二者无一一对应的关系
  4. 进程与程序又有密切的联系: 进程不能脱离具体程序而虚设, 程序规定了相应进程所要完成的动作。
  5. 组成不同。进程包含PCB、程序段、数据段。程序包含数据和指令代码。
  6. 程序是一个包含了所有指令和数据的静态实体。本身除占用磁盘的存储空间外,并不占用系统如CPU、内存等运行资源。
  7. 进程由程序段、数据段和PCB构成,会占用系统如CPU、内存等运行资源。
  8. 一个程序可以启动多个进程来共同完成。

例子

线程和进程的联系

什么是线程 

现代操作系统都是多线程操作系统,线程就是进程的一个子任务,进程就是轻量级的进程

 我们打开的浏览器这个进程,然后每打开的一个网页都是独立的线程,每个线程都可以执行一个子任务

为什么引入线程

有些进程可能需要“同时”做很多事,但是传统的进程只能串行得与执行一系列程序(比如你在使用QQ时,你登陆了账号,相当于创建了一个进程,你可以一边打字,一边视频聊天,这些是“同时”进行的,但是传统的进程是不能实现这样的功能,所以引入线程,加快并发的速度

  • 如果说在OS中引入进程的目的是为了使多个程序能够并发执行,比提高资源利用率和系统吞吐量,那么在OS中引入线程,是为了减少程序在并发执行时所付出的时间和空间开销,让OS具有更好的并发性(让进程并发得完成多种功能) 
  • 引入了线程之后,进程是除CPU之外系统资源的分配单元,如打印机,内存空间都是分配给进程的
  • 引入了线程之后,不仅程序能够并发执行了,进程也能并发执行了,从而提高了系统并发度

线程和进程的比较

  1. 进程是OS资源分配的基本单位,线程是调度的基本单位
  2. 创建和消耗进程的开销远远比创建和消耗线程大的多调度一个线程比进程快的多
  3. 进程包含线程,每个进程至少包含一个线程(主线程)
  4. 进程之间相互独立,不同的进程不会共享内存空间,但是同一个进程的线程会共享内存空间(共享进程的资源),线程几乎不拥有系统资源
  5. 在多CPU操作系统中,不同的线程可以去占用不同的CPU
  6. 同一进程的线程切换不会导致进程切换,但是不同进程的线程切换,会导致进程的切换

线程的优点

  •  1创建一个新线程的代价要比创建一个新进程小得多
  • 2. 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
  • 3. 线程占用的资源要比进程少很多
  • 4. 能充分利用多处理器的可并行数量,能够发挥多核CPU的优势
  • 5. 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
  • 6. 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现

上下文切换:

  • 多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,就会使用一些策略让线程轮流使用CPU,上下⽂切换(有时也称做进程切换或任务切换)是指 CPU 从⼀个进程(或线程)切换到另⼀个进程(或线程)。上下⽂是指某⼀时间点 CPU 寄存器和程序计数器的内容,也就是线程(进程)执行的环境

举例说明 线程A - B

  • 1.先挂起线程A,将其在cpu中的状态保存在内存中。
  • 2.在内存中检索下⼀个线程B的上下⽂并将其在 CPU 的寄存器中恢复,执⾏B线程。
  • 3.当B执⾏完,根据程序计数器中指向的位置恢复线程A。

什么叫多线程

  • 多线程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务。
     

守护线程和用户线程有什么区别呢

  • 用户 (User) 线程:运行在前台,执行具体的任务,如程序的主线程、连接网络的子线程等都是用户线程
  • 守护 (Daemon) 线程:运行在后台,为其他前台线程服务。也可以说守护线程是 JVM 中非守护线程的 “佣人”。一旦所有用户线程都结束运行,守护线程会随 JVM 一起结束工作

Java 中用到的线程调度算法(Java实现的是抢占式,Java是由JVM中的线程计数器来实现线程调度)

分时调度模型和抢占式调度模型。

  • 分时调度模型是指让所有的线程轮流获得 cpu 的使用权,并且平均分配每个线程占用的 CPU的时间片这个也比较好理解。
  • Java 使用的线程调使用抢占式调度, Java 中线程会按优先级分配 CPU 时间片运行, 且优先级越高越优先执行,但优先级高并不代表能独自占用执行时间片,可能是优先级高得到越多的执行时间片,反之,优先级低的分到的执行时间少但不会分配不到执行时间。

线程让出 cpu 的情况

  • 1. 当前运行线程主动放弃 CPU, JVM 暂时放弃 CPU 操作(基于时间片轮转调度的 JVM 操作系统不会让线程永久放弃 CPU,或者说放弃本次时间片的执行权),例如调用 yield()方法。
  • 2. 当前运行线程因为某些原因进入阻塞状态,例如阻塞在 I/O 上。
  • 3. 当前运行线程结束,即运行完 run()方法里面的任务。

进程调度算法

  • 先来先服务调度算法(FCFS)
  • 短作业(进程)优先调度算法
  • 高优先权优先调度算法 1非抢占式优先权算法 2抢占式优先权调度算法 3高响应比优先调度算法 高响应调度算法的优先级的计算

 

JAVA线程 

  • java 主类名称 启动的是JAVA进程 
  • 类中的主方法是这个类的主线程
  • 线程是操作系统中的概念 . 操作系统内核实现了线程这样的机制 , 并且对用户层提供了一些 API 供用户使 用( 例如 Linux pthread ). Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进行了进一步的抽象和封装

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

库里不会投三分

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值