自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 计算机网络体系结构——UDP

UDP 是User Datagram Protocol的简称,中文名是用户数据包协议。UDP是一种无连接的不可靠的传输协议(不需要进行三次握手和四次挥手)。UDP不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的,因此适合实时数据传输,例如:IP电话、网络视频会议等实时应用。

2025-08-05 10:41:09 857

原创 计算机网络体系结构——TCP可靠传输的实现

当发送窗口被调整为0后,发送方就不能再发送数据了,假如接收方的接收窗口调整为大于0了,如果不采取特殊措施发送方是不知道的,因为接收方不会主动告知发送方自己接收窗口的大小。这时就需要持续计数器了,当发送方接收到接收窗口为0的应答报文时马上启动一个持续计时器,当定时达到时主动向接收方发送一个零窗口探测报文,该报文只携带一个字节的数据,然后这种逻辑直到接收方回复的接收窗口大于0。假设以上三组数据报没有丢失,主机B在接收到所有数据后发送应答数据报,ack=501,并且将窗口调整为100,rwnd=100A。

2025-08-05 10:27:07 796

原创 计算机网络体系结构——TCP连接的建立

FIN=1,ACK=1表明这是一个连接释放报文段,seq=w,ack=u+1同时也对之前收到的报文段进行确认。思考:为什么seq=w,而不是seq=v+1呢?TCP客户端进程收到TCP连接释放报文段后,必须针对该报文段发送普通的TCP确认报文段,之后进入时间等待状态TCP服务器进程收到该报文段后就进入关闭状态而TCP客户端进程还需要经过。

2025-08-05 10:09:34 525

原创 计算机网络体系结构——运输层

运输层的主要任务就是负责向两台主机中进程之间的通信提供通用的数据传输服务。运输层直接为应用进程间的逻辑通信提供服务。根据应用需求的不同,因特网的运输层为应用层提供了两种不同的运输协议,即面向连接的TCP和无连接的UDP。运输层提供的是应用进程间的逻辑通信,“逻辑通信”的意思是:运输层之间的通信好像是沿水平方向传送数据。但事实上这两个运输层之间并没有一条水平方向的物理连接。

2025-08-05 09:42:25 613

原创 Linux并发编程——进程的终止和等待

状态,如果该进程的父进程不回收退出进程的资源, 那么这个进程将会变成僵尸进程,僵尸进程并没有真正的退出,该进程的ID。如果父进程先于子进程退出,该父进程的子进程将成为孤儿进程。孤儿进程将被系统的某个进程所托管(通常是init进程)。如果系统中产生大量的僵尸进程,系统将因为没有可用的进程号而导致系统不能产生新的进程,当一个进程正常或异常终止时,内核会向其父进程发送SIGCHLD信号。如果系统中产生大量僵尸进程,会导致系统无法创建新进程。当进程终止后,系统会把这个进程标记为。此即为僵尸进程的危害,应当避免。

2025-07-29 14:35:46 654

原创 Linux并发编程——进程的创建

一个现有的进程可以调用fork函数创建一个新的进程。fork()函数用于从一个已存在的进程中创建一个新进程,新进程称为子进程(child process),原进程称为父进程(parent process)。fork函数调用一次返回两次:在父进程中返回子进程的ID在子进程中返回0如果失败返回-1将子进程ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得具有子进程的进程ID。

2025-07-29 11:42:19 874

原创 Linux并发编程——调度算法

位于Q1中的任何一个作业(进程)都要比Q2中的任何一个作业(进程)相对于CPU的优先级要高(Q1中的作业一定要比Q2中的作业先被处理机调度),依次类推其它的队列。一旦出现了另一个优先级更高的就绪进程时,进程调度程序就停止正在执行的进程,将处理机分配给新出现的优先级最高的就绪进程。在k级队列的进程运行过程中,若更上级的队列中进入了一个新进程,则由于新进程处于优先级更高的队列中,因此新进程会抢占处理机,原来运行的进程放回k级队列队尾。如果作业运行时间相同,则等待时间越长的作业,其响应比越高,因此越容易被调度。

2025-07-29 11:22:04 793

原创 Linux并发编程——进程概述

可运行态就绪:TASK_RUNNING(在就绪队列中等待调度)运行:正在运行阻塞(等待)态浅度阻塞: TASK_INTERRUPTIBLE(可中断),能被其他进程的信号或时钟唤醒。深度阻塞: TASK_UNINTERRUPTIBLE(不可中断),不能被其他进程通过信号和时钟唤醒。深度阻塞一般是请求系统服务、IO服务,这些服务没有满足前不能被唤醒TASK_ZOMBIE,进程终止执行,释放大部分资源TASK_STOPPED,进程被挂起操作系统使用一个数据结构描述进程的状态、资源、运行变化的过程等。

2025-07-29 09:52:04 799

原创 标准I/O

标准C语言函数库(以下简称标准C库),所谓标准I/O库则是标准C库用于文件I/O操作(譬如读文件、写文件等)相关的一系列库函数的集合,通常标准I/O库函数相关的函数定义都在头文件<stdio.h>中,所以我们需要在程序源码中包含<stdio.h>头文件。

2025-07-28 17:50:08 972

原创 系统IO——库文件

静态库实际就是一些目标文件(一般以.o结尾)的集合,

