自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小侯宝的博客

长风破浪会有时

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

原创 【C++】命名空间 ( namespace )

命名空间是一种用来避免命名冲突的机制,它可以将一段代码的名称隔离开,使其与其他代码的名称不冲突;命名空间的原理是将一个全局的作用域分成一个个命名空间,每个命名空间是个单独的作用域,同时若是在同一个作用域内可能出现的命名冲突也不会造成影响,有效避免了命名空间的污染;从上面可知命名空间的作用,既然命名空间能够有效防止命名冲突,那该如何定义命名空间?在定义命名空间时,应该使用namespace修饰且在该修饰词后定义名字并在其后跟**{ }**在{ }内的元素即为该命名空间的成员;

2023-07-18 20:42:55 9664 13

原创 『 Linux 』HTTP(一)

当服务端接收到来自浏览器的请求时需要对请求行和请求头部进行读取以及分析,而请求头部过后紧接着的是请求数据,也就是请求正文,而为了避免请求头部与请求数据中的混淆,请求头部和请求数据(请求正文)之间将存在一行为空行,这个空行只有行分隔符,当服务端读取至一行只存在行分隔符时则表示请求行和请求头部已经读取完毕,剩下的内容即为请求数据(请求正文),换种说法即为报头与有效载荷进行分离;短语也是状态信息,状态信息是根据状态码变化而变化的,是对状态码的文本描述,虽然状态短语不是严格必要的,但是能够帮助用户理解响应;

2024-09-18 20:17:27 1421

原创 『 Linux 』协议的定制

序列化与反序列化部分是属于协议定制的一部分,只需要修改头文件即可;这里为了方便后续的调试,使用条件编译来区别自定义序列化与反序列化和使用JSON进行的序列化与反序列化;// 编码函数,将文本编码成特定格式的字符串// 解码函数,从编码后的字符串提取出原始文本// "len"\n"num1 op num2"\n 或 "len"\n"result code"\n// 移除已提取的报文内容public:public:public:// 序列化请求对象,转为字符串。

2024-09-12 20:03:07 1258

原创 『 Linux 』简单TCP英译汉程序

意思是服务端每新创建一个相同的进程实际上在关闭了多余的文件描述符后每个子进程因处理客户端发来的请求的文件描述符是相同的,而多线程中由于同一个进程间的不同线程共享同一个文件描述符表,这表示在多线程版本中不存在多余的文件描述符,但同样的文件描述符是一个有限资源,当服务端中的文件描述符资源被使用完毕后,再次创建线程来进行网络通信时这次的网络通信将会失败;

2024-09-04 22:58:07 1847

原创 『 C++ 』多线程相关

但如果在最后的比较中,当前内存中的值与最初加载进寄存器中的值不同则表示这个值已经被其他线程修改过了,如果再把当前寄存器的值写回内存中则是一个无用功,会导致数据不一致问题,那么这次的CAS操作则是失败,此时需要重新将内存中的值加载进寄存器中并再次进行上述操作,当比较时当前内存中的值与原来加载进寄存器的值相同时才能把在寄存器中计算后的值写回内存中,才算一次CAS操作成功;但是这里的互斥锁有一个问题,由于临界资源很短,且对临界资源的操作是非常小的操作,使用互斥锁反而有种"杀鸡焉用牛刀"的感觉;

2024-09-02 00:56:16 1210

原创 『 Linux 』TCP套接字网络通信程序

TCP套接字提供了面向连接的 , 面向字节流的 , 传输可靠的传输方式;面向连接的TCP是一种面向连接的协议 , 在通信开始之前需要建立联系;这个连接通过三次握手过程建立以确保通信双方已经准备好进行数据传输;面向字节流TCP传输的数据被看作是连续的字节流而不是消息或数据包;这意味应用程序可以将数据作为字节流发送 , TCP将会负责这些字节流按照顺序传送给接收方 , 接收方也会以同样的顺序接收数据;面向字节流也意味着可以直接使用writeread来对该套接字描述符进行操作;

