![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux
文章平均质量分 75
杰深入学习计算机
已经入门,继续努力
展开
-
【Linux】Reactor模式
首先需要进行的就是套接字的创建、绑定和监听,因为是ET模式下的epoll服务器,因此监听套接字创建出来后需要将其设置为非阻塞。然后就可以实例化一个Reactor对象,并对其进行初始化,也就是创建epoll模型。紧接着需要为监听套接字定义一个EventItem结构,填充EventItem结构当中的各个字段,并将accepter回调设置为监听套接字的读回调方法。然后调用AddEvent函数将监听套接字及其需要关系的事件添加到Dispatcher当中,该过程包括将监听套接字注册到epoll模型中,以及建立监原创 2023-08-17 01:06:49 · 366 阅读 · 0 评论 -
【Linux】IO多路转接——epoll
其中文件描述符0、1、2是默认打开的,分别对应的是标准输入、标准输出和标准错误,3号文件描述符对应的是监听套接字,4号文件描述符对应的是服务器创建的epoll模型,5号和6号文件描述符对应的分别是正在访问服务器的两个客户端。在epoll中,对于每一个事件都会有一个对应的epitem结构体,红黑树和就绪队列当中的节点分别是基于epitem结构中的rbn成员和rdllink成员的,epitem结构当中的成员ffd记录的是指定的文件描述符值,event成员记录的就是该文件描述符对应的事件。原创 2023-08-16 00:25:43 · 235 阅读 · 0 评论 -
【Linux】IO多路转接——poll接口
当我们用telnet工具连接poll服务器后,poll服务器调用的poll函数在检测到监听套接字的读事件就绪后就会调用accept获取建立好的连接,并打印输出客户端的IP和端口号,此时客户端发来的数据也能够成功被poll服务器收到并进行打印输出。因为我们编写的poll服务器在调用poll函数时,将timeout的值设置成了-1,因此运行服务器后如果没有客户端发来连接请求,那么服务器就会在调用poll函数后进行阻塞等待。当服务器端检测到客户端退出后,也会关闭对应的连接,并将对应的套接字从fds数组当中清除。原创 2023-08-15 16:37:32 · 702 阅读 · 0 评论 -
【Linux】IO多路转接——select接口
select是系统提供的一个多路转接接口。select函数EBADFEINTREINVALENOMEM结构fd_set结构与sigset_t结构类似,fd_set本质也是一个位图,用位图中对应的位来表示要监视的文件描述符。调用select函数之前就需要用fd_set结构定义出对应的文件描述符集,然后将需要监视的文件描述符添加到文件描述符集当中,这个添加的过程本质就是在进行位操作,但是这个位操作不需要用户自己进行,系统提供了一组专门的接口,用于对fd_set类型的位图进行各种操作。结构。原创 2023-08-15 13:31:48 · 321 阅读 · 0 评论 -
【Linux】高级IO
什么是IO?I/O(input/output)也就是输入和输出,在著名的冯诺依曼体系结构当中,将数据从输入设备拷贝到内存就叫做输入,将数据从内存拷贝到输出设备就叫做输出。OS如何得知外设当中有数据可读取?输入就是操作系统将数据从外设拷贝到内存的过程,操作系统一定要通过某种方法得知特定外设上是否有数据就绪。需要注意的是,CPU不直接和外设打交道指的是在数据层面上,而外设其实是可以直接将某些控制信号发送给CPU的某些控制器的。OS如何处理从网卡中读取到的数据包?原创 2023-08-14 19:35:44 · 458 阅读 · 0 评论 -
【Linux】网络协议总结
网络协议总结原创 2023-08-13 14:45:05 · 1268 阅读 · 0 评论 -
【Linux】NAT技术——解决IP地址短缺手段
NAT(Network Address Translation,网络地址转换)技术,是解决IP地址不足的主要手段,并且能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。原创 2023-08-13 14:37:29 · 1346 阅读 · 0 评论 -
【Linux】ICMP协议——网络层
ICMP(Internet Control Message Protoco)Internet控制报文协议,用于在IP主机、路由器之间传递控制信息,是一个TCP/IP协议。ICMP协议的定位在TCP/IP四层模型中,网络协议栈自顶向下分为应用层、传输层、网络层和数据链路层。其中应用层最典型的协议有HTTP、HTTPS和DNS等,传输层最典型的协议有TCP和UDP,网络层最典型的协议就是IP,数据链路层最典型的协议就是MAC帧协议,但实际网络层还有两种协议叫做ICMP和IGMP。原创 2023-08-13 14:11:49 · 905 阅读 · 0 评论 -
【Linux】DNS协议——应用层
域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称,例如www.baidu.com。com:一级域名,表示这是一个工商企业域名。同级的还有.net(网络提供商)和.org(开源组织或非盈利组织)等。baidu:二级域名,一般对应的就是公司名。www:只是一种习惯用法,之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式,来表示主机支持的协议。域名解析过程在浏览器中输入url后,如果url当中包含域名,则需要进行域名解析。原创 2023-08-13 00:11:41 · 370 阅读 · 0 评论 -
【Linux】以太网协议——数据链路层
发起方构建ARP请求,以广播的方式发送给每一个主机。每台主机都能识别接收,然后根据MAC帧的帧类型字段将有效载荷交付给每个主机的ARP层。其他不相关主机立马根据目的IP,在自己的ARP协议内部丢弃ARP请求,只有目标主机会处理请求。ARP应答的过程主机B在应答时首先需要构建ARP应答。原创 2023-08-12 23:57:51 · 1437 阅读 · 0 评论 -
【Linux】IP协议——网络层
当IP数据包到达路由器时,路由器就会用该数据的目的IP地址,依次与路由表中的子网掩码 Genmask进行“按位与”操作,然后将结果与子网掩码对应的目的网络地址Destination进行比对,如果匹配则说明该数据包下一跳就应该跳去这个子网,此时就会将该数据包通过对应的发送接口Iface发出。如果将该数据包的目的IP地址与子网掩码进行“按位与”后,没有找到匹配的目的网络地址,此时路由器就会将这个数据包发送到默认路由,也就是路由表中目标网络地址中的default。可以看到默认路由对应的Flags是UG,实际就原创 2023-08-12 23:03:59 · 573 阅读 · 0 评论 -
【Linux】TCP协议的相关实验——深入理解
当客户端和服务器在进行时,如果客户端调用close函数关闭对应的文件描述符,此时客户端底层操作系统就会向服务器发起FIN请求,服务器收到该请求后会对其进行ACK响应。但如果当服务器收到客户端的FIN请求后,服务器端不调用close函数关闭对应的文件描述符,那么服务器就不会给客户端发送FIN请求,相当于只完成了四次挥手当中的前两次挥手,此时客户端和服务器的连接状态分别会变为FIN_WAIT_2和CLOSE_WAIT。原创 2023-08-10 23:11:17 · 234 阅读 · 0 评论 -
【Linux】TCP协议——传输层
TCP全称为“传输控制协议(Transmission Control Protocol)”,TCP协议是当今互联网当中使用最为广泛的传输层协议,没有之一。TCP协议被广泛应用,其根本原因就是提供了详尽的可靠性保证,基于TCP的上层应用非常多,比如HTTP、HTTPS、FTP、SSH等,甚至MySQL底层使用的也是TCP。原创 2023-08-10 20:52:40 · 343 阅读 · 0 评论 -
【Linux】UDP协议——传输层
在学习HTTP等时,为了便于理解,可以简单的认为HTTP协议是将请求和响应直接发送到了网络当中。但实际应用层需要先将数据交给传输层,由传输层对数据做进一步处理后再将数据继续向下进行交付,该过程贯穿整个网络协议栈,最终才能将数据发送到网络当中。为了方便理解,在学习传输层协议时也可以简单的认为传输层协议是将数据直接发送到了网络当中。原创 2023-08-10 16:30:45 · 986 阅读 · 0 评论 -
【Linux】HTTPS协议——应用层
加密就是把明文(要传输的信息) 进行一系列变换,生产密文。解密就是把密⽂再进⾏⼀系列变换,还原成明⽂在这个加密和解密的过程中,往往需要⼀个或者多个中间的数据,辅助进⾏这个过程,这样的数据称为密钥。加密解密到如今已经发展成⼀个独⽴的学科: 密码学.⽽密码学的奠基⼈,也正是计算机科学的祖师爷之⼀,艾伦·⻨席森·图灵对⽐我们另⼀位祖师爷冯诺依曼数字指纹(数据摘要),其基本原理是利⽤单向散列函数(Hash函数)对信息进⾏运算,⽣成⼀串固定⻓度的数字摘要。数字指纹并不是⼀种加密机制,但可以⽤来。原创 2023-08-10 15:13:56 · 284 阅读 · 0 评论 -
【Linux】HTTP协议——应用层
HTTP(Hyper Text Transfer Protocol)协议又叫做超文本传输协议,是一个简单的请求-响应协议,HTTP通常运行在TCP之上。在编写网络通信代码时,我们可以自己进行协议的定制,但实际有很多优秀的工程师早就已经写出了许多非常成熟的应用层协议,其中最典型的就是HTTP协议。原创 2023-08-08 21:27:13 · 295 阅读 · 0 评论 -
【Linux】认识“协议“&序列化和反序列化
之前的socket编程,都是在通过系统调用层面,如今我们来向上打通计算机网络。认识应用层的协议和序列化与反序列化。原创 2023-08-07 22:52:01 · 196 阅读 · 0 评论 -
【Linux】网络套接字知识点补足
本节只介绍基于IPv4的socket网络编程,sockaddr_in中的成员struct in_addr sin_addr表示32位 的IP 地址但是我们通常用点分十进制的字符串表示IP 地址,以下函数可以在字符串表示 和in_addr表示之间转换;其中inet_pton和inet_ntop不仅可以转换IPv4的in_addr,还可以转换IPv6的in6_addr,因此函数接口是void*addrptr。那么问题来了, 如果我们调用多次这个函数, 会有什么样的效果呢?这个建立连接的过程, 通常称为。原创 2023-08-06 18:18:24 · 420 阅读 · 0 评论 -
【Linux】socket编程&简单的日志打印
socket编程+日志打印原创 2023-08-06 16:33:00 · 322 阅读 · 0 评论 -
【Linux】守护进程
我们只需要在服务端的main函数命令行参数信息处理后调用此daemon函数即可:原创 2023-08-06 16:25:18 · 1556 阅读 · 0 评论 -
【Linux】网络编程套接字
我们通常也使用 “点分十进制” 的字符串表示IP地址,例如 180.101.50.172,用点分割的每一个数字表示一个字节,范围是 [0, 255]。公网IP:通常用来唯一地表示互联网中唯一的主机。在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址。源 IP 和目的 IP:对一个报文来讲,回答了从哪里来到哪里去的问题,最大的意义是指导一个报文该如何进行路径选择。原创 2023-08-03 19:35:39 · 417 阅读 · 0 评论 -
【Linux】网络基础——宏观认识计算机网络
一开始,计算机发明出来之后,一台计算机处理完的数据,数据会保存在软盘(物理),通过人之间的相互通信,把计算机A处理完的数据存储到软盘中,在将软盘插入计算机B中,从而两台计算机可以进行通信。由于存在人的因素,这样的通信时间必然会慢。比如, 我们有 "天朝特色" 的广域网, 也可以看做一个比较大的局域网.原创 2023-08-02 20:05:48 · 1370 阅读 · 0 评论 -
【Linux】多线程的补充
IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是。原创 2023-07-30 14:36:44 · 92 阅读 · 0 评论 -
【Linux】线程池
一种线程使用模式。线程过多会带来调度开销,进而影响局部性和整体性能。而线程池维护多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。原创 2023-07-29 23:56:39 · 125 阅读 · 0 评论 -
【Linux】POSIX信号量
2 认识POSIX信号量的接口参数:pshared:0表示线程间共享,非零表示进程间共享value:信号量初始值销毁信号量功能:等待信号量,会将信号量的值减1//P()功能:发布信号量,表示资源使用完毕,可以归还资源了。将信号量值加1。//V()原创 2023-07-29 12:36:14 · 101 阅读 · 0 评论 -
【Linux】多线程——生产者和消费者模型
存在多个消费者,消费者对于商品的一次消费是小量的而且时间是不确定的,供货商一次生产的商品是大量的且时间是确定的(在工人的上班时间才能操作机械生产)。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。其次,我们要明确的是,生产者生产数据的过程可能漫长且独立的,消费者消费(处理)数据的时候可能漫长且独立的。原创 2023-07-28 22:34:52 · 616 阅读 · 0 评论 -
【Linux】线程同步&条件变量
学校里有一间VIP自习室,只能让一个人在里面自习,为了保护使用者自习不被他人所打扰,配备以一把锁。张三是一个勤奋的学生,为了抢到VIP自习室的使用权,凌晨六点就已经到达了自习室开始了自习,并将自习室给锁上了。后面陆续过来的人就只能在自习室外面等待。某个时刻张三想要上厕所,为了不让别人在此期间进入自习室,出门的时候反手就把门给锁上了,所以在张三上厕所的期间,张三自习室里面自己的学习资料就可得到很好的保护起来。第一个阶段:多线程访问临界资源的加锁保护,做到了互斥张三上完厕所回来了,继续之前的自习活动。原创 2023-07-28 20:09:57 · 157 阅读 · 0 评论 -
【Linux】线程互斥
死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。一个函数在重入的情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数。同一个函数被不同的执行流调用,当前一个流程还没有执行完,就有其他的执行流再次进入,我们称之为重入。很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。发起函数调用时,其他线程已经锁定互斥量,或者存在其他线程同时申请互斥量,但没有。原创 2023-07-27 22:13:25 · 573 阅读 · 0 评论 -
【Linux】线程控制
答:一个进程中有着多个线程,而线程的创建是由pthread动态库来创建的,这么多的线程,也是需要管理的,所以pthread库来对它们进行管理!要管理,就要先描述,在组织!--》pthread库会在进程地址空间的共享区中对每一个进程创建一个类似的TCB的结构体!每一个线程的结构体,像“数组”似得聚合到共享区中,此时每一块的结构体的首地址就是每一个线程所对应的线程ID;在结构体内部,会有着自己线程栈的结构--因为栈的数据是由一组寄存器esp,ebp所维护的,在CPU调度不同的线程的时候,每一个线程所对应的esp原创 2023-07-24 14:32:06 · 97 阅读 · 0 评论 -
【Linux】多线程概念&理论
如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。进程的多个线程共享 同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还。编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。原创 2023-07-23 19:18:18 · 267 阅读 · 0 评论 -
【Linux】初识多线程&深入理解进程地址空间
【现象分析】原创 2023-07-23 16:57:53 · 213 阅读 · 0 评论 -
【Linux】信号补充与总结
mian函数正在调用insert函数向链表中插入节点。insert函数分为两步,刚刚执行完第一步时此时硬件发生中断,使进程切换到内核。中断处理完毕切换到用户态之前发现有信号未决,于是进入了信号的处理函数,信号的处理函数中同样有insert操作,于是向链表中插入了一个新节点。进行完毕后返回到main函数,按照上下文接着执行main函数中insert函数的第二步,令头节点指向node1。从图中可以看出,这时候出现了一个问题,明明我们想要两个节点插入,可实际仅仅插入了一个,node2丢失了,也就是我们平常说的。原创 2023-07-22 19:24:46 · 76 阅读 · 0 评论 -
【Linux】信号保存&信号处理
OS是进程的管理者!信号的处理是否是立即处理的?在合适的时候 -》那什么是合适的时候?信号如图不是被立即处理,那么信号是否需要暂时被进程记录下来?记录在哪里最合适呢?以上的问题将在本篇博客得到解释!原创 2023-07-22 15:12:50 · 248 阅读 · 0 评论 -
【Linux】信号产生
一个操作系统中,存在着多个进程,每个进程有着多种信号;所以操作系统要管理这些的信号--先描述,在组织!描述:普通型号1~31一共有31种,对于一个进程来说,预先已经知道对于这31种信号的处理方法,所以OS只需要告诉进程某个信号是否存在--只有两种状态--位图结构!组织:在学习进程时候,我们应该了解了每个进程都对应一个task_struct(PCB),在这个task_struct中,记录着进程的各种信息,各种信息中同样也包括信号的记录。。原创 2023-07-21 19:47:23 · 339 阅读 · 0 评论 -
【Linux】认识信号
每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有定 义 #define SIGINT 2编号34以上的是实时信号,本章只讨论编号34以下的信号,不讨论实时信号。原创 2023-07-21 16:13:12 · 43 阅读 · 0 评论 -
【Linux】system V IPC 消息队列和信号量
消息队列是在两个进程之间传递二进制块数据的一种简单有效的方式。每个数据块都有一个特定的类型,接收方可以,而不一定像管道和命名管道那样必须以先进先出的方式接收数据。原创 2023-07-20 20:11:50 · 61 阅读 · 0 评论 -
【Linux】system V IPC原理分析
之所以称为System V IPC是因为这三种IPC机制都是来源于System V Unix的实现。原创 2023-07-20 19:19:24 · 139 阅读 · 0 评论 -
【Linux】共享内存
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。原创 2023-07-20 13:36:48 · 1503 阅读 · 0 评论 -
命名管道使用示例
【实现步骤】原创 2023-07-10 21:44:51 · 310 阅读 · 0 评论 -
进程间通信方法——命名管道
匿名限制共同祖先不相关命名管道特殊类型的文件。原创 2023-07-10 12:09:00 · 186 阅读 · 0 评论