开发成长之路(13)-- Linux网络服务端编程(通识篇)

2021-09-18 11:01:47 浏览数 (1)


文章目录

    • 文件I/O
    • 进程
    • 线程
    • SOCKET网络编程
    • epoll
    • 线程池
    • 数据库专区

文件I/O

引用一句经典的话:“UNIX下一切皆文件”。

文件是一种抽象机制,它提供了一种方式用来存储信息以及在后面进行读取。

在创建一个文件后,它会给文件一个命名。当进程终止时,文件会继续存在,并且其他进程可以使用名称访问该文件。

在Linux下,用open函数可以用来打开或创建一个文件:

代码语言:javascript复制
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);

//一般用fd接收返回值
//返回值 :成功返回重新分配的文件描述符,出错则返回-1并设置errno

关于文件I/O部分内容已有收录,篇幅还行:

温故Linux后端编程(一):文件I/O与文件系统


进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

为了使程序在多道程序环境下能够并发执行,并对并发执行的程序加以控制和描述,引入进程的概念。

进程部分的内容也是实在的多啊,还好我也已经有收录了:

温故Linux后端编程(二):进程·全家桶

长吧,这可是我这两年来不断修正打磨出来的。


线程

摘要:在多处理器共享内存的架构中(如:对称多处理系统SMP),线程可以用于实现程序的并行性。历史上硬件销售商实现了各种私有版本的多线程库,使得软件开发者不得不关心它的移植性。对于UNIX系统,IEEE POSIX 1003.1标准定义了一个C语言多线程编程接口。依附于该标准的实现被称为POSIX theads 或 Pthreads。

该教程介绍了Pthreads的概念、动机和设计思想。内容包含了Pthreads API主要的三大类函数:线程管理(Thread Managment)、互斥量(Mutex Variables)和条件变量(Condition Variables)。向刚开始学习Pthreads的程序员提供了演示例程。

适于:刚开始学习使用线程实现并行程序设计;对于C并行程序设计有基本了解。

什么是线程?

官方话就是:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

1、提高程序的并发性

2、开销小,不需要重新分配内存

3、通信和共享数据方便

线程部分也是极长的,不过我也整理过了,还好、

温故Linux后端编程(三):线程那些事儿


SOCKET网络编程

咱也不废话,直接上流程图。

socket函数:

代码语言:javascript复制
//socket函数:

int socket(int domain,int type,int protocol);

//参数释义:
domain:
AF_INET:用来产生IPV4 - socket 的协议,使用TCP或UDP来传输,用IPV4的地址
AF_INET6:和上面的差不多,这个是IPV6的
AF_UNIX:本地协议,用在Unix和Linux系统上,一般都是服务端和客户端在同一台机器上时使用。

type:
SOCK_STREAM:这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,是用TCP协议来传输的。
SOCK_DGRAM:这个协议是无连接的,固定长度的连接调用。该协议是不可靠的,使用UDP来进行它的连接。
SOCK_SEQPACKET:这个协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。(注(1))必须把整个包完整的接收才能够进行读取。
SOCK_RAW:这个socket类型提供单一的网络访问

protocol:0,默认协议

返回值:
	成功返回一个文件描述符,失败返回-1,设置errno。

socket的内容依旧是多,这么说吧,除了开头那个文件I/O,后面的知识点都是大篇幅的。

温故Linux后端编程(五):SOCKET网络编程


epoll

epoll接口是为解决Linux内核处理大量文件描述符而提出的方案。该接口属于Linux下多路I/O复用接口中select/poll的增强。其经常应用于Linux下高并发服务型程序,特别是在大量并发连接中只有少部分连接处于活跃下的情况 (通常是这种情况),在该情况下能显著的提高程序的CPU利用率。

代码语言:javascript复制
(1)epoll在Linux内核中构建了一个文件系统,该文件系统采用红黑树来构建,红黑树在增加和删除上面的效率极高,因此是epoll高效的原因之一。
有兴趣可以百度红黑树了解,但在这里你只需知道其算法效率超高即可。
(2)epoll提供了两种触发模式,水平触发(LT)和边沿触发(ET)。当然,涉及到I/O操作也必然会有阻塞和非阻塞两种方案。
目前效率相对较高的是 epoll ET 非阻塞I/O 模型,在具体情况下应该合理选用当前情形中最优的搭配方案。
(3)epoll所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于1024,举个例子,在1GB内存的机器上大约是10万左右

详情整理:温故Linux后端编程(六):深入了解epoll模型


线程池

线程池,好东西啊,它有一池子的线程,所以叫线程池。

为什么说它是好东西呢?有的人会觉得,那一池子线程,放在那边又不用,不浪费资源?

其实这笔账很好算的:假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。

当 T1 T3 > T2 && 这种线程被多次调度的时候,你还会觉得浪费资源吗?况且线程池内部又不是缺乏管理,相反,线程池内部管理很严格,吃白饭的线程很难有立足之地,用不上就裁员呗。

多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。

线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。

线程池不仅调整T1,T3产生的时间段,而且它还显著减少了创建线程的数目

看一个例子:

假设一个服务器一天要处理50000个请求,并且每个请求需要一个单独的线程完成。在线程池中,线程数一般是固定的,所以产生线程总数不会超过线程池中线程的数目,而如果服务器不利用线程池来处理这些请求则线程总数为50000。一般线程池大小是远小于50000。所以利用线程池的服务器程序不会为了创建50000而在处理请求时浪费时间,从而提高效率。

【C 】勉强能看的线程池详解


数据库专区

MySQL见闻录 - 入门之旅

0 人点赞