多线程基础

进程和线程

进程

正在执行的程序叫做进程(Process),是一个动态的概念。

(1) 进程是程序的一次动态执行过程, 占用特定的地址空间.

(2) 每个进程由3部分组成:cpu,data,code。每个进程都是独立的,保有自己的cpu时间,代码和数据,即便用同一份程序产生好几个进程,它们之间还是拥有自己的这3样东西。 缺点:内存的浪费,cpu的负担

(3) 多任务(Multitasking)操作系统将CPU时间动态地划分给每个进程,操作系统同时执行多个进程,每个进程独立运行。以进程的观点来看,它会为自己独占Cpu的使用权

(4) 进程的查看
Windows系统: Ctrl+Alt+Del打开任务管理器
Unix系统: ps or top

线程

(1)线程是进程中一个“单一的连续控制流程” (a single sequential flow of control)/执行路径。线程也可以达到同一份程序产生好几个进程的效果,但是不同的线程之间可以有某种程度上的资源共享,所以线程又被称为轻量级进程(lightweight process)。

(2)一个进程可拥有多个并行的(concurrent)线程

(3)一个进程中的线程共享相同的内存单元/内存地址空间,即可以访问相同的变量和对象,而且它们从同一堆中分配对象通信、数据交换、同步操作
(4) 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。

线程和进程的区别

  1. 每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。
  2. 线程可以看成时轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。
  3. 线程和进程最根本的区别在于:进程作为资源分配的单位,线程是调度和执行的单位
  4. 多进程: 在操作系统中能同时运行多个任务(程序)
  5. 多线程: 在同一应用程序中有多个顺序流同时执行 线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程
  6. 一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
  7. 系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,出了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。

线程重要相关概念

1. CPU在某一个时间刻度上只能够执行一个进程的一条线程的一条原子性语句

原子性语句: 不可再分割的语句 【指令】
原子性:要么同时成功,要么同时失败

2. 线程安全 和 线程同步

a++; 是线程安全的吗? 答案不是,这个语句中存在三个步骤
(1))读取a对应的地址空间的数据
(2)进行 加1计算
(3)将计算的结果重新写入到a对应的地址中

3.上下文切换

当A线程正在执行的时候,被B线程抢到了执行权,B线程执行完后再次回到A线程执行时,这就是一次上下文切换

4.并发和并行

并发: 在某一个时间段【可以分割的时间】可以同时执行
并行: 在某一个时间刻度【不可再分割的时间】可以同时执行 【多核处理器】
串行: 一步一步执行,没有上下文切换,一个任务执行完毕后执行下一个任务

5.同步和异步

同步: 按照顺序依次执行每一个任务,中间会出现阻塞现象
异步: 可以同时执行多个任务,相互之间不会受影响,例如: ajax异步请求
多个线程看上去像是同时执行,其实本质还是单步执行,只不过CPU执行的速度太快了,肉眼无法察觉

6.Java当中执行线程的原子性语句采用的调度模式是抢占式调度模型,该模式特点: 随机性和不确定性

你可能感兴趣的:(多线程基础)