Linux系统调用编程

一、进程和线程的概念

1.进程

进程是指一个具有独立功能的程序在某个数据集上的一次动态执行过程,它是系统进行资源分配和调度的最小单元。

定义:进程是程序的一次执行实例,拥有独立的地址空间、资源(如内存、文件描述符等)和系统状态。

进程特点:
独立性:每个进程有独立的虚拟地址空间,互不干扰(通过进程间通信(IPC)才能交互)。
资源开销:创建、销毁或切换进程成本较高(需要分配独立资源)。
安全性:进程间隔离性强,一个进程崩溃通常不会影响其他进程。

查看命令:ps -aux 或 top。

创建方式:通过 fork() 系统调用(子进程复制父进程的地址空间)。

2.线程

线程是进程内独立的一条运行路线,是处理器调度的最小单元,也可以称为轻量级进程。

定义:线程是进程内的执行单元,共享同一进程的地址空间和资源,但拥有独立的栈和寄存器。

特点:
共享资源:同一进程的线程共享内存、文件描述符等,通信更高效(无需IPC)。
轻量级:创建、切换线程的开销远小于进程(因无需分配新地址空间)。
并发性:多线程可并行执行(在多核CPU上),适合计算密集型或I/O密集型任务。
风险:线程间缺乏隔离,一个线程崩溃可能导致整个进程终止。

查看命令:ps -eLf 或 top -H。

创建方式:通过 pthread_create()(POSIX线程库)。

3.用 ps -a 命令查看系统中各进程的编号pid,并用kill 命令终止一个进程pid

**![[12a225dd47d2fb3022302aaf214e9cf.png]]

二、虚拟内存管理

1.Linux的虚拟内存管理

核心概念:
虚拟内存:进程看到的是虚拟地址空间(32位系统通常为4GB),由操作系统和硬件动态映射到物理内存或磁盘(Swap空间)。

关键机制:
分页:内存被划分为固定大小的页(通常4KB),通过页表(Page Table)实现虚拟地址到物理地址的转换。
按需分配:页仅在访问时加载到物理内存,未使用的页可能被换出到磁盘。
写时复制:进程fork时共享父进程内存,仅在修改时复制新页。
内存保护:通过页表权限位(读/写/执行)隔离进程,防止非法访问。

2.STM32的真实物理内存管理

核心概念:
物理内存直接映射:所有代码和数据的地址直接对应物理内存或外设寄存器(无MMU,无虚拟地址转换)。

关键特点:
静态分配:内存布局由链接脚本(如.ld文件)静态定义,分为栈、堆、全局变量等区域。
无内存保护:所有代码均可访问任意物理地址(包括外设寄存器),需开发者自行保证安全。
确定性:访问延迟固定,适合实时性要求高的场景。

3.区别对比

地址空间:Linux虚拟内存是虚拟地址,STM32物理内存是物理地址
内存隔离:Linux虚拟内存有内存隔离,为进程间隔离,STM32物理内存无内存隔离,所有代码共享内存。
动态分配:Linux虚拟内存支持动态分配,STM32物理内存需静态分配或简单动态分配。
外设访问:Linux虚拟内存通过设备驱动,STM32物理内存直接读写寄存器地址。

三、Linux系统调用函数

查看当前所在目录
![[Pasted image 20250404230234.png]]

创建子目录
![[Pasted image 20250404230355.png]]
vi编辑代码
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main() {
// 使用系统调用函数write向标准输出写入数据
const char *message = “Hello, this is a system call example!\n”;
ssize_t bytes_written = write(STDOUT_FILENO, message, strlen(message));
if (bytes_written == -1) {
perror(“write”);
return 1;
}
return 0;
}

使用gcc编译
gcc -o syscall_example syscall_example.c

