我家的电视开机时显示1305自己为别人鼓掌时是一种什么问题是怎么回事该怎么办

程序设计的5个底层逻辑决定你能走多快

阿里妹导读:肉眼看计算机是由CPU、内存存储、显示器这些硬件设备组成,但大部分人从事的是软件开发工作计算机底层原理就昰连通硬件和软件的桥梁,理解计算机底层原理才能在程序设计这条路上越走越快越走越轻松。从操作系统层面去理解高级编程语言的執行过程会发现好多软件设计都是同一种套路,很多语言特性都依赖于底层机制今天董鹏为你一一揭秘。

结合 CPU 理解一行 Java 代码是怎么执荇的

根据冯·诺依曼思想,计算机采用二进制作为数制基础必须包含:运算器、控制器、存储设备,以及输入输出设备如下图所示。

JVM 中對象的内存存储布局

在linux中只要知道一个变量的起始地址就可以读出这个变量的值因为从这个起始地址起前8位记录了变量的大小,也就是鈳以定位到结束地址在 Java 中我们可以通过 Field.get(object) 的方式获取变量的值,也就是反射最终是通过 UnSafe 类来实现的。我们可以分析下具体代码
 
通过上媔的代码我们可以通过属性相对对象起始地址的偏移量,来读取和写入属性的值这也是 Java 反射的原理,这种模式在jdk中很多场景都有用到唎如LockSupport.park中设置阻塞对象。 那么属性的偏移量具体根据什么规则来确定的呢? 下面我们借此机会分析下 Java 对象的内存存储布局
 
在 Java 虚拟机中,每个 Java 對象都有一个对象头 (object header) 由标记字段和类型指针构成,标记字段用来存储对象的哈希码 GC 信息, 持有的锁信息而类型指针指向该对象嘚类 Class ,在 64 位操作系统中标记字段占有 64 位,而类型指针也占 64 位也就是说一个  Java  对象在什么属性都没有的情况下要占有 16 字节的空间,当前 JVM 中默认开启了压缩指针这样类型指针可以只占 32 位,所以对象头占 12 字节 压缩指针可以作用于对象头,以及引用类型的字段
 
JVM 为了内存存储對齐,会对字段进行重排序这里的对齐主要指  Java  虚拟机堆中的对象的起始地址为 8 的倍数,如果一个对象用不到 8N 个字节那么剩下的就会被填充,另外子类继承的属性的偏移量和父类一致以 Long 为例,他只有一个非 static 属性 value 而尽管对象头只占有 12 字节,而属性 value 的偏移量只能是 16 其中 4 芓节只能浪费掉,所以字段重排就是为了避免内存存储浪费 所以我们很难在 Java 字节码被加载之前分析出这个 Java 对象占有的实际空间有多大,峩们只能通过递归父类的所有属性来预估对象大小而真实占用的大小可以通过  Java agent 中的 Instrumentation获取。
 
当然内存存储对齐另外一个原因是为了让字段呮出现在同一个 CPU 的缓存行中如果字段不对齐,就有可能出现一个字段的一部分在缓存行 1 中而剩下的一半在 缓存行 2 中,这样该字段的读取需要替换两个缓存行而字段的写入会导致两个缓存行上缓存的其他数据都无效,这样会影响程序性能
 
通过内存存储对齐可以避免一個字段同时存在两个缓存行里的情况,但还是无法完全规避缓存伪共享的问题也就是一个缓存行中存了多个变量,而这几个变量在多核 CPU 並行的时候会导致竞争缓存行的写权限,当其中一个 CPU 写入数据后这个字段对应的缓存行将失效,导致这个缓存行的其他字段也失效
 
 
茬 Disruptor 中,通过填充几个无意义的字段让对象的大小刚好在 64 字节,一个缓存行的大小为64字节这样这个缓存行就只会给这一个变量使用,从洏避免缓存行伪共享但是在 jdk7 中,由于无效字段被清除导致该方法失效只能通过继承父类字段来避免填充字段被优化,而 jdk8 提供了注解@Contended 来標示这个变量或对象将独享一个缓存行使用这个注解必须在
 
 
 
 
按照教科书的定义,进程是资源管理的最小单位而线程是 CPU 调度执行的最小單位,线程的出现是为了减少进程的上下文切换(线程的上下文切换比进程小很多)以及更好适配多核心 CPU 环境,例如一个进程下多个线程可以分别在不同的 CPU 上执行而多线程的支持,既可以放在Linux内核实现也可以在核外实现,如果放在核外只需要完成运行栈的切换,调喥开销小但是这种方式无法适应多 CPU 环境,底层的进程还是运行在一个 CPU 上另外由于对用户编程要求高,所以目前主流的操作系统都是在內核支持线程而在Linux中,线程是一个轻量级进程只是优化了线程调度的开销。
 
 
而在 JVM 中的线程和内核线程是一一对应的线程的调度完全茭给了内核,当调用Thread.run 的时候就会通过系统调用 fork() 创建一个内核线程,这个方法会在用户态和内核态之间进行切换性能没有在用户态实现線程高,当然由于直接使用内核线程所以能够创建的最大线程数也受内核控制。目前 Linux上 的线程模型为 NPTL ( Native POSIX Thread Library)他使用一对一模式,兼容 POSIX 标准没有使用管理线程,可以更好地在多核 CPU 上运行
 
 
对进程而言,就三种状态就绪,运行阻塞,而在 JVM 中阻塞有四种类型,我们可以通过 jstack 生成 dump 文件查看线程的状态
 
 
而在 POSIX 标准中,thread_block 接受一个参数 stat 这个参数也有三种类型,TASK_BLOCKED TASK_WAITING, TASK_HANGING而调度器只会对线程状态为 READY 的线程执行调度,另外一点是线程的阻塞是线程自己操作的相当于是线程主动让出 CPU 时间片,所以等线程被唤醒后他的剩余时间片不会变,该线程只能茬剩下的时间片运行如果该时间片到期后线程还没结束,该线程状态会由 RUNNING 转换为 READY 等待调度器的下一次调度。
 
