当前位置: 首页 > 科技观察

Java编程入门-异步事件:轮询和中断

时间:2023-03-19 01:28:15 科技观察

CPU几乎所有时间都花在从内存中获取指令并运行它们。然而,CPU和主存储器只是计算机硬件系统中众多组件中的两个。一个完整的系统还包括其他设备,如:硬盘或固态硬盘,用于存储程序和数据文件。(注意,主存只保存少量信息,并且只能在计算机开机时保存信息。硬盘或固态硬盘用于永久存储大量信息。但在程序实际运行之前,程序必须将硬盘或SSD中的数据加载到主存中,HDD将数据存储在一个旋转的磁盘中,而SSD将数据存储在一个纯电子设备中,不需要旋转或任何机械移动键盘和鼠标,为用户提供输入显示器和打印机,显示计算机的输出音频输出设备,使计算机能够播放声音网络接口,使计算机能够与其他联网计算机通信,有线或无线.联网的方式.扫描仪,将图片转换成二进制代码可以在电脑上存储和操作.以上列出的设备都是开放的(openended),而c计算机的设计目的是能够轻松地向扩展计算机添加新设备。CPU必须以某种方式与这些设备通信并控制它们,而它只能通过运行机器语言指令来做到这一点(它能做的只有这些)。这是如何完成的系统中的每个设备都对应一个设备驱动程序。这些驱动程序是一些应用软件,在CPU与设备交互时运行。在系统中安装一个新设备通常需要两个步骤:将物理设备签入计算机,然后安装设备驱动软件。如果没有设备驱动程序,物理设备将变得无用,因为CPU无法与物理设备通信。由许多设备组成的计算机系统通常将这些设备连接到一个或多个总线上组织。总线是一组电线,承载有关连接到这些电线的设备的各种信息。电线携带的信息包括数据、地址和控制信号。地址信息将数据定向到特定设备或特定A寄存器或特定设备内的特定位置。一个设备可以使用控制信号来通知另一个设备数据在数据总线上可用。一个非常简单的计算机系统可以这样组织:如今,键盘、鼠标和网络接口等设备都会产生输入数据,并需要CPU进行处理。那么CPU怎么知道数据已经到了呢?一个简单但不太理想的解决方案是让CPU不断检查数据是否到达,并在每次找到数据时处理数据。因为CPU需要不断轮询输入设备,检测是否有输入数据需要处理,所以这种方式称为轮询。不幸的是,轮询虽然简单,但效率也很低。因为CPU花费大量时间只是等待输入。为了提高效率,通常使用中断代替轮询。中断是其他设备发送给CPU的信号。为了响应中断信号,CPU会搁置正在处理的事务来响应中断信号。一旦CPU处理完中断,它就会返回并处理在中断发生时被搁置的事务。例如,当你按下键盘上的一个键时,一个键盘中断被发送到CPU。然后CPU通过中断正在处理的事务来响应中断信号,读取并处理你按下的按键信息。***,CPU将返回到您按下该键之前正在执行的任务。另外,你要知道这种中断机制是完全使用硬件实现的:设备只是简单地通过连线指示中断信息。CPU的设计使得当线路打开时,它会保存有关正在处理的事务的信息(保存上下文),以便稍后可以返回到相同的状态(恢复上下文)。此信息包括重要内部寄存器的内容,例如程序计数器。然后CPU跳转到某个预设的内存位置并执行存储在那里的指令。这些指令构成了一个中断处理程序,用于执行一些必要的处理以响应中断(这个中断处理程序是发送信号的设备驱动软件的一部分)。中断处理器的最后一条指令使用先前保存的状态信息来指示CPU跳回上下文。中断使CPU能够处理异步事件。在常规的读取-执行循环中,事件按预定顺序发生;所有事件都与其他事件“同步”发生。中断使CPU可以使用事件时间不可预测的“异步”有效地处理事件。作为使用中断的另一个例子,考虑一下当CPU需要访问存储在硬盘上的数据时会发生什么?CPU只能直接访问内存中的数据。因此,在访问硬盘上的数据之前,必须先将数据复制到内存中。不幸的是,与CPU的运行速度相比,硬盘的速度非常慢。当CPU需要硬盘上的数据时,它向硬盘驱动器发送一个信号,要求它定位并准备数据(这个信号在正常程序下是异步发送的)。然后CPU继续做一些其他的任务,而不是等待不可预知的长时间。这个等待过程将由硬盘驱动器来完成。当硬盘驱动器准备好数据时,它会向CPU发送中断信号。然后中断处理程序读取请求的数据。到目前为止,您可能已经注意到中断仅在CPU有多个任务要执行时才有用。如果CPU只有一个任务要执行,中断也会花时间轮询输入或等待硬盘操作完成。所有现代计算机都使用多任务处理来同时执行多项任务。一些计算机可以同时由一个以上的用户使用。因为CPU很快,它可以快速地从一个用户切换到另一个用户,轮流为每个用户工作一小段时间。这种多任务处理的使用称为分时。然而,只有一个用户的现代个人计算机也使用多任务处理。例如,用户可能正在计算机上写论文,同时时钟程序不断显示时间并从Internet下载文件。CPU正在执行的每个单独任务称为线程(或进程;线程和进程之间存在技术差异,但这种差异在这里并不重要,因为我们所说的线程是Java中的线程)。许多CPU可以同时运行多个线程——这些CPU包含多个“核心”,每个核心可以运行一个线程,但是同时运行的线程数量是有限的。往往因为线程太多无法同时运行所有线程,计算机必须能够从一个线程切换到另一个,就像分时计算机从一个用户切换到两个用户一样。通常,一个正在运行的线程将继续运行,除非出现以下情况之一:该线程自愿放弃控制权,让其他线程有机会运行。线程可能必须等待某个异步事件的发生。例如,一个线程可能需要硬盘上的一些数据,或者它可能正在等待用户按下一个键。当一个线程在等待时,我们说它被阻塞(blocked)。此时,其他线程(如果有的话)有机会运行。当等待事件发生时,中断会“唤醒”被阻塞的线程继续运行。一个线程可能会被挂起,以允许其他线程通过耗尽其分配的时间片来运行。并不是所有的计算机都能通过这种方式“强行”挂起线程。那些可以“强行”挂起的称为抢占式多任务处理。要使用抢占式多任务处理,计算机需要一个特殊的计时设备,可以周期性地产生中断,比如每秒100次。当定时器中断发生时,CPU可以从一个线程切换到另一个线程,而不管该线程是否正在执行。所有现代台式机和笔记本电脑,甚至是普通的智能手机和平板电脑,都使用抢占式多任务处理。普通用户,甚至普通程序员,不需要处理中断和中断处理程序。他们可以专注于他们希望计算机执行的不同任务或线程。计算机如何完成这些任务的细节对他们来说并不重要。事实上,大多数用户和许多程序员都可以忽略线程和多任务处理。但是,随着计算机的功能越来越强大,多任务、多处理的应用越来越多,线程也变得越来越重要。事实上,使用线程的能力很快就会成为程序员的必备技能。幸运的是,Java对线程提供了很好的支持,它使用线程作为一个基本的程序概念内置到Java编程语言中。在第12章中,我们将介绍线程编程。一般来说,在Java和现代编程中同样重要的是异步事件的基本概念。即使程序员实际上并不直接处理中断,他们也常常发现自己在编写事件处理程序。事件处理程序类似于中断处理程序,它们在某些事件发生时被调用。与许多传统的、直通式的、同步的编程相比,“事件驱动编程”有着不一样的体验。我们将从今天仍在使用的传统编程类型开始,为单个任务编写程序。但我们将在第6章中回到线程和事件。顺便说一句,负责所有中断处理、处理用户与硬件设备之间的交互以及控制哪些线程可以运行的软件称为操作系统。操作系统是最基本和最重要的软件,没有它计算机就无法正常运行。其他程序(例如文字处理器和网络浏览器)取决于操作系统。常见的操作系统包括Linux、各种版本的Windows和MacOS。原文链接:math.hws.edu翻译:ImportNew.com-Jinlin翻译链接:http://www.importnew.com/16620.html