自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

菜鸟康的博客

菜鸟成长日记

  • 博客(64)
  • 收藏
  • 关注

原创 Linux网络编程——基于ET模式下的Reactor

上篇文章中我们已经讲解了多路转接剩下的两个接口:poll和epoll,并且知道了epoll的两种工作模式分别是和,下来我们就实现的是一个简洁版的Reactor,即,在linux网络中,最常用最频繁的一种网络IO设计模式Reactor设计模式是一种为处理并发操作的事件处理模式。它将事件的检测和响应分离,使得事件的监听者可以注册对特定类型事件的兴趣,并在这些事件发生时得到通知。这种模式非常适合于需要处理大量并发连接的应用程序,比如Web服务器。

2025-04-19 10:55:11 698

原创 Linux网络编程——I/O多路转接(2)之 poll、epoll

上篇文章中我们提到了I/O多路转接的select接口select的fd存在着上限每次调用都需要重新设置关心的fd针对select接口中存在的问题,本章中我们再来介绍其他的多路转接的接口——poll接口和epoll接口。

2025-04-19 10:55:03 1021

原创 Linux网络编程——I/O多路转接(1)之 select

上篇文章中,我们已经知道了I/O的五种模式,包含阻塞、非阻塞、信号驱动、多路转接、异步。本文就多路转接模式进行深入分析,其中介绍了三组转接接口:selectpoll和epoll,支持一次性“等”多个文件描述符,以此将进程或线程“等”的时间进行重叠,便于数据就绪后调用对应的recvfrom()等接口进行数据的拷贝。先来复习一下I/O的多路转接是什么I/O多路转接也叫做I/O多路复用,虽然与阻塞I/O类似,但其核心特点在于,能够同时等待多个文件描述符的就绪状态。

2025-04-18 09:40:21 968

原创 Linux网络编程——五种I/O模式

在前面的学习中,我们不断地刷新着对I/O的认识,从最开始的我们简单认为I/O就是操作系统与外设的直接交互,从外设将数据拷贝到内存,和从内存将数据拷贝到外设,但是我们也知道在调用read()和write()时,万一缓冲区中没有数据或者数据满了,这就会导致阻塞,只有等待资源就绪之后才能继续I/O,这是我们深入理解I/O的一个关键——I/O=等待+数据拷贝。首先,什么是I/O?在我们之前学习操作系统的我们首先了解了冯诺依曼体系结构,如下图所示。

2025-04-18 09:39:41 730 1

原创 Linux网络编程——数据链路层详解,以太网、MAC地址、MTU、ARP、DNS、NAT、代理服务器......

上篇文章中,我们对网络协议栈中的网络层进行了详细的介绍,但是我们需要知道的是网络层并不会真正的传输数据。真正负责数据或者对数据进行传输的是数据链路层。ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写,是互联网协议族中的一员,主要用于将网络层(IP层,即第三层)的IP地址解析为数据链路层(第二层)的MAC地址。在局域网中,设备之间的通信需要知道对方的物理地址(MAC地址),而ARP协议正是用于实现这种转换的。

2025-04-12 21:42:35 849

原创 Linux网络编程——详解网络层IP协议、网段划分、路由

在之前的文章中,出去物理层,我们已经针对TCP/IP五层模型中的应用层、传输层的要点做了介绍。其中应用层的HTTP/HTTPS 协议主要是针对数据请求的一个超文本传输协议,目的是为了保证服务端和客户端之间的数据传输安全可靠且高效。传输层的UDP协议就是应用于像我们平时看直播刷视频一样,它并不保证数据的可靠传输,而是能容忍一定的数据丢失的传输层协议。TCP协议则是通过一系列的机制来保证数据传输的可靠性和完整性。学习完了应用层和传输层,接下来就是网络层的协议和数据链路层了。

2025-04-12 21:41:14 1031

原创 Linux网络编程——深入理解TCP的可靠性、滑动窗口、流量控制、拥塞控制

上篇文章中我们提到了TCP连接的可靠性,TCP为了这个可靠性做了很多的工作比如我们已经知道的校验和序列号,为了保证数据的按序到达等确认应答超时重发机制连接管理还有下面说的流量控制都是TCP为了传输可靠性而设计的。