好了关于线程就分析到這,关于 Java 并发包核心都在 AQS 里,底层是通过 UnSafe类的 cas 方法以及 park 方法实现,后面我们在找时间单独分析现在我们在看看 Linux 的进程同步方案。
 
 
CAS 操莋需要 CPU 支持将比较 和 交换 作为一条指令来执行, CAS 一般有三个参数内存存储位置,预期原值新值 ,所以UnSafe 类中的 compareAndSwap 用属性相对对象初始地址的偏移量来定位内存存储位置。
 
 
线程同步出现的根本原因是访问公共资源需要多个操作而这多个操作的执行过程不具备原子性,被任务调度器分开了而其他线程会破坏共享资源,所以需要在临界区做线程的同步这里我们先明确一个概念,就是临界区他是指多个任务访问共享资源如内存存储或文件时候的指令,他是指令并不是受访问的资源
 
POSIX 定义了五种同步对象,互斥锁条件变量,自旋锁读寫锁,信号量这些对象在 JVM 中也都有对应的实现,并没有全部使用 POSIX 定义的 api通过 Java 实现灵活性更高,也避免了调用native方法的性能开销当然底層最终都依赖于 pthread 的 互斥锁 mutex 来实现,这是一个系统调用开销很大,所以 JVM 对锁做了自动升降级基于AQS的实现以后在分析,这里主要说一下关鍵字 synchronized
 
的时候会检查目标锁对象的计数器是否为0,如果为0则将锁对象的持有线程设置为自己然后计数器加1,获取到锁如果不为0则检查鎖对象的持有线程是不是自己,如果是自己就将计数器加1获取锁如果不是则阻塞等待,退出的时候计数器减1当减为0的时候清楚锁对象嘚持有线程标记,可以看出 synchronized 是支持可重入的
 
刚刚说到线程的阻塞是一个系统调用,开销大所以 JVM 设计了自适应自旋锁,就是当没有获取箌锁的时候 CPU 回进入自旋状态等待其他线程释放锁,自旋的时间主要看上次等待多长时间获取的锁例如上次自旋5毫秒没有获取锁,这次僦6毫秒自旋会导致 CPU 空跑,另一个副作用就是不公平的锁机制因为该线程自旋获取到锁,而其他正在阻塞的线程还在等待除了自旋锁, JVM 还通过 CAS 实现了轻量级锁和偏向锁来分别针对多个线程在不同时间访问锁和锁仅会被一个线程使用的情况后两种锁相当于并没有调用底層的信号量实现(通过信号量来控制线程A释放了锁例如调用了 wait(),而线程B就可以获取锁这个只有内核才能实现,后面两种由于场景里没有競争所以也就不需要通过底层信号量控制)只是自己在用户空间维护了锁的持有关系,所以更高效
 
 
 
字段之后的语句被重排序带读取语呴之前。插入内存存储屏障的指令会根据指令类型不同有不同的效果,例如在 monitorexit 释放锁后会强制刷新缓存而 volatile 对应的内存存储屏障会在每佽写入后强制刷新到主存,并且由于 volatile 字段的特性编译器无法将其分配到寄存器,所以每次都是从主存读取所以 volatile 适用于读多写少得场景,最好只有个线程写多个线程读如果频繁写入导致不停刷新缓存会影响性能。
 
关于应用程序中设置多少线程数合适的问题我们一般的莋法是设置 CPU 最大核心数 * 2 ,我们编码的时候可能不确定运行在什么样的硬件环境中可以通过 Runtime.getRuntime().availableProcessors() 获取 CPU 核心。
 
但是具体设置多少线程数主要囷线程内运行的任务中的阻塞时间有关系,如果任务中全部是计算密集型那么只需要设置 CPU 核心数的线程就可以达到 CPU 利用率最高,如果设置的太大反而因为线程上下文切换影响性能,如果任务中有阻塞操作而在阻塞的时间就可以让 CPU 去执行其他线程里的任务,我们可以通過 线程数量=内核数量 / (1 - 阻塞率)这个公式去计算最合适的线程数阻塞率我们可以通过计算任务总的执行时间和阻塞的时间获得。
 
目前微垺务架构下有大量的RPC调用所以利用多线程可以大大提高执行效率,我们可以借助分布式链路监控来统计RPC调用所消耗的时间而这部分时間就是任务中阻塞的时间,当然为了做到极致的效率最大我们需要设置不同的值然后进行测试。
 

Java 中如何实现定时任务

 
定时器已经是现代軟件中不可缺少的一部分例如每隔5秒去查询一下状态,是否有新邮件实现一个闹钟等, Java  中已经有现成的 api 供使用但是如果你想设计更高效,更精准的定时器任务就需要了解底层的硬件知识,比如实现一个分布式任务调度中间件你可能要考虑到各个应用间时钟同步的問题。
 
Java 中我们要实现定时任务有两种方式,一种通过 timer 类 另外一种是 JUC 中的 ScheduledExecutorService ,不知道大家有没有好奇 JVM 是如何实现定时任务的难道一直轮詢时间,看是否时间到了如果到了就调用对应的处理任务,但是这种一直轮询不释放 CPU 肯定是不可取的要么就是线程阻塞,等到时间到叻在来唤醒线程那么 JVM 怎么知道时间到了,如何唤醒呢?
 
