自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 线程同步与互斥(上)

上一篇:线程概念与控制我们学习了线程的控制及其相关概念之后,我们清楚:线程是共享地址空间的,所以线程会共享大部分资源。

2025-04-04 21:53:08 661

原创 线程概念与控制(下)

线程概念与控制(中)

2025-03-31 20:54:31 666

原创 线程概念与控制(中)

线程概念与控制(上)

2025-03-29 18:35:45 985

原创 线程概念与控制(上)

我们Linux“线程”,可以采用“进程来模拟”;对资源的划分,本质就是对地址空间,虚拟地址范围的划分,虚拟地址就是资源的代表;我们该如何理解代码区划分?

2025-03-26 19:32:59 843

原创 Linux进程信号(下:补充)

Linux进程信号(下)我们本篇来补充对上文的叙述:理解用户态和内核态。

2025-03-22 21:43:17 715

原创 Linux进程信号(下)

如果信号的处理动作是自定义的信号处理函数(即用户定义的信号处理函数),内核会将控制权返回到用户模式,并执行相应的信号处理函数。这个信号处理函数是在用户空间中定义的,用于处理特定信号的逻辑。

2025-03-20 12:09:11 808

原创 Linux进程信号(中)

递达是终点:信号处理的最终执行阶段,可能终止进程或触发自定义逻辑。未决是等待队列:信号在阻塞期间的临时状态,内核仅记录常规信号一次。如果在进程解除对某信号的阻塞之前这种信号产生过多次,将如何处理?POSIX.1允许系统递送该信号一次或多次。Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里。本章不讨论实时信号。阻塞是主动防御:通过屏蔽信号保护关键代码,与忽略(被动丢弃)有本质区别。操作需谨慎:使用和sigpending。

2025-03-18 17:33:36 847

原创 Linux进程信号(上)

就好比你在听到警报声后,根据之前制定的应急计划,迅速找到重要物品并按照预定路线撤离。这是一种经过提前规划和准备的应对方式。在进程里,开发者可以根据需求定义信号的处理逻辑,让进程在接收到信号时执行特定的操作,而不是简单地终止。

2025-03-17 19:00:05 887

原创 进程间通信(补充)

信号量主要用于同步和互斥的!信号量其实很重要,但是system V版本的信号量并不重要,关于信号量,在后面的多线程专题会着重理解!我们这里先引入一些并发编程的概念铺垫。

2025-03-11 14:01:33 918

原创 进程间通信(下)

对于上篇的学习,由于内容太多,我们接着继续(下篇可点击进入查看)

2025-03-08 18:47:26 620

原创 进程间通信(中)

匿名管道和命名管道的主要区别在于它们的创建和打开方式,以及匿名管道通常用于父子进程间通信,而命名管道用于任意进程间通信。一旦创建和打开完成,它们在通信语义上是相同的。

2025-02-27 20:12:08 999

原创 进程间通信(上)

