dma技术如何支持系统并发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dma技术如何支持系统并发相关的知识,希望对你有一定的参考价值。

参考技术A

    DMA技术

    AXI直接数值存取(Drect Memory Access,DMA)IP核在AXI4内存映射和AXI4流IP接口之间提供高带宽的直接内存访问。DMA可以选择分散收集(Scatter Gather,SG)功能还可以将数据移动任务从位于于处理器系统中的中央处理器(CPU)中卸载出来。可以通过一个AXI4-Lite从接口访问初始化、状态和管理寄存器。如图4. 8展现了DMA IP的功能构成核心。

    系统内存和传输的目标之间的主要通过高速DMA数据传输,数据之间的流向是AXI4读数据的主端口到AXI4内存映射流(Memory-Mapped To Stream,MM2S),和通过数据流到内存映射(Stream To Memory-Mapped,S2MM)从外设写入到内存中。AXI DMA还支持在分散/聚集模式下,MM2S和S2MM路径上最多16个多通道的数据传输[67]。

    请点击输入图片描述

    Fig4. 8 Core functions of AXI DMA

    图4. 8 AXI DMA 核心功能

    DMA传输数据是不需要CPU进行控制,而是有一个专门的DMA控制器来控制着存储器之间的数据传送或者外部设备与存储器之间的数据交换流程。DMA控制器使用64-bit的AXI主接口,操作以两倍的CPU的时钟速率执行系统内存和PL外围设备之间的DMA数据传输。软件通过控制器的32位APB从接口访问这些寄存器。DMA控制器的基本工作流程如图4. 9所示。

    请点击输入图片描述

    图4. 9 DMAC基本工作流程

    Fig4. 9 DMAC basic workflow

    源存储设备向DMAC发送任务请求,DMAC在接收到请求后向CPU发出接管总线的权限,CPU把总线控制权释放给DMAC并且开始传输数据,使用FIFO作为一个中介,分别在源端口和目标端口进行读写操作。当数据传输完毕之后产生完成中断信号给CPU,把总线控制权限交还给CPU。

    分散/收集(SG)模式下DMA传输

    AXI DMA收集和发散模式下使用描述符进行控制数据传输,描述符由8个32-bit基本字和0或5个用户应用程序字组成。描述符将会支持64-bit地址和用户应用程序数据。每个数据帧的开头和结尾的标签都支持多个描述符。完成状态和完成时的中断状态也包括在内。

    在开始DMA操作之前,软件应用程序必须设置一个描述符链表。AXI DMA通过获取、处理并更新处理描述符。通过分析描述符,软件应用程序可以读取相关DMA传输的状态,通过在接收(S2MM)通道上获取用户信息来确定传输完成。有了这些信息,软件应用程序可以管理描述符和数据缓冲区。

    描述符SOF/EOF设置和AXI控制流之间的关系如图4. 10所示。SOF=1的描述符是数据包的开始,并为MM2S方向重置方向。图4. 11显示了描述符用户应用程序字段如何在AXI控制流上显示的示例。AXI DMA向目标设备插入一个标志来指示数据类型。

    请点击输入图片描述

    图4. 10描述符与MM2S流和控制流的关系

    Fig4. 10 Detail of Descriptor Relationship to MM2S Stream and Control Stream

    请点击输入图片描述

    图4. 11 MM2S控制流的用户应用字段和时间

    Fig4. 11 Example user application field / timing for MM2S control stream

    表4.3 MM2S描述符表内容具体解释

    Table 4.3 MM2S descriptor content specific explanation

    地址空间偏移

       

    名字

       

    描述

       

    00h

    04h

    08h

    0Ch

    10h

    14h

    18h

    1Ch

    20h

    24h

    28h

    2Ch

       

    MM2S下一个地址

    (地址)保留

    MM2S缓冲区地址

    (数据地址)保留

    保留

    保留

    控制

    状态

    MM2S应用0

    MM2S应用1

    MM2S应用2

    MM2S应用3

       

    MM2S指向下一描述符表的地址

    前面32-bit作为描述符表的地址保留

    MM2S中指向传输数据的地址

    前32-bit保留指向传输数据的地址

    保留

    保留

    控制

    状态

    MM2S应用程序0

    MM2S应用程序1

    MM2S应用程序2

    MM2S应用程序3

       