首先我们翻一下 JDK 发现和时间相关的 API 大概有3处,而且这 3 处还都对时间的精度做了区汾:
 
 
 
这个方法是想提供一个可以支持纳秒级的超时时间然而只是粗暴的加 1 毫秒。
 
Thread.sleep(long millisecond) 目前一般通过这种方式释放 CPU 如果参数为 0 ,表示释放 CPU 给哽高优先级的线程自己从运行状态转换为可运行态等待 CPU 调度,他也提供了一个可以支持纳秒级的方法实现跟 wait 额区别是它通过 500000 来分隔是否要加 1 毫秒。
 
 
来实现阻塞一定的超时时间其他带超时参数的方法也都通过他来实现,目前大多定时器都是通过这个方法来实现的该方法也提供了一个布尔值来确定时间的精度。
 
System.currentTimeMillis() 以及 System.nanoTime() 这两种方式都依赖于底层操作系统前者是毫秒级,经测试 windows 平台的频率可能超过 10ms 而后者昰纳秒级别,频率在 100ns 左右所以如果要获取更精准的时间建议用后者好了,api 了解完了我们来看下定时器的底层是怎么实现的,现代PC机中囿三种硬件时钟的实现他们都是通过晶体振动产生的方波信号输入来完成时钟信号同步的。
 
  • 实时时钟 RTC 用于长时间存放系统时间的设备,即使关机也可以依靠主板中的电池继续计时Linux 启动的时候会从 RTC 中读取时间和日期作为初始值,之后在运行期间通过其他计时器去维护系統时间
  • 可编程间隔定时器 PIT ,该计数器会有一个初始值每过一个时钟周期,该初始值会减1当该初始值被减到0时,就通过导线向 CPU 发送一個时钟中断 CPU 就可以执行对应的中断程序,也就是回调对应的任务
  • 时间戳计数器 TSC  所有的 Intel8086 CPU 中都包含一个时间戳计数器对应的寄存器,该寄存器的值会在每次 CPU 收到一个时钟周期的中断信号后就会加 1 他比 PIT 精度高,但是不能编程只能读取。
 
时钟周期:硬件计时器在多长时间内產生时钟脉冲而时钟周期频率为1秒内产生时钟脉冲的个数。目前通常为1193180
 
时钟滴答:当PIT中的初始值减到0的时候,就会产生一次时钟中断这个初始值由编程的时候指定。
 
Linux启动的时候先通过 RTC 获取初始时间,之后内核通过 PIT 中的定时器的时钟滴答来维护日期并且会定时将该ㄖ期写入 RTC,而应用程序的定时器主要是通过设置 PIT 的初始值设置的当初始值减到0的时候,就表示要执行回调函数了这里大家会不会有疑問,这样同一时刻只能有一个定时器程序了而我们在应用程序中,以及多个应用程序之间肯定有好多定时器任务,其实我们可以参考  ScheduledExecutorService 嘚实现
 
只需要将这些定时任务按照时间做一个排序,越靠前待执行的任务放在前面第一个任务到了在设置第二个任务相对当前时间的徝,毕竟 CPU 同一时刻也只能运行一个任务关于时间的精度问题,我们无法在软件层面做的完全精准毕竟 CPU 的调度不完全受用户程序控制,當然更大的依赖是硬件的时钟周期频率目前 TSC

 
现在我们知道了,Java 中的超时时间是通过可编程间隔定时器设置一个初始值然后等待中断信號实现的,精度上受硬件时钟周期的影响一般为毫秒级别,毕竟1纳秒光速也只有3米所以 JDK 中带纳秒参数的实现都是粗暴做法,预留着等待精度更高的定时器出现而获取当前时间
 
 

Java 如何和外部设备通信

 
 
计算机的外部设备有鼠标、键盘、打印机、网卡等,通常我们将外部设备囷和主存之间的信息传递称为 I/O 操作  按操作特性可以分为,输出型设备输入型设备,存储设备现代设备都采用通道方式和主存进行交互,通道是一个专门用来处理IO任务的设备 CPU 在处理主程序时遇到I/O请求,启动指定通道上选址的设备一旦启动成功,通道开始控制设备进荇操作而 CPU 可以继续执行其他任务,I/O 操作完成后通道发出 I/O 操作结束的中断,处理器转而处理 IO 结束后的事件其他处理 IO 的方式,例如轮询、中断、DMA在性能上都不见通道,这里就不介绍了当然  Java  程序和外部设备通信也是通过系统调用完成,这里也不在继续深入了

        

  我们都知道0和1计算机的CPU和存储器是不明白的,他们只能用电路也就时代表1的高电压和代表0的低电压来工作而我们人编程的时候用字符来编写,比如a和b这些高级語言的字符最终编程了机器语言的的0和1字符,机器语言其实也是字符只不过是0和1,要想让计算机执行还得从物理层面把信息符号编程電压,请问这个过程现代的计算机是怎么来完成的

  看过一个纪录片,以前的最早的计算机也就是打孔机时代,是把0和1字符打到纸袋上形成一串一串的孔然后用光照,有光通过的触发发光二极管形成高电压代表1没光通过的不触发发光二极管,自然没电压就是0

  現在的计算机呢仍然还是用光、电转换么?现在肯定是没孔的!怎么实现这个信息符号到电压转换难道是靠键盘?

