自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 改进RRT*的路径规划算法

RRT 算法是一种基于随机采样的快速搜索算法。该算法的主要思想是通过随机采样来创建一个快速探索的树,从而生长出一条从起点到终点的路径。如图为随机树的生长过程。算法伪代码如下图所示RRT 算法的优点是可以处理高维度的状态空间,计算速度快,适用于复杂的路径规划问题。但是,由于采用随机采样的方式生成树,该算法可能会产生不必要的路径, 需要使用启发式函数或其他优化方法进行改进。使用 RRT 算法进行路径规划的仿真结果如图所示,从图中可以看到 RRT 算法规划出的路径拐点较多,且可行性较低。

2024-09-16 12:58:29 1289

原创 Linux——多路复用之poll

前面我们学习了多路复用的select,知道多路复用的原理与select的使用方法,但是select也有许多缺点,导致他的效率不算高。今天我们来学习poll的使用,看看poll较于select的优势。

2024-07-19 20:53:43 1197

原创 Linux——多路复用之select

在前面,我们学习了五种IO模型,对IO有了基本的认识,知道了select效率很高,可以等待多个文件描述符,那他是如何等待的呢?我们又该如何使用呢?

2024-07-19 00:08:02 1271

原创 Linux——五种IO模型

send则是我发送消息,对方接受消息,当对方的接受缓冲区满了,也会造成阻塞,直到对方接收缓冲区有空间了,才可以发送过去。在I/O中,我们大部分时间是在等,比如你调用了scanf(),当前进程就在等待你的输入,你输入完毕后,把输入数据拷贝到内存中,才会继续执行。为了理解五种IO模型,我们来看个钓鱼的例子,钓鱼 = 等 + 钓 ,这里可以把钓看做是拷贝,钓都是一样的,但是等的过程不相同。其中,阻塞、非阻塞、信号驱动、多路复用都是同步IO,他们都参与了IO的过程,要么等了、要么拷贝了、或者都做了。

2024-07-18 00:25:26 1148

原创 C++项目——负载均衡在线OJ

首先完成了编译运行模块,通过fork创建子进程,让子进程去调用程序替换,父进程等待子进程,同时获取到子进程的退出码。同时使用了httplib库来帮助我们进行Get、Post请求。再完成了在线oj网站与服务器的搭建,从文件中读取机器的ip地址与端口,构建出负载均衡的所有机器。然后智能选择负载较少的机器,给这个机器发送编译请求。最后使用ajax进行前后端的交互,前端进行提交,将数据提交到后台,后台对数据做出响应,再将结果返回到前端上。如下是某个题的答题界面代码地址负载均衡在线oj系统。

2024-06-20 16:47:18 839

原创 Linux网络——TCP协议详细讲解

前面我们学习了TCP协议套接字的使用,了解了使用TCP的操作。但当时是在应用层,我们仅仅是浮于表面进行了初步的使用,今天我们来深入的理解TCP协议是如何实现的。为何面向字节流?为何是可靠的?

2024-05-21 17:33:56 1348

原创 Linux网络——端口号理解与UDP协议

在之前,我们学习了,了解到需要使用端口号来表示网络中的数据需要传输到哪个进程,同时使用套接字的进行了UDP的通信。但当时在应用层,我们仅仅是浮于表面进行了初步的使用,今天我们来深入的理解端口号与UDP协议是如何实现的。

2024-05-20 10:44:16 1063

原创 Linux网络编程——HTTP协议的理解与运用

我们知道,协议就是一种约定,客户端与服务端统一的用这种约定进行传输数据。我们也进行了自定义协议的序列化与反序列化,了解到了协议是如何进行约定的。今天我们来学习一下被广泛运用的应用层协议——HTTP(超文本传输协议)。

2024-05-15 23:03:30 991

原创 Linux网络——自定义序列化与反序列化

前言之前我们学习过socket之tcp通信,知道了使用tcp建立连接的一系列操作,并通过write与read函数能让客户端与服务端进行通信,但是tcp是面向字节流的,有可能我们write时只写入了部分数据,此时另一端就来read了,可能会导致读取的数据不完整的问题。这就引入到tcp通信的一个重要操作了——序列化与反序列化!一、使用结构体进行传输在我们之前学习的代码中,一般想传递很多数据,都会使用到结构体。比如pthread_create()需要传递函数地址,你如果需要传递很多参数,就得创建一

