0
点赞
收藏
分享

微信扫一扫

WebServer面试问答

WebServer概览

  • epoll ET模式(边缘触发模式)
  • mysql数据库
  • 连接池
  • 线程池
  • 日志
  • 定时器
  • Reactor模式
  • http
  • 大端序小端序
  • 读写缓冲区

大概流程

主线程监听连接

主线程让epoll监听活跃的文件描述符

处理完之后开工作线程

工作线程任务(读写是分开的,不一定是同一个线程操作)

读写缓冲区是数据httpconn的,httpconn是一个类,一个用户实例,所以直接独立了。

  • read客户端数据(用非阻塞IO)
    • 有个读缓冲,每个连接独享一个读和写缓冲,有个65K缓冲区,保证能一次读完,读不完就扩容
  • 以下业务逻辑
    • 先去看读缓冲有没有数据
    • 解析HTTP
    • 生成响应数据
    • 封装响应数据回传

Reactor没有分离读和写业务逻辑,Proactor才可以实现封装业务逻辑

性能相关

半同步半反应堆模式

  • 一种高效的并发模式(半同步/半异步模式)的一种实现方式,另一种并发模式是领导之/追随者模式。
  • 并发模式指的是I/O处理单元和多个逻辑单元之间的协调完成任务的方法。
  • 这里的同步和异步与I/O模型中的同步与异步不同:
    • I/O模型:内核向应用程序通知的是就绪事件还是完成事件
    • 并发模型:程序执行顺序是否按照代码顺序执行。中断‘信号。

线程池如何实现

  • 主线程轮流选取子线程
  • 通过共享队列+互斥量来同步
  • 通过信号量来通信
  • 同步问题

线程数量

  • CPU密集型:线程数和CPU数目相同即可
  • I/O密集型:线程数目可以大一点:(线程等待时间/线程CPU时间+1)*CPU数目

多进程模型

  • 为每个客户端分配一个进程来处理请求
  • 服务器的主进程负责监听客户的连接,一旦与客户端连接完成,accept()函数就会返回一个"已连接Socket",这是就通过fork()函数创建一个子进程,实际上就把父进程所有相关的东西都复制一根,包括文件描述符、内存地址空间、程序计数器、执行的代码等。
    • 根据返回值来区分是父进程还是子进程,如果返回值是0,则是子进程;如果返回值是其他的整数就是父进程。
    • 因为子进程会复制父进程的文件描述符,于是就可以直接使用”已连接Socket“和客户端通信了。
    • 子进程不需要关系”监听Socket“,只需要关心”已连接Socket“;父进程则相反,将客户服务交给子进程来处理,因此父进程不需要关心”已连接Socket“,只需要关心”监听Socket“。
  • 可能出现的问题
    • 当子进程退出时,实际上内核里还会保留该进程的一些信息,也是会占用内存的,如果不做好回收工作,就会变成僵尸进程,随着僵尸进程越来越多,会慢慢耗尽系统资源。
    • 父进程来负责回收子进程占用的资源,分别可以调用wait()waitpid()函数。
    • 进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器状态等内核空间的资源。

多线程模型

大端序小端序

网络字节是大端字节序

大端序:最高有效位存于最低内存地址处,最低有效位存于最高内存处,网络字节序是大端字节序,人们常用数字读取方式也是大端(内存从左往右排序)

小端序:最高有效位存于最高内存地址,最低有效位存于最低内存处

字节序的单位是字节,所以string(char为组织结构)是没有大小端之分的

从主机字节序到网络字节序的转换函数:htonl() htons();从网络字节序到主机字节学的转换函数:ntohs() ntohl()

SQL连接池

在实际生产中,数据库连接是一种关键的、有限的、昂贵的资源,怎样清空不活跃的用户是需要解决的问题。数据库连接池初始化后需要创建一定量数据库连接放到连接池中,数据库连接池有最大连接数与最小连接数。

不论数据库连接是否使用,连接池都将一直保持最小连接数的连接。连接池达到最大数据库连接数量时,再有新的连接则会被加入到等待队列中。

设计思路

容器

对连续内存没有要求,要求头尾插入删除时间复杂度低即可。list容器即符合要求,所以通过list容器存放空闲的连接。

线程锁

对容器进行读取放回操作时,需要加锁保证安全性。

单例模式

由于所有连接需要被统一管理,所以维护一个连接池对象,这个对象采用单例模式实现。

获取释放连接

获取链接

  • 容器有空闲连接,直接用
  • 容器无空闲
    • 未达上限,自己创建
    • 达上限,报错打回等待

释放连接

  • 放回容器
  • 目前暂无较好的销毁连接策略

销毁对象池

  • 关闭销毁池中连接
  • 释放连接池对象
  • 完成释放
举报

相关推荐

0 条评论