知其然,而知其所以然!

在计算机领域,有多种操作系统,常见的有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. dotnet 读 WPF 源代码笔记 为什么自定义的 UserControl 用户控件不能跨程序集继承

    从设计上,用户控件 UserControl 就不是一个合适用来多次继承的类型,更不要说进行跨程序集继承自定义的 UserControl 用户控件.对于大部分的用户控件来说,都是采用组合现有的控件来实现 ...

  2. 使用 Silk.NET 创建 OpenGL 空窗口项目例子

    本文告诉大家如何使用 Silk.NET 创建 OpenGL 空窗口项目.在 dotnet 基金会下,开源维护 Silk.NET 仓库,此仓库提供了渲染相关的封装逻辑,包括 DX 和 OpenGL 等等 ...

  3. 程序是怎样跑起来的_第一章-对程序员来说CPU是什么

    通过对第一章的学习,我了解了大体上CPU可以说是电脑的"大脑",即中央处理器.从功能来看可以分为寄存器,控制器,运算器和时钟.在这四个部分中,寄存器是最值得程序员注意的.总的来说, ...

  4. 【web安全】隐藏nginx头文件信息

    摘要 Nginx作为开源web中间件,被广泛应用.因此源编译或者yum安装,都会带有其原有的nginx版本.很容易被针对,因此,通过修改nginx的源码.隐藏nginx版本和头部信息,保障nginx的 ...

  5. vue3的reactive对象赋值后失去响应式的问题

    vue3种对象类型的响应式用reactive实现. 但是reactive对象在赋值后,因为变量代理函数变了,就失去了响应式功能了.示例如下: <template> <div> ...

  6. C语言:头文件ctype.h的内置函数

    #include <stdio.h> #include <ctype.h>//内置函数的头文件 #include <math.h> int main() { int ...

  7. python的requests模块详解

    原文链接:https://www.cnblogs.com/lanyinhao/p/9634742.html 1.模块说明 requests是使用Apache2 licensed 许可证的HTTP库. ...

  8. springboot使controller异步调用

    调用controller方法,遇到操作时间很长的情况下,不希望前端一直等待操作,而希望前端立马接收到操作启动的反馈,而真正的操作在后端执行,需要用到异步调用的方法.实现步骤如下: 一.配置异步支持: ...

  9. JavaScript 中 toString 的奇妙使用

    JavaScript 中的toString()方法,我们通常会一些其他类型的变量,转为字符串类型.但这里还有一些其他奇妙的用法. 不同的类型调用 toString() 会得到不同的结果.我们来一一分析 ...

  10. H.265码流解析

    这一篇内容旨在对H.265码流中的一些概念做简单了解,部分概念与H.264相同,本篇中将不再重复. 1.NALU H.265(HEVC)码流的NALU结构和AVC有一些不同,属于增强版,HEVC NA ...