知其然,而知其所以然!

在计算机领域,有多种操作系统,常见的有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-概念和实现机制的更多相关文章

  1. Java多线程5:Synchronized锁机制

    一.前言 在多线程中,有时会出现多个线程对同一个对象的变量进行并发访问的情形,如果不做正确的同步处理,那么产生的后果就是“脏读”,也就是获取到的数据其实是被修改过的. 二.引入Synchronized ...

  2. Java多线程--基础概念

    Java多线程--基础概念 必须知道的几个概念 同步和异步 同步方法一旦开始,调用者必须等到方法调用返回后,才能执行后续行为:而异步方法调用,一旦开始,方法调用就立即返回,调用者不用等待就可以继续执行 ...

  3. java 多线程总结篇4——锁机制

    在开发Java多线程应用程序中,各个线程之间由于要共享资源,必须用到锁机制.Java提供了多种多线程锁机制的实现方式,常见的有synchronized.ReentrantLock.Semaphore. ...

  4. Java多线程编程(4)--线程同步机制

    一.锁 1.锁的概念   线程安全问题的产生是因为多个线程并发访问共享数据造成的,如果能将多个线程对共享数据的并发访问改为串行访问,即一个共享数据同一时刻只能被一个线程访问,就可以避免线程安全问题.锁 ...

  5. java多线程系列(三)---等待通知机制

    等待通知机制 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解 ...

  6. JAVA高级--异常处理概念和异常处理机制

    什么是异常 程序运行的过程中发生的一些不正常事件 异常分类 Throwable Error  错误 Exception IOException         RuntimeException    ...

  7. Java多线程4:synchronized锁机制

    脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过 ...

  8. Java多线程基本概念

    基本概念 线程与任务的概念不一样. 任务:通常是一些抽象的且离散的工作单元,比如在Web请求中,针对用户的请求需要返回相应的页面是一个任务,在Java中实现Runnable接口的类也是一个任务. 线程 ...

  9. Java多线程-----线程安全及解决机制

    1.什么是线程安全问题? 从某个线程开始访问到访问结束的整个过程,如果有一个访问对象被其他线程修改,那么对于当前线程而言就发生了线程安全问题: 如果在整个访问过程中,无一对象被其他线程修改,就是线程安 ...

  10. Java多线程编程— 概念以及经常使用控制

    多线程能满足程序猿编写很有效率的程序来达到充分利用CPU的目的,由于CPU的空暇时间可以保持在最低限度.有效利用多线程的关键是理解程序是并发运行而不是串行运行的.比如:程序中有两个子系统须要并发运行, ...

随机推荐

  1. [ELK] Elasticsearch 安装/配置、启动/停止、加节点/重启

    Elasticsearch 在不同环境上支持的安装方式很多,有源码安装.二进制安装.docker安装.rpm包等管理器安装. 具体的,根据应用的实际情况选择即可. 完成可测试开发环境的建立后,需要进一 ...

  2. 设计模式之装饰器-AOP

    HelloWorld简单例子如下:此例子好好体会下继承 is a和组合 has a的异同. using System; using System.Runtime.InteropServices; na ...

  3. 谷歌 hackbar 不能使用的问题

    谷歌 hackbar 不能使用的问题 下载 hackbar 插件:https://github.com/Mr-xn/hackbar2.1.3 解压文件,将其拖入 chrome 扩展程序中 点击详情,点 ...

  4. gin里获取http请求过来的参数

    https://www.bilibili.com/video/av68769981/?p=2 课程代码: https://www.qfgolang.com/?special=ginkuangjia&a ...

  5. uniapp底层跨端原理

    uniapp底层跨端原理 - 代码编写:开发者使用Vue.js框架编写uniapp的代码,包括页面结构.样式和逻辑等. - 编译过程:在编译过程中,uniapp会将Vue.js的代码转换为各个平台所需 ...

  6. 撤销 git commit

    目录 文章目录 目录 场景1:撤回 commit,不撤销 git add .,保留代码 场景2:撤回 commit,撤销 git add .,保留代码 场景3:撤销 commit,撤销 git add ...

  7. vulnhub --> Web Machine: (N7)

    靶场下载地址 Web Machine: (N7) << 点我 开始打靶 ip发现: nmap扫描网段发现靶机ip:192.168.56.101 端口发现: 对靶机进行常规端口扫描 访问网站 ...

  8. kubernetes命令补全k8s命令补全

    echo "source <(kubectl completion bash)" >> ~/.bashrc source <(kubectl complet ...

  9. c/c++复习 2.0 ProMax

    main函数执行前后做了什么 初始化.data数据段,包括静态变量和全局变量 初始化.bss字段,包括int 0; bool false: 指针 NULL 设置栈指针.main函数的参数传递.全局对象 ...

  10. ros2 foxy订阅话题问题

    代码片段 这部分代码在galactic版本编译是OK的,可在foxy下编译就出了问题 TeleopPanel::TeleopPanel(QWidget* parent) : rviz_common:: ...