IO-操作系统

用户态和内核态

        现代操作系统,为了保护系统的安全,都会划分出内核空间和用户空间,或者我们经常说的内核态和用户态。简单来说,就是划分为内核态和用户态两个等 级,运行在用户态的进程大都是一些应用程序,能够访问的系统资源受到极大的限制。而运行在内核态的进程权限就非常大,可以"为所欲为”。
        这么做的目的是为了保护操作系统的底层资源,例如文件都要存在硬盘,但是如果用户编写的应用程序可以随意的操作硬盘的启动扇区,那就很容易把系统搞崩溃,分为内核态和用户态之后,用户态的应用程序就不能直接操作底层的硬件接口了,如果需要操作硬盘,比如存文件,那就必须经过内核态来协调。这样就可以对所有底层硬件的操作方式进行规范。
        有了用户态和内核态的划分后,应用程序就经常需要在用户态和内核态之间进行切换。例如程序要保存一个文件到硬盘,在程序执行的用户态,是不能直接操作磁盘的。只有切换到内核态才能真正去操作磁盘。
        内核态运行操作系统程序,操作硬件,用户态运行用户程序;当程序运行在 3 级特权级上时,可以称之为运行在用户态,当程序运行在 0 级特权级上时,称之为运行在内核态。
        特权级别
        R0、R1、R2 和 R3
        R0 相当于内核态,R3 相当于用户态;
        不同级别能够运行不同的指令集合;

IO

        IO,英文全称是 Input/Output,翻译过来就是输入/输出 。我们听得挺多,就是磁盘 IO,网络 IO 等。
        IO 即输入/输出,到底谁是输入?谁是输出?IO 如果脱离了主体,会让人疑惑。

 

计算机角度的 IO

        我们常说的输入输出,比较直观的意思就是计算机的输入输出 计算机就是主体
        计算机分成分为 5 个部分:运算器、控制器、存储器、输入设备、输出设备。

 

        输入设备是向计算机输入数据和信息的设备,键盘,鼠标都属于输入设备;输出设备是计算机硬件系统的终端设备,用于接收计算机数据的输出显示,一般显示器、打印机属于输出设备。

操作系统角度的 IO

        我们要将内存中的数据写入到磁盘的话,那么主体就是一个程序. 操作系统 负责计算机的资源管理和进程的调度,我们电脑上跑着的应用程序,其实是需要经过操作系统 ,才能做一些特殊操作,如 磁盘文件读写、内存的读写 等等。
        真正的 IO 是在操作系统 执行的。即应用程序的 IO 操作分为两种动作: IO 调用 和 IO 执行 。IO 调用是由进程(应用程序的运行态)发起,而 IO 执行是 操作系 统内核 的工作。
        应用程序发起的一次 IO 操作包含两个阶段:
                IO 调用:应用程序进程向操作系统内核发起调用。
                IO 执行:操作系统内核完成 IO 操作。

 

IO 模型

阻塞 IO

        假设应用程序的进程发起 IO 调用 ,但是如果 内核的数据还没准备好 的话,那应用程序进程就一直在阻塞等待 ,一直等到内核数据准备好了,从内核拷贝到用户空间,才返回成功提示,此次 IO 操作,称之为阻塞 IO
        阻塞 IO 比较经典的应用就是阻塞 socket、Java BIO 。阻塞 IO 的缺点就是:如果内核数据一直没准备好,那用户进程将一直阻塞,浪费性能 ,可以使用 非阻塞IO 优化。

非阻塞 IO

        如果内核数据还没准备好,可以先返回错误信息给用户进程,让它不需要等待,而是通过轮询的方式再来请求。这就是非阻塞 IO。 

 

非阻塞 IO 的流程如下:
  • 应用进程向操作系统内核,发起 recvfrom( )读取数据。
  • 操作系统内核数据没有准备好,立即返回 EWOULDBLOCK 错误码。
  • 应用程序进程轮询调用,继续向操作系统内核发起 recvfrom 读取数据。
  • 操作系统内核数据准备好了,从内核缓冲区拷贝到用户空间。
  • 完成调用,返回成功提示。
        recvfrom()用来接收远程主机经指定的 socket 传来的数据,并把数据传到由参数buf 指向的内存空间.
        非阻塞 IO 模型,简称 NIO ,Non-Blocking IO。它相对于阻塞 IO,虽然大幅提升了性能,但是它依然存在性能问题 ,即 频繁的轮询 ,导致频繁的系统调用,同样会消耗大量的 CPU 资源。可以考虑 IO 复用模型 ,去解决这个问题。

