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

操作系统中的进程:深入解析与理解

在这里插入图片描述

文章目录

    • 一、什么是进程?🤔
    • 二、进程的特性 🌟
    • 三、进程的组成 🧩
    • 四、进程的状态与转换 🔄🔀
    • 五、进程的调度与管理 🔧🔀
    • 六、代码示例(C)
      • 创建进程
      • 进程等待(父进程等待子进程结束)
      • 进程间通信(使用管道)

🌈你好呀!我是 山顶风景独好
🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然!😊
🌸愿您在此停留的每一刻,都沐浴在轻松愉悦的氛围中。
📖这里不仅有丰富的知识和趣味横生的内容等您来探索,更是一个自由交流的平台,期待您留下独特的思考与见解。🌟
🚀让我们一起踏上这段探索与成长的旅程,携手挖掘更多可能,共同进步!💪✨

一、什么是进程?🤔

进程(Process)是计算机中程序关于某数据集合上的一次运行活动,是操作系统进行资源分配和保护的基本单位。简单来说,进程就是程序的一次执行过程。程序是静态的,它作为系统中的一种资源永远存在;而进程是动态的,它包含程序的执行过程,以及执行过程中占用的所有系统资源,如CPU、内存、网络资源等。💡🔄

二、进程的特性 🌟

进程具有以下几个基本特性:

  • 动态性:进程是动态地产生、变化和消亡的,具有创建、活动、暂停、终止等过程,是程序的一次执行实例。🔄💨
  • 并发性:多个进程实体可以同时存在于内存中,并在一段时间内同时运行,以提高资源利用率。🚀📈
  • 独立性:进程是一个能独立运行、独立获得资源和独立接受调度的基本单元。🛡️💪
  • 异步性:由于进程间的相互制约,使得进程的执行速度不可预知,具有间断性。⏳🔀

三、进程的组成 🧩

进程实体由程序段、数据段和进程控制块(PCB)三部分组成:

  • 程序段:包含能被CPU执行的程序代码。📜🔑
  • 数据段:包含程序运行所需的原始数据、中间结果和最终结果。📊🔍
  • 进程控制块(PCB):包含了进程描述信息、控制和管理信息、资源分配清单和CPU相关信息等,是操作系统管理进程的核心数据结构。🔧🔍

四、进程的状态与转换 🔄🔀

进程在其生命周期中会经历多种状态,主要包括:

  • 新建状态:进程正在被创建,尚未开始执行。🛠️⏳
  • 就绪状态:进程已准备好执行,等待被调度器选中。💼🔄
  • 运行状态:进程正在CPU上执行。🏃‍♂️💨
  • 阻塞状态:进程因等待某个事件(如I/O操作完成)而暂停执行。🚫🔄
  • 终止状态:进程执行完毕或因错误而终止。🛑💀

进程的状态转换是操作系统调度的核心,常见的转换包括:

  • 就绪到运行:调度器从就绪队列中选择进程执行。🔄🏃‍♂️
  • 运行到阻塞:进程等待某个事件而暂停执行。🏃‍♂️🚫
  • 阻塞到就绪:进程等待的事件发生,进程重新进入就绪状态。🚫🔄
  • 运行到终止:进程执行完毕或异常终止。🏃‍♂️🛑

五、进程的调度与管理 🔧🔀

操作系统通过进程管理来控制各个进程的执行流程和资源分配。进程管理包括创建和终止进程、调度进程执行顺序、进程间通信与同步、进程挂起与恢复,以及进程的监控和调试等。

进程调度🔧🕒
由于操作系统的处理能力有限,无法同时执行所有进程,因此需要使用调度算法来决定哪个进程能够获得处理器时间。调度算法可以根据进程的优先级、等待时间、执行时间等来选择合适的进程执行,以提高系统性能和响应速度。🕒📈
进程间通信与同步 💬🔒
多个进程之间需要进行信息的交换和共享,操作系统提供了多种通信机制,如共享内存、消息传递和管道等。同时,为了避免进程间的冲突和竞争条件,操作系统还提供了同步机制,如互斥锁、信号量和条件变量等,确保进程能够按照正确的顺序访问共享资源。💬🔑

如何管理进程 🧹💡
当我们感觉电脑卡顿时,往往是因为后台运行的进程过多,占用了大量系统资源。此时,我们可以通过以下几种方式管理进程:

  • 使用任务管理器:按Ctrl+Alt+Delete快捷键进入任务管理器,查看和管理正在运行的后台进程,关闭不需要的进程以释放系统资源。🧹💻
  • 使用系统优化工具:大多数操作系统都自带了优化工具,如Windows的“任务计划程序”或Mac的“活动监视器”,可以帮助用户管理和优化后台进程。🛠️💡
  • 定期清理系统垃圾:使用电脑杀毒软件定期清理系统垃圾文件,减少系统资源的占用,提高电脑性能。🧹📈