2024-08-28 01:47:49 1217

原创 『 C++ 』线程库

C++ 标准库自 C++11 引入了线程支持库,提供了一个完整的线程管理工具集。这些工具包括用于创建和管理线程的类如 std::thread,以及同步机制如互斥锁 (mutex) 和条件变量 (condition_variable) 。这些库在不同操作系统上由不同的底层实现支持,譬如在 Linux 上基于 pthread 线程库。在创建和销毁线程时,可以直观地使用线程的构造和析构函数,并通过简单的成员函数进行线程操作。条件变量和互斥锁确保了多线程环境下的数据一致性及避免竞态条件。

2024-08-25 15:31:10 788

原创 『 Linux 』利用UDP套接字实现简单群聊

套接字实现一个客户端和一个服务端,客户端向服务端发送数据,服务端进行数据的拼接并返回拼接后的数据,或者是传入一个回调函数,服务端通过调用回调函数调用。函数进行初始化,然后进入一个无限循环,不断从用户获取输入并发送到服务器,并接收服务器的响应;当服务端接收到客户端所发的信息时这个数据包中存放的除了数据以外还包含着客户端的基本信息,如。存放着用户的信息,检查该哈希表中是否存在该用户的信息,有则无行为,无则添加;用于初始化服务器的基本参数,包括套接字文件描述符,端口号,运行标识符;

2024-08-19 01:48:21 796 1

原创 『 C++ 』IO流

流是指数据的有序传输序列,路表示数据从一个地方流向另一个地方的过程,流可以是输入流也可以是输出流,具体取决于数据的流动方向;输入流数据从外部设备(文件,键盘等)流入程序中;输出流数据从程序流向外部设备(如显示器,文件等);IO流是指用于处理输入输出操作的流,C++中的IO流用于程序与外部环境(用户,文件系统,网络等)之间交换数据的机制;IO流通过标准库中的一组类和对象实现允许程序员以统一的方式处理不同类型的输入输出设备;

2024-08-17 12:08:37 1140

原创 『 Linux 』利用UDP套接字简单进行网络通信

数据在进行网络传输的时候需要转成标准的网络字节序,本质原因是在数据传输的过程中网络通信的两端的字节序要相同以确保数据发送至对端时出现数据的解析错误;在接收客户端的数据时同样需要一个相同地址族的结构体,与对应的长度信息,两个信息作为输出型参数用于接收客户端发送的套接字信息;这个函数用于在套接字上发起到指定地址的连接,用于将客户端的套接字连接到远程服务器的地址和端口,是客户端编程中的关键一步;这个函数调用成功使返回一个非负整数,这个非负整数是新创建的已连接套接字的文件描述符,新描述符与请求连接的客户端通信;

2024-08-15 16:42:50 1081

原创 『 C++ 』单例模式与IO流

单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类在应用程序的生命周期内仅有一个实例,并提供一个全局访问点来访问该实例。单例模式主要目的是为了控制某些类的实例化以避免产生多个实例,从而节省资源和避免数据不一致问题。单例模式的核心要点包括唯一性、全局访问点和加载方式。常见的加载方式有饿汉加载和懒汉加载。饿汉加载在程序启动时即初始化实例,线程安全但可能浪费资源;懒汉加载在需要时才初始化,节约内存且初始速度较快,但需要注意线程安全问题。

2024-08-13 18:47:25 972

原创 『 Linux 』网络基础(二)

本质上采用大端字节序作为网络字节序主要是为了标准化,确保在不同系统之间数据能够被正确的解码,若是未指定字节序标准,当大端字节序接受到小端字节序发送的数据时将会解码错误;是面向数据包的协议,将数据划分成一个个独立的数据包,每个数据报在网络上传输时是一个独立的实体且具有边界,通常为单个数据报提供较小的负载;小端字节序中数据的低位字节存储在内存的低地址处,数据的高位字节存储在内存的高地址处,即数据从右往左进行存储;协议规定,多字节数据在传输数据时必须采用大端字节序,这意味着数据的高位字节先传输,低位字节后传输;

