【Linux篇】进程入门指南:操作系统中的第一步

发布时间 - 2025-06-20 00:00:00    点击率:

探索进程世界:初学者必备的操作系统概念 前言

在计算机系统中,进程是程序执行的基本单元。它不仅是代码的集合,还是操作系统管理和分配资源的核心对象。每当我们启动一个应用程序,操作系统便会为其创建一个进程,使程序能够独立运行并进行资源管理。理解进程的概念对深入学习操作系统和高效利用计算机资源至关重要。接下来,我们将深入探讨进程管理的各个方面。

一. 冯·诺依曼体系结构1.1 背景与历史冯·诺依曼体系结构是现代计算机的基础设计模型,由约翰·冯·诺依曼在1945年提出。其核心思想是将程序和数据存储在同一个内存中,计算机通过中央处理单元(CPU)按顺序执行指令。在此向这位伟大的人物致敬。?

1.2 组成部分中央处理器(CPU)由运算器和控制器组成。存储器(内存)是CPU进行读取和获取数据的必要工具,CPU执行程序时,必须先将代码及数据加载到内存中,然后执行代码并访问数据。

1.3 意义其意义在于简化了计算机设计,提升了计算机的可编程性,使得通过修改存储器中的指令和数据可以实现多种功能。冯·诺依曼体系结构成为现代计算机系统的标准架构,推动了计算机技术的快速发展。

二. 进程2.1 进程概念进程是程序的一次执行实例,是操作系统进行资源分配和调度的基本单位。它拥有独立的内存空间、系统资源(如文件句柄、网络端口)以及运行状态。

2.1.1 PCB(进程控制块)task_struct包含部分信息,另一部分信息将在后续博客中详细讲解。

操作系统如何管理各种进程?首先是描述,然后是组织。所有运行的进程都以task_struct链表的形式存在于内核中。

2.2 查看进程2.2.1 使用系统文件查看命令格式:

功能:查看指定进程的进程信息。不指定pid则查看所有进程的信息。

2.2.2 使用top和ps等用户级工具获取命令格式:

ps ajx | grep myprocess | grep -v grep2.2.3 通过系统调用获取进程标识符代码语言:javascript代码运行次数:0运行复制```javascript

include #include #include int main(){printf("pid: %d\n", getpid());printf("ppid: %d\n", getppid());return 0;}

getpid()系统调用,用于获取当前进程的PID(进程ID),在子进程中调用getpid()返回的是子进程自身的PID。getppid()系统调用,用于获取当前进程的父进程PID。2.3 创建子进程示例代码:

代码语言:javascript代码运行次数:0运行复制```javascript

include#include#include int gval = 100;int main(){printf("父进程开始运行 ,pid: %d\n",getpid());pid_t id = fork();if(id %d", gval, gval+10);gval+=10;printf("我是一个子进程 !, 我的pid:%d, 我的父进程id:%d\n",getpid(),getppid());}}else{//fatherwhile(1){sleep(1);printf("我是一个父进程 !, 我的pid:%d, 我的父进程id:%d, gval: %d\n",getpid(),getppid(),gval);}}printf("进程开始运行 ,pid: %d\n",getpid());return 0;}

子进程会共享父进程的代码和数据,如果父子任何一方对数据进行修改,操作系统会在底层对数据进行拷贝,让目标进程修改这个拷贝。

问题1:为什么fork给父子返回各自不同的返回值?

父进程中的返回值:fork() 在父进程中返回子进程的PID(进程ID)。这个PID是一个正整数,唯一标识子进程。父进程可以使用该PID来跟踪子进程,执行如等待子进程结束、获取子进程的状态等操作。

子进程中的返回值:在子进程中,fork()返回0。子进程通过这个返回值可以判断自己是否是子进程,父进程通过返回值判断是否是父进程。

问题2:为什么一个函数会返回两次?

父进程的情况:返回值是子进程的PID(进程ID),是一个正整数。

父进程用这个PID来识别和管理子进程。父进程可以使用这个PID来执行如wait()、waitpid()等系统调用,等待子进程终止或获取子进程的退出状态。

子进程的情况:返回值是0。

子进程用返回值0来判断自己是子进程,以便执行不同于父进程的代码。子进程可能会通过这个返回值执行某些特定的初始化工作或处理。

问题3:fork两个返回值如何分别给父子进程返回?

父进程:父进程使用返回子进程的PID,来管理或等待子进程。子进程:子进程返回0,子进程用这个值来判断自己是子进程,以执行不同于父进程的代码逻辑(比如初始化、执行任务等)。fork返回负值,表示fork调用失败(资源不足等),它会返回-1,并且没有子进程创建。操作系统会设置errno来表示具体的错误原因。2.4 进程状态请看Linux内核关于进程状态的描述:

R(running): 运行状态,表示某进程正在运行或准备运行。S(sleep): 睡眠状态,进程在等待某些事件完成(也称为浅度睡眠,可中断睡眠)。D(disk sleep): 磁盘休眠状态,进程通常在等待I/O操作完成(也称为深度睡眠,不可中断睡眠)。T(stopped): 停止状态,可以通过发送信号让该进程继续进行。t(Tracing stop): 通常是在进行调试或进程跟踪时出现的状态。X(dead): 死亡状态,不会出现在进程列表中。Z(Zombie): 僵尸状态,子进程已结束,父进程为获取子进程的退出信息。2.4.1 查看进程状态使用ps aux 或 ps ajx 命令可以查看进程的详细状态。 命令选项含义:

a:显示一个终端所有的进程,包括其他用户的进程。x:显示没有控制终端的进程,例如后台运行的守护进程。j:显示进程归属的进程组ID、会话ID、父进程ID,以及与作业控制相关的信息。u:以用户为中心的格式显示进程信息,提供进程的详细信息,如用户、CPU和内存使用情况等。僵尸进程危害 进程的退出状态必须被维持下去,因为它要告诉关心它的进程(父进程),你交给我的任务,我办得怎么样了。如果父进程一直不读取,那子进程就一直处于Z状态。 • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中, 换句话说,Z状态一直不退出,PCB一直都要维护?是的! • 一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费。因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间! • 内存泄漏

如果父进程先退出,那么子进程后退出,进入Z状态后,该如何处理呢? • 父进程先退出,子进程就称之为“孤儿进程” • 孤儿进程被1号init进程领养,当然要有init进程回收

父进程等待子进程退出(避免子进程成为孤儿进程)父进程可以通过适当的进程管理确保它会在子进程结束时正确地回收子进程的资源,避免进程成为孤儿进程。常用的技术包括:

wait() 或 waitpid():父进程可以使用wait() 或 waitpid() 来等待子进程结束,并获取子进程的退出状态,从而清理和回收子进程的资源。这样,即使父进程在结束之前退出,它也能确保子进程的资源得到回收。

使用 signal() 或 sigaction() 捕获终止信号如果父进程结束时没有来得及清理子进程的资源,可以通过捕获特定信号(如SIGCHLD)来及时回收子进程的资源。通过设置SIGCHLD信号处理函数,父进程可以在子进程结束时自动清理。

避免父进程直接退出父进程应该在子进程完成后再退出,例如通过使用wait()等系统调用等待子进程完成后再退出。如果父进程在子进程结束前退出,可能导致子进程变成孤儿进程。

定期检查子进程状态,使用waitpid()等方法主动回收子进程的资源。

三. 最后


# linux  # 操作系统  # 处理器  # 工具  # ai  # 为什么  # JavaScript  # 架构  # include  # printf  # 标识符  # 结构体  # errno  # int  # 数据结构  # signal  # 对象  # 事件  # 返回值  # 可以通过  # 是一个  # 结束时  # 会在  # 可以使用  # 我是一个  # 在等待  # 可编程 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: java获取注册ip实例  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Laravel如何配置Horizon来管理队列?(安装和使用)  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  如何在阿里云部署织梦网站?  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  如何在云主机上快速搭建网站?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  在线制作视频网站免费,都有哪些好的动漫网站?  JavaScript模板引擎Template.js使用详解  详解CentOS6.5 安装 MySQL5.1.71的方法  英语简历制作免费网站推荐,如何将简历翻译成英文?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  如何在阿里云虚拟服务器快速搭建网站?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  网易LOFTER官网链接 老福特网页版登录地址  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  如何在搬瓦工VPS快速搭建网站?  Laravel PHP版本要求一览_Laravel各版本环境要求对照  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  微信小程序制作网站有哪些,微信小程序需要做网站吗?  简历没回改:利用AI润色让你的文字更专业  JavaScript数据类型有哪些_如何准确判断一个变量的类型  简单实现Android验证码  如何快速查询网站的真实建站时间?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  北京企业网站设计制作公司,北京铁路集团官方网站?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  googleplay官方入口在哪里_Google Play官方商店快速入口指南  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  教你用AI润色文章,让你的文字表达更专业  如何用好域名打造高点击率的自主建站?  高防服务器:AI智能防御DDoS攻击与数据安全保障  如何在腾讯云免费申请建站?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  西安专业网站制作公司有哪些,陕西省建行官方网站?  香港服务器租用每月最低只需15元?  详解vue.js组件化开发实践  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  html如何与html链接_实现多个HTML页面互相链接【互相】  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  ,在苏州找工作,上哪个网站比较好?  如何在阿里云ECS服务器部署织梦CMS网站?  javascript基于原型链的继承及call和apply函数用法分析  Java垃圾回收器的方法和原理总结