06. Linux进程概念 1

Linux进程概念

冯诺依曼体系

冯诺依曼体系结构(Von Neumann Architecture)是现代计算机设计的奠基石,由数学家约翰·冯·诺依曼于1945年提出。这一架构彻底改变了早期计算机“硬件即程序”的设计方式,使得计算机可以灵活地运行不同程序,开启了可编程计算时代。


🧠 核心思想:存储程序原理

冯诺依曼结构的最大创新是将程序和数据统一存储在同一个存储器中,并通过控制器逐条读取指令执行。这种设计使得程序可以像数据一样被修改、传输和存储。


🧱 五大组成部分

部件功能说明
运算器(ALU)执行算术和逻辑运算,如加减乘除、与或非等操作
控制器(CU)负责指令的读取、译码和控制其他部件的操作流程
存储器存储程序指令和数据,通常是 RAM(内存)和 ROM(只读存储器)
输入设备将外部信息输入计算机,如键盘、鼠标、摄像头等
输出设备将计算结果输出到外部,如显示器、打印机、扬声器等
五大组成部分结构体系图
在这里插入图片描述1. 这里的存储器指的是内存(具有掉电遗失的性质),而磁盘是外设是拥有永久性存储的能力 2. CPU是不会直接和外设进行交流,所有外设的输入输出数据只能写入到内存之中去

🔁 工作流程介绍

  1. 从存储器中取指令
  2. 控制器译码指令
  3. 根据指令操作数据
  4. 运算器执行运算
  5. 结果写回存储器或输出设备

操作系统


🧠 操作系统概念

操作系统(Operating System,简称 OS)是计算机系统中最基本、最核心的系统软件。它负责管理计算机的硬件资源,并为用户和应用程序提供运行环境。

✅ 简单定义:

操作系统是管理计算机硬件与软件资源的中间层,它协调各个组件的运行,使用户和程序能够高效、安全地使用计算机。

  • 内核(进程管理,内存管理,文件管理,驱动管理)
  • 其他程序(函数库,shell程序)

🎯 操作系统的设计目的

操作系统的设计目的可以从两个方向理解:

🔽 对下:管理硬件资源(手段)
  • 管理 CPU:调度进程、分配时间片
  • 管理内存:分配空间、提供虚拟内存
  • 管理设备:通过驱动程序控制硬件
  • 管理文件系统:组织数据、提供访问接口

操作系统屏蔽了底层硬件的复杂性,为上层应用提供统一的访问方式。

🔼 对上:服务用户和应用程序(目的)
  • 提供程序运行环境
  • 提供系统调用接口(如文件读写、进程创建)
  • 提供图形界面或命令行交互方式
  • 提供安全性、稳定性和资源隔离

就像银行柜员是用户与后台系统之间的桥梁,操作系统是用户程序与硬件之间的“服务窗口”。
在这里插入图片描述

  • 操作系统管理硬件的一个过程就是
  • 先将其利用结构体进行描述
  • 然后利用链表或者其他的更高效的数据结构进行管理组织

🧱 操作系统的定位

在整个计算机系统架构中,操作系统处于中间层:

用户程序↑
系统调用 / 库函数↑
操作系统(内核)↑
硬件(CPU、内存、设备)

🧩 小结

维度内容说明
概念管理软硬件资源的系统软件
设计目的对下管理硬件,对上服务用户
定位计算机系统的中间层,是用户与硬件之间的桥梁
核心功能进程管理、内存管理、文件系统、设备驱动、安全性

接下来我们来了解进程的概念

  1. 基本概念:就是一个执行的实例,一个正在运行的程序
  2. 内核观点:担当分配系统资源的实体,在这里我的理解是内存资源

描述进程PCB(process control block)