2024-08-12 18:34:49 919

原创 『 C++ 』特殊类实现与类型转换

这篇文章详细介绍了不同场景下C++类的设计与类型转换方法。通过具体实例,作者讲解了如何设计不能被拷贝的类,确保资源的唯一性,并探讨了只能在堆上或栈上创建对象的类的实现方法。对于不能被继承的类,文章介绍了如何利用final关键字和私有化构造函数来实现。此外,文章还深入解析了C++中的四种主要类型转换运算符:static_cast、dynamic_cast、reinterpret_cast和const_cast,并通过代码示例说明了它们各自的用途和实现细节。最后,作者强调了在进行类型转换时需要注意的安全性问题,

2024-08-11 15:17:30 1040

原创 『 C++ 』智能指针 ( 万字梳理 )

现代智能指针提供了一个自定义的删除器使智能指针通过包含不同的对象来对其进行特殊的删除;以shared_ptr为例,存在一个包含特定的类内模板函数的构造函数,支持传入一个自定义删除器对特殊的资源完成特殊的资源清理工作;其传入的自定义删除器可以为任何可调用对象,lambda表达式,function包装器,bind绑定对象,仿函数等可调用对象;});// 使用定制删除器(lambda表达式)关闭文件});

2024-08-08 19:07:38 1382

原创 『 Linux 』网络基础 (一)

协议分层是计算机网络中组织和管理网络协议的重要方法。通过将网络通信过程划分为多个层次,每一层负责特定的功能,从而简化设计与实现。常见的协议分层模型包括OSI模型和TCP/IP模型。OSI模型将网络通信分为七层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。TCP/IP模型则通常简化为四层:应用层、传输层、网络层和链路层。协议分层的主要优点包括简化设计、模块化、标准化和故障隔离,使得各层可以独立开发与维护,提升了网络的灵活性与可扩展性。

2024-08-06 18:44:44 923

原创 『 C++ 』异常

异常处理是C++中用于管理错误和异常情况的重要机制。通过使用try-catch块,程序能够在运行时捕获和处理潜在的错误,使得代码更加清晰和易于维护。在C++中,异常可以是内置类型或自定义类型,允许开发者根据具体需求进行灵活处理。C++标准库提供了一套完善的异常体系,以std::exception为基类的多个异常类(如std::runtime_error和std::logic_error)用于描述不同类型的错误。当函数抛出异常时,控制流会自动转移到最近的catch块,避免了在每个函数中手动检查错误的繁琐。

2024-08-05 22:47:32 777

原创 『 Linux 』线程安全的单例模式,自旋锁与读写锁

这篇文章主要介绍了计算机编程中的一些重要概念和技术,包括单例模式(懒汉模式和饿汉模式)、自旋锁、读写锁。单例模式讲解了其特点和优点,以及两种加载方式。自旋锁阐述了其机制、初始化、锁定与解锁等。读写锁介绍了其状态、在 POSIX 线程库中的使用,包括初始化、加锁和解锁等。这些内容对理解多线程同步和资源管理有重要意义。

2024-08-04 16:39:49 799

原创 『 C++11 』模板可变参数包,Lambda表达式与 function 包装器

这篇文章深入探讨了C++11引入的几个关键特性:可变参数模板、Lambda表达式和std::function包装器。文章通过详细的解释和丰富的代码示例,阐述了这些特性的概念、语法和使用方法,展示了它们如何增强C++的泛型编程能力和函数式编程特性。同时,文章还介绍了std::bind的用法,进一步丰富了C++11的函数对象操作能力。整体而言,本文为理解和应用这些现代C++特性提供了全面而实用的指导。

2024-08-03 22:08:26 1247