2025-04-10 09:12:52 1409 1

原创 【MySQL】——理解事务的隔离性、MVCC、当前读、快照读

上篇文章中,我们已经对事务的隔离性有了一定的理解,对事务隔离性的四个等级进行了演示。但是尽管我们已经知道这些隔离性的应用,但是我们仍对这些事物的隔离性有着很深的疑问,数据库是如何实现这些控制的。读-读:不存在任何问题,也不需要并发控制读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读写-写:有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失(后面补充)我们先来了解数据库是如何对读-写进行控制的。

2025-04-10 09:12:06 946 1

原创 【MySQL】——事务的隔离性

在上篇事务一文中,我们提到了事务的四个属性 原子性、持久性、隔离性、一致性。原子性和持久性我们已经在上篇文章中见识到了,但是隔离性和一致性又该怎么理解呢?我们首先来看事务的隔离性,隔离性。同时,隔离级别。其中隔离级别越严格,安全性越高,但数据库的并发性能也就越低,往往需要在两者之间找一个衡点。不可重复读的重点是修改和删除:同样的条件, 你读取过的数据,再次读取出来发现值不一样了幻读的重点在于新增:同样的条件, 第1次和第2次读出来的记录数不一样。

2025-04-09 16:02:54 822

原创 【MySQL】——详解事务

在实际生活中,我们在对MySQL数据库进行CURD[创建(Create)、读取(Read)、更新(Update)和删除(Delete)]的操作时,要考虑到此时此刻并不是只有我们一个用户在对该数据库进行操作,所以这就牵扯到一个问题,数据库中的內容就好像是临界资源,在同时由多个用户进行CURD操作时,会不会出问题?下面举个例子:还是拿之前在讲到线程互斥的文章中提到的火车站抢票的例子来说,

2025-04-09 16:02:04 763

原创 Linux网络编程——TCP通信的四次挥手

TCP四次挥手详细內容

2025-04-08 12:15:02 1028 2

原创 Linux网络编程——TCP协议格式、可靠性分析

在上一篇文章中,我们重点介绍了UDP协议格式的一些内容。在本文中介绍的便是TCP协议格式的相关内容了。TCP(传输控制协议,Transmission Control Protocol)的全名已经明确指出了它的核心功能——对数据传输进行详细的控制。作为互联网基础通信协议之一,TCP提供了面向连接的服务,确保了数据的可靠传输。序号协定规则字节流编号TCP将数据视为一个无结构但有序的字节流,并为每个字节分配一个序列号。这意味着发送的数据不是基于报文或段来编号,而是基于每个单独的字节。

2025-04-08 12:14:42 1104

原创 Linux网络编程——UDP协议格式

TCP/IP网络模型,是将网络分成四层之前的文章介绍了 和协议,他们都是应用层协议,都是在传输层协议的基础上实现的。而传输层协议中最具有代表性的就是:UDP和TCP协议,以HTTP协议为例,在使用HTTP协议通信之前,是先需要建立TCP连接的,那么,传输层协议的介绍就先从UDP协议开始。

2025-04-07 16:31:26 880

原创 Linux网络编程——https的协议及其加密解密方式

上一篇文章中我们主要了解了http协议中,什么是url、http协议的请求和响应格式、http协议的一些方法,状态码、重定向、Cookie等内容。本文接下来就基于http协议的不安全性,深入研究https的解决方案,包含了对称和非对称加密性原理,以及CA证书。上篇文章中,我们已经提到了http协议的不安全性,其在网络中都是以明文的形式传播的,无论是GET还是POST方法都是不安全的,这是因为http协议协议以明文的形式传输数据, 缺乏对信息的保护.

2025-04-07 16:30:13 1416 7

原创 Linux网络编程——http协议

我们所知道的应用层协议实际上就是对应用层传输数据时需要遵循的一系列标准的一个规定,这些协议都是程序员规定的,在TCP网络通信这篇文章中,我们实现了一个简单的网络计算器,通过客户端产生请求,服务端接收请求,并响应请求,我们为该网络计算器还制定了一个简单的协议。但是网络上需要传输的数据是非常复杂的,视频、图片、网页等等。况且如果这些都需要程序员自己制定自己的协议是非常麻烦的。所以就对于其他一些非常好的协议,就会形成一个应用层特定的协议的标准,如此就可以供大家使用。如等。