六、代码示例(C)

创建进程

#include <stdio.h>    
#include <unistd.h>    
#include <sys/types.h>    int main() {    pid_t pid;    // 创建进程    pid = fork();    if (pid < 0) {    // 创建失败    perror("创建进程失败");    return 1;    } else if (pid == 0) {    // 子进程    printf("这是一个子进程,其PID为 %d\n", getpid());    } else {    // 父进程    printf("这是一个父进程,其PID为 %d\n", getpid());    printf("子进程的PID为 %d\n", pid);    }    return 0;    
}

进程等待(父进程等待子进程结束)

#include <stdio.h>    
#include <unistd.h>    
#include <sys/types.h>    int main() {    pid_t pid;    // 创建进程    pid = fork();    if (pid < 0) {    // 创建失败    perror("创建进程失败");    return 1;    } else if (pid == 0) {    // 子进程    printf("这是一个子进程,其PID为 %d\n", getpid());    } else {    // 父进程    printf("这是一个父进程,其PID为 %d\n", getpid());    printf("子进程的PID为 %d\n", pid);    }    return 0;    
}

进程间通信(使用管道)

#include <stdio.h>    
#include <unistd.h>    
#include <sys/types.h>    
#include <string.h>    int main() {    int pipefd[2];    pid_t pid;    char buf[30];    // 创建管道    if (pipe(pipefd) == -1) {    perror("创建管道失败");    return 1;    }    // 创建进程    pid = fork();    if (pid < 0) {    // 创建失败    perror("创建进程失败");    return 1;    } else if (pid == 0) {    // 子进程    close(pipefd[0]); // 关闭读端    write(pipefd[1], "Hello from child", 16); // 向管道写数据    close(pipefd[1]); // 关闭写端    } else {    // 父进程    close(pipefd[1]); // 关闭写端    read(pipefd[0], buf, sizeof(buf)); // 从管道读数据    printf("从子进程接收到的消息: %s\n", buf);    close(pipefd[0]); // 关闭读端    }    return 0;    
}

✨ 这就是今天要分享给大家的全部内容了,我们下期再见!😊
🏠 我在CSDN等你哦!我的主页😍

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Qt+TSC打印机调试
  • springboot疫情居家办公系统--论文源码调试讲解
  • AI驱动的招聘流程革新与挑战应对
  • HAProxy七层负载均衡配置方案
  • Linux的platform设备驱动框架
  • python中的迭代器、可迭代对象和生成器
  • 时序预测|基于变分模态分解-时域卷积-双向长短期记忆-注意力机制多变量时间序列预测VMD-TCN-BiLSTM-Attention
  • 【Linux】网络编程套接字Scoket:UDP网络编程
  • 如何设置RabbitMQ和Redis消息队列系统
  • 目标检测——YOLOv8训练自己的数据集
  • 一些常见的数据处理技术
  • android compose contraintlayout 使用 bias
  • 初识C++ · C++11(1)
  • 代码随想录——判断子序列(Leetcode 392)
  • 立仪科技光谱共焦应用之金属隔膜静态重复性测量
  • Angular 2 DI - IoC DI - 1
  • Centos6.8 使用rpm安装mysql5.7
  • CSS3 变换
  • es6要点
  • gops —— Go 程序诊断分析工具
  • gulp 教程
  • Java,console输出实时的转向GUI textbox
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript HTML DOM
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • js数组之filter
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • orm2 中文文档 3.1 模型属性
  • Spring-boot 启动时碰到的错误
  • 阿里研究院入选中国企业智库系统影响力榜
  • 闭包,sync使用细节
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 分布式熔断降级平台aegis
  • 复杂数据处理
  • 机器学习中为什么要做归一化normalization
  • 漂亮刷新控件-iOS
  • 如何利用MongoDB打造TOP榜小程序
  • 如何设计一个微型分布式架构?
  • 使用Swoole加速Laravel(正式环境中)
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 跳前端坑前,先看看这个!!
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 用Visual Studio开发以太坊智能合约
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #define 用法
  • #微信小程序(布局、渲染层基础知识)
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (八十八)VFL语言初步 - 实现布局
  • (二)学习JVM —— 垃圾回收机制
  • (力扣记录)235. 二叉搜索树的最近公共祖先