原创 『 Linux 』线程池与 POSIX 线程的封装编码实现

这篇文章详细介绍了线程池的概念和实现。文章首先解释了线程池的基本原理,包括资源分配、复用和管理等方面。接着,展示了一个线程池的C++实现,包括线程池类的设计、任务队列的管理、线程同步机制等核心组件。文章还提供了一个简单的任务类和测试代码,用于演示线程池的使用。此外,文章还讨论了线程的封装技术,展示了如何将POSIX线程封装成一个C++类,使线程的使用更加面向对象和便捷。文章通过代码示例和详细注释,清晰地展示了线程池和线程封装的实现细节,包括构造函数、线程启动、任务处理等关键方法。

2024-08-02 21:03:51 1013

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

本文介绍了基于环形队列的生产者消费者模型。首先阐述了信号量的概念、类型和操作方法,包括P操作和V操作。然后详细讲解了POSIX信号量的使用,包括初始化、销毁、等待和释放等操作。接着描述了环形队列在生产者消费者模型中的应用,解释了模型的核心要素和工作原理。最后通过具体的C++代码实现,展示了如何使用信号量和互斥锁来构建一个线程安全的环形队列,并通过简单数据和复杂任务两个例子演示了模型的实际应用。整体内容涵盖了理论基础和实践应用,为理解和实现并发编程中的同步机制提供了详细指导。

2024-08-02 16:00:45 766

原创 『 Linux 』基于阻塞队列的生产者消费者模型

生产者-消费者模型是一种常见的多线程设计模式,用于协调生产者和消费者线程之间对共享资源的访问。在这个模型中,生产者负责生成数据或任务并将其放入共享缓冲区,而消费者则从缓冲区中取出数据进行处理。关键点在于生产者和消费者通过共享缓冲区进行解耦,允许它们以不同的速率工作。该模型通过互斥锁和条件变量来实现线程同步。互斥锁确保对共享资源的互斥访问,而条件变量则用于线程间的通信和协调。当缓冲区满时,生产者等待;当缓冲区空时,消费者等待。这种设计提高了系统的并发性和效率,特别适合处理生产和消费速率不匹配的场景。

2024-08-01 16:37:20 1149

原创 『 Linux 』线程同步问题与条件变量

同步问题涉及多线程环境下,确保访问同一资源时的顺序性和数据安全。互斥锁常用于保护临界资源,防止数据竞争和不一致。条件变量是一种线程同步机制,允许线程在特定条件满足前等待,并在满足时被唤醒。它通常与互斥锁结合使用,确保共享资源的安全访问。生产者-消费者模型是一种多线程设计模式,生产者生成数据放入缓冲区,消费者从缓冲区读取数据处理。通过互斥锁和条件变量,生产者和消费者可以有效地同步和互斥访问共享资源,提高系统效率和稳定性。

2024-07-31 21:46:13 929

原创 『 Linux 』多线程互斥锁

文章深入分析了互斥锁的原理及其原子性,阐明了互斥锁在多线程同步中的重要性,并展示了如何封装互斥锁以简化其使用。在实际应用中,通过正确使用互斥锁和其他同步机制,可以确保多线程程序的正确性和高效性。最后,文章深入分析了互斥锁的原理及其原子性,阐明了互斥锁在多线程同步中的重要性,并展示了如何封装互斥锁以简化其使用。在实际应用中,通过正确使用互斥锁和其他同步机制,可以确保多线程程序的正确性和高效性。

2024-07-30 17:57:19 983

原创 『 Linux 』线程的资源共享,分离,以及多线程并发导致资源竞争

