深入理解计算机系统(第三版)/ CSAPP 杂谈,第12章:并发编程

  • 基于进程的并发编程:accept 后 fork。优点:虚拟空间独立,不容易出 bug;缺点:创建进程开销大。需要处理 SIGCHLD 来回收僵死子进程。

  • 基于 I/O 多路复用:传递待读描述符集合给 select 函数,以此响应所有描述符的 I/O 事件。select 会修改描述符集合,改为可读子集返回,所以每次使用都要重新更新待读描述符集合。

  • 基于 I/O 多路复用的并发事件驱动:保存所有已连接的客户端,每次循环检测监听套接字,然后更新客户端集合,并执行相应操作

  • 状态机就是一组状态(state),输入事件(input event),和转移(transition)

  • 基于线程的并发:accept 后创建线程处理。但容易引入竞争(race)。

版权所有,转载请注明出处:
https://sickworm.com/?p=1670

深入理解计算机系统(第三版)/ CSAPP 杂谈,第11章:网络编程

  • IP 协议提供基本的命名方法和递送机制
  • UDP 稍微扩展了 IP 协议(增加端口概念),使其从原来的主机间传送变成可以在进程间传送(通过端口区分不同进程),通讯粒度从主机变为进程
  • TCP 基于 IP 协议提供进程间可靠通信
  • 网络通信总是使用大端传输(网络字节序=大端)

  • Linux,Mac,Windows 都是使用 socket 通信。

int socket(int domain, int type, int protocol) // 创建套接字描述符,成功返回非负数描述符,失败为-1
int connect(int clientfd, const struct sockaddr *addr, socklen_t addrlen) // 连接服务器,成功为 0,失败为 -1

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) // 连接客户端,成功为 0,失败为 -1
int listen(int sockfd, int backlog) // 等待客户端连接。此函数将主动套接字转化为监听套接字,成功为 0,失败为 -1
int accept(int listenfd, struct sockaddr *addr, socklen_t addrlen) // 等待来自客户端的连接,成功返回非负数连接描述符,失败为-1

int getaddrinfo(const char* host, const char* service,
    const struct addrinfo* hints, struct addrinfo** result)
// 用于主机名,主机地址,服务名,端口号的字符串表示转换成 addrinfo
// addrinfo 是一个列表,客户端调用 getaddrinfo 后需要遍历 result 这个列表,直到某个元素可以执行 socket 和 connect 成功
// host 可以是域名也可以是 ip 地址
// service 可以是服务名(http)或端口号
// hints 用于设置一些参数以便对返回的 result 列表做更好的控制

int getnameinfo(const struct sockaddr *sa, socklen_t salen,
    char* host, size_t hostlen,
    char *service, size_t servlen, int flags)
// 用于 sockaddr 转换成 主机名,主机地址,服务名,端口号的字符串表示

// 简化版(非 Linux 内核内置)
int open_clientfd(char *hostname, char *port) // 客户端连接服务器
int open_listenfd(char* port) // 服务器监听端口
  • HTTP 请求由 request line,request header,空行 组成。
GET / HTTP/1.1  // method URI version
Host: www.aol.com

  • HTTP 有 GET,POST,OPTIONS,HEAD,PUT,DELETE,TRACE

  • HTTP 响应由 response line(1),response header,空行,response body,空行组成

HTTP/1.0 200 OK  // version status-code status-message
MINE-Version: 1.0
Date: Mon, 8 Jan 2010 4:59:42 GMT
Server: Apache-Coyote/1.1
Content-Type: text/html
Content-Length: 42092

<html>
...
</html>
  • CGI,Common Gateway Interface,通用网关接口
  • CGI 收到客户端请求后:解析参数,fork 子进程,子进程执行请求路径上的程序,使用 dup2 将标准输出重定向到客户端的已连接描述符。

版权所有,转载请注明出处:
https://sickworm.com/?p=1665