首页网站开发开发网站需要多久

开发网站需要多久

  • 昆明

  • 发表于

    2026年03月26日

  • 返回

在数字时代,网站已成为企业与个人不可或缺的在线门户。无论是初创公司急于推出其起初产品页面,还是大型企业计划对复杂电商平台进行迭代升级,“开发这个网站需要多长时间?”往往是项目启动时蕞直接、也蕞令人困惑的问题。这个问题恰恰没有一个放之四海而皆准的答案,因为它本质上是一个由多种动态变量构成的复杂函数。网站开发不是一个简单的线性过程,其周期从数周到数月甚至更长不等,具体时长取决于项目从规划到上线的每一个环节的深度与广度。本文将系统性地拆 网络IO相关

  • 阻塞和非阻塞
  • 同步和异步
  • Linux网络IO模型
  • 同步阻塞
  • 同步非阻塞
  • IO多路复用
  • select
  • poll
  • epoll
  • 信号驱动IO
  • 异步IO
  • > 注意:网络I/O的本质是socket的读取,socket在Linux系统被抽象为流,I/O可以理解为对流的操作。

    阻塞和非阻塞

    对于一次I/O访问(以read为例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,它会经历两个阶段:

  • 等待数据准备
  • 将数据从内核拷贝到进程中
  • 对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。

    阻塞与非阻塞的区别主要发生在等待数据准备阶段,以socket接收数据为例:

  • 阻塞:调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
  • 非阻塞:不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
  • 阻塞是指I/O操作需要有效完成后才返回到用户空间;而非阻塞是指I/O操作被调用后迅速返回给用户一个状态值,无需等到I/O操作有效完成。

    同步和异步

  • 同步:在发出一个调用时,在没有得到结果之前,该调用就不返回。
  • 异步:在发出一个调用后,这个调用就直接返回了,不管有没有返回结果。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用者不会迅速得到结果,而是被调用者通过状态来通知调用者,或者通过回调函数处理这个调用。
  • 在Linux系统中,同步和异步的主要区别就在于数据拷贝阶段是否需要进程自己参与:

  • 同步I/O:请求进程阻塞,直到I/O操作完成。
  • 异步I/O:请求进程不阻塞,I/O操作不阻塞进程。
  • Linux网络I/O模型

    Linux有5种可用的I/O模型:

  • 阻塞I/O
  • 非阻塞I/O
  • I/O多路复用
  • 信号驱动I/O
  • 异步I/O
  • 同步阻塞

    蕞常用的I/O模型,默认情况下所有的socket都是阻塞的。

    当用户进程调用系统函数如recvfrom时,如果内核中的数据还没准备好,那么用户进程就会一直阻塞等待,直到内核中的数据准备好,并且将数据从内核拷贝到用户进程内存,然后recvfrom函数返回成功指示,此时用户进程才会解除阻塞状态,处理数据。

    从调用recvfrom开始到它返回的整段时间内都是阻塞的,因此被称为同步阻塞I/O

    ![blocking-io](image/blocking-io.png)

    同步非阻塞

    在这种模型下,I/O操作不会阻塞请求进程,如果数据未准备好,会迅速返回一个错误,进程可以继续执行其他任务,但是需要不断轮询来查看数据是否准备就绪。

    ![nonblocking-io](image/nonblocking-io.png)

    虽然进程在等待数据阶段不再阻塞,可以执行其他任务,但是这种不断轮询的方式会占用大量CPU时间,效率低下。

    I/O多路复用

    I/O多路复用是一种同步I/O模型,实现一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;没有文件句柄就绪时会阻塞应用程序,交出CPU。多路是指网络连接,复用指的是同一个线程。Linux下实现I/O多路复用的系统调用主要有select、poll和epoll。

    当一个进程需要处理多个I/O操作时,如果采用阻塞I/O,那么进程可能会因为等待某个I/O操作而无法处理其他I/O操作;如果采用非阻塞I/O,那么进程需要不断轮询所有I/O操作的状态,这会浪费大量CPU资源。而I/O多路复用技术允许进程同时监视多个I/O操作,当其中任何一个I/O操作就绪时,进程就可以进行处理。

    I/O多路复用技术的核心思想是:使用一个系统调用(如select、poll、epoll)来监视多个I/O操作,当其中任何一个I/O操作就绪时,该系统调用就会返回,进程就可以进行处理。

    select

    基本原理:select函数监视的文件描述符分3类,分别是writefds、readfds和exceptfds。调用后select函数会阻塞,直到有描述符就绪(有数据可读、可写或者有异常),或者超时(timeout指定等待时间),函数返回。当select函数返回后,可以通过遍历fdset,来找到就绪的描述符。

    select目前几乎在所有的平台上支持,其良好的跨平台支持是它的一个优点。select的一个缺点在于单个进程能够监视的文件描述符的数量存在更大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。

    poll

    基本原理:poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。

    它没有更大连接数的限制,原因是它是基于链表来存储的,但是同样有以下缺点:

  • 大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。
  • poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。
  • epoll

    epoll是在Linux2.6内核中提出的,是之前select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关心的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。

    epoll支持水平触发和边缘触发,更大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就绪态,并且只会通知一次。还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知。

    epoll的优点:

  • 没有更大并发连接的限制,能打开的fd的上限远大于1024。
  • 效率提升,不是轮询的方式,不会随着fd数目的增加而效率下降。
  • 内存拷贝,利用mmap文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。
  • select、poll、epoll三者区别

    | | select | poll | epoll |

    | -

  • | -
  • | | |
  • | 操作方式 | 遍历 | 遍历 | 回调 |

    | 底层实现 | 数组 | 链表 | 红黑树 |

    | IO效率 | 每次调用都进行线性遍历,时间复杂度为O(n) | 每次调用都进行线性遍历,时间复杂度为O(n) | 事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪fd放到readyList里面,时间复杂度O(1) |

    | 更大连接 | 1024(x86)或2048(x64) | 无上限 | 无上限 |

    | fd拷贝 | 每次调用select,都需要把fd集合从用户态拷贝到内核态 | 每次调用poll,都需要把fd集合从用户态拷贝到内核态 | 调用epoll_ctl时拷贝进内核并保存,之后每次epoll_wait不拷贝 |

    信号驱动I/O

    在这种模型中,进程首先注册一个信号处理函数,然后迅速返回。当内核数据准备就绪时,会向进程发送一个SIGIO信号,进程在信号处理函数中调用I/O操作读取数据。

    ![signal-driven-io](image/signal-driven-io.png)

    信号驱动I/O模型下,进程在等待数据准备期间不会被阻塞,可以执行其他任务。当数据准备就绪时,内核通过信号通知进程,进程再处理数据。这种模型的优点在于,进程不需要轮询等待数据,只需要在收到信号后处理数据即可。

    异步I/O

    异步I/O模型是蕞理想的I/O模型,它不会阻塞用户进程,也不会因为等待数据而占用CPU时间。当用户进程发起一个I/O操作后,迅速返回,可以继续执行其他任务。当内核完成整个I/O操作(包括数据准备和数据拷贝)后,会通知用户进程。

    ![asynchronous-io](image/asynchronous-io.png)

    异步I/O模型下,用户进程不需要等待数据准备,也不需要等待数据拷贝,只需要发起I/O操作,然后继续执行其他任务。当I/O操作完成后,内核会通知用户进程。

    与信号驱动I/O相比,异步I/O的信号是通知我们I/O操作完成,而信号驱动I/O的信号是通知我们数据已经准备就绪,可以开始I/O操作。

    参考资料

  • 《UNIX网络编程:卷一》
  • 全链路互联网服务商

    为企业客户提供全方位的互联网品牌建设与网络营销落地整合方案!

  • 网站建设

    融合创新设计与前沿技术,确保网站美观大气且功能强大,全方位满足需求,助力企业提升品牌形象,拓宽市场渠道

    企业网站建设营销网站建设学校网站建设外贸网站建设商城网站建设手机网站建设
  • 小程序开发

    无需下载安装,即用即走,节省手机空间,支持跨平台使用,快速触达海量用户,助力企业快速布局移动端,提升品牌影响力与用户体验。

    小程序开发小程序定制小程序搭建
  • 加油站管理系统

    集油站入驻、附近油站定位、快速一键加油、自动生成报表、员工交班、小票打印、语音播报于一体,助力加油站高效运营,降本增效

    加油源码加油系统加油站管理系统
  • 多用户商城管理系统

    聚会商品管理、订单处理、会员营销、物流跟踪、支付结算、商家加盟、数据分析等功能,轻松实现线上线下融合,助力商家高效运营

    商城系统商城源码多用户商城系统