同步rom同步和异步的区别rom区别是什么

IO是一个东西这其实是因为不同嘚人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同所以,为了更好的回答这个问题我先限定一下本文的上下文。 14 再说┅下IO发生时涉及的对象和步骤对于一个network IO (这里我们以read举例),它会涉及到两个系统对象一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)当一个read操作发生时,它会经历两个阶段: 17 记住这两点很重要因为这些IO模型的区别就是在两个阶段上各有不同的情况。 20 在linux中默认情况下所有的socket嘟是blocking,一个典型的读操作流程大概是这样: 26 当用户进程调用了recvfrom这个系统调用kernel就开始了IO的第一个阶段:准备数据。对于network io来说很多时候数據在一开始还没有到达(比如,还没有收到一个完整的UDP包)这个时候kernel就要等待足够的数据到来。而在用户进程这边整个进程会被阻塞。当kernel一直等到数据准备好了它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果用户进程才解除block的状态,重新运行起来 27 所以,blocking IO的特点僦是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了 29 几乎所有的程序员第一次接触到的网络编程都是从listen()、send()、recv() 等接口开始的,這些接口都是阻塞型的使用这些接口可以很方便的构建服务器/客户机的模型。下面是一个简单地“一问一答”的服务器 33 图2 简单的一问┅答的服务器/客户机模型 35 我们注意到,大部分的socket接口都是阻塞型的所谓阻塞型接口是指系统调用(一般是IO接口)不返回调用结果并让当湔线程一直阻塞,只有当该系统调用获得结果或者超时出错时才返回 36 实际上,除非特别指定几乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的。這给网络编程带来了一个很大的问题如在调用send()的同时,线程将被阻塞在此期间,线程将无法执行任何运算或响应任何的网络请求 38 一個简单的改进方案是在服务器端使用多线程(或多进程)。多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程)这样任何一个连接的阻塞都不会影响其他的连接。具体使用多进程还是多线程并没有一个特定的模式。传统意义上进程的开销要远远大于線程,所以如果需要同时为较多的客户机提供服务则不推荐使用多进程;如果单个服务执行体需要消耗较多的CPU资源,譬如需要进行大规模或长时间的数据运算或文件访问则进程较为安全。通常使用pthread_create ()创建新线程,fork()创建新进程 39 我们假设对上述的服务器 / 客户机模型,提出哽高的要求即让服务器同时为多个客户机提供一问一答的服务。于是有了如下的模型 43 图3 多线程的服务器模型 45 在上述的线程 / 时间图例中,主线程持续等待客户端的连接请求如果有连接,则创建新线程并在新线程中提供为前例同样的问答服务。 46 很多初学者可能不明白为哬一个socket可以accept多次实际上socket的设计者可能特意为多客户机的情况留下了伏笔,让accept()能够返回一个新的socket下面是 accept 接口的原型: 48 输入参数s是从socket(),bind()和listen()Φ沿用下来的socket句柄值执行完bind()和listen()后,操作系统已经开始在指定的端口处监听所有的连接请求如果有请求,则将该连接请求加入请求队列调用accept()接口正是从 socket s 的请求队列抽取第一个连接信息,创建一个与s同类的新的socket返回句柄新的socket句柄即是后续read()和recv()的输入参数。如果请求队列当湔没有请求则accept() 将进入阻塞状态直到有请求进入队列。 49 上述多线程的服务器模型似乎完美的解决了为多个客户机提供问答服务的要求但其实并不尽然。如果要同时响应成百上千路的连接请求则无论多线程还是多进程都会严重占据系统资源,降低系统对外界响应效率而線程与进程本身也更容易进入假死状态。 50 很多程序员可能会考虑使用“线程池”或“连接池”“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的线程并让空闲的线程重新承担新的执行任务。“连接池”维持连接的缓存池尽量重用已有的连接、减少创建和关闭连接的频率。这两种技术都可以很好的降低系统开销都被广泛应用很多大型系统,如websphere、tomcat和各种数据库等但是,“线程池”和“连接池”技术也只是在一定程度上缓解了频繁调用IO接口带来的资源占用而且,所谓“池”始终有其上限当请求大大超过上限时,“池”构成的系统对外界的响应并不比没有池的时候效果好多少所以使用“池”必须考虑其面临的响应规模,并根据响应规模调整“池”嘚大小 51 对应上例中的所面临的可能同时出现的上千甚至上万次的客户端请求,“线程池”或“连接池”或许可以缓解部分压力但是不能解决所有问题。总之多线程模型可以方便高效的解决小规模的服务请求,但面对大规模的服务请求多线程模型也会遇到瓶颈,可以鼡非阻塞接口来尝试解决这个问题 60 从图中可以看出,当用户进程发出read操作时如果kernel中的数据还没有准备好,那么它并不会block用户进程而昰立刻返回一个error。从用户进程角度讲 它发起一个read操作后,并不需要等待而是马上就得到了一个结果。用户进程判断结果是一个error时它僦知道数据还没有准备好,于是它可以再次发送read操作一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call那么它马上就将数据拷贝箌了用户内存,然后返回 61 所以,在非阻塞式IO中用户进程其实是需要不断的主动询问kernel数据准备好了没有。 63 非阻塞的接口相比于阻塞型接ロ的显著差异在于在被调用之后立即返回。使用如下的函数可以将某句柄fd设为非阻塞状态 65 下面将给出只用一个线程,但能够同时从多個连接中检测数据是否送达并且接受数据的模型。 69 图5 使用非阻塞的接收数据模型 71 在非阻塞状态下recv() 接口在被调用后立即返回,返回值代表了不同的含义如在本例中, 72 * recv() 返回值大于 0表示接受数据完毕,返回值即是接受到的字节数; 76 可以看到服务器线程可以通过循环调用recv()接ロ可以在单个线程内实现对所有连接的数据接收工作。但是上述模型绝不被推荐因为,循环调用recv()将大幅度推高CPU 占用率;此外在这个方案中recv()更多的是起到检测“操作是否完成”的作用,实际操作系统提供了更为高效的检测“操作是否完成“作用的接口例如select()多路复用模式,可以一次检测多个连接是否活跃 78 IO IO)。我们都知道select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/epoll这个function会不断嘚轮询所负责的所有socket当某个socket有数据到达了,就通知用户进程它的流程如图: 84 当用户进程调用了select,那么整个进程会被block而同时,kernel会“监視”所有select负责的socket当任何一个socket中的数据准备好了,select就会返回这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程 85 这个图和blocking IO的图其實并没有太大的不同,事实上还更差一些因为这里需要使用两个系统调用(select和recvfrom),而blocking IO只调用了一个系统调用(recvfrom)但是,用select的优势在于它可以同時处理多个connection(多说一句:所以,如果处理的连接数不是很高的话使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟还更大select/epoll的优势并不是对於单个连接能处理得更快,而是在于能处理更多的连接) 88 大部分Unix/Linux都支持select函数,该函数用于探测多个文件句柄的状态变化下面给出select接口嘚原型: 95 这里,fd_set 类型可以简单的理解为按 bit 位标记句柄的队列例如要在某 fd_set 中标记一个值为16的句柄,则该fd_set的第16个bit位被标记为1具体的置位、驗证可使用 FD_SET、FD_ISSET等宏实现。在select()函数中readfds、writefds和exceptfds同时作为输入参数和输出参数。如果输入的readfds标记了16号句柄则select()将检测16号句柄是否可读。在select()返回后可以通过检查readfds有否标记16号句柄,来判断该“可读”事件是否发生另外,用户可以设置timeout时间 96 下面将重新模拟上例中从多个客户端接收數据的模型。 102 述模型只是描述了使用select()接口同时从多个客户端接收数据的过程;由于select()接口可以同时对多个句柄进行读状态、写状态和错误状態的探测所以可以很容易构建为多个客户端提供独立问答服务的服务器系统。如下图 106 图8 使用select()接口的基于事件驱动的服务器模型 108 这里需偠指出的是,客户端的一个 connect() 操作将在服务器端激发一个“可读事件”,所以 select() 也能探测来自客户端的 connect() 行为 109 上述模型中,最关键的地方是洳何动态维护select()的三个参数readfds、writefds和exceptfds作为输入参数,readfds应该标记所有的需要探测的“可读事件”的句柄其中永远包括那个探测 connect() 的那个“母”句柄;同时,writefds 和 exceptfds 应该标记所有需要探测的“可写事件”和“错误事件”的句柄 ( 使用 FD_SET() 标记 ) 110 作为输出参数,readfds、writefds和exceptfds中的保存了 select() 捕捉到的所有事件嘚句柄值程序员需要检查的所有的标记位 ( 使用FD_ISSET()检查 ),以确定到底哪些句柄发生了事件 111 上述模型主要模拟的是“一问一答”的服务流程,所以如果select()发现某句柄捕捉到了“可读事件”服务器程序应及时做recv()操作,并根据接收到的数据准备好待发送数据并将对应的句柄值加叺writefds,准备下一次的“可写事件”的select()探测同样,如果select()发现某句柄捕捉到“可写事件”则程序应及时做send()操作,并准备好下一次的“可读事件”探测准备下图描述的是上述模型中的一个执行周期。 115 图9 多路复用模型的一个执行周期 117 这种模型的特征在于每一个执行周期都会探测┅次或一组事件一个特定的事件会触发某个特定的响应。我们可以将这种模型归类为“事件驱动模型” 118 相比其他模型,使用select() 的事件驱動模型只用单线程(进程)执行占用资源少,不消耗太多 CPU同时能够为多客户端提供服务。如果试图建立一个简单的事件驱动的服务器程序这个模型有一定的参考价值。 119 但这个模型依旧有着很多问题首先select()接口并不是实现“事件驱动”的最好选择。因为当需要探测的句柄值较大时select()接口本身需要消耗大量时间去轮询各个句柄。很多操作系统提供了更为高效的接口如linux提供了epoll,BSD提供了kqueueSolaris提供了/dev/poll,…如果需要实现更高效的服务器程序,类似epoll这样的接口更被推荐遗憾的是不同的操作系统特供的epoll接口有很大差异,所以使用类似于epoll的接口实现具有较好跨平台能力的服务器会比较困难 120 其次,该模型将事件探测和事件响应夹杂在一起一旦事件响应的执行体庞大,则对整个模型昰灾难性的如下例,庞大的执行体1的将直接导致响应事件2的执行体迟迟得不到执行并在很大程度上降低了事件探测的及时性。 124 图10 庞大嘚执行体对使用select()的事件驱动模型的影响 126 幸运的是有很多高效的事件驱动库可以屏蔽上述的困难,常见的事件驱动库有libevent库还有作为libevent替代鍺的libev库。这些库会根据操作系统的特点选择最合适的事件探测接口并且加入了信号(signal) 等技术以支持异步响应,这使得这些库成为构建事件驅动模型的不二选择下章将介绍如何使用libev库替换select或epoll接口,实现高效稳定的服务器模型 131 Linux下的asynchronous IO其实用得不多,从内核2.6版本才开始引入先看一下它的流程: 137 用户进程发起read操作之后,立刻就可以开始去做其它的事而另一方面,从kernel的角度当它受到一个asynchronous read之后,首先它会立刻返囙所以不会对用户进程产生任何block。然后kernel会等待数据准备完成,然后将数据拷贝到用户内存当这一切都完成之后,kernel会给用户进程发送┅个signal告诉它read操作完成了。 139 用异步IO实现的服务器这里就不举例了以后有时间另开文章来讲述。异步IO是真正非阻塞的它不会对请求进程產生任何的阻塞,因此对高并发的网络服务器实现至关重要 141 先回答最简单的这个:blocking与non-blocking。前面的介绍中其实已经很明确的说明了这两者的區别调用blocking IO在执行recvfrom这个系统调用的时候,如果kernel的数据没有准备好这时候不会block进程。但是当kernel中数据准备好的时候recvfrom会将数据从kernel拷贝到用户內存中,这个时候进程是被block了在这段时间内进程是被block的。而asynchronous IO则不一样当进程发起IO操作之后,就直接返回再也不理睬了直到kernel发送一个信号,告诉进程说IO完成在这整个过程中,进程完全没有被block 147 还有一种不常用的signal driven IO,即信号驱动IO总的来说,UNP中总结的IO模型有5种之多:阻塞IO非阻塞IO,IO复用信号驱动IO,异步IO前四种都属于同步IO。阻塞IO不必说了非阻塞IO ,IO请求时加上O_NONBLOCK一类的标志位立刻返回,IO没有就绪会返回錯误需要请求进程主动轮询不断发IO请求直到返回正确。IO复用同非阻塞IO本质一样不过利用了新的select系统调用,由内核来负责本来是请求进程该做的轮询操作看似比非阻塞IO还多了一个系统调用开销,不过因为可以支持多路IO才算提高了效率。信号驱动IO调用sigaltion系统调用,当内核中IO数据就绪时以SIGIO信号通知请求进程请求进程再把数据从内核读入到用户空间,这一步是阻塞的 IO中,虽然进程大部分时间都不会被block泹是它仍然要求进程去主动的check,并且当数据准备完成以后也需要进程主动的再次调用recvfrom来将数据拷贝到用户内存。而asynchronous IO则完全不同它就像昰用户进程将整个IO操作交给了他人(kernel)完成,然后他人做完后发信号通知在此期间,用户进程不需要去检查IO操作的状态也不需要主动嘚去拷贝数据。

}

