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的空暇时间可以保持在最低限度.有效利用多线程的关键是理解程序是并发运行而不是串行运行的.比如:程序中有两个子系统须要并发运行, ...
随机推荐
- [Go] gorm 返回指定模型数据的处理方式
重新 var 声明一个变量,类型为包含指定字段的结构体. 查询的时候,还是使用原始模型类型的变量. example: // For return data var retMember struct { ...
- Django之ORM操作Mysql
一.单表操作 # 单表查询操作基本方法 class BookList(models.Model): title = models.CharField(max_length=32) price = mo ...
- Linux定时任务实现每秒执行一次
编写/root/test.sh脚本 该方法适用于调度周期能被60整除的情况 #!/bin/bash step=1 for (( i = 0; i < 60; i = (i+step) )); d ...
- golang cron定时任务简单实现
目录 星号(*) 斜线(/) 逗号(,) 连字符 (-) 问好 (?) 常用cron举例 使用说明 golang 实现定时服务很简单,只需要简单几步代码便可以完成,不需要配置繁琐的服务器,直接在代码中 ...
- 超级详细的Oracle安装图文详解!手把手教会您从下载到安装!
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485532&idx=1 ...
- fastposter 2.1.1 紧急版本发布 电商级海报生成器
fastposter 2.1.1 紧急版本发布 电商级海报生成器 fastposter低代码海报生成器,一分钟完成海报开发.支持Java Python PHP Go JavaScript等多种语言. ...
- python的requests模块详解
原文链接:https://www.cnblogs.com/lanyinhao/p/9634742.html 1.模块说明 requests是使用Apache2 licensed 许可证的HTTP库. ...
- Python:Python字符串中的r、u和转义字符
Python中字符串前面我们经常看到加r(R)或u/(U)的前缀,而这两个符号是什么意思呢? 1.r(R) r意为raw,表示不包含转义字符的原生字符串.常见的转义字符包括下列几种: 转义字符 描述 ...
- Java手机号校验规则最新
一.最新的Java手机号校验规则 在Java中,进行手机号校验通常使用正则表达式(Regex)来匹配手机号的格式.以下是一个基于当前(截至2024年)中国手机号规则的校验方法: 中国手机号通常以数字1 ...
- dpkg和rpm对比及常用命令
dpkg(Debian Package)和rpm(RPM Package Manager)是两种不同的Linux包管理工具,它们各自在特定的Linux发行版中占据核心地位.两者之间对比如下: 所属发行 ...