task_struct-PCB的一种

  • 在Linux中描述进程的结构体叫做task_struct。
  • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
    简单理解就是,当我写了一个小程序,此时执行,现在这个小程序是在内存之中被执行的,而他的可执行文件则在硬盘当中。
    但是电脑内存当中肯定不止这一个执行的程序也就是进程,有太多的加载进来的程序,操作系统肯定要进行管理。
    所以在这里使用task_struct,也就是先对其进行描述再进行管理
    所谓的对进程进行管理,也就转变成了对PCB进行相关的管理
    而对进程管理-> 也就转化成了对链表的增删查改
  • 简要介绍一下这个task_struct中存储了以下信息

🧱 task_struct 的核心字段

分类字段示例说明
🔖 标识信息pid, tgid, ppid进程号、线程组号、父进程号
📍 状态信息state, exit_code当前状态(运行、等待、僵死等)
🎛️ 调度信息priority, policy, counter优先级、调度策略、时间片
🧠 内存信息mm, active_mm指向进程的内存描述结构
🧵 线程信息thread保存寄存器上下文、栈指针等
📂 文件系统信息files, fs打开的文件、文件系统上下文
🔗 链接信息parent, children, sibling父子进程关系
🔔 信号处理signal, blocked, sigpending信号处理相关字段
📊 统计信息utime, stime, start_time用户态/内核态时间、启动时间

查看进程

  1 #include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 int main()5 {6     // 引入子进程的概念,观察进程现象7     pid_t id = fork();8     printf("我是一个进程,pid: %d, ppid:%d, id:%d\n",getpid(), getppid(), id);9     // 观察进程状态10     //while(1)11     //{12     //    printf("我是一个进程,pid: %d, ppid:%d\n",getpid(), getppid());13     //    sleep(1);                                                                                              14     //}15     return 0;16 }

在这里先忽略fork,可以看到执行的程序结果pid是16802,使用指令查看,在这张图片里显示的最后一个进程是我们使用了grep查找16802可以忽略
在这里插入图片描述

  • 进程id (PID)
  • 父进程id(PPID)

🧠 fork()的概念

fork() 是 Linux 和类 Unix 系统中用于创建新进程的系统调用。它的核心作用是:

复制当前进程,生成一个几乎完全一样的子进程。

这个“复制”并不是简单的拷贝,而是通过一种叫做 写时复制(Copy-On-Write, COW) 的机制来优化性能。


🧱 基本语法

#include <unistd.h>pid_t fork(void);
  • 返回值:
    • > 0:父进程,返回的是子进程的 PID
    • = 0:子进程
    • < 0:创建失败,返回 -1,并设置 errno

🧪 示例代码

#include <stdio.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {perror("fork failed");return 1;} else if (pid == 0) {// 子进程printf("Hello from child! PID = %d\n", getpid());} else {// 父进程printf("Hello from parent! Child PID = %d\n", pid);}return 0;
}

🧾 输出可能是:

Hello from parent! Child PID = 12345
Hello from child! PID = 12345

注意:父子进程的执行顺序不确定,由操作系统调度决定。


🔍 fork 的工作原理

  • 复制进程上下文:包括代码段、数据段、堆、栈等
  • 独立 PID:子进程拥有自己的进程号
  • 共享文件描述符:初始时父子进程共享打开的文件
  • 地址空间独立:虽然初始共享内存页,但修改时会触发复制(COW)

🧩 常见用途

  • 创建后台任务或守护进程
  • 实现并行计算
  • exec() 结合,执行新程序(如 shell 命令)
  • 构建多进程服务器(如 Apache)

⚠️ 注意事项

  • 必须处理返回值,否则容易逻辑混乱
  • 避免僵尸进程:父进程应使用 wait()waitpid() 等待子进程结束
  • 资源消耗:虽然 COW 优化了性能,但频繁 fork 仍可能影响系统稳定性

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP标头全解析:保护你的Web应用!

在网络攻击频发的时代&#xff0c;你的Web应用是否像一座没有城墙的城堡&#xff0c;任由XSS、点击劫持和中间人攻击入侵&#xff1f;HTTP标头&#xff0c;这些看似不起眼的响应头&#xff0c;其实是Web安全的隐形守护者。想象一个电商网站&#xff0c;用户数据被窃取&#xff…