2025-07-28 17:21:55 1059

原创 系统IO——软硬链接

硬链接是指通过索引节点来进行链接。

2025-07-28 09:38:46 260

原创 系统IO——Linux下一切皆文件

对于Linux内核而言,这是Unix/Linux系统设计的核心抽象之一,它统一了各种I/O操作的接口。

2025-07-18 21:10:41 148

原创 数据结构与算法——排序算法

一趟快速排序的具体做法为:设置两个指针low和high分别指向待排序列的开始和结尾,记录下基准值baseval(待排序列的第一个记录),然后先从high所指的位置向前搜索直到找到一个小于baseval的记录并互相交换,接着从low所指向的位置向后搜索直到找到一个大于baseval的记录并互相交换,重复这两个步骤直到low=high为止。算法稳定性:假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;归并排序是稳定的算法,它满足稳定算法的定义。归并排序的时间复杂度是O(n㏒n)。

2025-07-07 20:10:52 754

原创 数据结构——图

图G(Graph)由两个集合V(Vertex)和E(Edge)组成,记为G=(V,E),其中V是顶点的有限集合,记为V(G),E是连接V中两个不同顶点(顶点对)的边的有限集合,记为E(G),对于含有n个顶点的图,通常用字母或自然数来唯一标识图中顶点(顶点的编号)。

2025-07-03 22:01:37 529

原创 C语言数据结构——哈希表

开放地址法:计算简单快捷,处理起来方便,但线性探测法容易形成“堆聚”。另外,该方法的删除操作显得十分复杂,我们不能直接删除关键字所在的记录,否则在查找删除位置后面的元素时,可能会出现找不到的情况,因为删除位置上已经成了空地址,查找到这里时会终止查找。所以,就需要重建哈希表,特别浪费性能。拉链法:该方法将所有哈希地址相同的结点构成一个单链表,单链表的头结点存在哈希数组里,链地址法常出现在经常插入和删除的情况下,此时,哈希表的插入/删除/查找都是O(1)的时间复杂度。

2025-07-03 21:57:37 918

原创 C语言数据结构——树(三)

此时超过了节点可以存放容量,需要执行分裂操作, 找到“90 95 120 200”之间的中值“95”,然后将中值“95”放到父节点中,父节点中的“90”小于“95”,于是放到“90”右边,而原来小于“95”的那些值作为左子树,原来大于“95”的那些值作为右子树。分裂操作为,先选取待分裂节点的中值,这里为“60”,然后将中值“60”放到父节点中,因为这里还没有父节点,那么直接创建一个新的父节点存放“60”,而原来小于“60”的那些值作为左子树,原来大于“60”的那些值作为右子树。

2025-07-03 21:48:41 942

原创 C语言数据结构——树(二)

之前我们学习过二叉查找树,发现它的查询效率比单纯的链表和数组的查询效率要高很多,最理想的情况下时间复杂度可以达到O(logn),大部分情况下,确实是这样的,但不幸的是,在最坏情况下,二叉查找树的性能还是很糟糕。第三个节点「3」插入的 时候,BF(1)=-2 BF(2)=-1,RR 型失衡,左旋,**根节点逆时针旋转**。第三个节点「1」插入的 时候,BF(3) = 2,BF(2) = 1 LL 型失衡,右旋,第三个节点「1」插入的 时候,BF(1)=-2 BF(3)=1 RL 型失衡,

2025-06-27 21:49:42 775

原创 C语言数据结构——树

二分查找树BST(也叫二分查找树、二叉排序树)的提出是为了提供查找效率,之所以称为二分查找树,因为该二叉树对应着二分查找算法,查找平均的时间复杂度为O(logn),所以该数据结构的提出是为了提高查找效率。注意:不论需要删除的结点有左孩子结点还是右孩子结点,该结点上提后都是删除结点父结点的左孩子结点。度不为0的结点称为分支结点,也可以叫做非终端结点。一个结点的直接后继结点称为该结点的孩子结点。一个结点的直接前驱称为该结点的双亲结点。的结点称为叶结点,也可以叫做终端结点,A:删除的结点是叶子结点,直接删除。

2025-06-26 22:23:23 730

原创 C语言数据结构——队列

队列是一种基**先进先出(FIFO)**的数据结构,是一种只能在一端进行插入,在另一端进行删除操作的特殊线性表,它按照先进先出的原则存储数据,先进入的数据,在读取数据时先读被读出来。2、队列的应用举例1:排队系统的实现举例2:使用循环队列存储网络摄像头的数据帧(图像数据)3、队列的具体实现顺序队列链队列。

2025-06-24 20:53:59 484

原创 讲讲自己

我是一名在读大学生,虽然目前对编程的了解还很基础,但我对技术充满好奇,希望通过学习掌握编程技能,开启新的职业可能性。通过书籍(如《C Primer Plus》《Python Crash Course》)和在线课程(如Coursera、B站优质教程)打牢基础。编程之路不会一帆风顺,但我相信,只要保持耐心和热情,每一步都会离目标更近。从简单的小工具开始(如计算器、待办事项列表),逐步增加复杂度。完成一个完整的个人项目(如小型博客系统、爬虫工具等)。熟悉基本的算法和数据结构(如数组、链表、排序算法)。

2025-04-01 23:47:41 335

空空如也

空空如也

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

TA关注的人

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