2025-04-02 11:19:51 987

原创 Linux网络编程——TCP协议的三次握手、超时重传机制

上篇文章中我们对TCP的协议格式和可靠性做了分析,里面提到了在TCP通信时候的“三次握手”。今天就主要研究一下TCP通信的“三次握手”

2025-04-02 11:08:58 979

原创 Linux网络编程——守护进程

在我们上一篇TCP网络通信文章中,我们使用了守护线程,但是当时没有做过多的了解,下面再本文中,我们再做详细介绍。

2025-03-14 20:59:13 1142

原创 Linux网络编程——应用层协议的初认识

在前面的文章中我们已经对UDP和TCP通信协议有了一定的了解,并且实现了不同版本的UDP和TCP网络通信代码。我们在之前实现通信网络中用到的各种接口:socket()bind()listen()等这些实际上都是Berkeley套接字接口( Berkeley sockets API),它们是标准库函数,提供了对底层网络通信协议的抽象,通过这些函数,应用程序能够方便的进行网络通信,而无需直接处理复杂的网络协议细节。然而网络发展至今天,已经出现了许许多多成熟的应用层协议,

2025-03-14 15:41:51 1078 1

原创 Linux网络编程——TCP网络通信多线程处理

上篇文章中我们实现了简单的TCP网络通信,有单进程版本的,多进程版本的。但是它们都存在着许多的不足之处。如单进程版本当给多个客户端提供服务时会出现问题,从而实现了多进程的两个版本,分别利用忽略子进程的退出信号使得子进程被自动回收和创建孙子进程的两种方法实现。但是对于多进程来说,这样的资源消耗会很大,所以接下来我们要考虑的是多线程版本。

2025-03-12 08:53:47 499

原创 Linux网络编程——简单的TCP网络通信

上篇文章中我们对udp网络通信有了初步的认识,我们在之前已经知道了UDP通信和TCP通信的不同UDP非连接,面向数据包。TCP连接,面向字节流。这篇文章我们来介绍和演示一下TCP套接字的接口。

2025-03-11 09:20:40 867 1

原创 Linux网络编程——UDP网络通信的简单实现

通过上述步骤,UDP服务端和客户端就可以进行基本的数据交换了。由于UDP是无连接的,每次数据传输都是独立的,因此每次调用sendto和recvfrom都不需要事先建立连接。这种方式非常适合那些对延迟敏感的应用程序,但也意味着数据包可能丢失或乱序到达。

2025-03-11 09:19:51 1042

原创 Linux网络编程——网络编程初识、UDP套接字简单了解

上篇文章主要介绍的是网络通信方面的一些知识,也算是为以后的学习先做一下铺垫。从本章开始我们就要正式进入网络编程的学习了。但是在开始网络编程之前,我们还需要进行一些准备工作,需要先了解一些概念。

2025-03-10 08:44:03 1136 1

原创 Linux网络编程之——网络初认识

在前面的文章中,我们已经学习完了Linux系统编程方面的知识,接下来我们就要开始进入Linux网络编程部分了。在正式认识Linux网络编程前,我们先对网络做一个了解。

2025-03-10 08:42:38 804

原创 Linux系统编程——生产者消费者模型

生产者-消费者模型(Producer-Consumer Pattern)是一种经典的多线程同步问题,它描述了一组生产者线程和一组消费者线程共享一个有限缓冲区的情况。生产者负责创建数据并将其放入缓冲区中,而消费者从缓冲区中取出数据并处理它们。这个模型广泛应用于各种并发编程场景中,以确保线程之间高效、安全地交换数据。

2025-03-09 21:49:02 1117 3

原创 Linux系统编程--线程同步

上篇文章我们讲解了线程互斥的概念,为了防止多个线程同时访问一份临界资源而出问题,我们引入了线程互斥,线程互斥其实就是多个线程同时争抢一份资源,谁抢到了就是谁的,抢不到的只能等待着下一次抢。虽然解决了有多个线程同时访问同一资源所产生的问题,但是我们思考一下这样子合理吗?不合理,这会产生另一种问题——线程饥饿。二、线程饥饿那么线程饥饿是什么呢?

