Linux高性能服务器编程 4. 高级 I/O 函数
4. 高级 I/O 函数1.文件描述符文件描述符(File Descriptor, FD)是操作系统中用于访问文件的一个抽象概念。它是一个非负整数,通常由操作系统分配,用来标识被打开的文件或输入输出资源(如管道、网络连接等)。文件描述符在操作系统和应用程序之间充当桥梁,允许程序通过文件描述符来读取、写入文件或进行其他I/O操作。 1.文件描述符的类型文件描述符通常分为三类标准描述符: 标准输入(Standard Input,FD 0): 默认情况下与键盘关联,通常用于从用户那里接收输入数据。 标准输出(Standard Output,FD 1): 默认情况下与终端窗口关联,通常用于向用户显示输出数据。 标准错误(Standard Error,FD 2): 默认情况下也与终端窗口关联,但通常用于显示错误消息或诊断信息。 2.文件描述符的使用在UNIX和类UNIX操作系统中,文件描述符用于各种I/O操作,包括: 打开文件:open() 系统调用返回一个文件描述符,表示已打开的文件。 读取文件:read()...
Linux高性能服务器编程 6. 高性能服务器程序框架
6. 高性能服务器程序框架**《Linux 高性能服务器编程》**一书中,把这一章节作为全书的核心,同时作为后续章节的总览。这也意味着我们在经历了前置知识的学习后,正式进入了 Web 服务器项目的核心部分的学习 按照服务器程序的一般原理,服务器可以解构为三个主要模块: **I/O处理单元:**四种I/O模型,两种高效事件处理模式。 **逻辑单元:**两种高效并发模式;逻辑处理方式——有限状态机。 **存储单元:**服务器程序的可选模块,其内容与网络编程本身无关。 1.服务器模型C/S...
Linux高性能服务器编程 多进程并发服务器
多进程并发服务器基于该视频完成 11-多进程并发服务器思路分析_哔哩哔哩_bilibili 通过的是非阻塞忙轮询的方式实现的 和阻塞等待的区别就是,阻塞是真的阻塞了,而这个方式是一直在问有没有请求有没有请求 1.核心思路&功能实现一个服务器可以连接多个客户端,每当accept函数等待到客户端进行连接时 就创建一个子进程; 核心思路:让accept循环阻塞等待客户端,每当有客户端连接时就fork子进程,让子进程去和客户端进行通信,父进程用于监听并使用信号捕捉回收子进程;(子进程关闭用于监听的套接字lfd,父进程关闭用于通信的cfd) **功能:**客户端输入小写字符串,服务器转成大写返回给客户端 2.代码实现warp.h12345678910111213141516171819202122232425262728293031323334353637383940414243#ifndef __WRAP_H_#define...
Linux高性能服务器编程 多线程并发服务器
多线程并发服务器基于该视频完成 12-多线程并发服务器分析_哔哩哔哩_bilibili 通过的是非阻塞忙轮询的方式实现的 和阻塞等待的区别就是,阻塞是真的阻塞了,而这个方式是一直在问有没有请求有没有请求 linux | c | 多进程并发服务器实现-CSDN博客 可以先看看这篇博客,思路和功能都一样 1.核心思路&功能实现一个服务器可以连接多个客户端,每当accept函数等待到客户端进行连接时 就创建一个子进程; 核心思路:让accept循环阻塞等待客户端,每当有客户端连接时就fork子进程,让子进程去和客户端进行通信,父进程用于监听并使用信号捕捉回收子进程;(子进程关闭用于监听的套接字lfd,父进程关闭用于通信的cfd) **功能:**客户端输入小写字符串,服务器转成大写返回给客户端 2.代码实现warp.h12345678910111213141516171819202122232425262728293031323334353637383940414243#ifndef __WRAP_H_#define...
Linux高性能服务器编程 1.IP协议
1. IP协议TCP / IP 模型主要分为以下四层:应用层、传输层、网络层、网络接口层。 IP 协议 (IPv4)IPv4 的首部长度通常为 20B,除非含有可变长选项的部分。 IP 协议为上层协议提供无状态、无连接、不可靠的服务。 无状态(stateless)指 IP 通信双方不同步传输状态信息。这种服务的最大缺点是无法处理乱序和重复的 IP 数据报。优势是简单、高效。 无连接(connectionless)是指 IP 通信双方都不长久的维持对方的任何信息。上层协议每次发送数据的时候,都必须明确指定对方的 IP 地址。 不可靠是指 IP 协议不能保证 IP 数据报准确地到达接收端,只承诺尽最大努力交付,但会返回一个 ICMP 差错报文(超时、终点不可达、源点抑制、参数问题等等) 头部结构 主要字段 标识(identification)占 16 位,用来产生 IP 数据报的标识。它是一个计数器,每产生一个数据报就加1,并赋值给标识字段。但这个 “标识”...
Linux高性能服务器编程 2. TCP协议
2. TCP协议传输层的协议主要有两个:TCP 和 UDP 协议。TCP 协议相对于 [UDP 协议](https://so.csdn.net/so/search?q=UDP 协议&spm=1001.2101.3001.7020)的主要特点是:面向连接、面向字节流和可靠传输。 使用 TCP 通信的双方都必须建立连接,并分配必要的内核资源。TCP 连接是全双工的,双方的数据读写可以通过同一个连接进行。TCP 连接是一对一的。 [TCP 协议](https://so.csdn.net/so/search?q=TCP 协议&spm=1001.2101.3001.7020)采用发送应答机制,发送端发送的每个 TCP 报文段都必须得到接收方的应答,才认为传输成功。且采用超时重传机制,发送方在发出一个 TCP 报文段后启动定时器,定时时间内未收到应答,将重发。 由于 TCP 报文段会被封装成 IP 数据报发送,而 IP 数据报到达接收端可能会乱序、重复,因此 TCP 协议还会对接收到的 TCP 报文段重排、整理,再交付给应用层。 UDP 协议则和 IP...
Linux高性能服务器编程 3.Linux网络编程基础API
3. Linux网络编程基础API 1.主机字节序和网络字节序现代 CPU 的累加器一次都能装载(至少)4个字节(对于 32 位的机器),即一个 int 类型。那么这4个字节在内存中排列的顺序将影响它被累加器装载的整数值,这就是字节序问题。 字节存储顺序主要分为大端序(Big-endian)和小端序(Little-endian),区别如下 Big-endian:高位字节存入低地址,低位字节存入高地址 Little-endian:低位字节存入低地址,高位字节存入高地址 例如,将12345678h写入1000h开始的内存中,以大端序和小端序模式存放结果如下: 现代 PC 大多采用小端字节序,因此小端字节序又称为主机字节序; 而在两台不同字节序的主机之间传递数据时,发送端总是把要发送的数据转化成大端字节序数据后再发送,因此大端字节序也被称为网络字节序。 网络字节顺序是TCP / IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节顺序采用大端排序方式。 “大同小异 ”:大端字节序的...
Ubuntu使用telnet连接时出现的错误 没有到主机的路由 能ping通但是还是报错
Ubuntu使用telnet连接时出现的错误:没有到主机的路由(能ping通但是还是报错)错误如下: 说明: A机:192.168.120.138 B机:192.168.120.139 开启的服务端口是1234 解决方法: 1.检查是不是能ping通如果ping不通,那就先解决这个问题 2.防火墙的问题以下操作要在b机上运行,即开启服务的那个主机 列出所有规则: 1firewall-cmd --list-all 这里看到的只有22和8000端口,刚刚使用ufw开放的端口没有。于是使用相关命令开放端口(1234替换成想指定的端口): 如果是udp也要换成udp而不是用tcp 1firewall-cmd --zone=public --add-port=1234/tcp --permanent 执行完添加端口命令后,一定要重启防火墙才能生效,重启命令如下: 1firewall-cmd...
MIT 6.S081 第二章问题记录
第二章问题记录1.CS模式由于客户/服务器(Client/Server)模式,具有非常多的优点,故在单机微内核操作系统中几乎无一例外地都采用客户/服务器模式,将操作系统中最基本的部分放入内核中,而把操作系统的绝大部分功能都放在微内核外面的一组服务器(进程)中实现。 2.Xv6使用页表(由硬件实现)为每个进程提供自己的地址空间。3.操作系统中有哪些操作是由硬件实现的? 内存管理: 虚拟内存管理:通过内存管理单元(MMU),硬件实现虚拟地址到物理地址的转换,支持页表机制来管理进程的内存空间。 页错误处理:当一个进程试图访问未映射的页面时,硬件通过触发页错误中断来通知操作系统进行处理。 页表和虚拟地址到物理地址的转换 中断处理: 外部设备中断:硬件中断控制器(如 APIC)允许外部设备(如键盘、鼠标、磁盘等)向 CPU 发出中断信号,操作系统可以在中断发生时中断当前执行任务,转而处理外部设备的请求。 软件中断和 syscall:CPU...
MySQL笔记:第06章_多表查询
MySQL笔记:第06章_多表查询第06章_多表查询多表查询概述 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。 为什么不把多张表合成一张表?答:多张表合成一张表会导致很多信息的冗余!将不必要的冗余信息从磁盘导入内存将导致很多的磁盘IO。 1.一个案例引发的多表连接1.1 案例说明从多个表中获取数据: 123#案例:查询员工的姓名及其部门名称SELECT last_name, department_nameFROM employees, departments; 查询结果(从上图可以看到:每个员工都与每个部门匹配了一遍,此错误称为笛卡尔积的错误): 12345678910# 2889行结果+-----------+----------------------+| last_name | department_name...