在多线程编程中,为确保线程安全和数据一致性,必须注意线程的资源共享和独立数据区。线程共享进程的大部分资源,如全局变量、堆、代码段等,但每个线程也有自己的独立数据区,如线程栈、线程局部存储等。这种共享和独立机制在提升多线程编程效率的同时,也带来了数据竞争问题。当多个线程同时访问和修改共享资源时,可能导致数据不一致的现象。因此,需要通过线程同步机制,如互斥锁、信号量等,来确保对共享资源的访问是原子性的,从而避免数据竞争问题,确保程序的正确性和稳定性。在实际应用中,合理利用这些机制可以有效提高多线程程序的性能和可

2024-07-29 21:16:13 389

原创 『 Linux 』线程控制

类型的参数以表示该线程的返回值,通常该值不能是线程栈上开辟的空间中的数据,必须是在非栈上这种共享空间中,因为该线程的生命周期已经结束,若是访问线程栈中的数据将会导致段错误;参数返回时不能直接返回线程栈上开辟空间的数据,因为线程的栈是其独立的,当程序执行完毕后表示该线程的生命周期结束,对应的其栈的空间将会被回收;查看当前对应运行进程中的轻量级进程的基本属性(该命令为内置命令,且Linux中不存在线程概念,所以查看的属性为轻量级进程的基本属性);通常着需要指向一个预先分配好的栈内存区域,并且栈的顶端应该对齐;

2024-07-28 20:37:40 687

原创 『 Linux 』线程概念

线程本质上是进程的一个执行分支,用于处理进程中的代码和数据;每个线程都可以执行独立不同的代码片段,这意味着在一个进程中可以同时执行多个任务;同一个进程中的所有线程共享相同的内存地址空间和资源(如全局变量,文件句柄等);使得线程之间的通信和数据共享十分搞笑,因为它们不需要像进程通信那样复杂的机制;在Linux中,线程在进程"内部"执行,线程在进程的地址空间内运行任何执行流要执行的前提是具有资源;进程地址空间是进程的资源窗口,线程在进程"内部"执行意味着其将执行进程代码的一部分;

2024-07-27 18:34:58 817

原创 『 Linux 』信号的捕捉及部分子问题

当一个进程在处理一个信号的时候会将对应的信号添加到其信号屏蔽字(阻塞信号集)中以避免信号方法重复调用;当父进程获取到子进程所发的信号时将该信号进行捕获,而后调用自定义动作对已经僵尸的子进程进行等待处理;实际上未决信号集的置零时机为执行信号处理前,即先将未决信号集对应位置置零再执行处理信号的函数;信号时由于上一个相同信号未被处理完成,处于未递达状态,相同的信号被阻塞,停留在未决信号集中;当一个信号在被进行处理时将会把正在处理的信号添加进信号屏蔽字以阻塞下一个相同的信号;

2024-07-26 17:45:38 646

原创 『 Linux 』用户态与内核态的转换机制及信号检测时机

本文详细讲解了操作系统中用户态与内核态的概念及其转换机制。通过以printf()函数为例,描述了用户态代码、库函数代码及内核代码的执行过程,重点解释了进程如何通过系统调用从用户态转换为内核态并返回。文章还深入探讨了进程地址空间的结构,包括用户空间和内核空间的划分以及页表的角色和CR3寄存器的作用。最后,文章对信号的处理机制进行了详尽分析,介绍了信号在用户态和内核态之间的处理时机和流程,并提供了多个图示以辅助理解。

2024-07-25 20:56:08 1152

原创 『 Linux 』信号的写入与保存

忽略表示已经收到了该信号且已经对信号进行了处理,信号已经递达,其中信号的处理方式为忽略,即不作任何处理;信号递达指已经到达并被处理的信号,当信号处理程序执行完毕后这些信号就会被认定是已抵达的;信号递达表示信号已经被处理,进程将继续其正常执行流程或者根据信号类型执行特定行为;阻塞表示已经收到了该信号但不对信号进行处理,使得信号在取消阻塞前都保持未决状态;被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞才执行递达动作;信号集被传进接口函数并对原有阻塞信号集进行操作时将会将原本的阻塞信号集写入。

2024-07-25 14:29:58 1216 2