2025-03-09 21:48:41 1052 1

原创 Linux操作系统——多线程互斥

我们已经学习了什么是多线程,以及多线程的控制和其优点,多线程可以提高程序的并发性和运行效率,可以充分利用计算机的多核资源。但是我们在前面学习的过程中,看到了有些多线程的程序的运行结果是有一些问题的,如出现了输出混乱、访问共享资源混乱等特点。所以我们下面提出的这个概念是关于这方面的——线程互斥。

2025-01-03 11:11:20 735 1

原创 Linux系统编程——线程控制

在上一篇文章中我们已经学习了线程的概念,线程的创建和等待,并且已经从根本上了解了线程和进程的相同点及不同点。在学习进程时,我们也学习了进程的相关控制接口,而线程作为更轻量级的进程,其自然也有着控制接口。

2024-12-29 21:36:12 824 2

原创 Linux系统编程——线程

之前的文章中我们已经对进程相关的概念做了认识,从创建进程、子进程,进程回收、进程替换等,由于我们之前对于知识框架的不熟悉,为了方便我们的理解学习,我们在之前的学习中没有做到深挖细节和深入理解,对之前的进程内容的有些部分做了简单的抽象,接下来我们学习的是比进程粒度更细的一个概念——线程。在这部分内容中,我们除了学习主线的内容外,还会对之前的內容稍作补充和修改,这都是会在文章中提到的。资源共享:同一个进程中的所有线程共享该进程的资源,包括全局变量、堆栈和文件描述符。这使得线程之间的通信和数据交换更加高效。

2024-12-28 22:13:34 1036

原创 Linux系统编程——详解页表

页表是我们之前在讲到程序地址空间的时候说到的,它是物理内存到进程程序地址空间的一个桥梁,通过它物理内存的数据和代码才能映射到进程的程序地址空间中,在信号这一节我们又提到了内核空间的页表,讲到了该内核级页表不同于前面说的用户级页表是每个进程都有的,内核级页表整个系统只有一份。但是之前我们对页表的理解还都处于一个比较简单的层面,事实上页表的实现还是比较复杂的,这次我们深入理解一下页表的构成及其功能。1、进程虚拟地址和物理内存的解耦在二级页表中,每个页表条目记录的是页面(page)的位置,未加载的页面会存储为。

2024-12-27 21:39:05 1054 3

原创 Linux系统编程——理解系统内核中的信号捕获

如果 用户的自定义处理信号方法内部, 还会发送其他信号, 并且用户还对其进行了捕捉. 那么 信号的处理就无止尽了. 这种情况是不允许发生的.所以 可以通过使用。

2024-12-23 22:27:37 1016 3

原创 Linux系统编程——系统内核中的信号

在信号之前讲到的所有进程信号的产生都需要OS来执行,为什么?我们提到进程在接收到信号之后通常有着三种处理方式,那么针对这三种处理方式,进程是立即处理的吗?如果不是立即处理,那么信号是否需要暂时被进程记录下来?记录下来放在哪里呢?一个进程在没有收到信号的时候,怎么知道自己应该对合法信号作何处理呢?怎么理解OS向进程发送信号?是怎么发送的?具体情况是什么?接下来我们将从系统内核层面着重讨论和理解进程信号产生之后进程处理信号的详细操作以及进程信号的产生到进程接收之间内核做了哪些事情。

2024-12-22 21:39:43 1143

原创 Linux系统编程——信号

