- 博客(81)
- 收藏
- 关注
原创 Linux进程(四)系统中进程调度详解
2)时间片轮转法 时间片轮转(RR,Round Robin)算法也是用于实时进程,它的基本思想是给每个实时进程分配一个时间片,然后按照它们的优先级rt_priority加入到相应的活动队列中。在进程的运行过程中,如果有更高优先级的实时进程就绪,则调度程序就会中止当前进程而去响应高优先级的进程。1)先进先出法 先进先出(FIFO,First In First Out)调度算法用于实时进程,采用FIFO策略的实时进程就绪后,按照优先级rt_priority加入到相应的活动队列的队尾。普通进程的实际优先级。
2024-09-30 08:39:37 761
原创 Linux进程(三)系统中进程控制功能详解
进程控制是指对进程的生命周期进行有效的管理,实现进程的创建、撤销以及进程各状态之间的转换等控制功能。进程控制的目标是使多个进程能平稳地并发执行,充分共享系统资源。
2024-09-30 08:39:18 604
原创 Linux进程(二)系统中进程状态及运行模式详解
在Linux系统中进程也被称为任务(task),两者的概念是一致的。Linux的进程共有5种基本状态,包括:运行、就绪、睡眠(分为可中断与不可中断)、暂停和僵死。Linux将这些基本状态归结为4种并加以命名和定义:可执行态:包括运行和就绪两种状态。处于可执行态的进程均已具备运行条件。睡眠态:即等待态。进程在等待某个事件或资源。可细分为可中断的(interruptible)和不可中断的(uninterruptible)。不可中断:睡眠过程中进程会忽略信号。
2024-09-29 10:22:11 622
原创 Linux进程(一)基础知识详解
进程由程序、数据和进程控制块三部分组成,其中程序是进程执行的可执行代码,数据是进程所处理的对象,进程控制块记录进程的所有信息。运行态→就绪态:正在执行的进程的时间片用完了,或者有更高优先级的进程到来,系统会暂停该进程的运行,使其进入就绪态,然后调度其他进程运行。进程描述信息用于记录一个进程的特征和基本情况,通过这些信息可以识别该进程,了解该进程的归属信息,确定这个进程和其他进程之间的关系。等待态→就绪态:处于等待状态的进程,当所申请的资源得到满足,则系统将资源分配给它,并将其状态变为就绪态。
2024-09-29 10:20:24 790
原创 Linux文件系统入门详解-总结大章
文件系统,本身是对存储设备上的文件,进行组织管理的机制。组织方式不同,就会形成不同的文件系统。比如常见的 Ext4、XFS、ZFS 以及网络文件系统 NFS 等等。
2024-09-28 09:15:50 1005
原创 Linux系统调用与库函数调用及部分函数运用详解
printf,scanf,fopen,fclose,fgetc,fgets,fprintf,fsacnf,fputc,calloc,free,malloc,realloc,strcat,strchr,strcmp,strcpy,strlen,strstr等,需要包含stdio.h,string.h,alloc.h,stdlib.h等头文件。返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0。路径名为绝对路径名,文件则是在当前工作目录下的。
2024-09-28 09:15:14 604
原创 Linux系统调用IO和标准IO详解
标准IO其实就是stdio.h头文件中提供的IO接口,只不过在特定的系统中可能有特定的内部实现。和系统调用IO类似,标准IO也预定义了三个文件指针stdin、stdout、stderr,分别对应标准输入、标准输出、标准错误。
2024-09-27 09:16:04 1019
原创 Linux系统IO-文件描述符详解
在 Linux 操作系统中,当一个应用程序或进程操作系统资源时,首先会触发文件调用事件,通过应用程序或进程发送一个调用文件的信号给操作系统内核,内核会在。在Linux操作系统上,每个进程都有三个标准的 「POSIX」文件描述符,对应三个标准流,按照索引以 0 开始,分别是。操作系统中应用程序或进程的调度总是在和文件打交道,对于一个活动着的进程,同样可以通过进程看到对应的 文件描述符 的信息。当操作系统本身的内存资源很小或者内存足够用的情况下,需要动态调整系统分配的文件描述符的数量,可通过命令进行调整。
2024-09-27 09:15:36 536
原创 Linux标准IO(五)-I/O缓冲详解
出于速度和效率的考虑,系统 I/O 调用(即文件 I/O,open、read、write 等)和标准 C 语言库 I/O 函数(即标准 I/O 函数)在操作磁盘文件时会对数据进行缓冲,本小节将讨论文件 I/O 和标准 I/O 这两种 I/O 方式的数据缓冲问题,并讨论其对应用程序性能的影响。除此之外,本小节还讨论了屏蔽或影响缓冲的一些技术手段,以及直接 I/O 技术—绕过内核缓冲直接访问磁盘硬件。
2024-09-26 09:23:06 1489
原创 Linux标准IO(四)-格式化I/O输入
其函数定义如下所示:可以看到,这 3 个格式化输入函数也是可变参函数,它们都有一个共同的参数 format,同样也称为格式控制字符串,用于指定输入数据如何进行格式转换,与格式化输出函数中的 format 参数格式相似,但也有所不同。每个函数除了固定参数之外,还可携带 0 个或多个可变参数。scanf()函数可将用户输入(标准输入)的数据进行格式化转换;fscanf()函数从 FILE 指针指定文件中读取数据,并将数据进行格式化转换;
2024-09-26 09:22:33 725
原创 Linux标准IO(三)-格式化I/O输出
长度修饰符指明待转换数据的长度,因为 type 字段指定的的类型只有 int、unsigned int 以及 double 等几种数据类型,但是 C 语言内置的数据类型不止这几种,譬如有 16bit 的 short、unsigned short,8bit 的 char、unsigned char,也有 64bit 的 long long 等,为了能够区别不同长度的数据类型,于是乎,长度修饰符(length)应运而生,成为转换说明的一部分。这里只是以 printf()函数举个例子,实际上并不这样用。
2024-09-25 10:22:10 1098
原创 Linux标准IO(二)-打开、读写、定位文件
在前面所介绍的文件 I/O 中,使用 open()系统调用打开或创建文件,而在标准 I/O 中,我们将使用库函数fopen()打开或创建文件,fopen()函数原型如下所示:使用该函数需要包含头文件 stdio.h。path:参数 path 指向文件路径,可以是绝对路径、也可以是相对路径。mode:参数 mode 指定了对该文件的读写权限,是一个字符串,稍后介绍。
2024-09-25 10:12:42 1093
原创 Linux标准IO(一)-基础知识详解
所谓标准 I/O 库则是标准 C 库中用于文件 I/O 操作(譬如读文件、写文件等)相关的一系列库函数的集合,通常标准 I/O 库函数相关的函数定义都在头文件中,所以我们需要在程序源码中包含头文件。
2024-09-24 10:14:34 943
原创 Linux文件IO(十一)-复制文件描述符与截断文件
在 Linux 系统中,open 返回得到的文件描述符 fd 可以进行复制,复制成功之后可以得到一个新的文件描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作,复制得到的文件描述符和旧的文件描述符拥有相同的权限,譬如使用旧的文件描述符对文件有读写权限,那么新的文件描述符同样也具有读写权限;在 Linux 系统下,可以使用 dup 或 dup2 这两个系统调用对文件描述符进行复制,本小节就给大家介绍这两个函数的用法以及它们之间的区别。
2024-09-24 10:08:29 835
原创 Linux文件IO(十)-fcntl 和 ioctl
执行成功的情况下,其返回值与 cmd(操作命令)有关,譬如 cmd=F_DUPFD(复制文件描述符)将返回一个新的文件描述符、cmd=F_GETFD(获取文件描述符标志)将返回文件描述符标志、cmd=F_GETFL(获取文件状态标志)将返回文件状态标志等。当 cmd=F_DUPFD 时,它的作用会根据 fd 复制出一个新的文件描述符,此时需要传入第三个参数,第三个参数用于指出新复制出的文件描述符是一个大于或等于该参数的可用文件描述符(没有使用的文件描述符);返回值:成功返回 0,失败返回-1。
2024-09-23 09:29:45 987
原创 Linux文件IO(九)-原子操作与竞争冒险
假定此时进程 A 处于运行状态,B 未处于等待运行状态,进程 A 调用了 lseek 函数,它将进程 A 的该文件当前位置偏移量设置为 1500 字节处(假设这里是文件末尾),刚好此时进程 A 的时间片耗尽,然后内核切换到了进程 B,进程 B 执行 lseek 函数,也将其对该文件的当前位置偏移量设置为 1500 个字节处(文件末尾)。然后进程 B 调用 write 函数,写入了 100 个字节数据,那么此时在进程 B 中,该文件的当前位置偏移量已经移动到了 1600 字节处。接下来给大家介绍原子操作。
2024-09-23 09:29:11 1177
原创 Linux文件IO(八)-文件共享
进程 1 和进程 2 分别是运行在 Linux 系统上两个独立的进程(理解为两个独立的程序),在他们各自的程序中分别调用 open 函数打开同一个文件,进程 1 对应的文件描述符为 fd1,进程 2 对应的文件描述符为fd2,fd1 指向了进程 1 的文件表 1,fd2 指向了进程 2 的文件表 2;这种情况非常简单,多次调用 open 函数打开同一个文件会得到多个不同的文件描述符,并且多个文件描述符对应多个不同的文件表,所有的文件表都索引到了同一个 inode 节点,也就是磁盘上的同一个文件。
2024-09-22 09:58:51 461
原创 Linux文件IO(七)-复制文件描述符
在 Linux 系统中,open 返回得到的文件描述符 fd 可以进行复制,复制成功之后可以得到一个新的文件描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作,复制得到的文件描述符和旧的文件描述符拥有相同的权限,譬如使用旧的文件描述符对文件有读写权限,那么新的文件描述符同样也具有读写权限;由打印信息可知,fd1 等于 6,复制得到的新的文件描述符为 7(遵循 fd 分配原则),打印出来的数据显示为接续写,所以可知,通过复制文件描述符可以实现接续写。
2024-09-22 09:58:27 769
原创 Linux文件IO(六)-多次打开同一个文件
大家看到这个小节标题可能会有疑问,同一个文件还能被多次打开?事实确实如此,同一个文件可以被多次打开,譬如在一个进程中多次打开同一个文件、在多个不同的进程中打开同一个文件,那么这些操作都是被允许的。本小节就来探讨下多次打开同一个文件会有一些什么现象以及相应的细节问题?
2024-09-21 11:37:17 1371
原创 Linux文件IO(五)-三种进程退出方法及空洞文件
示例代码中,我们使用 open 函数新建了一个文件 hole_file,在 Linux 系统中,新建文件大小是 0,也就是没有任何数据写入,此时使用lseek函数将读写偏移量移动到4K字节处,再使用write函数写入数据0xFF,每次写入 1K,一共写入 4 次,也就是写入了 4K 数据,也就意味着该文件前 4K 是文件空洞部分,而后 4K数据才是真正写入的数据。exit()函数_exit()函数都是用来终止进程的,exit()是一个标准 C 库函数,而_exit()和_Exit()是系统调用。
2024-09-21 11:28:41 1230
原创 Linux文件IO(四)-返回错误处理与errno详解
其实不然,在 Linux 系统下对常见的错误做了一个编号,每一个编号都代表着每一种不同的错误类型,当函数执行发生错误的时候,操作系统会将这个错误所对应的编号赋值给 errno 变量,每一个进程(程序)都维护了自己的 errno 变量,它是程序中的全局变量,该变量用于存储就近发生的函数执行错误编号,也就意味着下一次的错误码会覆盖上一次的错误码。从图中红框部分描述文字可知,当函数返回错误时会设置 errno,当然这里是以 open 函数为例,其它的系统调用也可以这样查找,大家可以自己试试!
2024-09-20 09:10:41 922
原创 Linux文件IO(三)-Linux系统如何管理文件
以上就是本小节给大家介绍到所有内容了,上面给大家所介绍的内容后面的学习过程中还会用到,虽然这些理论知识对大家的编程并没有什么影响,但是会帮助大家理解文件 IO 背后隐藏的一些理论知识,其实这些理论知识还是非常浅薄的、只是一个大概的认识,其内部具体的实现是比较复杂的,当然这个不是我们学习 Linux 应用编程的重点,操作系统已经帮我们完成了这些具体的实现,我们要做的仅仅只是调用操作系统提供 API 函数来完成自己的工作。根据 inode 结构体中记录的信息,确定文件数据所在的 block,并读出数据。
2024-09-20 09:09:25 1311
原创 Linux文件IO(二)-文件操作使用详解
前篇已经讲过open打开文件的操作使用,本篇文章介绍剩余的wirte、read、close、lseek等操作。
2024-09-19 09:22:14 1268
原创 Linux文件IO(一)-open使用详解
Tips:open 函数 O_RDONLY、O_WRONLY 以及 O_RDWR 这三个标志表示以什么方式去打开文件,譬如以只写方式打开(open 函数得到的文件描述符只能对文件进行写操作,不能读)、以只读方式打开(open函数得到的文件描述符只能对文件进行读操作,不能写)、以可读可写方式打开(open 函数得到的文件描函数得到的文件描述符只能对文件进行读操作,不能写)、以可读可写方式打开(open 函数得到的文件描述符可对文件进行读和写操作);关于文件权限等相关问题,将会在 4.1 中给大家介绍。
2024-09-19 09:15:58 1026
原创 Linux文件IO-基础知识了解及文件描述符
本章给大家介绍 Linux 应用编程中最基础的知识,即文件 I/O(Input、Outout),文件 I/O 指的是对文件的输入/输出操作,说白了就是对文件的读写操作;Linux 下一切皆文件,文件作为 Linux 系统设计思想的核心理念,在 Linux 系统下显得尤为重要,所以对文件的 I/O 操作既是基础也是最重要的部分。
2024-09-18 17:49:14 1072
原创 Linux标准IO-系统调用详解
LED 应用程序与 LED 驱动程序是分隔、分离的,它们单独编译,它们并不是整合在一起的,应用程序运行在操作系统之上,有操作系统支持,应用程序处于用户态,而驱动程序处于内核态,与纯粹的裸机程序存在着质的区别。内核提供了一系列的服务、资源、支持一系列功能,应用程序通过调用系统调用 API 函数来使用内核提供的服务、资源以及各种各样的功能,如果大家接触过其它操作系统编程,想必对此并不陌生,譬如Windows 应用编程,操作系统内核一般都会向应用程序提供应用编程接口 API,否则我们将我无法使用操作系统。
2024-09-18 17:44:53 1109
原创 C++数据结构-哈夫曼树的介绍、查找算法与编码(进阶篇)
其次,将刚才合成的数据作为右孩子,左孩子从未处理的数据中选出最小的一个,作为左孩子,他们的根同样为左右孩子的权值和。由上文的分析可知,构建哈夫曼树时,我们需要根据各个结点的权重值,筛选出其中值最小的两个结点,构建二叉树。霍夫曼编码是一种无前缀编码。不断重复上述的步骤,直到将所有的数据全部处理完并构建出二叉树,这棵二叉树就是我们的哈夫曼树。首先,选出我们数据中最小的两个数据,构建成二叉树的左孩子和右孩子,而根的数据为两者之和。d) 结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。
2024-09-17 10:14:05 911
原创 C++数据结构-树的深度优先搜索及树形模拟法运用(进阶篇)
(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n),DFS搜索的过程访问可以称之为DFS序。如图:
2024-09-17 10:13:31 1109
原创 C++数据结构-二叉树的三种遍历方法(进阶篇)
树作为非线性数据结构,在我们取出数据时就需要设计遍历,所谓遍历,就是按照一定的规则性,将数据结构中的所有数据全部依次访问,而二叉树本身并不具有天然的全局次序,故为实现遍历,需通过在各节点与其孩子之间约定某种局部次序,间接地定义某种全局次序,这便是我们常规定的先序,中序,后续遍历。在开始前,请记住下面的这三句话:先序遍历:根左右中序遍历:左根右后序遍历:左右根。
2024-09-16 09:59:08 1293
原创 C++数据结构-二叉树的存储方法(基础篇)
如同当时学习链表的创建,首先,我们创建一个空的结点再进行连接,首先将这个空的结点中的date域赋予数据,再判断tree中是否是一个空树,如果为空,只需要将整个根指向这一个结点即可,如果不为空,再进行两个判断,判断输入的数据是否大于或者小于当前比对的结点数据,根据其大小进行相应的排列,这样存储进入的数据总是有一定规律的,在输出的时候根据这个规律进行输出就可以达到想要的效果。a)结点元素,data域,用来存储数据,其可以是int,char等基本的类型,同时也可以是struct等这些复杂的复合数据类型。
2024-09-16 09:58:39 448
原创 C++数据结构-树的概念及分类介绍(基础篇)
树是数据结构中的一种,其属于非线性数据结构结构的一种,我们前文所提到的数据结构多数都是线性的,这也是较为简单的数据结构,而接下来的树与图均属于非线性数据结构,也是概念极多的一类。完全二叉树:对一颗具有n个结点的二叉树按层编号,如果编号为i(1
2024-09-15 12:04:28 1105
原创 C++广义表的介绍及创建方法-附C语言实现代码
Atom/Node域的内容由tag标志决定,当Tag为0时表示该节点是原子结点(即存放原子数据),当Tag为1时表示该节点为指向下一个广义表的指针(即表结点),Link域存放与本元素同一层的下一个元素所在的结点地址,当本元素时所在层的最后一个元素时,Link域为NULL;对于代码的书写,我们首先需要对传入的字符串进行切割,将每一组括号”()”进行分割,每一组括号其中就表示的一份新的广义表,我们需要找到括号并且与这个括号相互匹配的括号数进行对应,找到并切割掉,以此分离出表头串,方便我们进行后续的操作。
2024-09-15 12:04:06 1167
原创 C++中矩阵的介绍及相关应用扩展详解
从前文的代码实现可以看出,矩阵在整个计算机中使用非常广泛,而其实现方式又无不与二维数组这个概念相对应,二维数组是最简单的矩阵表示方式,其便利性可以让我们设计出相当多的矩阵相关的算法,与一维的运算不同,二维的运算无论从理解出发还是计算乃至代码设计出发,都复杂了许多,这就需要充分的数学知识做铺垫,也希望读者能够细细理解代数这一门学科的奥妙。
2024-09-14 09:29:54 1212
原创 C++中string字符串类型介绍及数组模拟
但在实际中,编程应该讲究灵活贯通,链表等虽然操作方便,但是其由于指针以及其他结构的设计问题本身占用空间就比较大,因此,灵活掌握合适的数据结构的使用是必须的。这里介绍一个编程的思维——模拟,所谓模拟,就是通过简单易懂的方式,根据所给出的要求,一一进行实现,通过代码模拟出所需要实现的方法过程,模拟的方法不是一种具体的实现算法,而是一种思维。C语言中通过字符相连已经基本创造出了字符串的常规操作,然而,字符串在C语言中并不是常规类型,而是一个类似于数组的结构,在C++中,通过模板类的操作创建了。
2024-09-14 09:10:40 884
原创 字符串的KMP算法详解及C/C++代码实现
紧接上文,我们知道了暴力匹配的算法在时间运行上的缺陷,假设字符串T的长度为n,字符串P的长度为m,则整个算法的时间复杂度为O( n * m ),而对于一个复杂的现实情况而言 n >> m >> 2 (即n远远大于m,m远远大于常数),这样的计算计算机的负担很重。对于模式串P而言,我们需要知道模式串中P的每一位的前一位是否存在相等的完全相等的前后缀,并且求这个最大的完全相等的前后缀,如一个模式串”ABCABDE”对于第倒数第二位字符而言,其符合情况的前后缀就是”AB”,而最后一位则没有完全相等的前后缀。
2024-09-13 09:08:18 550
原创 C++字符串的常用操作
这并不是最理想的算法,但却这是字符串匹配算法中最容易理解的算法,算法核心为给定一个主串T和一个模式串P,求问是否P是属于T的一个字串,如:”Hello”中”llo”就是其中的一个字串,对于暴力匹配算法而言,我们可以利用两层循环进行比对,第一层循环中找寻T字符串中的每一个字符,第二层循环找寻的是每一个P字符,进入第二层循环时T字符串也会跟着进行字符前进,如果发生不匹配则产生一个回溯回到第一层循环的进入字符的下一个字符。输出Welcome Hello。
2024-09-13 09:05:19 987
原创 Linux内存管理知识-一篇文章了解堆和栈区别(进阶篇)
前面已经介绍过,栈是由编译器在需要时分配的,不需要时自动清除的变量存储区。里面的变量通常是局部变量、函数参数等。堆是由malloc()函数分配的内存块,内存释放由程序员手动控制,在C语言为free函数完成。
2024-09-12 08:35:07 1128
原创 Linux内存管理知识-堆区和栈区(基础篇)
可执行程序在存储时(没有调入到内存)分为3个部分。加上static,则表示此函数只能在当前文件中被调用。
2024-09-12 08:34:05 699
原创 Makefile变量的定义与使用与自动化变量
变量对于我们来说是不陌生的,在学习各种编程语言时会经常用到。就拿C语言来说,变量的使用是十分常见的,变量可以用来保存一个值或者是使用变量进行运算操作。Makefile 中的变量也是这样,我们可以利用它来表示某些多处使用而又可能发生变化的内容,不仅可以节省重复修改的工作,还可以避免遗漏。Makefile 文件中定义变量的基本语法如下:变量的名称=值列表Makefile 中的变量的使用其实非常的简单,因为它并没有像其它语言那样定义变量的时候需要使用数据类型。
2024-09-11 09:13:24 1265
原创 关于Linux Makefile的一些函数知识foreach、if、call、origin、shell、error和warning
foreach函数的工作过程是:把LIST中使用空格分割的单词依次取出并赋值给变量VAR,然后执行TEXT表达式。重复这个过程,直到遍历完LIST中的最后一个单词。函数的返回值是TEXT多次计算的结果。现在编写一个Makefile,自动搜索各个目录下的C源文件。
2024-09-11 09:07:15 759
ipmsg飞鸽传输项目源码与软件需求说明书.zip
2024-09-06
《Linux操作系统命令全攻略》图解手册
2024-09-06
《C++ STL标准模板库完全指南》详解与实战案例
2024-09-06
《150款专业单页简历模板》精选合集
2024-09-06
《嵌入式面试Linux核心知识点》全面解析
2024-09-06
F103-指南者-原理图.zip
2024-08-31
STM32固件库使用手册的中文翻译版.zip
2024-08-31
掌握UDP网络编程:嵌入式系统工程师的高效通信指南
2024-08-24
精通Socket编程:嵌入式系统工程师的TCP/IP网络通信指南
2024-08-24
嵌入式系统工程师必读:全面深入的计算机网络基础与TCP/IP协议解析
2024-08-24
嵌入式系统优化:线程管理与同步互斥机制解析
2024-08-24
嵌入式系统开发:深入理解信号机制及其在进程通信中的应用
2024-08-24
掌握嵌入式系统中的高效IPC:消息队列与共享内存深度解析
2024-08-24
嵌入式系统中的进程间通信:深入管道与命名管道
2024-08-24
深入解析嵌入式系统中的进程管理
2024-08-24
掌握系统调用与标准I/O:Linux系统编程精要
2024-08-24
Linux编程自动化:精通Make工具与Makefile
2024-08-24
深入Linux编程核心:GCC与GDB工具详解
2024-08-24
掌握Linux编程核心:Shell脚本与工具使用指南
2024-08-24
深入探索Linux世界:《Linux下编程工具(概述、目录结构)》精粹指南
2024-08-24
精通Linux命令行:《Linux下编程工具(Linux命令、vi)》教程全解析
2024-08-24
掌握Linux开发环境搭建:Ubuntu系统安装与配置全指南
2024-08-24
深入探索操作系统的演变:从无到有,Linux的崛起与未来
2024-08-23
学生信息管理系统项目答辩PPT
2024-08-23
学生信息管理系统的设计与实现
2024-08-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人