IO 多路复用

概述

        既然 NIO 无效的轮询会导致 CPU 资源消耗,我们等到内核数据准备好了,主动通知应用进程再去进行系统调用。
        IO 复用模型核心思路:系统给我们提供一类函数(如 select、poll、epoll),它们可以同时监控多个 fd 的操作,任何一个返回内核数据就绪,应用进程再发起 recvfrom 系统调用。
        文件描述符 fd(File Descriptor),它是计算机科学中的一个术语,形式上是一个非负整数。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

 IO 多路复用之 select

        应用进程通过调用 select 函数,可以同时监控多个 fd,在 select 函数监控的 fd中,只要有任何一个数据状态准备就绪了,select 函数就会返回可读状态,这时应用进程再发起 recvfrom( )请求去读取数据。
        非阻塞 IO 模型(NIO)中,需要 N(N>=1)次轮询系统调用,然而借助select 的 IO 多路复用模型,只需要发起一次询问就够了,大大优化了性能。
        但是呢,select 有几个缺点:
                监听的 IO 最大连接数有限,在 Linux 系统上一般为 1024。select 函数返回后,是通过遍历 fdset,找到就绪的描述符 fd。(仅知道有 I/O 事件发生,却不知是哪几个流,所以遍历所有流 ). 因为 存在连接数限制 ,所以后来又提出了 poll 。与 select 相比, poll 解决了 连接数限制问题 。但是,select 和 poll 一样,还是需要通过遍历文件描述符来获取已经就绪的 socket。如果同时连接的大量客户端,在一时刻可能只有极少处于就绪状态,伴随着监视的描述符数量的增长,
效率也会线性下降
        因此经典的多路复用模型 epoll 诞生。

IO 多路复用之 epoll

        为了解决 select/poll 存在的问题,多路复用模型 epoll 诞生,它采用事件驱动来实现,流程图如下:
        epoll 先通过 epoll_ctl()来注册一个 fd(文件描述符),一旦基于某个 fd 就绪时,内核会采用回调机制,迅速激活这个 fd,当进程调用 epoll_wait()时便得到通知。这里去掉了 遍历文件描述符 的坑爹操作,而是采用 监听事件回调 的机制。
        这就是 epoll 的亮点。
总结一下 select、poll、epoll 的区别
        epoll 明显优化了 IO 的执行效率,但在进程调用 epoll_wait()时,仍然可能被阻塞。能不能不用我老是去问你数据是否准备就绪,等我发出请求后,你数据准备好了通知我就行了,这就诞生了信号驱动 IO 模型

IO 模型之信号驱动模型

        信号驱动不再用主动询问的方式去确认数据是否就绪,而是向内核发送一个信号,然后应用用户进程可以去做别的事,不用阻塞。当内核数据准备好后,再通过信号通知应用进程,数据准备好后的可读状态。应用用户进程收到信号之后,立即调用 recvfrom,去读取数据。
        信号驱动 IO 模型,在应用进程发出信号后,是立即返回的,不会阻塞进程。它已经有异步操作的感觉了。但是上面的流程图,发现数据复制到应用缓冲的时候 ,应用进程还是阻塞的。回过头来看下,不管是 BIO,还是 NIO,还是信号驱动,在数据从内核复制到应用缓冲的时候,都是阻塞的。

         还有没有优化方案呢?AIO(真正的异步 IO)!