rt-linux下__slab_alloc里的另外一处可能睡眠的逻辑

一、背景 在之前的博客 tasklet上下文内存分配触发might_alloc检查及同步回收调用链 里&#xff0c;我们讲了一处内存分配时会引起睡眠的调用链&#xff08;这个引起睡眠的这个调用链它是在普通linux里也是存在的&#xff09;。这篇博客里&#xff0c;我们讲一处内存分配路径下…

基于STM32F103C8T6的智能环境监测系统:DHT11温湿度检测与OLED显示实现

引言 你是否曾想实时握身边环境的温湿度变化&#xff1f;无论是居家种植需要精准调控环境&#xff0c;还是实验室存放敏感材料需监控条件&#xff0c;亦或是智能座舱场景下的环境感知&#xff0c;智能环境监测系统正成为连接物理世界与数字管理的重要桥梁。而在众多嵌入式开发…

动态规划在子数组/子串问题

目录 一、最大子数组和&#xff08;LeetCode 53&#xff09; 二、环形子数组的最大和&#xff08;LeetCode 918&#xff09; 三、乘积最大子数组&#xff08;LeetCode 152&#xff09; 四、乘积为正数的最长子数组长度&#xff08;LeetCode 1567&#xff09; 五、等差数列…

微信小程序开发笔记(01_小程序基础与配置文件)