2024-05-09 23:07:44 672

原创 Linux——守护进程化(独立于用户会话的进程)

在之前,我们学习过socket编程中的udp通信与tcp通信,但是当时我们服务器启动的时候,都是以前台进程的方式启动的,这样很不优雅,因为前台进程无法接受命令输入,同时也可能一不小心被使用者终止。因此我们得让服务器以守护进程的方式进行运行。如果不太了解,可以看这篇文章前台进程与后台进程。

2024-05-05 17:01:05 799

原创 Linux——socket编程之tcp通信

前面我们学习,了解到了socket的概念与udp的实现方法,今天我们来学习一下面向连接的tcp通信。

2024-05-04 00:25:15 1632

原创 Linux——socket套接字与udp通信

接受消息放到buf里,预期接受len个字节的消息,flags默认为0,代表的阻塞模式,src_addr与addrlen为输入输出参数,输出发送放相关sokect消息。有了文件描述符,还需要填充sockaddr_in结构体里面的字段,sockaddr 是一个通用的套接字地址结构体,而sockaddr_in则专门为网络socket设计的,他是用于IPv4套接字的地址结构体。所有数据具在发送到网络时,都必须要做小端到大端的转化,你是大端,直接发给网络就可以,你是小段,先转化完再发给网络。

2024-04-28 15:48:02 1069

原创 C++11——线程库的理解与使用

之前我们学习过Linux的线程库thread,他是使用 POSIX 标准,而Windows中的线程库,使用的其他标准,在C++11之前他们的接口是不一样的,对代码的编写就很麻烦,Linux一套,Windows一套。C++11出来之后,引入了标准的线程库,使得在不同平台上编写具有可移植性的多线程代码变得更加容易。

2024-04-21 23:46:26 1142

原创 Linux——日志的编写与线程池

学了很多线程相关的知识点,线程控制线程互斥线程同步,今天我们将他们做一个总结,运用所学知识写一个较为完整的线程池,同时把日志编写也学一下。

2024-04-18 18:53:55 1139 2

原创 Linux——信号量与基于环形队列的生产者消费者模型

之前,我们学习了线程互斥与线程同步与生产者消费者模型,了解了互斥锁能够很好的保护公共资源,但是之前我们都是将公共资源整体来使用,如果我们可以将公共资源拆分为N份,让线程访问之前先申请信号量,申请到我就将其中一份资源给你,你自己处理,这样操作不会影响到其他线程访问自己的那一块公共资源。提高了效率。

2024-04-15 20:27:12 1031

原创 Linux——线程同步与生产者消费者模型

之前我们学习了线程互斥,知道了系统为保护临界资源,需要让线程互斥,一个个的访问资源,同时我们也发现线程饥饿的问题,就是某一个线程一直持有锁,释放锁,再持有锁,释放锁,其他线程根本就竞争不过他,因此又提出了线程同步,让线程有序的进行申请锁资源。

2024-04-10 21:28:48 817

原创 Linux——线程互斥与互斥锁的使用

由于线程可以创建多个,也就是操作系统中存在多个由某一个进程创建的执行流。那么他们在访问并修改共享资源时,可能会发生数据不一致的问题,进而我们需要让线程互斥来保护公共资源。

2024-04-07 23:52:07 1751

原创 Linux——线程控制

线程控制,如何操控一个线程完成任务,同时能取消线程、等待线程,分离线程。

2024-04-01 23:50:23 1708

原创 Linux——线程概念与线程的创建

在一个程序里的一个执行路线就叫做线程(thread)。线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流我们知道,操作系统是软硬件的管理者,他需要去管理系统中的各种资源,那么进程作为操作系统中重要的一环,也必须被管理,管理的本质是先描述在组织。

2024-03-30 22:20:29 1021

原创 Linux——信号的保存与处理

在之前,我们学习了信号的概念以及信号的产生方式,知道进程在何种情况下会收到信号,进程收到并不一定会立刻执行,因此需要对信号进行保存,再来处理信号。

2024-03-28 23:57:53 755

原创 Linux——信号概念与信号产生方式