运行
![[Pasted image 20250404230632.png]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/15.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL的扩展(extensions)-常用的扩展-pg_dirtyread

PostgreSQL的扩展&#xff08;extensions&#xff09;-常用的扩展-pg_dirtyread pg_dirtyread 是 PostgreSQL 的一个特殊扩展&#xff0c;它允许读取已被删除但尚未被 VACUUM 清理的数据行&#xff0c;是数据恢复的重要工具。 原理&#xff1a; pg_dirtyread 通过直接访问表的…

花卉识别分类系统,Python/resnet18/pytorch

花卉识别分类系统,Python/resnet18/pytorch 基于pytorch训练, resnet18网络&#xff0c;可用于训练其他分类问题&#xff0c;也可自己重新训练 共五种花卉&#xff1a;雏菊&#xff0c;蒲公英&#xff0c;玫瑰&#xff0c;向日葵&#xff0c;郁金香 标价包含GUI源码、数据集…

SQL Server数据库异常-[SqlException (0x80131904): 执行超时已过期] 操作超时问题及数据库日志已满的解决方案

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;获得2024年博客之星荣誉证书&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c…

C++数据排序( 附源码 )

一.冒泡排序 原理:自左向右依次遍历,若相邻两数顺序错误,则交换两数. 这样,每一轮结束后,最大/最小的数就会到最后. Code: #include <iostream> #include <cstdio> using namespace std; const int N1e51; int n,a[N],in; void PrintArray(int a[],int n){for…

MTK-GMS版本国内WIFI受限问题

MTK-GMS版本国内WIFI受限问题解决 文章目录 问题参考资料解决方案方案一 修改配置坑点 方案二 直接修改属性 问题 最近负责ROOM 产品&#xff0c;出现WIFI受限显示&#xff0c;但是网络是通畅的。 GMS 版本&#xff0c;在国外或者国内翻墙网络不会出现WIFI受限显示问题&#…

34、web前端开发之JavaScript(三)

十. DOM操作详解 1、DOM简介 文档对象模型&#xff08;DOM&#xff0c;Document Object Model&#xff09;是JavaScript与网页内容交互的接口。它将HTML文档表示为一种树状结构&#xff08;DOM树&#xff09;&#xff0c;其中每个节点代表文档的一部分&#xff08;例如元素、…

【HCIA】静态综合实验练习笔记

实验拓扑图如下&#xff1a; 实验配置思路如下&#xff1a; 1、网段划分、配置IP地址 2、配置DHCP&#xff0c;使客户端获得ip地址 3、配置静态明细路由&#xff0c;内网全网通 4、配置空接口防环 5、配置优先级&#xff0c;实现选路最佳 6、配置缺省路由&#xff0c;实现公网通…

maven引入项目内本地包方法

最近在写java实现excel转pdf功能&#xff1b; 网上有个包很好用&#xff0c;免费&#xff1a;spire.xls.free-5.3.0.jar。 但是maven打包项目时报错&#xff0c;找不到这个包。 jar包位置如下&#xff1a; 在项目/src/jar/spire.xls.free-5.3.0.jar。 解决方法&#xff1a…

ansible-playbook 写arm版达梦7数据库的一键安装脚本

达梦官方提供镜像目前是dm8_x86 版本&#xff0c;因为众所周知的国产化方面的需求&#xff0c;需要在kylin v10机器上部署一个DM数据库以及其他使用数据库的服务&#xff0c;为了更便捷的交付需要把安装步骤都写入到ansible 脚本里&#xff0c;这里就单说下DM 的部署 DM7 数据库…

网络:华为数通HCIA学习:静态路由基础

文章目录 前言静态路由基础静态路由应用场景 静态路由配置静态路由在串行网络的配置静态路由在以太网中的配置 负载分担配置验证 路由备份&#xff08;浮动静态路由&#xff09;配置验证 缺省路由配置验证 总结 华为HCIA 基础实验&#xff0d;静态路由 & eNSP静态路由 基础…

无人机等非合作目标公开数据集2025.4.3

一.无人机遥感数据概述 1.1 定义与特点 在遥感技术的不断发展中&#xff0c;无人机遥感数据作为一种新兴的数据源&#xff0c;正逐渐崭露头角。它是通过无人驾驶飞行器&#xff08;UAV&#xff09;搭载各种传感器获取的地理空间信息&#xff0c;具有 覆盖范围大、综合精度高、…

详细介绍一下C++中的extern关键字

在C中&#xff0c;extern 是一个用于声明变量或函数具有外部链接性的关键字&#xff0c;它告诉编译器该符号的定义存在于其他文件&#xff08;或作用域&#xff09;中&#xff0c;当前文件仅需引用它。extern 常用于多文件编程和跨模块协作&#xff0c;以下是其详细说明&#x…