异步 IO(AIO asynchronous IO)

        前面讲的 BIO,NIO 和信号驱动,在数据从内核复制到应用缓冲的时候,都是阻塞 的,因此都不算是真正的异步。AIO 实现了 IO 全流程的非阻塞,就是应用进程发出系统调用后,是立即返回的,但是立即返回的不是处理结果,而是 表示提交成功类似的意思 。等内核数据准备好,将数据拷贝到用户进程缓冲区,发送信号通知用户进程 IO 操作执行完毕。
        流程如下:

 

        异步 IO 的优化思路很简单,只需要向内核发送一次请求,就可以完成数据状态询问和数据拷贝的所有操作,并且不用阻塞等待结果。日常开发中,有类似思想的业务场景:
        比如发起一笔批量转账,但是批量转账处理比较耗时,这时候后端可以先告知前端转账提交成功,等到结果处理完,再通知前端结果即可。
阻塞、非阻塞、同步、异步 IO 划分:

 

        一个通俗例子读懂 BIO、NIO、AIO
        同步阻塞(blocking-IO)简称 BIO
        同步非阻塞(non-blocking-IO)简称 NIO
        异步非阻塞(asynchronous-non-blocking-IO)简称 AIO
一个经典生活的例子:
BIO
        小明去吃同仁四季的椰子鸡,就这样在那里排队,等了一小时 ,轮到她了,然后才开始吃椰子鸡。
NIO
        小红也去同仁四季的椰子鸡,她一看要等挺久的,于是去逛会商场,每次逛一下, 就跑回来看看,是不是轮到她了 。于是最后她既购了物,又吃上椰子鸡了。
AIO
        小华一样,去吃椰子鸡,由于他是高级会员,所以店长说,你去商场随便逛会吧, 等下有位置,我立马打电话给你 。于是小华不用干巴巴坐着等,也不用每过一会儿就跑回来看有没有等到,最后也吃上了美味的椰子鸡
Java NIO 概述
        Java NIO(Non Blocking IO)是从 Java 1.4 版本开始引入的一个新的 IO API,可以替代标准的 Java IO API,NIO 支持面向缓冲区的、基于通道的 IO 操作。NIO 将以更加高效的方式进行文件的读写操作。

阻塞 IO(Blocking I/O BIO)

        通常在进行同步 I/O 操作时,如果读取数据,代码会阻塞直至有可供读取的数据。同样,写入调用将会阻塞直至数据能够写入。
        传统的 Server/Client 模式服务器会为每个客户端请求建立一个线程,由该线程单独负责处理一个客户请求。
        这种模式带来的一个问题就是线程数量的剧增,大量的线程会增大服务器的开销。大多数的实现为了避免这个问题,都采用了线程池模型,并设置线程池线程的最大数量,这由带来了新的问题,如果线程池中有 100 个线程,而有 100 个用户都在进行大文件下载,会导致第 101 个用户的请求无法及时处理,即便第 101 个用户只想请求一个几 KB 大小的页面。传统的 Server/Client 模式如下图所示:

非阻塞( non-blocking IO NIO) 

核心思想
        NIO 中非阻塞 I/O 调用不会被阻塞,核心是注册感兴趣的特定 I/O 事件,如可读数据到达,新的套接字连接等等,在发生特定事件时,系统再通知我们。
        NIO 中实现非阻塞 I/O 的核心对象就是 Selector.
        Selector 就是注册各种 I/O 事件地方,而且当我们感兴趣的事件发生时,就是这个对象告诉我们所发生的事件,如下图所示:
        从图中可以看出,当有读或写等任何注册的事件发生时,可以从 Selector 中获得相应的 SelectionKey,同时从 SelectionKey 中可以找到发生的事件和该事件所发生的具体的 SelectableChannel,以获得客户端发送过来的数据。
        非阻塞指的是 IO 事件本身不阻塞,但是获取 IO 事件的 select()方法是需要阻塞等待的.
        区别是 BIO 会阻塞在 IO 操作上,NIO 阻塞在事件获取上,没有事件就没有IO,从高层次看 IO 就不阻塞了.

NIO

Java NIO 核心部分组成
        Channels
        Buffers
        Selectors
        虽然 Java NIO 中除此之外还有很多类和组件,但 Channel,Buffer 和Selector 构成了核心的 API。其它组件,如 Pipe 和 FileLock,只不过是与三个核心组件共同使用的工具类。