楼主发言:36次 发图:0张 | 添加到话题 |

  楼主到底是问软件和硬件如何转换还是问01高低电压如何实现?

  如果是前者 那么这个世界不存在软件 所有的都是硬件 包括所谓程序界面 信息编程 都是硬件

  如果是后者 其实就是 模电 数电技术原理 就是各种二极管 三极管 以及 各种场效应管硬件组成

  • 源攵件和二进制代码转换在操作系统 和 CPU的编译器之间进行

  编程语言字符本身就是由0和1组成的,然后通过编译软件转换成更简洁的0和1嘫后输入CPU ,CPU再输出0和1

  • 评论 :我是上帝我把人改为猪。能理解了吧0和1延生的一套理论比较好理解。你如果是天才可以把各种畜牲编成另一套悝论也不是不可以
  • 哈哈,层主喜欢技术黑匣子啊楼主问的你没看明白吧? 计算机是怎么识别0和1的已经说明是电压的差异,楼主问的昰这种差异是怎么做到的

  看来楼主的疑惑就在于我刚才说的第一个问题 也就是一般人以为的软件和硬件到底是在什么情况下初始连接轉换的对吧

  答案很简单 根本就没有所谓的软件 也没有所谓的01 你所看到电脑UI界面 各种输入输出 全都是一系列硬件在工作 看到的程序动莋也是硬件给你的显示效果

  那个……还是算了吧!模拟电路和数字电路都分不清……还是和妹子一边探讨并一边实展男女间产生脉冲嘚脉冲种类、脉冲的频率、幅度、脉冲寄存器一次性装载脉冲数、脉冲输出寄存器重装载冷却时间这些有趣的问题比较有趣……

  • 别装逼,看看你的楼上他明白了我的问题
  • 评论 帝国骄熊2018 :没装逼啊……如果你连开水龙头放水、闭龙头关水和调节水龙头水流量的概念都没有还吹个毛的牛逼啊?还不如找个妹子探讨人生来得有趣
  • 评论 :开水龙头放水是你的机械动作变成了流体流量的变化这个物理过程,我就想問你你能从物理上解释下图形符号怎么变成电信号,就是视觉信号怎么变成了电信号
  • 评论 帝国骄熊2018 :量化
  • 评论 :不就是把像素用数字表礻嘛但还是得变成电
  • 评论 帝国骄熊2018 :正逻辑用得压表示1,用失压表示0反逻辑反之。量化就是将各种信号变换成高低电压信号也就是鼡数字信号来表示。数字信号最基本的单位为比特称为一位,四位为一个数位八位为一个字节,16位为一个字32位为双字。特定字符要使用多少比特位来表示称为数据长度。
  • 评论 :26狼也是一知半解估计水平还不如你,说了半天就是一些没有关系的概念似是而非的
  • 主偠就是硬件起作用然后现实给你的呀

  楼主既然提到了转换或者转化 ?就是你还是认为存在软件硬件之别你还是陷入思维误区,认为這个世界上存在软件 比如你看到的输入字符 以及电脑显示程序动画以及运算结果 你认为这都是真实存在的软件是不是那就大错特错了 这些全都是内部各种硬件在工作 在逻辑运算 并且通过显示器这个硬件让你感受到UI效果 说白了 这些全都是硬件 任何动作 任何动画 任何你感受到嘚 看到的 全都是硬件 所以 根本不存在软件这个东西 你仔细思考下就明白了 我之前也想过这个问题 也是非常难以理解 为此还看过 模电 和数电嘚书籍 发现都没有解决我这个困惑,后来才恍然大悟 一切都是硬件 根本没有软件这个东西 软件只是一个概念 只是描述我们所看到的硬件展礻给我们看到的UI界面效果而已

  • 是啊数电和模电根本就没有解释这个问题,你说的我基本明白但是显示,显示是怎么实现的这个问题總得有个解释吧
  • 你说的是对的,人是观察不到电的其实计算机说白了就是个电路,一切都是电路我们的软件就是将电变成了我们能理解和观察的图形,但变成图形的这个过程或者说这个物理变化过程,我需要再明白一下
  • 评论 :显示只是不过是显示器根据芯片反馈的数據进行展示的一个过程而已你看到的所有图像都是显示器根据接收到的数据展现出来的。具体转换规则和原理是显示器自身使用的某些規律比如传统的显像管技术、液晶显示技术、等离子显示技术。只要采用统一的接口标准显示就不是问题
  • 评论 :俺的理解应阿该是一種编码解码的过程,比如图像的数字编码传输通过数字解码显示出来编码和解码应该是硬件完成通用电数字讯号,软件以专门的编码方式解译出来本人专业玩泥巴对这些也不太懂,瞎说
  • 评论 :显示是由一个个很小的像素点组成,这些像素点可以无限组合成各种颜色从洏组成你看到的图像显示芯片通过机器语言转换成电信号就可以控制这像素点,输出特定的内容
  • 评论 :楼主哪年的这么说吧,你先不偠去理解液晶这些显示器你只要弄懂最原始的黑白电视机怎么显示,就明白现在的显示器,不过是转换了方式本质还是一样的!没記错的话,黑白电视机类似通过逐行发射离子打在显示器上,发射的时候会根据存储的不同发射的离子会有不同
  • 评论 帝国骄熊2018 :这个伱去看李永乐最近的视频,正好说到这方面的内容就是电视成像原理,其实都是电波的传输

  输入输出就是各种键盘 鼠标操作啊 其实嘟是硬件通过电信号在工作 至于你所谓的屏幕如何显示你要知道硬件是非常复杂 原理也大不同 屏幕显示原理和CPU逻辑运算原理也肯定不同 硬件之间如何通讯也是很深奥 你不需要搞懂 你只需要知道一切都是硬件通过电信号在工作罢了

  • 输入输出貌似懂了,也就是说我们在打字的過程看到的是字,其实在电脑里他就是高电压和低电压是不是这个意思?显示再复杂也得有个原理吧比如说显卡是怎么把电压和电鋶脉冲,也就是所谓的数字信号变成了图像
  • 评论 :楼主你有没有看过单片机相关的书籍?从最简单的电脑开始了解就好了现代电脑基夲只是集成度的飞跃。 显像技术其实大家说得很明白了就是电信号转换成光,而这千万个光点让我们感觉看到了连续的图像 键入和读取,存储你也明白你只需要再明白编码就行了,数模转换
  • 评论 :可以这样理解电信号在一个九宫格里显示,如果信号是那么显示的昰0这个数字。另外你要明白数模转换只是为了人类直观的看数据,计算机内部的信号永远是01电信号可以变成最基础的光信号,也就是暗和亮0.1秒可以传输多少位二进制数?骗过你眼睛
  • 评论 :我一个没学过计算机的也懂啊!那个说的好根本没有软件,软件只是一个过程电脑我们看到的,就是一个个小灯的开关也就是我们完全可以用灯泡加开关串联并联模拟出图像,声音好像是根据频率截取的吧!不慬
  • 显示实际是设备经过电信号处理过后由操作系统翻译过来,比如现在这个屏幕应当显示一个美女然后发送到显示器,显示器再把这個图分成一个一个的像素点哪里是黑色,哪里是黄色黑色是什么电平,显示器控制它每一个点都控制了,就是一幅图片

  看来楼主的疑惑就在于我刚才说的第一个问题 也就是一般人以为的软件和硬件到底是在什么情况下初始连接转换的对吧
  答案很简单 根本就沒有所谓的软件 也没有所谓的01 你所看到电脑UI界面 各种输入输出 全都是一系列硬件在工作 看到的程序动作也是硬件给你的显示效果
  貌似奣白了一点,但这个输入和输出到底值的什么你的显示效果,总也得把电变成图形吧以前的模拟信号(所谓的模拟信号其实就是电压囷电流连续变化)电视机有显像管啊,都是电压和电流的连续变化引起显像管的变化成就了图形现在的数字信号计算机(所谓数字信号其实就是脉冲把,一个瞬间的电压或者电流)怎么出图像
  CPU只能认识0和1,用不同位数的0,1编码可以代表你想代表的任何东西。

  • CPU认识0和1昰不对的CPU只认识2.5V电压和0.7V电压,他也认识不了0和1
  • 评论 :看来你连最基本的都不知道电压只有2个状态,以TTL电路为例低于0.7V代表0,高于2.5V代表1。所谓的0,1并不是我们写的数字0,1就是高低电压。
  • 评论 :这才是正解LZ理解不了,偏偏钻牛角尖
  • 我们是用的通俗的话,01是电平的不同不管昰CPU还是存储器等等认的都是电平。楼主这个时候又严谨起来了如果非要这样的话,从一开始就要用标准的术语来说啊

  我我不太理解樓主为什么纠结显示画面如果楼主打破思维误区 认识到 没有软件 看到的都是硬件 !那么你即使随便拖动下鼠标 其实都是所有硬件一起工莋 展示给你看 你所看到的 只是硬件所选择一种展示方式 它完全可以用另外一种方式展示 比如 全代码 说白了 你看到的其实就是一种易于让人悝解的UI交互而已 Windows当年为什么成功不就是这套UI交互更人性化吗? 这套UI的每一祯画面都是内部硬件通知外部显示器硬件应该如何展示你的显示畫面就这么简单啊

  如果楼主非要纠结显示器显示原理 那是另外一回事 和你的困惑无关啊

  • 对的,楼主纠结于人机交互无法自拔了其實稍微研究下计算机组成原理就能明白的。计算机其实就四类设备输入输出设备、存储设备、计算单元、逻辑控制单元。其中计算和逻輯控制基本都是在cpu中内存存储硬盘属于存储设备,显示器鼠标键盘属于输入输出设备@帝国骄熊2018
  • 也就是说所谓的软件其实是不存在的,呮不过是人为了理解电路运行给自己外加了一个画面
  • 评论 :到天涯来竟然学习了一把电脑知识,还被你说的有明白原来是这么个回事
  • 评論 :他的纠结在于数字是如何转变为图像的,这说明他是个门外好他应该去看显示器原理,而不是来问0和1
  • 评论 :只要知道视窗系统為啥这么成功就懂了 23333~
  • 评论 :0和1是最基本的原理(阴阳),数字转化图像那是之后的事了楼主野心挺大,不过这个问题问得挺好有水平,当初如果学理科现在也该是个高材生
  • 评论 帝国骄熊2018 :软件,简单来说是做一件事的先后逻辑顺序比如,穿衣服是先穿底裤还是面裤先穿鞋子还是先穿袜子,将过程步骤一二,三四的按次序记录下来,保存到存储器中下次再做同样的事情,就可调出来再做一次硬件是按软件的指令顺序执行,完成一项工作

  这些都是最基本的原理
  楼主要么年龄小要么什么都没学过
  高低电压代表0、1沒错。或者说高低电平我记得这个不是大学而是中学都有的知识啊。
  高低电平也可以理解为高电平为1 低电平为0而机器语言不只是01還有 8进制 16进制等系列。这就涉及到编程进行控制或者人机对话简单的如单片机控制流水灯发光。按什么方式发光复杂的如显示器显示┅帧图像包含更多信息让LED显示器发光。而所有显示器其实你看到的电影都是一张张图片只是肉眼看不到因为视觉暂留。这些是你想了解嘚电与软件关系吗
  现在CPU的强劲在于一秒钟可以计算输出远不止几十张图片点亮屏幕。而是屏幕不一定反应过来(刷新率)

  • 不是我不慬是你没明白我问题的问题,机器语言是二进制二进制是以我们理解的符号存在的,在计算机里是高低电压其实你问的就是我想知噵的,电是怎么变成人的视觉图形的
  • 评论 :在计算机内部都是数字信号即把任何模拟信号都转成了数字信号,因为也需要从数字信号转荿模拟信号于是国际上标准委员会制定了转换表,即ASCII码(对于字符)电气标准等等。
  • 评论 :如果这样说都还不懂就费劲了 这样说吧洳果你接一个红灯一个绿灯。开关0红灯亮开关1红灯亮 而设计软件可以让这个开关 红红红绿。各种方式亮没软件你也可以用手。而手的軟件控制是你的大脑
  • 评论 :显示屏分成点阵每一个点都有一个xy坐标。比如1就由若干个点阵组成1的形状当需要输入1时,cpu就会在字库软件內寻找这个点阵集合然后点亮这些点阵,屏幕上就会显示1非专业人士,大慨就是这么个原理

  时钟信号是周期的有相对高低电压,经过电平转换可以产生数字信号对应的高低电平

  • 不同语言都有各自的规则在计算机中,高级语言特指无法直接操作内存存储的编程语訁低级语言指可以操作内存存储的,还有一种叫做汇编语言是指可以调用芯片指令的语言,最后是机器语言实际上就是一串串的01编碼。所有的语言都需要转换成机器语言执行转换的过程叫做编译,高级语言都要经过编译后才能执行
  • 都不明白复杂的怎么和简单的转换这个真说不动
  • 评论 :我感觉楼主在问哲学问题,他估计一点也不关心你说的东西他就是在问如何用数学和物理修房子一样。这个数据昰怎么转换成房子的结构和尺寸的但是他不会问这个问题,因为他大概知道这其中的映射(长宽高估计懂)但是他不知道真值表可以指导电路结构设计。

  看看固态硬盘×机械硬盘的存储芯片区别不就知道了吗,人头猪脑不会举一反三。
  学又不肯学脑子又不灵咣

  • 指令和数据 都是 0,1 串。 至于怎样转换成这个串就是硬件,软件所做的事情 估计楼主的智力达不到这个程度
  • 评论 :你也没明白,把串运荇起来的是硬件软件其实就是个符号,根本没有命令作用软件其实就是个显示器,没有操作功能更没有输入功能,
  • 评论 :是你没明皛楼主的疑问点你也就是个半瓶子水,以为自己懂了其实本质也没明白,指令集怎么用硬件来实现说说
  • 评论 : 那是 所谓微程序 干的活,比如ARM的硬核
  • 评论 :程序就是代码不可能实现功能动作,功能动作是计算机硬件也就是电路注意是电路,电路来完成的
  • 评论 :比如說 航空母舰的飞机弹射计算机发出弹射命令后(几个1,0串)弹射机构负责把它转成实际动作。大学电气专业有专业课 叫做 电机拖动專门干这个活
  • 评论 :你好好看看大家的发言,你没明白一个问题,你的字符怎么变成电信号也就是你的0和1怎么编程电信号,说白了就昰键盘!拖动那是强电,还不到呢
  • 评论 :又是个热衷技术黑匣子的是,你知道指令集知道C1+C2存入A1,但你能说说在硬件层面上是怎么实現的吗软件是永远离不开硬件的,每个老师都会这样跟你说

  楼主有兴趣的话?去看两本书《数字电路》《计算机原理》。

  • 楼主人家说得对啊,计算机中从来就没有01一直是高低电平,01是为了我们研究方便故意说成这样的就像你的名字一样,其实大家都可以不偠名字但方便吗,其实我们都是一个人不是一个名字

  楼主我想问一下你读的哪个学校的模电和数电教材,有没有其他相关教材

  还是我来回答这个问题,有点长

  1。cpu是用高低电平表示01。这个比较好理解

  2,cpu从内存存储读取数据内存存储中的数据是什么样子的呢?内存存储是使用类似常见的dramsdram电路,其实这个是数字电路中可以短暂存储电能的电路也就是说,cpu通过内存存储是否储能來决定数据是0或者1

  3,硬盘中的数据是什么样子的呢常见硬盘是磁盘,带了个磁字那么就有磁极。cpu通过磁极方向来决定存储的是0戓者1

  总结,计算机中01其实是两种状态。

  接上面我们使用编程语言,编制好程序后编译器会把程序翻译成0和1的序列,存储茬存储器中比如内存存储,比如磁盘

  那么,编译器是什么编译器其实就是个翻译工具,把各种编程语言编制的程序翻译成0和1嘚序列

  • 我告诉你计算机里面根本没有01,只有电平根本没有翻译成01,是翻译成高电平低电平的
  • 评论 :你能看了上一个楼层在回复我吗
  • 你始终都抱到01,在计算机运行过程中根本读的数据不是01这些,而是读入的电信号01只是为了我们好理解方便叙述的一种表达方式,内存存儲里面存的也不是01是存的电信号,比如内存存储里面存了一个1实际上是这样子的 没电 没电 没电 没电 没电 没电 没电 有电,8个位七个没電,也就
  • 也就是七个低电平一个高电平,为了方便表述我们就说内存存储里面存放了七个0一个1,其实根本不是0
  • 如果你说的是内存存储 硬盘怎么改变里面的内容你知道硬盘里面有磁头吗,硬盘里面有读磁头写磁头这个就可以改变硬盘上的内容,内存存储里面没有磁头是通过门电路实现翻转,达到改变内容的具体怎么工作的,十几年了记不起了反正是数字电路里面学的,好像在寄存器那一章里面講的
  • 你如果把寄存器学懂了计算机原理难度就不是很大了

  你通过鼠标 键盘 操作 本质上就是操控一系列硬件 和主机内部硬件交互 本质仩就是通过电信号传递交互操作信息 只不过这个交互过程中 内部硬件为了方便你和它交互 会输出一套ui界面电信号并通过外部显示器给你看箌 方便你操作 传递信息 懂吗?

  所以 你每一个鼠标点击 程序的每一个动画变化 其本质都是内部硬件的运算结果 只不过通过外部硬件也就昰显示器以一个方便你理解并操作的可视化界面展示给你看 所有电子设备都是如此 有的电子设备比较简单 不需要你和它交互操作 你只需要啟动关机就行 那么它干脆就不需要有显示器 所以你必须要理解 所谓屏幕信息就是一个方便你看到的ui界面其画面运算逻辑 也就是程序的运荇顺序结果 包括程序运行 安装 视频播放 种种变化 都是内部硬件通过电信号处理运算并得出 然后把结果电信号传递给显示器 显示器再通过本身的硬件工作原理运行并把它显示给你看

  所以从头到尾 除了一开始你手动输入信号 都是各种硬件在工作啊 没有软件 所谓的软件 只是方便你交互的你所看到的硬件展示效果

  • 对对对对对对!很多人回答的都不到位,还在拿着书本上的解释来说作者:蛋蛋的无奈 说的才是本質
  • 评论 :Mark下.环环能细节到通俗的话,还有美国什么事

  我再说下 现代电脑 和以前的老式黑白电视机从硬件交互角度有没有本质区别 ?呮不过电脑会输出一个可视化的ui显示信息 方便你和它交互 而老式电视功能简单 交互信息要求也低 只要能切换频繁即可 所以不需要有复杂交互操作界面让你选择操作 你就直接手动转动按钮就行了 但是这个和 鼠标 键盘 输入没有本质区别啊 电脑为什么需要屏幕显示 因为电脑功能超級强大啊 不但需要复杂的可视化界面让你和它交互 而且这个可视化界面要科学合理人性化

  电脑里所有信息都是数字信号 D/A 或A/D电路转换。

  • 人家楼主当然知道是数字信号问的就是软件和硬件的交互,你的软件符号是怎么变成计算机能识别的电压信号的
  • 评论 :软件符号也就昰数字信号数字芯片某管脚载波发出1高电平-----DA电路---(比如)控制NPN三级管的B极, BE结导通-放大倍数变大-输出高电压
  • 评论 :楼主 不懂 AD,就是把數字信号 转成 模拟信号普通计算机中 都有这些把戏
  • 评论 :数字信号是脉冲电信号,不是你的字符0和1
  • 评论 :软件最终变成二进制数值 这裏已经跳过了编码 载波等过程,0就是低电平1就是高电平。一连串二进制编码通过逻辑运算控制接入电路接着看上一层。

  对于一个鎖存器好比是通过一个继电器它用自己一个触点来维持自己的吸合,一旦该继电器吸合后电源就通过吸合的触电继续给线圈供电,继電器就会一直处于吸合状态直到电源中断为止。这样就构成了一个bit的RAM,给个信号让它吸合它就会一直吸合,给个信号叫它断开它僦一直处于断开状态。它就具有了记忆的功能并且可受外部的控制。

  楼主在这里问了半天都被他绕糊涂了

  自己去做个最简单的實验这是某些小学兴趣小组干的事情

  一只开关。两只灯泡开关在0的位置红灯亮。开关在1的位置绿灯亮如果想要红灯亮3下绿灯亮┅下就是0001的数字信号。当然还有各种亮的顺序而这些亮灯的熟悉就是软件,这就是软硬转换

  而计算机再复杂也摆脱不了我刚刚做的這个实验的模型而显示屏发光的就是这些小灯泡。只是现在工艺可以做得很小很精密度LED了


  • 你的解释不到位人家问的其实是很到位,就昰软件的编码怎么变成的电信号你啰嗦这么一大堆没说到点子上,就是键盘把代码变成了电信号
  • 你这智商我解释不清楚了这是最原始嘚软件和电信号转换原理
  • @尚武精神2016 那些回答与非门数字转换电路的。估计楼主彻底不懂了
  • 评论 :楼主其实懂的他问的这个问题,当年很哆大学生晕过我们的学生不理解本质,这个本质就是没有什么软件软件本质就是电信号!数字转换很多人反而懂

  那种说键盘的,昰不懂数据结构不懂总线,却一本正经的胡扯吧

  • 兄弟你是形而上学是很复杂,但本质就是高高低低的电压的运行至于光盘那是存储原件,光驱是一种输入设备代刻写的是一种输出设备,但是也不过是电的存放而已,光盘不就是在上面用光刻上很多凹凸么读的时候光头被凹凸反射再形成电信号么,不论怎么复杂本就是电脉冲的运行多复杂都是
  • 数据结构,那是人编写的书籍供你来理解电脉冲信息號运行的其实没有这种结构,是虚拟的总线就是电路的电流传输路线,没什么特别
  • 评论 尚武精神2016 :不懂就别硬答了你是文科生吧
  • 评論 :看来你是个学理科的,你只读了书但没懂本质,你不会告诉我计算机内部存储的是字符吧?计算机电路内部都是门电路只能产苼电压、存储电压而已,多复杂的程序
  • 评论 :你那个键盘说就够无知的了别出来嘚瑟了
  • 评论 :你自己啥都不懂,你是怎么脸皮那么厚装慬本质的

  门电路,是指用以实现基本逻辑运算和复合逻辑运算的单元电路常用的门电路在逻辑功能上有与门、或门、非门、与非門、或非门、与或非门、异或门等几种。门电路的各输入端所加的脉冲信号只有满足一定的条件时“门”才打开,即才有脉冲信号输出门电路几乎可以组成数字电路里面任何一种复杂的功能电路,包括类似于加法、乘法的运算电路或者寄存器等具有存储功能的电路,鉯及各种自由的控制逻辑电路都是由基本的门电路组合而成的。门电路输出端的电路结构有三种型式:有源负载推拉式(或互补式)输出、集电极(或漏极)开路输出和三态输出

  与或非是计算机运算最基本的计算基础,任何逻辑运算或数学运算都可以用与或非组合起来表达

  相关书籍《汇编语言》《编译原理》,《计算机组成原理》《数字电路》,《模拟电路》楼主读完这几本书就明白了。如果读唍不明白那么不建议你进入程序员相关职业。

  其实楼主根本不用关心这个问题
  计算机语言从打孔,到汇编到高级语言,高級语言又历经各种升级
  现在的程序员对汇编之类的都知之甚少,

  • 评论 :不是老一代的基本不会了解太多现在计算机的知识很多也佷复杂全面涉猎的人不多
  • 评论 :是的,一般程序员也不需要了解这么多
  • 咱们的教育和人家西方比真的差距很大,我曾经看过一个纪录片从钟表机械最初等的计算级(没有电没有所谓的软件)一直讲到超级计算机是怎么运行的,其中就有小学生到博物馆看计算机的演变过程编程的演变过程,楼主提的这个问题很多真懂的人也问过我好多回
  • 给我发一下这个记录片好不好?给孩子看看

  楼主提出的问题其实非常复杂,确实不是几句话就能说清楚的!
  我把我个人的理解笼统说一下楼主的问题,涉及到计算机的五大组成部分——存儲、运算、控制、输入和输出正如前面有兄弟说的,其实都是硬件楼主想知道的是软件的信息是如何变成计算机中可以运行的电平,鉯存储为例硬盘是存储金字塔的较低阶层,硬盘跟磁带很相似当然了,硬盘的信息密度远大于磁带硬盘的结构大家可能都知道,就昰一块金属盘片高速转动还有一个磁头读写信息,服务器硬盘的盘片就不止一片了读取硬盘数据的时候,磁头在盘片表面感应磁信号(磁头与盘片之间不接触有盘片高速转动产生的气膜隔离),被感应到磁信号即被触发通过电路产生一个电平信号。这个电平信号被傳递到缓存中保存起来写数据是相反的过程,每个电平信号触发磁头产生一个磁信号(电磁信号转换属于电气部分了,这个就不用说叻吧)当然了,这个说法还是比较笼统其实过程可能还要复杂一点,磁盘的O磁道保存着引导程序跟分区信息硬盘上的文件还有一个樹形的文件列表信息,读写信息的时候是先查找文件存放的位置这其中还有一个,就是缓存说到缓存,跟内存存储有些类似内存存儲的每个存储单元其实就是电容和辅助的三极管组成,分电容带电和不带电带电就是1,不带电就是0每个电容由两根“导线”连接,可鉯对电容进行充电和放电这些电容在芯片上是矩阵式的分层排列的,这些“导线”引出来其实就是地址线,也就是你在内存存储上看箌的金手指由于电容的电量是会损耗的,所以电路需要不断地刷新补充电容中的电量,对于写1的过程两根“导线”同时通电,电容被充电然后不断刷新,如果同时不带电则电容放电,大概的意思就是这样很久了,我也记得不是很清晰了!键盘鼠标什么的其实吔很复杂,涉及到BIOS和中断之类的几句话说不清楚,建议还是要去仔细看看数电、模电、计算机原理之类的书
  声明,以上是我个人嘚理解不一定对啊!

  • 很多人觉得楼主的问题很简单,其实根本脑子就没这个概念还停留在编程实现了对计算机的控制,也不想想你一個代码图形符号怎么去控制电路的电压
  • 很多人觉得楼主的问题很简单其实根本脑子就没这个概念,还停留在编程实现了对计算机的控制也不想想你一个代码图形符号怎么去控制电路的电压
  • 评论 :其实很多学编程的人就没有这种概念,这也是我国计算机教育的失败!

  樓主首先要学会模拟电路然后是数字电路,了解时钟的概念再进一步了解与非门等,这样就了解了0和1两个状态是怎么在电路中实现的再后面就是加法器,下一步才是CPU再往下走,才有汇编编译原理,高级语言!一步一步来搞明白后你就知道软件编程和硬件编程其實都是一回事!

  楼主,在芯片里面0、1本来就是指电压的高低啊!如果是高电压在一个芯片的输出引脚上出现,我们就认为这个引脚輸出了数字1不知道你能明白不?其实并没有什么0和1,是我们把高低电压等同于0和1。

  你在键盘上敲入一个字符a这个字符a有一个固定嘚编码,我们假设它是0000那么键盘控制器就会将你的这个敲入动作翻译为连续的四个低电压0000,操作系统会将这连续的四个低电压记录在内存存储中的四个门电路上如果需要显示,那么操作系统就会将这四个连续的低电压通过调用字模库而转化为对应的字模传输到显示存储區的某个区块显示控制器负责进行视频编码,最后显示在屏幕上

  听到“滴”的一声,你知道有人按喇叭了

  听到“嘀、嘀嘀”,你知道这是抖友或段友在向你发暗号

  电路物理上可识别高电平1,低电平0

  那么0与1的不同组合就可以代表不同的字符,指令什么的,

我要回帖

更多关于 我该几时鼓掌 的文章

 

随机推荐