AndroidCoder 浅谈并发编程(一)
前言
Android 开发者相较于Java 开发者来说,并发编程的使用没有很频繁,但对于框架编写或者阅读源码都必需要掌握并发编程知识,读懂 Android 系统源码对并发知识也有要求,另外并发编程相关知识也是面试的高频问题,所以掌握并发编程是非常必要。本篇文章开始,来聊聊并发编程。
文章概览
一些相关的基本概念
1. 并行和并发
先来熟悉一个例子,高速公路 LineA上面并排有6条车道,公路中间有个收费站,那么在某一时刻,每条车道的车同时通过收费站的,这种情况就是并行;车在单位时间内通过收费站的,这种情况可看做是并发。
在谈论并发的时须要加个单位时间,也就是单位时间内并发量是多少,离开单位时间其实是没有意义的。
并行: :指在同一时刻,多条指令在多个处理器上同时执行。
并发: :指在同一时刻只有一条指令执行,但多个进程指令被快速地轮转执行,使得在宏观上具有多个进程同时执行的效果,但实际上并不是同时执行的,只是把时间分成若干段,使多个进程交替地执行。
2. 进程和线程
大学里学过《操作系统》,对这两个概念一定不陌生。
进程是程序运行资源分配的最小单位,这里资源包括:CPU、内存空间、磁盘等, 同一进程中的多个线程共享进程中的全部系统资源,而进程间是相互独立的。进程是系统进行资源分配和调度的一个独立单位。
进程是程序在计算机上的一次执行。当运行一个程序,就启动了一个进程。移动端打开一个APP,也是启动了一个进程。另一方面可以说,程序是死的、静态的,进程是活的、动态的。
进程可以分为系统进程和用户进程,用于完成操作系统各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身,用户进程就是所有由用户启动的进程。
线程是 CPU 调度的最小单位, 它依赖于进程而存在,线程是 CPU 调度和分派的基本单位,它是比进程更小的、能独立运行的基本单位。线程与同属一个进程的其他线程共享进程所拥有的全部资源。
CPU核心数和线程数的关系
多核心: 是物理上的,单核、双核、多核,指的就是物理核心的数目。
多线程: 是逻辑上的,简单说就是模拟出的 CPU 核心数;
核心数和线程数的关系: 增加核心数目就是为了增加线程数, 因为操作系统是通过线程来执行任务的,正常情况下是1:1对应关系,也就是说六核CPU一般拥有六个线程。当然超线程技术会改变这个比例关系。
CPU时间片轮转机制
在平常开发的时候,一般并没有感觉到cpu核心数的限制,创建线程还有启动线程都比较顺畅,哪怕是在单核CPU上,为什么?因为操作系统提供了一套CPU时间片轮转机制。
时间片轮转调度是一种最简单、最公平且使用最广的算法,又称RR(Round-Robin,RR)调度。根据先进先出原则,排成队列,开始调度时,先将 CPU 分配给队首进程,让其执行一个时间段(称为:时间片),时间片通常为 10-100ms 数量级,当执行的时间片用完时,会中断请求,调度程序据此来停止首进程的执行,并将其设置为队列末尾,然后把 CPU 重新分配给调整后队列的首进程,如此往复。
总结
并发编程是很大的一块知识点,因而涉及的技术点也多。熟悉了相关基本概念,对后续多线程及线程间通讯的学习是非常有必要的。打牢基础,才能从容不迫!
转载自:https://juejin.cn/post/7140084981233090574