Channel

        Channel,可以翻译成“通道”。Channel 和 IO 中的 Stream(流)是差不多一个等级的。只不过 Stream 是单向的,譬如:InputStream,OutputStream.
        而 Channel 是双向的,既可以用来进行读操作,又可以用来进行写操作。因为Channel 是全双工的,所以它可以比流更好地映射底层操作系统的 API。
        Channel 是一个对象,可以通过它读取和写入数据。所有数据都通过 Buffer对象来处理。你永远不会将字节直接写入通道中,相反,您是将数据写入包含一个或者多个字节的缓冲区。同样,您不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。
        NIO 中的 Channel 的主要实现有:
                FileChannel:从文件中读写数据
                DatagramChannel:通过 UDP 读写网络中的数据
                SocketChannel:通过 TCP 读写网络中的数据
                ServerSocketChannel:可以监听新进来的 TCP 连接

 

Buffer

        Java NIO 中的 Buffer 用于和 NIO 通道进行交互。数据是从通道读入缓冲区,从缓冲区写入到通道中的。
        缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成 NIO Buffer 对象,并提供了一组方法,用来方便的访问该块内存。
        NIO 中的关键的 Buffer 实现有:
                ByteBuffer
                CharBuffer
                ShortBuffer
                IntBuffer
                LongBuffer
                FloatBuffer
                DoubleBuffer
        对数据的读取/写入需要使用 buffer,buffer 本质就是一个数组
        常用方法:
                ByteBuffer.allocate(1024); 创建字节数据
                byteBuffer.flip(); 翻转这个缓冲区,读操作前使用
                byteBuffer.clear(); 清除缓存,写操作前使用
一个基本的 NIO 案例
FileInputStream in = new FileInputStream("E:/source.txt");
FileOutputStream out = new FileOutputStream("E:/dest.txt");
FileChannel inchannel = in.getChannel();
FileChannel outchannel = out.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
    while(inchannel.read(byteBuffer)!=-1){
        byteBuffer.flip();
        outchannel.write(byteBuffer);
        byteBuffer.clear();
    }

Selector

        Selector 一般称为选择器。它是 Java NIO 核心组件中的一个,用于检查一个或多个 NIO Channel(通道)的状态是否处于可读、可写。如此可以实现单线程管理多个 channels,也就是可以管理多个网络链接。
        使用 Selector 的好处在于:使用更少的线程来就可以来处理通道了,相比使用多个线程,避免了线程上下文切换带来的开销。

 