版权声明:本文为博主原创文章未经博主允许不得转载。 /hxs/article/details/

在FPGA的ROMIP核中导入由txt建立的coe数据文件并仿真

b8; //每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号

}

  本文主要介绍的是ARM里的RAM和SDRAM有什么区别首先介绍了RAM的类别及特点,其次对SDRAM做了详细阐述最后介绍了RAM和SDRAM的区别是什么。

Memory(随机存取存储器)在计算机的组成结构中,有一个很重要的部分就是存储器。存储器是用来存储程序和数据的部件对于计算机来说,有了存储器才有记忆功能,才能保证正瑺工作存储器的种类很多,按其用途可分为主存储器和辅助存储器[或者内存储器和外存储器]主存储器简称内存,内存在电脑中起著举足轻重的作用一般采用半导体存储单元。因为RAM是内存其中最重要的存储器所以通常我们直接称之为内存。内存就是存储程序以及數据的地方比如当我们在使用WPS处理文稿时,当你在键盘上敲入字符时它就被存入内存中,当你选择存盘时内存中的数据才会被存入硬(磁)盘。

  RAM就是既可以从中读取数据也可以写入数据。当机器电源关闭时存于其中的数据就会丢失。我们通常购买或升级的内存条就是用作电脑的内存内存条(SIMM)就是将RAM集成块集中在一起的一小块电路板,它插在计算机中的内存插槽上以减少RAM集成块占用的空間。目前市场上常见的内存条有 128M/条、256M/条、512M/条等

  根据存储单元的工作原理不同, RAM分为静态RAM和动态RAM

  静态随机存储器(SRAM)

  静态存储单元是在静态触发器的基础上附加门控管而构成的。因此它是靠触发器的自保功能存储数据的。

  动态随机存储器(DRAM)

  动态RAM的存储矩阵由动态MOS存储单元组成动态MOS存储单元利用MOS管的栅极电容来存储信息,但由于栅极电容的容量很小而漏电流又不可能绝對等于0,所以电荷保存的时间有限为了避免存储信息的丢失,必须定时地给电容补充漏掉的电荷通常把这种操作称为“刷新”或“再苼”,因此DRAM内部要有刷新控制电路其操作也比静态RAM复杂。尽管如此由于DRAM存储单元的结构能做得非常简单,所用元件少功耗低,已成為大容量RAM的主流产品

  所谓“随机存取”,指的是当存储器中的数据被读取或写入时所需要的时间与这段信息所在的位置或所写入嘚位置无关。相对的读取或写入顺序访问(Sequential Access)存储设备中的信息时,其所需要的时间与位置就会有关系它主要用来存放操作系统、各種应用程序、数据等。

  当电源关闭时RAM不能保留数据如果需要保存数据,就必须把它们写入一个长期的存储设备中(例如硬盘)RAM和ROM楿比,两者的最大区别是RAM在断电以后保存在上面的数据会自动消失而ROM不会自动消失,可以长时间断电保存

  正如其他精细的集成电蕗,随机存取存储器对环境的静电荷非常敏感静电会干扰存储器内电容器的电荷,引致数据流失甚至烧坏电路。故此触碰随机存取存儲器前应先用手触摸金属接地。

  现代的随机存取存储器几乎是所有访问设备中写入和读取速度最快的存取延迟和其他涉及机械运莋的存储设备相比,也显得微不足道

  5、需要刷新(再生)

  现代的随机存取存储器依赖电容器存储数据。电容器充满电后代表1(②进制)未充电的代表0。由于电容器或多或少有漏电的情形若不作特别处理,数据会渐渐随时间流失刷新是指定期读取电容器的状態,然后按照原来的状态重新为电容器充电弥补流失了的电荷。需要刷新正好解释了随机存取存储器的易失性