Tornado从入门到进阶 打造支持高并发的技术论坛

Tornado从入门到进阶 打造支持高并发的技术论坛

公司对系统的并发性要求越来越高,tornado可以针对高并发场景提供并发解决方案,成为很多大中型公司开发高并发/微服务项目的首选框架,在本课程中,我们从tornado的基础开发到项目实战进行系统讲解,覆盖理论与实践,完成本课程可以更透彻的理解异步IO并发编程思想,以及正确使用tornado进行并发编程,做一个支持高并发的技术论坛项目

 

用 tornado 做网站 (1)

从现在开始,做一个网站,当然,这个网站只能算是一个毛坯的,可能很简陋,但是网站的主要元素,它都会涉及到,读者通过此学习,能够了解网站的开发基本结构和内容,并且对前面的知识可以有综合应用。

基本结构

下面是一个网站的基本结构

技术图片

前端

这是一个不很严格的说法,但是在日常开发中,都这么说。在网站中,所谓前端就是指用浏览器打开之后看到的那部分,它是呈现网站传过来的信息的界面,也是用户和网站之间进行信息交互的界面。撰写前端,一般使用 HTML/CSS/JS,当然,非要用 Python 也不是不可以(例如上节中的例子,就没有用 HTML/CSS/JS),但这势必造成以后维护困难。

MVC 模式是一个非常好的软件架构模式,在网站开发中,也常常要求遵守这个模式。请阅读维基百科的解释:

MVC 模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