爱吃草的羊驼
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作系统---IO设备
Aaron_涛
09-14 3608
操作系统IO设备 IO设备 IO控制方式 1、程序中断控制方法 2、中断驱动方法 3、DMA 4、通道控制方法 举例子分析 IO子系统的层次结构 举个例子 操作系统IO设备 IO设备 按使用特性分类 人机交互类外设:键盘、鼠标 存储设备:磁盘 网络通讯设备:网络接口啥的 按传输速率分类 低速设备:每秒一个或几个字节,如键盘等等 中速设...
操作系统-IO-自整理笔记
04-18
操作系统_IO_笔记_考研
五种IO模型:操作系统五种IO模型大全
热门推荐
緑水長流*z
05-10 9万+
包含操作系统的应用与内核,CPU指令等级,内核空间、用户空间,内核用户;网络IO,磁盘IO,内存IO,异步/同步IO,阻塞/非阻塞IO,以及操作系统的五种IO模型,阻塞IO,非阻塞IO,复用IO(select、poll、epoll)、信号驱动IO模型,异步IO模型等...
初识IO-Link
weixin_46183720的博客
08-14 4421
关于工业自动化领域的国际化标准协议IO-Link在发展、应用、开发、标准文件、数据帧传输、物理接线等方面的概述,欢迎对该技术领域感兴趣的uu们一起交流一起进步。
[工业互联-4]:工业有线互联总线之IO-Link
文火冰糖(王文兵)的博客
11-06 5712
现代企业要求生产过程需要更快地适应不断变化的发展需求,这就要求各类测量传感器也能够具有更高的使用灵活性。因此,未来传感器的其中一大重要发展方向是能够在尽量短的时间之内进行远距离的参数设置等操作IO-link是通向执行器(可写设备)和传感器(只读设备)的最后一步,也被誉为自动化的最后一米技术,拥有“IO-link”通讯接口,可以使现场传感器可以更好地适应简易、快捷地修改参数设置的需要,在生产过程中您就会拥有极大的灵活性。
IO-Link—为工业物联网提供底层数据基础
工业通讯__HongKe的博客
08-14 2914
随着工业4.0的发展,工业物联网的更新迭代,对工业控制领域的要求越来越高。为了迎合物联网的需要,在底层传感器等设备领域需要有一些新技术的引入,提供大数据,从而推动物联网的发展。能简化工业控制领域底层设备连接,提供设备的大量数据信息的一种新技术——IO-Link,由此出现。 一、工业物联网需要工业做出哪些变革——IO-Link技术的出现 工业4.0的发展,使得可通过实际的智能制造和大数据处理的互相融合,生产线的实体可以通过物联网来进行远程操作,实现互联互通。那么,工业的物联网,需要工业做出哪些变革? 下
操作系统---IO控制方式
https://juejin.cn/user/4248168663101239/posts
05-22 3731
IO控制方式一. IO控制方式①. 程序直接控制方式(串行方式)②. 程序中断方式③. DMA(直接存储方式)④. 通道控制方式⑤. 外围处理机方式 一. IO控制方式 ①. 程序直接控制方式(串行方式) 最关键的部分在于CPU读取IO,如果IO设备状为未准备就绪,CPU就将反复读状,直到IO准备就绪。 由于IO设备的速度远远低于CPU速度,采用这种方式会导致CPU效率很低。 ②. 程序中断方式 为了减少程序直接控制方式下 CPU 的等待时间以及提高系统的并行程度,系统引入了
工业通讯 | IO-Link协议概述
Hongke_Tech的博客
12-24 6287
“传统工业自动化控制系统”的瓶颈 在以往传统的工业自动化控制系统中,传感器信号都是通过远程I/O或者扩展I/O,经过转换之后,才给到控制器,所以控制器没有直接访问到底层的传感器数据,实际上只访问到远程I/O或者扩展I/O,此时即使底层传感器有很多的数据信息,控制器也只能够获取到测量值,没有办法获取到传感器的参数、诊断以及更多的信息,所以无法实现传感器更多的功能, 使得传感器的潜力受到了束缚。因此,传统的信号传输方式有数据隔离的瓶颈。 除此之外,用户想要去维护或者修改传感器/执行器的参数时...
操作系统- IO多路复用
an13654067079的博客
01-06 1515
1 背景 1) IO多路复用是操作系统的原理,但是很多中间件的实现都是基于它去做的,IO多复用需要 知道整个链路是样子的,输入是什么,输出是什么 2) 了解IO多路复用作用的位置是哪里 2 数据流 ...
计算机操作系统-IO系统
qq_43535469的博客
01-21 2583
这里写自定义目录标题什么是IO设备IO系统什么是IO系统:IO系统的作用:什么是设备控制器什么是IO系统接口IO操作的三种方式 什么是IO设备 打印机,扫描仪,磁盘驱动器,磁带机等 IO系统 什么是IO系统: 用于管理IO设备和存储设备的系统 IO系统的作用: 管理用户提出的IO请求,提高IO速率, 方便用户使用IO设备 什么是设备控制器 每个IO设备一般都配备有相应的设备控制器 这是一种硬件设备 包含有若干个用于存放控制命令的寄存器和存放参数的寄存器 用户通过这些命令和参数可以控制外部设备 但是每一个控制
操作系统-四种IO模型
yitian881112的专栏
10-30 1400
操作系统中的4中常见的io模型
操作系统-操作系统-IO系统的功能、模型和接口.pptx
11-14
操作系统-操作系统-IO系统的功能、模型和接口.pptx
155-教学课件-操作系统内核IO子系统1
08-04
1. I/O 调度概念 2. 缓冲区与高速缓存 3. 设备分配 5.出错处理
操作系统原理IO管理.pptx
11-16
操作系统原理IO管理.pptx
JAVA IO-NIO 详解
04-24
传统的Java IO是阻塞式的,即当程序进行读写操作时,如果数据没有准备好,线程会阻塞等待,这在高并发场景下会导致线程资源的浪费。而NIO则是非阻塞式的,它允许线程在等待数据准备好的同时,继续执行其他任务,从而...
JAVAEE之多线程进阶(2)_ CAS概念、实现原理、ABA问题及解决方案
2301_80653026的博客
05-29 1417
CAS全称Compare and swap,字面意思:”比较并交换“,它是一条 CPU 并发原语,用于判断内存中某个值是否为预期值,如果是则更改为新的值,这个过程是原子的。全称 Compare and swap, 即 “比较并交换”. 相当于通过一个原子的操作, 同时完成 “读取内存, 比较是否相等, 修改内存” 这三个步骤. 本质上需要 CPU 指令的支撑。
【STM32学习】HAL库点灯学习
2301_78895982的博客
05-26 929
STM32基于HAL库流水灯实验_hel库安装教程中文版-CSDN博客t=N7T8。
operator <=> (spaceship operator)
janeqi1987的专栏
05-28 940
= 与!= 操作符为了检查是否相等,现在定义== 操作符就够了。当编译器找不到表达式的匹配声明a!=b 时,编译器会重写表达式并查找!(a==b)。若这不起作用,编译器也会尝试改变操作数的顺序,所以也会尝试!(b==a):a!=b,!(b==a)因此,对于TypeA 的a 和TypeB 的b,编译器将能够识别并编译a!= b若需要的话,可以这样做• 一个独立函数operator!• 一个独立函数operator==(TypeA, TypeB)
Java 异常处理中try-catch块、finally子句以及自定义异常的使用
最新发布
Itmastergo的博客
05-31 749
异常是程序运行过程中出现的非正常情况。Java 使用异常类(Exception 类及其子类)来表示这些异常情况。异常处理的核心思想是将正常的程序流程与异常处理流程分离开来,使代码更加清晰和可维护。Throwable 类:所有异常和错误的基类。Error 类:表示系统级的错误,程序通常无法处理,比如内存不足(OutOfMemoryError)。Exception 类:表示程序中可以处理的异常情况。RuntimeException 类。
mac rust io-uring
09-06
Mac Rust io-uring是一种在Mac操作系统上使用Rust语言进行开发的io-uring库。 io-uring是Linux内核中的一个新特性,它为应用程序提供了一种高性能、高效率的异步I/O操作方式。它通过使用事件驱动和无锁技术,实现了...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 【JAVA】学习java 运行环境配置 7829
  • 【JAVA】GUI编程 2877
  • 微服务架构(一) 2497
  • IO-操作系统 816
  • 【JAVA】Java进阶(一) 791

