并发编程相关基础概念

Posted by 小白 on December 12, 2016

CPU核心数与进程数

Intel引入超线程技术后,使核心数与线程数形成1:2的关系。 一般PC主机只有一个CPU,但是服务器CPU可以有多个。

Linux下查询CPU型号:

cat /proc/cpuinfo grep name cut -f2 -d: uniq -c

查看CPU有几个核几个线程:

grep ‘processor’ /proc/cpuinfo sort -u wc -l
grep ‘core id ‘ /proc/cpuinfo sort -u wc -l

时间片轮转机制

时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。 时间片轮转调度中唯一有趣的一点是时间片的长度。从一个进程切换到另一个进程是需要一定时间的–保存和装入寄存器值及内存映像,更新各种表格和队列等。假如进程切换(process switch) - 有时称为上下文切换(context switch),需要5毫秒,再假设时间片设为20毫秒,则在做完20毫秒有用的工作之后,CPU将花费5毫秒来进行进程切换。CPU时间的20%被浪费在了管理开销上。

结论可以归结如下:时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应变差。将时间片设为100毫秒通常是一个比较合理的折衷。

进程和线程

  • 进程是程序运行资源分配的最小单位。 其中资源包括CPU、内存空间、磁盘IO等。同一进程的多条线程共享该进程中的全部系统资源,而进程与进程之间则是相互独立的。
  • 线程是CPU调度的最小单位,必须依赖于进程而存在。线程基本上不拥有系统资源,只拥有一点运行中必须的资源如程序计数器、寄存器和栈等。
  • 线程无处不在。任何一个程序都必须要创建线程。

并行和并发

简单可以这样理解:

  • 并行:程序同时所开启的运行中的线程数 <= CPU数量 * CPU的核心数量
  • 并发:程序同时所开启的运行中的线程数 > CPU数量 * CPU的核心数量

当不考虑客观因素的情况下,假设一台机器有两个物理CPU,每个CPU有8核16个线程,那么它的极限并发量是:1000ms162/(CPU轮转时间+程序执行时间)。讨论并发时不能脱离时间。

吞吐量

  • 网络吞吐量是指在某个时刻,在网络的两个节点之间,提供给网络应用的剩余带宽。即在没有帧丢失的情况下,设备能接受的最大速率。
  • 系统吞吐量是指系统在单位时间内所处理的信息量,它以每个时间段所处理的进程数来度量。

高并发编程的好处和坏处

好处

充分利用CPU资源。 加快响应用户的时间。 可以使代码模块化(参考Android UI刷新机制)、异步化、简单化。

坏处

线程之间的安全性需要注意。 线程之间的死锁问题(这里主要指Java提供的锁机制)。 线程使用过多造成资源耗尽而死机(可以使用资源连接池解决)。