linux概念详解
用户守护进程
用户空间守护进程是一些在后台运行的长期服务程序,提供系统级服务。
下面举一些例子。
网络服务:
如sshd(SSH服务)、httpd(HTTP服务)。
sshd:sshd 守护进程会在后台运行,并等待来自网络的SSH连接请求。
httpd:httpd 守护进程负责处理和响应来自客户端(如浏览器)的HTTP请求。常见的Web服务器如Apache、Nginx都是这种类型的守护进程。
ftpd:FTP守护进程,提供文件传输协议(FTP)服务,允许用户通过FTP协议上传和下载文件。
系统日志:
如syslog,记录系统和应用程序日志。又如cron,定期执行预定的任务。
syslog 守护进程会不断地在后台监视系统日志文件,并进行日志记录。
cron:定期执行计划任务。cron 守护进程在后台持续运行,根据预设的计划任务表(crontab)定期执行命令或脚本。例如,每天定时备份数据或每周更新系统。
库文件
1.介绍
库文件是技术大牛写的代码,我们可以引用这些文件到我们的代码中。
文件分为静态库和动态库。
所谓静态库,在编译时便和和其他代码一起编译成一个可执行文件了。
而动态库是在其他代码运行时被加载进去的。
2.库文件的形式
-
静态库文件:在Linux系统中,静态库通常是以
.a结尾的文件。 -
动态库文件:在Linux中,动态库通常是以
.so结尾的文件。
3. 如何使用静态库和动态库
静态库的使用
-
创建静态库:你可以使用
ar工具将多个目标文件打包成一个静态库文件。ar rcs libexample.a example1.o example2.o -
编译时链接静态库:在编译程序时,通过
gcc或g++的-l选项链接静态库。例如,如果要使用libexample.a库,可以这样编译:gcc -o myapp myapp.c -L/path/to/libs -lexample这里的
-L用于指定静态库的路径;-l用于指定要链接的库(去掉前缀lib和文件扩展名.a)。 -
生成可执行文件:编译后,
myapp将包含静态库的代码。
动态库的使用
-
创建动态库:通过
gcc生成共享库文件(.so文件),例如:gcc -shared -o libexample.so example1.o example2.o -
编译时链接动态库:在编译程序时,通过
gcc的-l选项链接动态库。例如:gcc -o myapp myapp.c -L/path/to/libs -lexample动态库的编译方式与静态库类似,但是生成的文件是
.so格式。 -
运行时加载动态库:运行时,操作系统会根据
LD_LIBRARY_PATH环境变量查找并加载动态库。export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH ./myapp
4.静态库和动态库各自缺点
由1可知,只要有n个代码要使用静态库,这n个代码都会将静态库复制到他们的内存。而动态库可以被多个程序共享,即 程序需要时,操作系统才会将它加载到内存。 这样的区别有无优劣?
===》.他们的优点我就不说了,他们的不足如下:
静态库的缺点有:
-
如果有多个程序都使用同一个静态库,那么每个程序都会将该库的代码复制到自己的内存中。这会导致内存的浪费,内存使用效率较低。
-
静态库的代码会被嵌入到每个可执行文件中,这使得最终的可执行文件比较大。
-
如果静态库的代码需要更新,必须重新编译所有使用该库的程序。
动态库的缺点有:
-
程序在运行时依赖操作系统加载动态库。如果动态库的路径不正确或库文件丢失,程序将无法启动,给系统带来依赖问题。
-
虽然现代操作系统会优化动态库的加载,但动态库仍然需要在运行时由操作系统加载,这可能会导致一定的延迟,特别是在程序启动时。
-
不同的程序可能依赖于相同库的不同版本,这会导致版本冲突。这种情况需要特别小心版本控制和兼容性。
5.使用静态库与动态库的选择
静态库适用于需要高性能和独立运行、不需要频繁更新的程序,但会导致内存和存储浪费,且不便于库的更新。
动态库适用于需要节省内存、减少存储空间、易于更新和共享的场景,但依赖外部库文件,可能引起依赖问题(即有些程序需要保持完全独立,不依赖于外部的库文件;以及动态库丢失的影响)
对于大多数应用程序,动态库通常是更常见和灵活的选择,尤其是在开发大型应用程序时,可以通过共享库提高资源利用率并减少重复代码。但是在一些独立的、小型的或对启动性能要求较高的程序中,静态库可能更为合适。
系统调用
常见的系统调用包括:
文件操作:
open():打开文件。 read():从文件读取数据。 write():向文件写入数据。
close():关闭文件。
进程管理:
fork():创建子进程。 exec():执行新的程序。 wait():等待子进程结束。 exit():终止进程。
内存管理:
mmap():映射内存区域。 munmap():解除内存映射。
设备管理:
ioctl():控制设备。 poll():监视文件描述符事件。
网络操作:
socket():创建网络套接字。 bind():绑定地址到套接字。
listen():监听连接。 accept():接受连接。
Linux操作系统的典型体系结构:
硬件层,内核,外设驱动程序,文件系统 ,系统调用接口,用户空间。
内核的组成
我们可以简单的将内核分为内核核心部分和各种内核模块,这是对内核结构的一种常见分类方式。
1.内核核心部分,内核的核心部分通常包括以下几个部分:
-
进程管理:调度和管理系统中的进程。
内存管理:管理系统的内存,包括虚拟内存和物理内存。
硬件抽象层(HAL):提供与硬件设备的交互接口。
系统调用接口:为用户空间提供与内核的交互接口。
2.各种内核模块,例如驱动程序。文件系统。 网络协议模块 ,其他功能模块等等。
所谓 内核模块就是说这样的一个程序片段能够被加载到内核中,并可以在运行时动态地与内核互动。
插述:虽然说文件系统和内核的核心部分是分开的,但是 Linux等操作系统中,文件系统是通过内核模块来实现的。这些文件系统模块(如ext4、NTFS、FAT等)是在内核中加载并执行的,实际上是内核的一个子系统。
另外关于内核态和用户态的切换:
系统调用是用户程序请求内核服务的主要方式,
而中断是硬件设备向CPU发出的信号。
驱动设备
最常见的三种驱动设备类型通常是字符设备、块设备和网络设备。
驱动程序
1) 每个Linux驱动程序通常是一个内核模块,所谓 内核模块就是说这样的一个程序片段能够被加载到内核中,并可以在运行时动态地与内核互动。
2)驱动程序用于控制特定类型的硬件设备 。 驱动程序可以在系统运行时动态加载或卸载。
3) 内核通过函数调用的方式直接调用驱动代码。
举个应用驱动程序的例子, 例如,当你插入一个USB设备时,相应的USB驱动程序模块会被加载到内核中,设备可以开始工作。一旦不再需要,可以卸载该模块,释放系统资源。
内核源码树
内核源码树其实就是一个经过配置编译之后的内核源码。.
在编写驱动代码的时候,我们需要用到系统内核的头文件,所以要具备这一份内核的源码。
文件系统和根文件系统
文件系统介绍
在linux中无疑需要文件系统。常见的文件系统有:
ext系列文件系统: 例如 ext4(第四扩展文件系统), 它是许多Linux发行版的默认文件系统。
NTFS 是Windows操作系统的主要文件系统
VFAT,它是FAT文件系统的扩展,主要用于较小的存储设备,如USB闪存驱动器、SD卡等 。
什么是挂载
什么是挂载?我们可以理解为一个文件系统挂载到某一目录下,该目录下就存放了对于文件系统的东西 。
挂载的时候,我们得选择一个空目录。
例如,我有一个USB设备,它上面有一个ext4格式的文件系统。我们要对它进行挂载,得先创建一个 /mnt/usb 目录,再执行以下命令:
mount /dev/sdb1 /mnt/usb
之后,该目录下的内容就会变成USB设备中存储的数据 。
从而,我们就可以 通过访问 /mnt/usb 来访问USB设备中的内容。
文件系统介绍
RootFS(根文件系统)是指在 Linux 系统启动时,第一个被挂载的文件系统。
在Linux中,文件系统以树形结构组织,根文件系统位于树的最顶端,挂载点是“/”。
根文件系统包含系统运行所需的核心文件和目录,如:
-
/bin:基础命令和工具,如ls、cp等。
-
/sbin:系统管理命令,仅限管理员使用,如ifconfig、reboot等。
-
/etc:系统配置文件,如网络配置、用户信息、系统服务等。
-
/lib:共享库文件,系统程序运行时需要的动态链接库。
-
/dev:设备文件,代表硬件设备,如硬盘、终端等。
-
/mnt:挂载点,用于临时挂载其他文件系统。
根文件系统的作用有:
-
启动系统:根文件系统包含启动操作系统所需的文件。在系统启动时,Linux内核会从存储设备加载根文件系统,然后根据根文件系统中的初始化脚本(如rcS或init)启动系统服务和进程。
-
提供关键文件和命令:因为根文件系统存储了系统的核心文件和命令(如/bin和/sbin目录)。
什么是内核移植
什么叫内核移植?
内核移植就是 将 Linux 内核从一个硬件平台移植到另一个硬件平台的过程。而不同硬件平台有不同的架构和设备(如 ARM、x86、MIPS 等), ,因此要使 Linux 内核能够在新的硬件平台上运行,必须针对新平台进行相应的调整和修改。 例如:
1.我们需要根据目标硬件平台的架构 来修改 修改内核代码以支持新的 CPU 和硬件组件。
2.因为新平台上的硬件设备(如串口、网卡、显示屏、存储设备等)可能与原平台有所不同 ,所以我们需要移植或编写新的设备驱动程序,使内核能够与这些设备进行交互。
3.在移植过程中,需要根据目标平台配置内核参数,编译适合该硬件平台的内核映像。
4.另外,内核启动程序(如 U-Boot)需要进行配置和修改,以便正确地加载和启动新移植的内核。
什么是内核映像文件
什么是内核映像文件,为什么要将内核代码编译成为内核映像文件?
====》
1.内核代码的映像文件(Kernel Image) 是指经过编译后、包含操作系统内核代码的可执行文件。
2.我们将内核代码编译成一个映像文件可以提高启动速度,并减少内存占用。另外就是内核映像文件的格式便于引导加载程序(如GRUB)读取和加载 。而且, 更新内核时,我们只需要替换这个内核映像文件,而不必修改系统中的每个单独文件。
内核映像文件通常包含一个核心内核部分以及指向外部内核模块的接口。从而这些外部的内核模块可以在运行时动态加载,扩展内核的功能,如支持新硬件、文件系统等。
不同的计算机有不同的计算机架构(如x86、ARM等), 可能需要不同的内核映像格式 ,通过 将内核编译成不同格式的映像文件 ,可以高效的适配这些不同的架构,从而 Linux内核 移植工作能够更加简便。
linux启动
在前面我们介绍了 启动过程中,引导加载程序会从启动设备(硬盘、USB等)加载内核映像文件到内存中,然后将控制权交给内核。即启动内核后, 内核会初始化硬件并加载系统组件。
还会加载根文件系统并执行初始化脚本,如/etc/rc.d、/etc/inittab等,启动系统的服务和进程。
一旦内核初始化完成,系统进入用户空间,开始正常运行。
相关文章:
linux概念详解
用户守护进程 用户空间守护进程是一些在后台运行的长期服务程序,提供系统级服务。 下面举一些例子。 网络服务: 如sshd(SSH服务)、httpd(HTTP服务)。 sshd:sshd 守护进程会在后台运行&#x…...
【设计模式】-工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式(简单工厂、工厂方法、抽象工厂) 介绍 简单工厂模式 简单工厂模式不属于23种GoF设计模式之一,但它是一种常见的设计模式。它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让类的实例化推迟到子类…...
AMESim中批处理功能的应用
AMESim 软件的批处理功能是一项能显著提高仿真效率和灵活性的功能,以下是其介绍与应用说明: 一 功能介绍 参数扫描功能:用户可以指定模型中一个或多个参数的取值范围和步长,批处理功能会自动遍历这些参数组合,进行多…...
《Spring实战》(第6版)第1章 Spring起步
第1部分 Spring基础 第1章 Spring起步 1.1 什么是Spring Spring的核心是提供一个容器(container)。 称为Spring应用上下文(Spring application context)。 创建和管理应用的组件(bean),与上下文装配在一起。 Bean装配通过依赖注入(Dependency Injection,DI)。…...
E卷-特殊的加密算法-(200分)
专栏订阅🔗 特殊的加密算法 问题描述 有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下: 明文为一段由 0-9 组成的数字串。密码本为由数字 0-9 组成的二维数组。需要按明文串的数字顺序在密码本里找到同样的数字串,密码本里…...
QT 异步编程之多线程
一、概述 1、在进行桌面应用程序开发的时候,假设应用程序在某些情况下需要处理比较复制的逻辑,如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事…...
K-均值(K-means)
K-均值(K-means)是一种常用的无监督学习算法,用于将数据集中的样本分成 K 个簇。该算法的过程大致如下: 1. 随机初始化 K 个聚类中心(centroid)。 2. 将每个样本分配到与其最近的聚类中心所代表的簇。 3. …...
AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐
AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐 目录 AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐比特币AI Agents稳定币扩容区块链AI基础设施AI驱动的软件应用AI赋能的行业应用AI医疗影像、智能客服、个性化推荐AI药物研发比特币 市场与机构化:2024…...
接入 SSL 认证配置:满足等保最佳实践
前言 随着信息安全形势的日益严峻,等保(信息安全等级保护)要求成为各行业信息系统必须遵守的标准。在数据库领域,OpenGauss作为一款高性能、安全、可靠的开源关系型数据库,也需要满足等保要求,确保数据的安…...
微软AutoGen高级功能——Selector Group Chat
介绍 大家好,这次给大家分享的内容是微软AutoGen框架的高级功能Selector Group Chat(选择器群聊),"选择器群聊"我在给大家分享的这篇博文的代码中有所体现微软AutoGen介绍——Custom Agents创建自己的Agents-CSDN博客,但是并没有详…...
w206基于Spring Boot的农商对接系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
Springboot中使用Elasticsearch(部署+使用+讲解 最完整)
目录 引言 一、docker中安装Elasticsearch 1、创建es专有的网络 2、开放端口 3、在es-net网络上安装es和kibana 4、可能出现的问题 5、测试 6、安装IK分词器 7、测试IK分词器 二、结合业务实战 1、准备依赖 2、配置yml 3、读取yml配置 4、准备es配置类 5、编写测…...
深度求索—DeepSeek API的简单调用(Java)
DeepSeek简介 DeepSeek(深度求索)是由中国人工智能公司深度求索(DeepSeek Inc.)研发的大规模语言模型(LLM),专注于提供高效、智能的自然语言处理能力,支持多种场景下的文本生成、对…...
flv实时监控视频
文章目录 前言一、安装二、引入三、使用 前言 开发大屏项目时,可能需要在大屏上展示一个监控画面,此时就可以用的flv.js来展示视频效果 一、安装 npm install flv.js二、引入 import flvjs from flv.js;三、使用 <video ref"videoElement&quo…...
有哪些免费的SEO软件优化工具
随着2025年互联网的不断发展,越来越多的企业意识到在数字营销中,网站的曝光度和排名至关重要。无论是想要提高品牌知名度,还是想要通过在线销售增加收益,SEO(搜索引擎优化)都是一项不可忽视的关键策略。而要…...
跟着ai辅助学习vue3
第一章:基础入门(1 - 2 周) 1. 了解 Vue 3 概述 阅读官方文档简介 访问 Vue 3 官方文档,在首页或简介板块中,重点了解 Vue 3 相较于 Vue 2 的重大变革。比如,Vue 3 采用了 Proxy 实现响应式系统ÿ…...
什么是Mustache
Mustache 是一种轻量级模板引擎,用于将变量插入到模板中生成最终的文本输出。它的设计简单且易于使用,适用于多种编程语言,包括 JavaScript、Python、Ruby、Java 等。 Mustache 的模板语法使用双大括号 {{}} 包裹变量或表达式,用…...
C++,STL容器适配器,priority_queue:优先队列深入解析
文章目录 一、容器概览与核心特性核心特性速览二、底层实现原理1. 二叉堆结构2. 容器适配器架构三、核心操作详解1. 容器初始化2. 元素操作接口3. 自定义优先队列四、实战应用场景1. 任务调度系统2. 合并K个有序链表五、性能优化策略1. 底层容器选择2. 批量建堆优化六、注意事项…...
1.综述 Google 的软件工程读书笔记
Google 的软件工程由Google的多位资深工程师合著,分享了他们在管理Google庞大代码库(超过20亿行代码)过程中总结的经验教训。这本书不仅涵盖了软件工程的理论知识,还结合了Google的实际案例,展示了如何在大规模、复杂的…...
vue框架生命周期详细解析
Vue.js 的生命周期钩子函数是理解 Vue 组件行为的关键。每个 Vue 实例在创建、更新和销毁过程中都会经历一系列的生命周期阶段,每个阶段都有对应的钩子函数,开发者可以在这些钩子函数中执行特定的操作。 Vue 生命周期概述 Vue 的生命周期可以分为以下几…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
