java多线程-2-概念和实现机制
知其然,而知其所以然!
在计算机领域,有多种操作系统,常见的有windows家族和unix/Linux家族,它们都支持多任务的计算模式。
它们实现多任务的机制是差不多的,这点在<<操作系统原理>>上已经说得很清楚了。当然不同的OS在具体是线上可能有一些细微区别,但最终总是殊途同归。
这里主要阐述linux操作系统的多任务的实现机制,最后稍微提下windows的多任务实现机制。
限于篇幅,只讨论单台计算机的并发。
统一的例子
为了便于统一理解,本文以以下内容为例子:
有绝世高手叫冷月轮流,绝技是“时不我待”。
为何叫“时不我待”,她是这么说的:“因为我特别喜欢手工,恨不得时时刻刻都在做手工。为了有更多时间做手工,我必须有稳定的收入,
为了有稳定的收入,我必须有一种高效的赚钱方式。想来想去,就是做杀手。暗器无疑是最佳的工具之一,它可以瞬时终结目标,且让我无声无息地脱离危险。时不我待可以保证百分百
,闪电般终结目标,之后我就可以回去做我喜欢的事情-手工!”。
冷月轮流对外公布了一个特别的规定:只解决一群,不论强盗还是土匪。
她不担心收不到报酬。因为从来没有人不主动給报酬,当然也因为她的顾客都是不差钱的主。
因为只针对不法分子,所以民间对她颇有好评;而恶人对她恨之入骨,但又无可奈何。
有时候,她心情好的时候,会发一块牌,名为“春日”。得到“春日”的人都可以让她免费提供一次服务,服务过后,她会收回。
通常她一年才发一次“春日”。一来她时间不够,二来,许多时候她心情并不好,因为她都沉浸在忘我做手工的境界中。
为何要有多任务
这个好理解,我们要处理的事情太多了,希望快一点,再快一点。譬如搬砖头,一个人不够,再派一个,2个不够,上4个,8个,16个.....。多多益善。
事情那么多,所以希望计算机业能够同时处理多个事情(任务)。
冷月轮流每次都解决一窝坏蛋,当然要解决的越快越好。而她的“时不我待”就非常合乎时宜,一瞬间解决10个人不是问题。
多任务的不同形式
平常我们觉得计算机可以同时处理多个任务,这个感觉是真的。不过具体实现上,还是有区别的。
- 可能是错觉
有时候计算机繁忙,或者有的cpu比较弱(只有一个内核),那么这种多任务并发更多是一种错觉,不是真正的多任务。
简单来说计算机比人快太多,差了好多量级。假设人计算一个算术题要一秒,而计算机只需要2纳秒,所耗费的时间是人的5亿分之一。
理论上一秒钟,有的计算机的一个cpu内核可以计算5亿次的,甚至更多。计算机的所处理任务,归结起来主要就是:cpu,I/O和网络。甚至可以简化为CPU和I/O。
简化下,假设都是cpu,那么一秒内计算机就可以做好多事情,而对于人而言,都是一秒内发生,感觉起来没有什么差异。
换言之,计算机cpu利用自己巨大的速度差异,把自身的时间划分为多个部分,分别执行多个任务(计算),从而让人产生并行的错觉。
操作系统的这种行为,有时候也称为“时间分片”。
所以,这种多任务对于人是多任务,而对于计算机而言并不是真正的多任务,对于计算机而言,仅仅是因为它们太快了。
“时不我待”有两种招式,其中一种是“弹式”,就是利用食指把暗器弹出。冷月轮流利用“弹式”,可以在瞬间弹出多个致命的暗器。
绝大部分情况下,她都只用“弹式”,因为它威力更大,更准确;因此,也能更加节省制作暗器的时间。
- 一个好汉三个帮
如果任务非常多,那么一个内核可能不够,这个时候就需要多几个内核。这就是真真正正,实实在在的多任务。
有的时候,目标特别多,冷月轮流不得不两只手一起用。妙的是,她左右两手基本一样,无论力道,速度,准确地。
计算机是如何实现多任务
前文说过,计算器本身有两大核心构成:cpu+I/O。I/O可以理解为存储+网络+外设。
事实上,计算机越来越复杂,许多外设本身也有计算能力,譬如显卡,磁盘。
单台计算机有两种多任务模式:时间分片,多核并行。
java多线程-2-概念和实现机制的更多相关文章
- Java多线程5:Synchronized锁机制
一.前言 在多线程中,有时会出现多个线程对同一个对象的变量进行并发访问的情形,如果不做正确的同步处理,那么产生的后果就是“脏读”,也就是获取到的数据其实是被修改过的. 二.引入Synchronized ...
- Java多线程--基础概念
Java多线程--基础概念 必须知道的几个概念 同步和异步 同步方法一旦开始,调用者必须等到方法调用返回后,才能执行后续行为:而异步方法调用,一旦开始,方法调用就立即返回,调用者不用等待就可以继续执行 ...
- java 多线程总结篇4——锁机制
在开发Java多线程应用程序中,各个线程之间由于要共享资源,必须用到锁机制.Java提供了多种多线程锁机制的实现方式,常见的有synchronized.ReentrantLock.Semaphore. ...
- Java多线程编程(4)--线程同步机制
一.锁 1.锁的概念 线程安全问题的产生是因为多个线程并发访问共享数据造成的,如果能将多个线程对共享数据的并发访问改为串行访问,即一个共享数据同一时刻只能被一个线程访问,就可以避免线程安全问题.锁 ...
- java多线程系列(三)---等待通知机制
等待通知机制 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解 ...
- JAVA高级--异常处理概念和异常处理机制
什么是异常 程序运行的过程中发生的一些不正常事件 异常分类 Throwable Error 错误 Exception IOException RuntimeException ...
- Java多线程4:synchronized锁机制
脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过 ...
- Java多线程基本概念
基本概念 线程与任务的概念不一样. 任务:通常是一些抽象的且离散的工作单元,比如在Web请求中,针对用户的请求需要返回相应的页面是一个任务,在Java中实现Runnable接口的类也是一个任务. 线程 ...
- Java多线程-----线程安全及解决机制
1.什么是线程安全问题? 从某个线程开始访问到访问结束的整个过程,如果有一个访问对象被其他线程修改,那么对于当前线程而言就发生了线程安全问题: 如果在整个访问过程中,无一对象被其他线程修改,就是线程安 ...
- Java多线程编程— 概念以及经常使用控制
多线程能满足程序猿编写很有效率的程序来达到充分利用CPU的目的,由于CPU的空暇时间可以保持在最低限度.有效利用多线程的关键是理解程序是并发运行而不是串行运行的.比如:程序中有两个子系统须要并发运行, ...
随机推荐
- OLAP系列之分析型数据库clickhouse主从副本模式(三)
一.测试单分片,单副本或多副本模式 # 1.停止集群 systemctl stop clickhouse-server # 修改配置文件 vim /etc/clickhouse-server/conf ...
- Pod进阶篇:污点-容忍度-亲和性-Affinity-调度(5)
一.Pod资源清单详细解读 apiVersion: v1 #版本号,例如 v1 kind: Pod #资源类型,如 Pod metadata: #元数据 name: string # Pod 名字 n ...
- 第一章 Jenkins安装配置
Jenkins官网 # 官网: https://www.jenkins.iohttps://www.jenkins.io/zh/ # docker安装: https://www.jenkins.io/ ...
- 【Android】Binder的Oneway拦截
在某些虚拟化,免安装,打点,环境检测,拦截器等场景,针对Android系统服务接口的拦截是常用的技术方案.通常只是针对正向的接口调用,如果涉及被动的服务回调拦截,则实现起来就有些许麻烦. 说明 由于我 ...
- Python requests模块做接口测试
将接口相关信息写入到Excel中,然后用此脚本从Excel中读取相应的信息并组装成URL来发送接口并获取返回的结果,并将结果写入到对应的用例中. import requests import json ...
- 这几个好用的 Google 搜索技巧,让你飞起!
搜索能力是被绝大多数人低估一项基本素质,绝大部分做编程技术相关的朋友应该都知道如何使用 Google,但是并不知道如何利用它的潜力.其实不管是 Google 还是 百度,会搜索的人一样都可以查找到需要 ...
- Golang 之 casbin(权限管理)
目录 1. 权限管理 官网 编辑器测试 1.1.1. 特征 Casbin的作用 Casbin不执行的操作 1.1.2. 怎么运行的 1.1.3. 安装 1. 示例代码 xormadapter 2. 示 ...
- ansible(8)--ansible的hostname模块
1. hostname模块 功能:管理远程主机的主机名. 示例一:更改192.168.20.22的主机名为nginx01: [root@xuzhichao ~]# ansible 192.168.20 ...
- Javascript返回顶部和砸金蛋,跑马灯等游戏代码实现
1. 我们经常写页面的时候会遇到页面很长需要做返回顶部的操作:$("id /class").animate({scrollTop:$('.class').offset().top} ...
- jeecg-boot中导出excel冲突问题
jeecg-boot自带的库是autopoi,如果自定义导出excel引入poi,则需要POI版本要保持一致,否则会出现冲突的情况,导致这2个都用不了的情况. Autopoi底层用的是POI库,poi ...