当前位置: 首页 > news >正文

【Linux系统】初识OS的进程管理:查看与创建进程

众所周知,计算机其实都是由一个个的硬件组成的:

  • 输入设备:包括键盘、鼠标、扫描仪等
  • 输出设备:显示器、打印机等
  • 存储器:主要指的是内存
  • 中央处理器:就是CPU,含有运算器和控制器等

从这个体系结构图中我们能看出:在数据层面上,CPU不会和外设(输入输出设备)进行交互,CPU只会和内存打交道。外设要输入或输出数据,只能写入内存中或从内从中读取。数据可以提前加载到内存中,所以计算机处理数据可以认为主要就是CPU和内存之间的交互。总结就是,所有设备只能直接和内存打交道,所以计算机的效率主要取决于内存。而它们之间的数据流动过程,本质都是拷贝,也就是计算机的效率由拷贝效率决定!

二、操作系统的基础概念

任何一个计算机系统都包含一个基本的程序集合,称为操作系统(OS)。广义上理解,它包含操作系统内核、其他程序(函数库、shell程序等)

操作系统的内核是它的核心,内核有四大功能:内存管理、文件管理、驱动管理、进程管理

在整个计算机软硬件架构中,操作系统是一款软件,专门用于软硬件资源管理

想象这样一个场景:用户到银行取钱,用户是上层软件,金库是计算机硬件。如果让上层软件直接操控底层硬件,就像让用户直接去金库拿钱,管理起来就十分麻烦!所以就需要有操作系统进行中间管理——操作系统就像银行柜员,用户与柜员沟通存取钱,柜员再负责向金库中存取钱。这样一来从整个银行行长角度看,管理软硬件资源就很方便了。

在程序员开发角度,操作系统对外会表现为一个整体,暴露部分接口给上层开发使用,这部分操作系统提供的接口,称为系统调用

三、初识进程

1. 进程的概念与描述
1.1 基本概念

进程是操作系统学科中一个很重要的知识,操作系统的进程管理、内存管理、文件管理、设备管理等核心功能,都围绕进程展开。

一般的教科书上可能讲进程的概念是:程序的一个执行实例、正在执行的程序、是程序的一次执行过程,等。或者从内核层面来看,进程是担当分配系统资源(CPU时间、内存等)的实体,是操作系统进行资源分配和调度的基本单位等,没有错。

我认为更精辟的总结是:进程 = 内核数据结构对象 + 程序的代码和数据

这个概念需要我们在后面的学习中慢慢体会。

1.2 描述进程的数据结构PCB

Linux系统的内核主要是由C语言写的。

一个进程的信息,被存放在一个叫做进程控制块的数据结构中,是进程属性的集合。在操作系统学科中,这个数据结构统称为PCB(process control block)。具体在Linux系统中,它是一个C语言结构体,名字是task_struct! task_struct中有很多的信息,在接下来我们学习进程会不断了解的。

2. 查看进程

在Windows系统下双击启动应用、手机上启动app、Linux中执行命令和程序,本质都是启动了进程!我们也有相应的方法去查看进程。

命令ps axj,查看系统中所有进程的部分信息:

在这里插入图片描述

当前系统中还有很多隐藏的进程,为了方便查看到我们想要的进程,可以搭配headgrep命令使用。

为了方便演示,我写一个这样的程序test.exe:

在这里插入图片描述

这个程序可以一直运行,除非ctrl c中断。

我把它运行起来,然后新开一个终端页面,执行:

代码语言:javascript

AI代码解释

ps axj | head -1 && ps axj | grep test.exe

(head -1是为了保留第一行列名,grep是为了查询有test.exe文本的进程)

结果是:

在这里插入图片描述

可以看到,查询结果有两行,第二行是上面ps命令的进程(因为说过执行命令也是启动了进程)不用在意。重点是第一行,这就是我们正在一直运行的test.exe程序的进程信息!

2.1 pid和ppid

有一列名是PID,是进程id,用来描述本进程的唯一标识符,用来区别其他进程。 一个进程可以获取到自己的pid,OS提供了一个系统调用getpid,返回当前进程的pid

在这里插入图片描述

使用它需要包含头文件#include<sys/types.h>#include<unistd.h>,返回类型pid_t其实就是一个整型。

可以证明一下,在test.exe中加一句printf("%d\n", getpid());

在这里插入图片描述