原创 『 Linux 』信号概念与信号的产生 ( 万字 )

"信号"一词指用来传达信息或只是的各种形式的提示或标志;在生活中常见的信号例如红绿灯,交通标志,短信通知等在操作系统中,"信号"是一种用于异步通知进程发生特定事件的机制;信号允许操作系统或其他进程向目标进程发送通知以便他们能够相应某些时间或条件;

2024-07-22 22:32:29 1011

原创 『 Linux 』简要介绍System V IPC 消息队列 && 信号量

获取/创建 一个消息队列获取/创建一个消息队列通常使用msgget()系统调用接口;NAMESYNOPSIS返回值为int类型,与System V共享内存相同,当该系统调用接口调用成功时将返回一个msqid用于对消息队列的具体操作;调用失败时返回-1并设置errno;key_t key与共享内存相同,传入一个key值使多个进程可通过该key值看到同一份资源(消息队列);该参数可用户自定或是通过调用系统调用接口ftok()进行传入(ftok()系统调用接口不赘述);int msgflg。

2024-07-21 20:38:20 1172

原创 『 Linux 』System V共享内存

共享内存的直接原理即由操作系统内核申请出一块物理内存空间,并将该空间的使用权移交给多个进程,即将该空间以挂接至多个进程的进程地址空间中使得多个进程可以同时访问同一块内存空间。当需要释放共享内存时在此之前需要使得该共享内存没有再被某些进程进行关联,确保进程的读写操作不会因为共享内存的释放而发生读写错误;该参数为一个结构体,该结构体包含了共享内存的所有属性,可通过该结构体对共享内存进行获取属性,查看属性,修改属性等操作;当共享内存被创建后需要将共享内存挂接到进程地址空间中,即使进程与该共享内存进行关联;

2024-07-20 15:50:06 861

原创 『 Linux 』简单日志插件

日志(log)是一种记录和存储系统运行状态,事件,和操作历史的文件和数据库,这些记录通常以时间顺序排列且详细记录系统中发生的各种活动;系统日志记录操作系统级别的事件,如启动,关机,错误和警告等;记录应用程序运行过程中的事件,如用户操作,错误,状态变更等;安全日志记录系统和应用程序的安全相关事件,如登录尝试,权限变更等;问题诊断和故障排查日志可以帮助系统管理员和开发人员诊断和解决问题;系统监控和维护通过分析日志,管理员可以监控系统的运行状态并且识别潜在的问题和异常;安全审计和合规性。

2024-07-17 18:38:58 1125

原创 『 Linux 』命名管道

两个毫不相关的进程,其中一个进程用来创建管道文件并维护管道文件,同时负责接收另一个进程向管道文件内写入的数据;命名管道不占用实际磁盘空间,只是用于传输,不存在刷盘(写入磁盘)的动作,故实际上使用的也是该文件的内核缓冲区;创建一个管道类用于管理管道文件,即利用其构造函数创建管道文件,在退出后析构函数释放对应管道文件;当管道内的数据没有被读端读取时写端会进行阻塞等待读端将当前管道内的数据进行读取;模拟实现服务端,用于管理命名管道文件,接收管道内文件并进行打印;命名管道是管道的一种,数据流向为单向故被称为管道;

2024-07-15 19:14:59 934

原创 『 Linux 』匿名管道应用 - 简易进程池

当一种资源需要被使用时这意味着这个资源可能会被进行多次使用或者需要同时使用多个该资源,当出现这种情况时内核将会频繁的对该资源进行申请并释放,大大降低整体的效率;整体构造采用先描述后组织的方式对进程池进行设置,并以自顶向下的方式进行设计,即先将所需接口以声明的形式标出而后再对接口进行具体实现;本文模拟实现的进程池通过多个匿名管道实现进程间通信使得一个进程与多个其对应的血缘关系进程进行协同从而形成一个进程池[父写子读];子进程为父进程的一份拷贝,当父子进程中其中一个进程被修改时(即对物理内存进行修改);