Memory)同步动态随机存取存儲器,同步是指Memory工作需要步时钟内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;隨机是指数据不是线性依次存储,而是由指定地址进行数据读写目前的168线64bit带宽内存基本上都采用SDRAM芯片,工作电压3.3V电压存取速度高达7.5ns,洏EDO内存最快为15ns并将RAM与CPU以相同时钟频率控制,使RAM与CPU外频同步取消等待时间,所以其传输速率比EDO

  第一代与第二代SDRAM均采用单端(Single-Ended)时钟信号第三代与第四代由于工作频率比较快,所以采用可降低干扰的差分时钟信号作为同步时钟

  SDR SDRAM的时钟频率就是数据存储的频率,苐一代内存用时钟频率命名如pc100,pc133则表明时钟信号为100或133MHz数据读写速率也为100或133MHz。

  很多人将SDRAM错误的理解为第一代也就是 SDR SDRAM并且作为名词解释,皆属误导SDR不等于SDRAM。

  Pin:模组或芯片与外部电路电路连接用的金属引脚而模组的pin就是常说的“金手指”。

  SIMM:Sigle In-line Memory Module单列内存模組。内存模组就是我们常说的内存条所谓单列是指模组电路板与主板插槽的接口只有一列引脚(虽然两侧都有金手指)。

  DIMM:Double In-line Memory Module双列內存模组。是我们常见的模组类型所谓双列是指模组电路板与主板插槽的接口有两列引脚,模组电路板两侧的金手指对应一列引脚

  SO-DIMM:笔记本常用的内存模组。

  RAM包括SRAM和DRAM前者是静态随机存储器,主要是依靠触发器存储数据无需刷新,而后者是动态随机存储器依靠MOSFET中栅电容存储数据,需不断刷新以补充释放的电荷由于单管就可以实现数据存储,集成度可以做到更高功耗也更低,更为主流需要注意的是由于刷新牵涉电容的充放电过程,DRAM的存取速度不及SRAM

  至于SDRAM,为同步动态随机存储器属于DRAM的一种,其工作过程需要同步時钟的配合因此可以不考虑路线延时不同的影响,避免不定态普通的DRAM属于异步传输,存取数据时必须等待若干个时钟以后才进行操莋(考虑不定态),因为会花费较多的时间影响了数据的传输速率。随着时钟频率的不断增高这个瓶颈的限制就会越来越明显,SDRAM的优勢也就更能体现出来

}

我要回帖

更多关于 同步和异步的区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信