最新评论

  • 【JAVA】学习java 基本数据类型

    爪哇岛上的星期五: 你这写的也太好了吧,怪不得没人看表情包

大家在看

  • Python Selenium 详解:实现高效的UI自动化测试 1408
  • 机器学习解释(9)DALEX包,对比 163
  • 低代码快速开发平台(工作流引擎集成+表单,直接开发业务) 308
  • 配置 HTTP 代理 (HTTP proxy) 667
  • C++ 习题精选(2)

最新文章

  • 微服务架构(二)
  • 微服务架构(一)
  • Spring进阶
2023年25篇
2022年20篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司长沙至尊标王哪家好鹤岗百度爱采购横岗SEO按天扣费多少钱柳州网站推广公司德州seo哈密网站开发多少钱双龙百度爱采购多少钱成都如何制作网站报价桂林关键词按天计费哪家好沧州网站制作哪家好永新网站搭建推荐龙华阿里店铺运营价格济南网站建设推荐阳江模板网站建设推荐海口网络广告推广哪家好济南网站推广工具价格上饶seo优化哪家好汉中网页设计公司玉溪网站制作报价南昌关键词按天收费报价毕节网站搜索优化推荐延安网站设计模板公司怒江关键词按天计费价格开封网站搜索优化推荐永新网页设计汕头关键词排名推荐辽源seo网站推广哪家好广元网站改版哪家好黄石百度竞价报价亳州网络广告推广报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化