还有一列为PPID,是父进程idLinux中,新的进程往往是通过其他进程创建的,这就是父进程。ppid就是一个进程的父进程id。 刚才说过,执行命令也是创建了进程,那么这个进程的父进程是谁呢?在上图中第二行是执行的命令,它的ppid是8059,那么我们就可以查看一下谁的pid是8059,ps axj | head -1 && ps axj | grep 8059

在这里插入图片描述

😮进程id是8059的是一个叫-bash的东西!-bash,是Linux系统的命令行解释器,是所有命令行执行命令的进程的父进程!也就是说,我们执行Linux的命令,本质都是-bash创建了子进程!

也有一个叫做getppid()的系统调用,可以获取到当前进程的ppid,用法和getpid一样,不再赘述。

3. fork创建子进程

刚才说,一个进程是由父进程创建的。我们自己写的程序启动后也是一个进程,按理说也能创建子进程。Linux就有这样一个系统调用fork!

在这里插入图片描述

fork函数的返回值很有意思:

在这里插入图片描述

调用fork后,会创建一个子进程。在父进程中,fork的返回值是子进程的pid;在子进程中,fork的返回值是0!如果子进程创建失败则在父进程中返回-1默认条件下,fork后父子进程是共享代码和数据的!

举个栗子:

代码语言:javascript

AI代码解释

#include<stdio.h> #include<unistd.h> #include<sys/types.h> int main() { // 创建子进程 pid_t id = fork(); while(1) { if(id == -1) { //子进程创建失败,一般不会失败 return 1; } else if(id == 0) { //子进程中执行 printf("子进程,pid:%d\n", getpid()); } else { //父进程中执行 printf("父进程,pid:%d\n", getpid()); } sleep(1); } return 0; }

执行后:

在这里插入图片描述为什么fork的返回值是这样规定的呢?这是因为一个子进程只会有一个父进程,而一个父进程可以创建出多个子进程,为了标识特定的子进程父进程需要得到子进程的pid。

http://www.jsqmd.com/news/777688/

相关文章:

  • AR眼镜硬件工程挑战:从功耗散热到系统集成的现实约束
  • 用Python+NumPy手把手复现数学建模国赛题:无人机编队纯方位定位(附完整代码)
  • 职业发展中的导师网络构建:从线性规划到多维连接
  • 工业自动化平台化架构:从硬件绑定到软件定义的转型之路
  • 从长江出发,与世界同步——2026武汉工业双展全球共振。
  • 电商AI绘图实操教程:2026三大场景快速搞定主图创作 - PC修复电脑医生
  • Linux 进程、管道与变量隔离深度解析
  • 2026信创数据中心KVM切换器选型指南:国产化方案与安全隔离实践
  • 解决Claude Code访问不稳定与Token不足的替代方案实践
  • 26国考补录公告已出
  • 固定式气体检测设备售后服务较好的厂商 - 品牌推荐大师
  • ComfyUI-Impact-Pack V8:3大AI图像增强技巧让普通人也能专业修图
  • 我们到底在为安全运维服务买单什么?——国内厂商核心能力拆解
  • CanMV K230上手初体验:除了跑AI,它的MicroPython环境还能玩出什么花样?
  • 如何用Keyboard Chatter Blocker终极解决机械键盘连击问题:完整配置指南
  • 如何快速掌握KLayout版图工具:从零开始的芯片设计实战指南
  • 内容创作平台集成 Taotoken 实现按需切换不同风格的文本生成模型
  • 利用Taotoken统一API管理多个项目的AI模型调用与成本
  • ComfyUI-Manager离线模式配置:无网络环境下的企业级部署解决方案
  • 【AI技术大会参会心得】:SITS2026现场未公开的5大落地陷阱与3个月可复用的工程化 checklist
  • 浙江灵腾流体科技有限公司2026阀门执行器领军:不锈钢闸阀/截止阀/止回阀/法兰球阀定制厂家推荐浙江灵腾流体科技 - 栗子测评
  • 设计制作企业排名
  • 通过OpenClaw配置Taotoken实现自动化工作流
  • Java在人工智能:TensorFlow Java API的使用
  • 如何高效永久保存微信聊天记录:WeChatMsg实用解决方案
  • 3步解锁被遗忘的压缩包密码:ArchivePasswordTestTool使用全攻略
  • Java开发(数据方向)面试复盘|踩坑实录
  • 终极免费Steam创意工坊下载器:5步解决跨平台模组下载难题
  • Cursor AI液态玻璃主题:美学与效率并重的代码编辑器视觉方案
  • 大模型上线即崩?2026奇点大会现场还原某央企37小时极限攻坚实录:从GPU显存溢出到SLA 99.99%达成