在Linux操作系统中,进程信号是一个非常重要的概念。我们在前面的文章中已经见识过了进程信号了,比如我们在进程的一章中,尝试过向进程发送9号信号来终止进程(所以对于用户来说,我们可以通过向进程发送特定的信号使得进程完成某些指定的动作。signal()捕捉信号:其是一个系统调用接口,作用是捕捉进程信号,并由用户处理。可以看到该函数的函数声明:signal(intsignum。

2024-12-22 09:56:56 794

原创 Linux系统编程——System V 共享内存

System V 消息duilieSystem V 共享内存System V 信号量我们下面主要研究的是物理内存。

2024-12-17 11:46:22 803 1

原创 Linux系统编程——进程间通信

在我们学习进程的时候,我们知道正是因为程序地址空间的存在,所以进程之间具有独立性,他们互不影响,但是在我们的实际应用中,进程之间总会有需要通信的时候,那么这个时候的程序地址空间就是进程间通信的一个阻碍了,那么此时该怎么办呢?匿名管道 的生命周期 取决于什么时候彻底关闭管道文件(即pipe文件的打开计数为0)匿名管道 是面向字节流的匿名管道 自带同步机制(pipe满, 则writer阻塞;pipe空, 则reader阻塞), 即自带访问控制机制。

2024-12-13 10:15:18 1215 1

原创 Linux系统编程——超级详细讲解静态库、动态库的创建、打包和使用

在Linux环境下,我们使用gcc编译连接代码时,可以分为静态链接和动态链接。静态链接即在编译链接时,将代码所使用到的静态库文件代码全部加入到可执行文件中(拷贝实质上是将库文件的代码展开拷贝至我们的可执行程序的代码段。,这样做的缺点是可执行文件会生成的比较大,优点是此时再运行可执行文件就不需要再查找库了。静态库文件一般以.a结尾。动态库链接不会在编译时将动态库文件的代码加入到可执行文件中,而是在可执行文件运行时,去查找所需的动态库,并将其加载到相应的进程中,并且不同的进程可以共享这些动态库。

2024-12-08 21:12:45 2367

原创 Linux操作系统——Linux的磁盘管理系统、文件inode及软硬链接

在上一篇文章中我们了解到了操作系统对打开的文件即加载到内存中的文件的一系列操作,但是整个计算机中还存在着许许多多的没有被打开的文件,这些文件又是存在在哪里呢?操作系统对这些文件都是怎么管理的呢?

2024-12-06 21:06:12 1004 1

原创 Linux操作系统--文件的重定向以及文件缓冲区

上一篇讲到了文件描述符,我们知道每次自己新创建的文件描述符都是默认从3开始的,因为stdin、stdout和stderr分别对应的0、1、2是默认打开的。所以后面是从3开始的。接下来我们分别关闭0、1、2的文件再创建新的文件看看有什么影响上面我们已经知道了通过关闭文件来实现重定向,但是这个未免也太过于麻烦,系统中已经给出了重定向的接口,我们先来介绍一个:dup2()可以看到,dup2()接口的两个参数分别是两个文件描述符,并且newfd是oldfd的一份拷贝(

2024-12-05 21:25:53 943

原创 Linux系统编程——文件

操作系统下一切皆文件!我们知道open()接口的返回值是文件描述符,先打印出来几个看看这里出现了问题,为什么这个文件描述符是从3开始打印的,0、1、2去哪里了。实际上0、1、2是被默认打开的,0代表的是标准输入,对应的是键盘。1代表的是标准输出,对应的是显示器,2代表的是标准错误,对应的是显示器。在Linux进程运行的时候就会先打开这三个文件验证:打印出来他们的文件描述符看看。

2024-12-03 09:58:47 984

原创 Liunx系统编程——shell的简单实现

现在我们实现的这个简易的shell是系统的bash的子进程,所以它会继承bash的全部环境变量,因此,我们在自己的shell中仍然可以访问和使用bash中的环境变量。从上面的分析来看,显然我们需要改变的是父进程的路径,也就是我们自己实现的shell的路径而不是子进程的路径,改变子进程的路径没有任何意义,这个时候就需要使用我们的内建命令了。我们可以看到用系统的bash执行命令之后,他会自动带上颜色,我们自己实现的却没有,那是因为我们执行的命令都是裸的命令没有经过任何的配置,我们先看看系统的命令。

2024-12-01 17:16:20 1205

原创 Linux系统编程——进程替换

一般情况下,对应的语言写的程序只能调用对应的语言的接口,对于其它类型的语言的接口,如C++就不能 调用java或者python的接口,那如果我们想要调用别人的接口怎么办?所以进程程序替换就能很好的解决这个问题,这样我们就可以使用现成其他语言接口的程序而不用费力地去再实现一个,很大程度上能减少我们的编程成本。

2024-11-30 18:45:54 1259

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除