(问题我们到网络会解决)(就是我们打开文件时,通常喜欢将打开一个文件,叫做打开一个文件流,文件流就是字节流,我们往文件写一个字符串,再写一个浮点数,写一个整数等等,是很好写的,但是我们向文件读取的时候,我们将字符串,整数,浮点数准确读上来,是有点困难的,因为我们写的时候是一条一条写的,但是读的时候是一坨一坨的都上来的。而且文件间共享就是利用文件描述符,A用A的,B用B的文件描述符,只不过指向同一个文件不就可以,基于这种思路,我们既可以遵守Linux下一切皆文件,也可以将之前的技术服用起来。

2025-02-22 21:45:23 619

原创 库制作与原理(下篇:库的理解与加载)

静态链接的出现,确实提高了程序的模块化水平。对于一个大的项目,不同的人可以独立地测试和开发自己的模块。通过静态链接,生成最终的可执行文件。我们知道静态链接会将编译产生的所有目标文件(.o 文件),以及用到的各种静态库(通常是.a 文件)合并成一个独立的可执行文件。在这个过程中,会修正模块间函数的跳转地址,这一过程也被称为“编译重定位”(或“静态重定位”)。也就是说,静态链接在编译阶段就确定了所有函数和变量的最终地址,生成的可执行文件是完全独立的,不依赖于外部库。

2025-02-14 02:52:40 306

原创 库制作与原理(中篇:ELF)

其实我们不需要害怕,我们用到的ELF格式就是一个大文件,比如说这个文件一共是10兆,这个可执行程序10兆的话,所谓的section1,section2,...,sectionN,他本质上只需要告诉我,我这个sectionM相比较于整个文件的开头,我的偏移量大概在什么位置,再加上我的高度,那么此时,我们就能够在文件部分用起始的偏移量+sectionM的长度,就能够将一个section表示出来。是操作系统加载程序时的概念,代表了执行视角下程序在内存中的不同区域,如可执行代码段、可读写数据段、只读数据段等。

2025-02-12 20:22:13 1014

原创 库制作与原理(上篇:动静态库)

库的本质库是一种将现有成熟代码进行复用的方式,避免重复编写相同的代码。通过库,可以将常用的函数或功能封装起来,供多个程序使用。例子在C语言中,标准库提供了许多常用的函数,如printf。如果标准库不提供这些函数,每个程序员都需要自己实现,这会导致代码质量参差不齐。通过将常用的函数(如printf)抽取出来,由顶级程序员实现并打包成库,程序员只需调用库函数即可,无需关心函数的具体实现。现实生活中的类比使用手机时,用户不需要关心手机的生产过程,只需要购买和使用即可。

2025-02-11 23:29:14 937

原创 Ext系列文件系统(下)

这些图描述了在Linux操作系统中,文件从进程打开到挂载在文件系统上的整个流程。首先,每个进程(如进程A和进程B)都有一个结构,其中包含一个结构,用于跟踪该进程打开的所有文件。每个打开的文件由file结构表示,该结构包含文件描述符、文件状态信息以及指向inode和dentry的指针。inode结构代表硬盘文件系统上的索引节点,包含文件的元数据,如权限、所有者、大小和时间戳等。dentry(目录项)结构代表文件系统中的文件名和它对应的inode的关联。dentry通过其d_inode字段与inode关联。

2025-02-10 18:27:55 763

原创 Ext系列文件系统(上)

我们之前说过,文件=内容+属性,这是我们从一个文件得视角去谈的,而系统当中存在成百上千的文件,在系统层面上,文件也就被打开了一小部分,操作是将那么多的文件是进行怎么样的管理呢?更重要的是,我们之前fopen()打开文件的时候,为什么我们的系统就能够准确的把我们想要打开的文件打开,并且可以在系统层面上将文件信息加载到内存?怎么可以做到如此精准?被打开的文件是在内存当中的,因为操作系统要管理他,如果文件没有被打开呢?他在哪里呢?答案是在磁盘上!

2025-02-09 16:45:35 866

原创 基础IO-缓冲区

我们生活中有许多“缓冲区”的,就好比我们学校的菜鸟驿站,别人给你寄快递的时候,你当前可能在宿舍打游戏,你来不及处理这个数据,也就是这个包裹,所以快递员就把你的快递放在了楼下对应的菜鸟驿站里,给你缓存起来,将来要取快递的时候就去底层缓存区去取.你(用户):不用停下手头的事情,继续打游戏。快递员(OS):不需要等任何人,只要将包裹送到菜鸟驿站。菜鸟驿站(内核文件缓冲区):临时存储包裹,直到收件人有空来取。作为一个中间存储点,缓解了快递员和收件人之间的时间不匹配问题。这种机制最大的体现就是提高了效率!!

2025-02-07 11:14:24 839

原创 基础IO-首篇补充

原因是因为,我们今天在进行对应的输出的时候,虽然我们的标准输出和标准错误都指向同一个文件,但是当我们进行对应的重定向时,他的本质是把文件描述符1重定向到新文件log.txt,即把新打开的文件描述符对应内容的的地址拷贝到了1里面,这时候1指向的内容就是log.txt,可是2依旧指向标准错误,在重定向时,这也是我们后面要谈到的,其实struct file是我们操作系统内打开的文件,但是我们文件相关的一些硬属性,相关属性并没有在该file结构体当中存储,而是在另一个数据结构,这个数据结构称为。

2025-02-06 17:38:28 623

原创 基础I/O

Linux内核中进程打开文件的管理机制主要通过和file结构体来实现。以下是详细的机制描述:结构体是Linux内核中描述进程的主要数据结构,它包含了进程的所有信息,包括进程状态、进程ID、文件描述符表等。每个进程都有一个唯一的实例,内核通过这个结构体来管理进程。2.结构体每个进程都有一个结构体,它用于管理进程打开的文件。文件描述符表(fdtable)通过一个指针指向fdtable结构体,该结构体包含文件描述符数组和其他相关信息。fdtable结构体。

2025-02-05 20:47:00 646

原创 Linux重定向:面试必备知识与实战技巧

在 Linux 中,重定向是一种通过命令符将标准输出或标准输入重新导向到文件、另一个设备或网络上的操作。这种功能使得数据处理更加高效和灵活。

2025-02-03 20:51:08 439

原创 自主Shell命令行解释器

我们一直使用的"ls","cd","pwd","mkdir"等命令,都是在命令行上输入的,我们之前对于命令行的理解:命令行是干啥的?是为我们做命令行解释的。命令行这个东西实际上是我们登入时,系统默认创建的,我们最终输入的命令都交给他了。

2025-02-03 20:29:12 977

原创 进程控制-下篇

我们编译的时候要有编译器,形成可执行程序之前还要有链接动静态库,链接完成程序要加载,,那么,加载就需要加载器,加载就是把程序载入到我们的内存当中,后来我们学习了操作系统我们知道:任何程序在载入内存的时候,首先要变成进程,所以,程序的加载本质就是一个动态创建一个进程的过程,我们大概了解了shell之后,我们基本所有的命令都是bash的子进程。这使得进程可以执行完全不同的程序,而进程ID保持不变。所以在程序替换的过程中,并没有创建新的进程,只是把当前进程的代码和数据用新的程序的代码和数据覆盖式的进行替换!

2025-02-02 16:16:59 688

原创 进程控制-上篇

操作系统创建内核数据结构失败了:PCB,虚拟地址空间还有页表对应的物理内存申请不出来了,因为毕竟我们的PCB,虚拟地址空间还有vm_areas_struct,包括页表,这些东西就是数据结构对象,是需要开辟空间的,只不过这批数据结构,这些结构体对象是在我们操作系统内定义的,他开辟失败了,另一个就是加载内存的时候失败了:比如说加载代码和数据的时候失败了。到这我们已经知道了,创建一个进程就是在操作系统内多了一个进程,多了一个进程就是多了PCB,虚拟地址空间,页表,甚至未来还要多代码和数据,因为要加载新的程序。

2025-02-01 16:29:35 653

原创 程序地址空间

因为有了虚拟地址空间和页表的存在,物理内存中的数据可以被加载到任意位置,而进程管理模块和内存管理模块可以解耦合。这是因为虚拟地址空间为每个进程提供了独立的地址映射,而页表则负责将虚拟地址映射到物理地址。这种机制使得物理内存的分配和进程的管理可以独立进行。虚拟地址空间:每个进程都有自己的虚拟地址空间,操作系统通过页表将虚拟地址映射到物理地址,从而实现了进程之间的隔离。按需加载:操作系统采用按需加载的方式,只有当进程实际访问某个虚拟地址时,才会触发缺页中断,操作系统才会将相应的数据从磁盘加载到物理内存中。

2025-01-29 20:46:19 1090

原创 环境变量

环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数;如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器进⾏查找;环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性。环境变量的存储环境变量最初由操作系统和用户配置文件定义,bash在启动时读取这些变量,并在内部构建环境变量表。命令查找过程bash通过环境变量表中的PATH。

2025-01-27 14:57:54 663

原创 指针的进阶理解与应用:深入探索C语言指针的高级特性

函数指针是一个指向函数的指针,可以用于存储函数的地址,并通过指针调用函数。函数指针的定义需要明确函数的返回类型和参数列表。// 定义一个函数指针// 将函数指针指向add函数// 通过函数指针调用函数指针是C语言中一个强大而灵活的工具,通过深入理解指针的高级特性,可以实现复杂的数据结构、高效内存管理和灵活的编程模式。在实际开发中,需要注意指针的生命周期管理和野指针的防范,以确保程序的稳定性和可靠性。希望本文能够帮助读者进一步掌握指针的高级应用,提升C语言编程水平。

2025-01-25 17:10:59 973

原创 进程调度

分时操作系统适合处理多任务,强调资源利用和公平性,适用于通用计算环境。实时操作系统强调任务的及时响应和严格的时间约束,适用于对时间敏感的领域,如汽车电子和工业自动化。在实际应用中,选择哪种操作系统取决于具体的需求和场景。例如,汽车的行车电脑需要实时操作系统来确保安全功能的及时响应,而个人电脑则更适合分时操作系统以支持多任务处理。

2025-01-25 16:42:27 1081

原创 进程切换

于是你开始“切换工作”:你迅速收拾桌面上的文案工具,把它们放进抽屉(保存当前进程的上下文到进程控制块PCB),然后拿起咖啡师的围裙、咖啡豆、杯子等咖啡店工作需要的工具(加载新进程的上下文到寄存器),赶往咖啡店继续工作。(时间片到了,操作系统就要切换他)于是你再次收拾咖啡店的工具,把它们放回咖啡店的储物柜(保存咖啡店进程的上下文),然后重新拿出文案工具,回到办公室继续之前未完成的文案工作(恢复文案进程的上下文并继续执行)。进程切换,最核心的,就是保存和恢复当前进程的硬件上下文数据,即CPU内寄存器的内容!

2025-01-24 16:16:50 1052

原创 联合体与枚举

联合体是一种特殊的数据类型,允许在同一块内存位置存储不同类型的多个成员。所有成员共享同一块内存空间,这意味着在任何时刻,联合体只能存储其中一个成员的值。联合体的大小由其最大成员的大小决定。int i;float f;枚举是一种用户自定义的数据类型,用于定义一组相关的常量。枚举通过关键字enum定义,每个枚举常量都有一个整数值。

2025-01-23 23:19:55 467

原创 Linux权限管理:从用户切换到文件权限

无论是用户切换、文件权限调整,还是特殊权限的使用,Linux都提供了强大的工具来确保系统的安全性和灵活性。Linux文件权限分为三类:所有者(User)、所属组(Group)和其他用户(Other)。接下来的 9 个字符分为三组,分别表示所有者、所属组和其他用户的权限。ACL 提供了更灵活的权限管理,允许为特定用户或组设置独立的权限。粘滞位用于公共目录,防止用户删除其他用户的文件。:允许修改文件内容或在目录中创建/删除文件。:允许用户以文件所有者的权限运行文件。:允许用户以文件所属组的权限运行文件。

2025-01-23 23:09:52 905

原创 进程优先级

时间片是操作系统分配给每个进程的一段CPU使用时间。当一个进程的CPU时间用完时,它会被挂起,操作系统会将CPU分配给另一个进程。

2025-01-23 23:02:00 694

原创 进程状态

Linux内核中的链表设计与用户空间中的链表设计不同,主要体现在节点结构和使用方法上。内核链表通过将数据和链表结构分离,实现了更轻量级和灵活的设计。理解这些区别有助于更好地使用和优化内核代码。我们到现在,对进程状态有了一个较粗力度的认识,接下来我们就要开始谈论具体Linux进程的状态。上面是Linux进程的理论。

2025-01-21 00:54:54 1140

原创 进程概念与基本操作

看上图的测试结果,我们子进程的返回值是0,父进程的返回值是子进程的pid,主要原因是我们的Linux系统里,子进程 : 父进程(比值关系)=n : 1,可以说任何一个父进程可以有一个或者多个孩子,当让也可以是0个,所以一定要把孩子的pid返回给父进程,因为父进程要通过不同的pid来区分他不同的子进程,方便未来父进程对其子进程的管理,而子进程就不需要获得父进程的pid,因为子进程getppid(),就可以获得父进程的pid了,所以子进程只需要确定自己是否被创建就行了。子进程默认共享父进程的代码和数据。

2025-01-17 21:09:13 670

原创 学习进程前的简单认知-体系结构与OS

每一个硬件都有硬件名,操作系统怎么管理硬件的,硬件名,硬件状态,硬件其他的属性,操作系统可以在自己操作系统内部先描述再组织,把网卡,硬盘,显卡,键盘,显示器统一可以使用struct_devise定义一个类,类里面可以包含每种硬件的各种属性,其中,我们的属性包括硬件的名称,硬件的状态,硬件相关的链接信息,所以在操作系统内,构建struct_devise这样的结构,每一个设备都要对应一个struct_devise这样的对象,把这样的对象管理起来,所以操作系统管理硬件转化成了对链表的增删查改。

2025-01-14 20:47:31 920

原创 gdb/cgdb调试技巧加餐

通过这些步骤,你可以更有效地使用GDB来调试程序,找到并修复隐藏在代码中的问题。希望这些解释和示例能帮助你更好地理解和使用GDB。如果你有⼀些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如果变化了,就会通知你。的值发生变化时,GDB会暂停程序并通知你。假设我们已经设置了一个普通断点,现在想要给它追加条件。我们能使用set var来进行变量值的临时的调整。变量的变化,以确保它正确地累加了从。等于30时暂停程序,以检查此时的。删除的时候就和删除断点一样。函数中添加了一个全局变量。

2025-01-12 18:12:27 976

原创 调试器gdb/cgdb的使用

通过本文的介绍,相信你已经对GDB/CGDB调试器的使用有了基本的了解。在实际开发中,熟练掌握这些调试工具将大大提高你的开发效率,帮助你快速定位和修复程序中的问题。无论是简单的逻辑错误,还是复杂的内存泄漏或并发问题,GDB/CGDB都能为你提供强大的支持。希望本文能成为你在Linux开发旅程中的一个有用的参考。

2025-01-11 19:28:38 991

原创 版本控制器Git:时间机器与备份系统

Git可以控制电脑上所有格式的文件,如doc、excel、dwg、dgn、rvt等。对于开发者而言,Git最重要的功能是帮助管理软件开发项目中的源代码文件。版本控制系统(如Git)就像一个时间机器和备份系统,帮助你管理项目的每一个版本。Git仓库是一个图书馆,记录了你的项目文件夹(书架)的每一次变化。通过提交(拍照留念)、分支(平行宇宙)和合并(故事融合),你可以灵活地管理你的项目,确保你的工作安全且易于协作。远程仓库则让你可以与他人共享和同步你的项目,就像一个云端图书馆一样。

2025-01-11 01:42:58 903

原创 Linux第一个系统程序---进度条

进度条---命令行版本。

2025-01-09 16:33:45 2375 2

原创 Linux项目自动化构建工具-make/Makefile

虽然它在某些情况下有用,但每次文件被访问时,操作系统都需要更新atime,这会导致额外的磁盘I/O开销,降低系统性能,尤其是在高并发的文件访问场景下,会增加磁盘I/O压力,影响文件访问效率。因为我们修改文件的同实,我是在code.c文件中加入了一行printf代码,这样文件的size(大小)就发生了变化,所以在我们修改文件内容的时候,文件内容和文件属性被同时修改了,导致了Modify和Change的时间戳发生了变化,其实Modify的时间戳也是文件的属性,所以通过文件内容的修改,他们两者是同时变化的。

2025-01-08 22:46:41 962

包含了多个关于C++编程概念和特性的图像文件,具体内容涵盖了排序算法、内存管理、迭代器使用、拷贝构造函数等多个方面,会更新,放心

本资源集合包含了多个关于C++编程概念和特性的图像文件,具体内容涵盖了排序算法、内存管理、迭代器使用、拷贝构造函数等多个方面。以下是对每项资源的简要描述: 1. Hoare Sort (hoareSort.png): 描述了霍耳排序算法的图解,展示了递归思想在排序中的应用。 2. New and Delete (new-delete.png): 展示了带有和不带有析构函数的类在内存管理上的差异,以及编译器优化的影响。 3. C++98 Swap (C++98_swap.png): 展示了C++98标准下`std::swap`函数模板的行为,包括内存空间的交换和深拷贝与浅拷贝的概念。 4. Reverse Iterator (reverse_iterator.png): 解释了反向迭代器的概念,以及它如何指向字符串的最后一个有效字符的前一个位置。 5. Shell Sort (Shell_Sort.png): 展示了希尔排序的分组和预排序结果,说明了排序过程中的gap变化。 6. String Iterator (string_iterator.png): 等等

2024-08-23

STL中string,vector,list,queue,stack....等原码

1. 资源来源:STL 2. 资源类型: 源码:提供STL的原始代码,允许用户查看和修改STL的内部实现 3. 资源内容:描述资源覆盖的主题和内容,例如容器、迭代器、算法、函数对象、适配器等。 4. 资源适用性: 进阶学习者:适合已经有一定基础,希望深入理解STL的用户 5. 资源形式:在线文档 6.资源语言:英语

2024-08-23

空空如也

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

TA关注的人

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