MVC 模式最早由 Trygve Reenskaug 在 1978 年提出,是施乐帕罗奥多研究中心(Xerox PARC)在 20 世纪 80 年代为程序语言 Smalltalk 发明的一种软件设计模式。MVC 模式的目的是实现一种动态的程式设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长分组:

  • (控制器 Controller)- 负责转发请求,对请求进行处理。
  • (视图 View) - 界面设计人员进行图形界面设计。 -(模型 Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

所谓“前端”,就对大概对应着 View 部分,之所以说是大概,因为 MVC 是站在一个软件系统的角度进行划分的,上图中的前后端,与其说是系统部分的划分,不如严格说是系统功能的划分。

前端所实现的功能主要有:

  • 呈现内容。这些内容是根据 url,由后端从数据库中提取出来的。前端将其按照一定的样式呈现出来。另外,有一些内容,不是后端数据库提供的,是写在前端的。
  • 用户与网站交互。现在的网站,这是必须的,比如用户登录。当用户在指定的输入框中输入信息之后,该信息就是被前端提交给后端,后端对这个信息进行处理之后,在一般情况下都要再反馈给前端一个处理结果,然后前端呈现给用户。

后端

这里所说的后端,对应着 MVC 中的 Controller 和 Model 的部分或者全部功能,因为在我们的图中,“后端”是一个狭隘的概念,没有把数据库放在其内。

不在这些术语上纠结。

在我们这里,后端就是用 Python 写的程序。主要任务就是根据需要处理由前端发过来的各种请求,根据请求的处理结果,一方面操作数据库(对数据库进行增删改查),另外一方面把请求的处理结果反馈给前端。

数据库

工作比较单一,就是面对后端的 Python 程序,任其增删改查。

关于 Python 如何操作数据库,在本教程的第贰季第柒章中已经有详细的叙述,请读者阅览。

一个基本框架

上节中,显示了一个只能显示一行字的网站,那个网站由于功能太单一,把所有的东西都写到一个文件中。在真正的工程开发中,如果那么做,虽然不是不可,但开发过程和后期维护会遇到麻烦,特别是不便于多人合作。

所以,要做一个基本框架。以后网站就在这个框架中开发。

建立一个目录,在这个目录中建立一些子目录和文件。

/.
|
handlers
|
methods
|
statics
|
templates
|
application.py
|
server.py
|
url.py

这个结构建立好,就摆开了一个做网站的架势。有了这个架势,后面的事情就是在这个基础上添加具体内容了。当然,还可以用另外一个更好听的名字,称之为设计。

依次说明上面的架势中每个目录和文件的作用(当然,这个作用是我规定的,读者如果愿意,也可以根据自己的意愿来任意设计):

  • handlers:我准备在这个文件夹中放前面所说的后端 Python 程序,主要处理来自前端的请求,并且操作数据库。
  • methods:这里准备放一些函数或者类,比如用的最多的读写数据库的函数,这些函数被 handlers 里面的程序使用。
  • statics:这里准备放一些静态文件,比如图片,css 和 javascript 文件等。
  • templates:这里放模板文件,都是以 html 为扩展名的,它们将直接面对用户。

另外,还有三个 Python 文件,依次写下如下内容。这些内容的功能,已经在上节中讲过,只是这里进行分门别类。

url.py 文件

#!/usr/bin/env Python
# coding=utf-8
"""
the url structure of website
"""

import sys     #utf-8,兼容汉字
reload(sys)
sys.setdefaultencoding("utf-8")

from handlers.index import IndexHandler    #假设已经有了

url = [
    (r‘/‘, IndexHandler),
]

  

url.py 文件主要是设置网站的目录结构。from handlers.index import IndexHandler,虽然在 handlers 文件夹还没有什么东西,为了演示如何建立网站的目录结构,假设在 handlers 文件夹里面已经有了一个文件 index.py,它里面还有一个类 IndexHandler。在 url.py 文件中,将其引用过来。

变量 url 指向一个列表,在列表中列出所有目录和对应的处理类。比如 (r‘/‘, IndexHandler),,就是约定网站根目录的处理类是 IndexHandler,即来自这个目录的 get() 或者 post() 请求,均有 IndexHandler 类中相应方法来处理。

如果还有别的目录,如法炮制。

application.py 文件

#!/usr/bin/env Python
# coding=utf-8

from url import url

import tornado.web
import os

settings = dict(
    template_path = os.path.join(os.path.dirname(__file__), "templates"),
    static_path = os.path.join(os.path.dirname(__file__), "statics")
    )

application = tornado.web.Application(
    handlers = url,
    **settings
    )

  

从内容中可以看出,这个文件完成了对网站系统的基本配置,建立网站的请求处理集合。

from url import url 是将 url.py 中设定的目录引用过来。

setting 引用了一个字典对象,里面约定了模板和静态文件的路径,即声明已经建立的文件夹"templates"和"statics"分别为模板目录和静态文件目录。

接下来的 application 就是一个请求处理集合对象。请注意 tornado.web.Application() 的参数设置:

tornado.web.Application(handlers=None, default_host=‘‘, transforms=None, **settings)

关于 settings 的设置,不仅仅是文件中的两个,还有其它,比如,如果填上 debug = True 就表示出于调试模式。调试模式的好处就在于有利于开发调试,但是,在正式部署的时候,最好不要用调试模式。其它更多的 settings 可以参看官方文档:tornado.web-RequestHandler and Application classes

server.py 文件

这个文件的作用是将 tornado 服务器运行起来,并且囊括前面两个文件中的对象属性设置。

#!/usr/bin/env Python
# coding=utf-8

import tornado.ioloop
import tornado.options
import tornado.httpserver

from application import application

from tornado.options import define, options

define("port", default = 8000, help = "run on the given port", type = int)

def main():
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)

    print "Development server is running at http://127.0.0.1:%s" % options.port
    print "Quit the server with Control-C"

    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

  

此文件中的内容,在上节已经介绍,不再赘述。

如此这般,就完成了网站架势的搭建。

后面要做的是向里面添加内容。

以上是关于dma技术如何支持系统并发的主要内容,如果未能解决你的问题,请参考以下文章

Tornado从入门到进阶 打造支持高并发的技术论坛

redis单线程如何支持高并发

如何实现支持数亿用户的长连消息系统 | Golang高并发案例

如何测试网站最大并发数

紧急求助 c#流不支持并发IO读写问题

如何在Linux系统下查看apache的并发连接数