信号的产生,最终都要由操作系统来进行执行,这是因为操作系统是进程的管理者。进程在信号到来不会立即处理,而是在合适的时候处理。由于信号不会被立即处理,因此信号需要暂时被进程记录下来,记录在信号位图中。信号在没有收到信号的时候,已经知道自己该如何处理信号。操作系统向进程发送信号,本质是向目标进程的信号位图中写信号(置1)。

2024-03-27 22:53:10 1052

原创 Linux——进程通信(四)system V共享内存

之前我们学习了管道,管道的本质就是文件,通过文件描述符进行数据的传输,只不过只是内存级别的,不往磁盘中写入。。因此Linux系统设计者还设计了专门用户通信的System V共享内存,进程可以通过将共享内存段映射到它们的地址空间中来实现共享数据。

2024-03-21 00:13:11 688

原创 Linux——进程通信(三)命名管道

我们在之前学习了与匿名管道的应用——进程池,但是匿名管道的通信,需要有血缘关系的进程(通过fork创建的进程们),如果我想让两个毫不相干的进程进行通信,可以采样的方式(有名字,通过名字可以找到,不需要继承的方式)。

2024-03-19 22:51:53 851

原创 Linux——进程通信(二) 匿名管道的应用:进程池

之前我们学习了进程通过进行通信,实现了两个进程的数据传输。如果我们管理的是很多个进程,通过管道发送指令,因为如果,也就是被管理的进程们都在等待我发送的指令,那么我们可以通过特定的通讯方式,对进程实施控制,也就是让进程根据传输的指令去完成相应的操作。

2024-03-18 18:06:44 551

原创 Linux——进程通信(一) 匿名管道

之前我们学习的进程,都是进程自己干自己的事情,最多就父进程等待一下子进程,两个进程自己完成自己的任务,并没有太多关系,虽说进程具有独立性,但进程并不孤僻,进程之间交流是可以完成的,今天我们就来学习进程通过匿名管道进行通信,匿名管道并不难,不要被它名字唬住了。

2024-03-17 22:38:44 1047

原创 Linux——动静态库的制作及使用与动态库原理

当其他的可执行程序,也需要使用到该动态库的时候,也是在他的进程地址空间中的共享区中,用他的页表映射,找到物理内存中的库。我们知道静态库在链接时,会链接上我的代码,他们打包形成了一个可执行程序,因此运行时数据都在可执行程序中,不需要去外部找内容,所以我们执行静态库链接的程序,直接运行就好了。因此我们将目录添加到该环境变量中,就可以了,代码如下。但是这样还是有点戳,说好的打包,你是打包了,但一看这么全,把库文件和.h文件都放在一起,很难看的,我想将.h放在一个文件夹中,库文件放在一个文件夹中。

2024-03-15 17:26:22 1126

原创 Linux——文件系统与软硬链接

我们之前学习了文件标识符,重定向,缓冲区等等,但是这些都是对已打开文件进行管理的,但是操作系统中被打开的文件只占小部分,更多的是那些在磁盘中未打开的文件,但是操作仍然要对其进行管理,今天文件系统他就来了。

2024-03-13 22:32:52 780 1

原创 Linux——文件缓冲区与模拟实现stdio.h

我们学习了系统层面上的文件操作,也明白了的基本原理,在重定向中,我们使用fflush(stdout)刷新了缓冲区,当时我们仅仅知道重定向需要刷新缓冲区,但是不知道其所以然,今天我们来见识一下。

2024-03-11 17:28:24 768

原创 Linux——文件重定向

在之前我们学习了文件标识符,直到close可以使用文件标识符进行关闭,但是当我们关闭1号(stdout)时,无法往显示器中打印数据,这都是文件的重定向在起作用,今天我们来一探究竟。

2024-03-09 23:02:02 1305

原创 Linux——文件标识符

我们是通过进程对文件进行处理,那么进程的task_struct里面存在一个files_struct指针指向文件描述符表,里面有很多数据,其中有一个struct file* fd_array[]的数组指针,他指向被打开的文件结构体,这个索引就是文件描述符。我们知道,打开文件是要将文件加载到内存中,我们之前的操作是使用进程打开文件,进程是没有这么大的权利的,他肯定是调用了操作系统给我们的系统接口。我们知道,=文件是存储在磁盘中的,如果我们打开文件,需要将文件加载到内存中,这样CPU才可以对文件进行处理。