2024-07-13 22:41:13 995

原创 『 Linux 』 进程间通信 - 匿名管道 (万字)

管道(Pipe)是一种基本的进程间通信(IPC)机制,允许一个进程与另一个进程之间进行数据传输;管道工作方式类似于生活中的水管因此命名为管道,数据从一端流入另一段流出,数据流为单向;Linux中可以使用查看当前登入系统的用户数;who命令用与显示当前登入系统的用户信息,其中一条会话代表一个用户;wc -l命令统计当前行数;两条命令通过管道符进行连接,即将显示的信息通过管道符传输给wc命令再进行统计行数;符号即为一种管道;匿名管道(Anonymous Pipes)不存在命名的管道,用于。

2024-06-21 16:57:08 1030

原创 『 Linux 』 进程间通信概述

进程间通信(IPC)指的是在操作系统重,允许两个或者多个进程之间传递信息或者数据的机制;进程是操作系统重独立运行的实体,即进程间具有独立性,存在自己的地址空间;因此进程间默认无法直接访问彼此的内存空间,其通信成本会较高;IPC提供一种方式使得互相独立的进程能够交换数据并进行通信和数据共享;

2024-06-20 16:45:52 760

原创 『 Linux 』 进程地址空间与动态库地址

当可执行程序被加载进内存成为进程时,操作系统将会给这个寄存器中存放这个进程代码的初始位置(虚拟地址 ),例如程序的入口点;为了使不同的进程能够同时使用同一份物理内存的库副本,库中的代码必须能够运行在任何地址上即它们必须是与位置无关的;这是通过确保代码执行时不依赖它的绝对地址来实现的,即代码对于数据的禁用是基于它当前的运行地址来计算的;目标文件最终被生成的动态库其中的地址将可以加载到物理内存中的任意位置,并随机为其分配进程地址空间;如,它可以避免为每个使用特定库的进程单独加载库的副本从而节省内存资源;

2024-06-14 13:26:37 1063 1

原创 『 Linux 』动态库的加载

动态库和静态库是软件开发中两种主要的代码库链接方式;其中动态库在程序运行时被加载并允许代码在物理内存中只有一份拷贝而被多个进程共享从而减少系统资源的消耗;相比之下,静态库在程序编译时被整合进可执行文件;导致每个程序都包含了一份库的副本,增加了程序的大小和内存占用;动态库的管理依赖于操作系统中的结构体,如link_map;它记录了库的加载地址,名称等信息,确保动态链接和库间依赖关系的正确处理;通过高效地管理和加载动态库,系统能够提高内存使用效率,简化库的更新过程,并支持跨进程的库共享;

2024-06-13 17:39:18 930

原创 『 Linux 』动静态库的创建与使用 ( 万字纯干货 )

在某些情况下,如果用户只提供了静态库而没有提供对应的动态库,链接器将不得不使用静态链接.但这也取决于编译时的具体指令和可用的库;同样类似于标准库的库文件也已经在系统中被安装,若是没有指定目录则会去默认路径(当前路径或是系统安装库文件的目录)中查找;静态库在编译时已经被链接到可执行文件中,故运行时不需要动态加载库文件,因此启动速度较快,运行时性能较好;静态库在编译时被嵌入到应用程序中,因此生成的可执行文件不依赖于外部的库文件;目标用于删除所有编译生成的文件,包括静态库,动态库,目标文件以及发布后的。

2024-06-13 00:34:38 775

oracle9i经典测试用表

该表用于MySQL中的增删查改练习等;

2023-12-06

oracle9i经典测试用表

该测试用表为Oracle9i的一个经典测试用表,雇员表; 该表可以用来进行对数据库的增删查改的联系操作; 请在MySQL中使用"SOURCE /路径"的方式进行使用

2023-12-06

空空如也

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

TA关注的人

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