java多线程并发编程与CPU时钟分配小议

我们在实现多线程广播屏幕截图的时候

因为CPU对多个线程之间的执行顺序是随机的

也就导致了我们发图片的时间间隔的不确定性

从而导致了有些图片从开始发到发完的时间的不确定性

严重降低了系统的实时性

(实际上,在TCP模式下用线程池多线程随机发送图片改良下的远程监控系统,如果服务器端放电影,观测客户端,会发现经常会出现电影“倒着放”的现象,原因也就是这个还有救网络路由时间的不确定性)


要解决这个问题

那么

我们先来研究下JAVA的多线程的并发编程和CPU时钟振荡的关系吧

老规矩,先科普


我们的操作系统在DOS以前都是单任务的

什么是单任务呢?就是一次只能做一件事

你复制文件的时候,就不能重命名了

那么现在的操作系统,我一边在这边写BLOG,一边听歌,一边开着QQ,一边……………………

显然,现在的操作系统都是多任务的操作系统


操作系统对多任务的支持是怎么样的呢?

每打开一个程序,就启动一个进程,为其分配相应空间(主要是运行程序的内存空间)

这其实就支持并发运行了


CPU有个时钟频率,表示每秒能执行CPU指令的次数,

在每个时钟周期内,CPU实际上只能执行一条(或者多条指令)。

操作系统对进程线程进行管理,

轮流(不是按顺序)为每个进程分配很短的一段时间(不一定均分),

然后在每个进程的内部,程序代码自己处理该进程内部线程的时间分配,

多个线程之间相互切换着去执行,

因为切换的时间非常非常短

因此,给人的感觉就是这多个任务、多个线程是在并发运行的

其实,从微观角度来看,

程序的运行还是异步的。


既然都是异步运行的

那么

我们的多线程运行

其实也只是CPU也只是一直在串行的运行着

根本就没有同时运行啊?

既然这样

那么我们多线程又有什么意义呢?


我们又知道

Cpu的运算速度实在是太快了

但是我们I/O的读取速度

网络的传输熟读

数据库的连接--读取速度

我们操作的速度

这些和CPU运算速度比起来

实在是太慢太慢了

因此

在我们进行这些操作的时候

其实CPU在多数情况下还是空闲着的


在这种情况下

我们运行多个任务多个线程

那么在进程A需要进行IO等操作时

CPU空闲就可以进行进程B的相关操作

而不是像串行的那样一定要线程A运行完了才能运行线程B

这也就提高了CPU的利用率


可能有些童鞋会在某些论坛或者什么地方看到

有关java多线程降低CPU运算速度的讨论和说法


这又是怎么回事呢?

其实,这个问题的关键是:

你到底要让CPU干嘛?

如果你让CPU进行的全是内部运算

(没有任何I/O    网络   数据库访问  等等…… )

那么,人为地硬折开CPU内部运算

用来给多个线程"分时"运算

那么CPU运算速度只能更慢


但是

如果你的业务不全是CPU内部运算

还有网络\数据库访问\I/O(如GUImouse操作)等等

则使用多线程有明显的好处


说了这么多

还没最重要的问题呢------多线程的目的

多线程的目的是为了最大限度的利用CPU资源



好了

那么我们继续讨论CPU的问题  

CPU中

主频=外频×倍频

主频越高

一个时钟周期里面完成的指令数也越多

当然cpu的速度也就越快了



以前提高CPU运算速度的方法

就是提高CPU主频

但是随着时间的发展

cpu主频在一定程度上

已经达到了物理极限,很难再提高了


那么我们想再继续提高CPU性能应该怎么办呢?


我们知道

传统的CPU

只有一个内核

这个内核也只用同时运行一个线程


现在要提高CPU性能

我们可以在CPU的一个内核上

允许运行多个操作

从硬件级上实现多线程并发运行

为了提高CPU的运算性能

只有使用具有超线程技术的多核CPU

-------------我想这才是JAVA支持多线程并发运行的长久意义所在



说了这么多

再来回到我们的主题吧

java中多线程

1.  关于内存

前面已经说过

在操作系统下

没打开一个程序

系统就会为启动一个进程

为进程分配系统资源(运行程序所需的内存等)

在JAVA中

所有线程都归JVM调度


那么

在JAVA中的线程和系统下的进程在内存使用方面又会有哪些异同呢?


而在Java中所有变量都储存在主存中

对于所有线程都是共享的(在同一进程中)

每条线程都有自己的工作内存(Working Memory)

工作内存中保存的是主存中某些变量的拷贝

线程对所有变量的操作都是在工作内存中进行

线程之间无法相互直接访问

变量传递均需要通过主存完成

但是在程序内部可以互相调用(通过对象方法)

所有线程间的通信相对简单,速度也很快


进程间的内部数据和状态都是相互完全独立的

而进程间通信大多数情况是必须通过网络实现



线程本身的数据通常只有寄存器数据

以及一个程序执行时使用的堆栈

所以线程的切换比进程切换的负担要小



关于线程调度

前面说了

CPU对于各个线程的调度是随机的(分时调度)


在Java程序中,JVM负责线程的调度

线程调度是指------按照特定的机制为多个线程分配CPU的使用权


调度的模式有两种:

分时调度和抢占式调度。

分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;

抢占式调度是根据线程的优先级别来获取CPU的使用权。


JVM的线程调度模式采用了抢占式模式。

既然是抢占调度

那么我们就能通过设置优先级来“有限”的控制线程的运行顺序

注意“有限”一次

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 本文基于周志明的《深入理解java虚拟机 JVM高级特性与最佳实践》所写。特此推荐。 衡量一个服务性能的高低好坏,...
    阳光的技术小栈阅读 1,062评论 0 3
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,436评论 1 15
  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,085评论 0 23
  • 在坚持的路上,必定会有许多想放弃的念头出现的时候,会有很多质疑、劝你放弃的声音,怎么办? 放弃真的很容易,但坚持才...
    孙晓丽阅读 247评论 0 1
  • 因为有胖妞,才会想着去坐坐摩天轮,正好是雨天,说是great wheel其实转一圈时间很短,一张票转四圈,最后不知...
    不死之旅阅读 205评论 0 0