2024-03-07 23:25:16 1382

原创 Linux——自写一个简易的shell

之前学习了很多进程相关的知识,包括环境变量、进程的创建与退出、进程等待、进程替换。现在可以用所学的作一个小总结,手撕一个shell解释器,大致的思路是先通过环境变量获取相关信息,再通过fork创建子进程并进行程序替换,bash的命令。

2024-03-05 18:06:04 578

原创 Linux——进程控制(三)进程程序替换

之前,我们学习了进程的fork创建,进程的等待,执行的代码都是父进程代码的一部分,如果我们想要子进程执行全新的代码并访问全新的数据,不和父进程共享一份代码,此时就需要用上进程程序替换。

2024-03-04 16:33:09 985

原创 Linux——进程控制(二)进程等待

前面我们花了大量的时间去学习,退出并不难,但更深入的学习能为本章进程等待打好基础,因此没看过的小伙伴可以先学习进程退出。

2024-03-02 17:16:04 1070

原创 Linux——进程控制(一)进程的创建与退出

退出码可以使用C语言内置的,也可以自定义,自己对退出码做解释,因为退出码退出多少(也就是return 返回多少是你自己设置的)如下就是自定义的退出码,如果你的代码根据用户的操作出现了错误,可以返回响应的值,来知道发生了什么错误。查看进程运行完毕,结果是否正确,只需要看退出码即可查看进程异常终止,只需要查看收到的信号是什么即可。

2024-02-29 14:26:21 1231

原创 Linux------进程地址空间

在进程地址空间中,我们进行了很多划分,将数据划分到对应的区中,再用页表映射到物理内存上,这样方便我们更好管理。生活中也存在区域划分的情况,比如我们上学时期同桌给划分的三八线,超过线就要被惩罚。例如//........等等使用long整形将区域的起始地址和结束地址存放起来,进程就可以将数据放到对于区域的地址范围中。这样就完成了区域划分。我们打开linux2.6的源码也可以看到一些。

2024-02-27 16:24:20 1077

原创 Linux------环境变量

在前面我们学习了进程与命令行参数,了解到了指令的本质就是可执行程序,选项就是通过main函数参数argv来获取并处理的。但是系统的一些mkdir/ls/rm/pwd等指令,是不需要添加./来执行的,而我们自己写的程序需要添加./来指定路径执行(系统找不到)。其实这都跟环境变量有关系,./的目的是从当前文件夹中去寻找程序。设置了环境变量后,系统就知道了程序的路径,会去你设置的路径里面寻找,如果存在,就开始运行了。

2024-02-18 17:11:22 1769

原创 Linux------命令行参数

当我们在命令行输入 ls -al ,可以查看当前文件夹下所有文件的信息,还有其他的如rm,touch等指令,都可以帮我们完成相应的操作。其实运行这些指令的本质就是进程,当我们输入相关指令的时候,系统会判断该指令是否能被找到,如果能找到,就会执行相应的程序(形成进程), 让这个进程来帮我们完成相关操作。具体是如何处理的呢?今天我们就来学习一下命令行参数。

2024-02-06 23:51:25 3347 1

原创 Linux------进程优先级与进程切换

首先我们得知道一个进程总是需要排队的,他一会在运行队列中排队等待运行,一会在设备的等待队列中排队,。。

2024-02-02 01:30:33 1329

原创 Linux------进程状态

在之前,我们学习了Linux为什么要有PCB-----先描述,在组织。使用PCB将系统中的资源组织起来,方便操作系统和用户进行管理访问。还学习了Linux中进程的创建和fork操作,现在我们来讲一讲实际的PCB中的重要字段-------。

2024-01-27 13:51:29 981

原创 Linux------进程的fork()详解

在之前,我们学习了进程的概念以及命令行启动进程,今天我们来学习另一种进程创建方法:用代码创建进程。这里我们简单回顾一下,进程 = 可执行程序+task_struct对象。创建一个进程,在系统中要申请内存,保存当前进程的可执行程序 + task_struct对象,并将 task_struct对象添加到进程列表。

2024-01-16 17:19:15 1827

空空如也

空空如也

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

TA关注的人

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