ZZHow(ZZHow1024) 参考课程: 【尚硅谷微信小程序开发教程】 [https://www.bilibili.com/video/BV1LF4m1E7kB] 009_文件和目录结构介绍新建页面与调试基础库 一个完整的小程序项目分为两个部分&#xff1a;主体文件、页面文件 主体文件又称全局文件&#xff0c;能够作用于整…

NLP Subword 之 BPE(Byte Pair Encoding) 算法原理

本文将介绍以下内容&#xff1a; 1. BPE 算法核心原理2. BPE 算法流程3. BPE 算法源码实现DemoBPE最早是一种数据压缩算法&#xff0c;由Sennrich等人于2015年引入到NLP领域并很快得到推广。该算法简单有效&#xff0c;因而目前它是最流行的方法。GPT-2和RoBERTa使用的Subword算…

CSS 伪类选择器

伪类选择器&#xff08;pseudo-class selector&#xff09;是一种用于选择HTML元素特定状态或特征的关键字&#xff0c;它允许开发者基于文档树之外的信息&#xff08;如用户交互、元素位置或状态变化&#xff09;来选择元素并应用样式。伪类选择器以冒号(:)开头&#xff0c;附…

Electron 新特性:2025 版本更新解读

引言&#xff1a;Electron 新特性在 2025 版本更新中的解读核心价值与必要性 在 Electron 框架的持续演进中&#xff0c;新特性的引入是推动桌面开发创新的核心动力&#xff0c;特别是 2025 年的版本更新&#xff0c;更是 Electron 项目从成熟生态到前沿技术的跃进之钥。它不仅…

MyBatis从入门到面试:掌握持久层框架的精髓

MyBatis从入门到面试&#xff1a;掌握持久层框架的精髓 前言 在Java企业级应用开发中&#xff0c;持久层框架的选择至关重要。MyBatis作为一款优秀的半自动化ORM框架&#xff0c;以其灵活的SQL定制能力和良好的性能表现&#xff0c;成为了众多开发者的首选。本文将带你从MyBa…

5.Three.js 学习(基础+实践)

Three.js 是 “WebGL 的封装库”&#xff0c;帮你屏蔽了底层的着色器 / 缓冲区细节&#xff0c;专注于 “3D 场景搭建”&#xff0c;开发效率高&#xff0c;是通用 3D 开发的首选。他的核心是 “场景 - 相机 - 渲染器” 的联动逻辑&#xff0c;先掌握基础组件&#xff0c;再学进…

消火栓设备工程量计算 -【图形识别】秒计量

消火栓设备工程量计算 -【图形识别】秒计量 消防系统的消火栓设备水枪、水带和消火栓组成&#xff0c;根据清单定额规则计算消火栓设备工程量。通过CAD快速看图的图形识别框选图纸就能自动数出消火栓数量&#xff0c;省时又准确&#xff0c;是工程人做消防算量的好帮手。 一、…

Docker 与 VSCode 远程容器连接问题深度排查与解决指南

Docker 与 VSCode 远程容器连接问题深度排查与解决指南 引言 Visual Studio Code 的 Remote - Containers 扩展极大地提升了开发体验&#xff0c;它将开发环境容器化&#xff0c;保证了环境的一致性&#xff0c;并允许开发者像在本地一样在容器内进行编码、调试和运行。然而&…

爱图表:镝数科技推出的智能数据可视化平台

本文转载自&#xff1a;https://www.hello123.com/aitubiao ** 一、✨ AI 图表&#xff1a;智能数据可视化好帮手 爱图表是镝数科技旗下的一款智能数据可视化工具&#xff0c;它能让复杂的数字和报表变得直观又好懂。接入了先进的DeepSeek 系列 AI 模型&#xff0c;它不仅会做…

ENVI系列教程(四)——图像几何校正

目录 1 概述 1.1 控制点选择方式 1.2 几何校正模型 1.3 控制点的预测与误差计算 2 详细操作步骤 2.1 扫描地形图的几何校正 2.1.1 第一步:打开并显示图像文件 2.1.2 第二步:启动几何校正模块 2.2 Landsat5 影像几何校正 2.2.1 第一步:打开并显示图像文件 2.2.2 第…

STM32-FreeRTOS操作系统-消息队列

引言在嵌入式开发领域&#xff0c;STM32与FreeRTOS的结合应用极为广泛。本文将探讨如何在STM32上使用FreeRTOS实现消息队列功能&#xff0c;助力高效任务通信与系统协作。消息队列定义消息队列是一种在 FreeRTOS 中用于任务间通信的机制。它允许任务将消息发送到队列中&#xf…

【开题答辩全过程】以 C语言程序设计课程网站为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

手机上有哪些比较好用的待办事项提醒工具

在快节奏的现代工作中&#xff0c;我们每天都要面对大量的任务与事务。从项目截止日期、客户会议&#xff0c;到日常的工作安排&#xff0c;琐碎的事项容易让人顾此失彼。 手机待办事项工具早已突破传统“记事本”的局限&#xff0c;成为移动办公场景下的效率核心。它们通过任务…

Mysql数据库事务全解析:概念、操作与隔离级别

MySQL系列 文章目录MySQL系列一、什么是事务1.1事务的核心概念1.2、 事务的四大属性&#xff08;ACID&#xff09;1.2.1 原子性&#xff08;Atomicity&#xff09;1.2.2 一致性&#xff08;Consistency&#xff09;1.2.3 隔离性&#xff08;Isolation&#xff09;1.2.4 持久性&…

【MCU EEPROM开发教程】

简单来说把eeprom芯片当成一个传感器来使用&#xff0c;通过IIC/SPI等协议对芯片进行读写操作&#xff0c;具体的读写操作涉及到一些算法—怎么样读写更加快速&#xff0c;以及一些异常错误处理。 应用场景&#xff1a; 对于一些掉电也不能丢失的数据要存在eeprom/flash中&…

Docker将镜像搬移到其他服务上的方法

导出/加载镜像&#xff08;保留分层、标签&#xff09;和导出/导入容器快照&#xff08;仅文件系统&#xff0c;丢失镜像历史与标签&#xff09;。 一、把镜像打包带走&#xff08;推荐&#xff09; 适合把一个或多个镜像搬到离线/内网机器&#xff0c;保留分层与标签。 在源服…