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

news2024/11/15 11:05:51

在这里插入图片描述

文章目录

    • 一、什么是进程?🤔
    • 二、进程的特性 🌟
    • 三、进程的组成 🧩
    • 四、进程的状态与转换 🔄🔀
    • 五、进程的调度与管理 🔧🔀
    • 六、代码示例(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等你哦!我的主页😍

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

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

相关文章

scanf中%c前加不加空格的区别

%c前加空格可以让scanf跳过空白字符&#xff08;如空格、制表符、换行符等&#xff09;&#xff0c;直接读取非空白字符。如果不加空格就会读取空白字符。 可以用两段测试客官有无慧根的程序来说明这个问题&#xff0c;测试代码如下&#xff1a; #include <stdio.h> in…

Ubuntu22.04安卓编译环境搭建及so库编译

1.配置Android-ARM64开发环境工具链: vim ~/.profile 或者 ~/.bashrc 或者 /etc/profile 编辑环境变量文件 输入下面内容 export CROSS_TRIPLE=aarch64-linux-android export CROSS_ROOT=/usr/${CROSS_TRIPLE} export ANDROID_NDK=${CROSS_ROOT} export AS=${CROSS_ROOT}…

【人工智能】数据集合集!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 点击蓝字 关注我们 1 Habitat Platform 发布方&#xff1a; Facebook AI Research西蒙菲莎大学佐治亚理工学院Facebook Reality LabsIntel LabsUniversity of California, Berkeley…

1- 关键字static

文章目录 1 前言2 static修饰局部变量2.1 局部变量无static修饰2.2 局部变量有static修饰 3 static修饰全局变量 1 前言 在C语言中&#xff0c;static是用来修饰变量和函数的&#xff1a; 修饰局部变量 - 称为静态局部变量修饰全局变量 - 称为静态全局变量修饰函数 - 称为静态…

django空巢老人志愿服务系统-计算机毕业设计源码58726

摘 要 随着社会老龄化问题日益突出&#xff0c;空巢老人群体的关注和关怀日益重要。本研究设计并实现了基于Python的空巢老人志愿服务系统&#xff0c;旨在利用技术手段提供更多关爱和支持给空巢老人群体。 该系统结合Python编程语言的灵活性和易用性&#xff0c;实现了慈善捐赠…

HCIE杭州考试分享

考试过程&#xff1a; 首先提醒大家关注一下天气&#xff0c;我去杭州没看天气&#xff0c;去了一直下雨&#xff0c;鞋子也湿了&#xff1b;27号早上七点多到的杭州&#xff0c;雨一直下&#xff0c;去了直奔网吧上机&#xff0c;最后的机时&#xff0c;早饭和晚饭都在网吧吃…

Linux多线程间通信机制(互斥锁、条件变量、信号量,读写锁)同步与异步(二)

原文链接&#xff1a;https://blog.csdn.net/weixin_55796564/article/details/119699146 一、概述 本章介绍了线程同步的几种不同的方法&#xff0c;包括互斥锁、条件变量、自旋锁以及读写锁&#xff0c;当然&#xff0c;除此之外&#xff0c;线程同步的方法其实还有很多&…

如何获取设备消息?

一、什么是消息&#xff1f; 消息是设备向萤石云平台传输的带有特定内容的信息&#xff0c;大部分消息由设备端主动产生&#xff0c;并且上报到平台。举个例子&#xff0c;设备开启画面变化检测&#xff0c;当设备画面产生变化&#xff0c;设备就会产生报警&#xff08;画面…

Adobe Premiere Pro 2023-23.6.7.1 解锁版下载与安装教程 (一款专业的视频编辑软件)

前言 Adobe Premiere Pro&#xff08;简称PR&#xff09;是一款知名的专业视频编辑软件&#xff0c;数字视频剪辑软件。主要用来编辑视频和音频&#xff0c;可以在RGB和YUV色彩空间中以高达32位色彩的视频分辨率对4K和更高质量的视频文件进行编辑&#xff0c;支持VST音频插件和…

windows 10/11禁用更新

一、操作 获取“禁用更新”文件。将“禁用更新”文件从百度网盘中下载到电脑桌面。 百度网盘:链接:https://pan.baidu.com/s/1eGEtJYgN3MR4qGoUpnP7xw?pwd=ccrc提取码:ccrc 双击运行“禁用更新”。 弹出如下对话框,点击“是”。 弹出如下对话框,点击“是”。 确…

中仕公考:大四还没毕业能考公吗?

应届大学生是否可以报考公务员? 对于尚未获得毕业证书的应届大学生&#xff0c;有资格报名参与公务员考试。具体到学历和学位的要求&#xff0c;截止日期定于2024年7月底。在报名过程中&#xff0c;考生必须填写《报名登记表》和《报名推荐表》&#xff0c;确保提供的信息真实…

【手眼标定】使用kalibr对imu和双目摄像头进行联合标定

使用kalibr对imu和双目摄像头进行联合标定 前言 方式一&#xff1a;ros2消息格式通过ros1_bridge转为ros1消息格式&#xff0c;在ros1环境下录制bag进行标定。一、IMU标定二、双目摄像头标定三、手眼标定&#xff08;imu和双目摄像头的联合标定&#xff09; 方式二&#xff1a;…

Python轻量级 NoSQL 数据库之tinydb使用详解

概要 在现代应用开发中,使用数据库来存储和管理数据是非常常见的需求。对于简单的数据存储需求,关系型数据库可能显得过于复杂。TinyDB 是一个纯 Python 实现的轻量级 NoSQL 数据库,专为嵌入式场景设计,适用于小型项目、原型开发和教学等场景。本文将详细介绍 TinyDB 库,…

SPAW7000高精度功率分析记录仪,测试方案

测试目标 评估双电机四驱系统中前后电机的性能。 分析前后电机之间的实时联动情况。 测量并分析电机控制器的输入与输出功率。 计算功率转换效率和损耗。 验证电机系统的谐波特性。 测试设备 SPAW7000高精度功率分析记录仪&#xff1a;用于测量功率、电压、电流等参数&am…

这个tiktok短视频才发布了一天,就能卖货1.6w美金

这个tiktok短视频才发布了一天&#xff0c;就能卖货1.6w美金&#xff01; 今天的讨论课上&#xff0c; 我的学员们问我 TikTok上的一条带货短视频的结构是怎样的&#xff1f; 我们一起看了这个案例。 一、案例分析 这是TikTok上的一位达人“moreco1in" 他拥有862K粉丝…

LeetCode.3152.特殊数组II

题目描述&#xff1a; 如果数组的每一对相邻元素都是两个奇偶性不同的数字&#xff0c;则该数组被认为是一个 特殊数组 。 你有一个整数数组 nums 和一个二维整数矩阵 queries&#xff0c;对于 queries[i] [fromi, toi]&#xff0c;请你帮助你检查 子数组 nums[fromi..toi…

【Linux】多线程7——线程池

1.线程池的概念 1.1.池化技术 池化技术指的是提前准备一些资源&#xff0c;在需要时可以重复使用这些预先准备的资源。 在系统开发过程中&#xff0c;我们经常会用到池化技术。通俗的讲&#xff0c;池化技术就是&#xff1a;把一些资源预先分配好&#xff0c;组织到对象池中…

idea Spring-boot 项目debug启动过慢 :已验证

问题描述 Springboot项目在Idea中开发&#xff0c;server模型启动正常&#xff0c;但debug模式启动非常缓慢。 解决方案&#xff1a; 检查了项目配置&#xff0c;均没有问题&#xff0c;等20分钟以上能正常启动&#xff0c;但这样无法调试。查很多资料都没有找到问题解决方案…

spring01-spring容器启动过程分析

【README】 本文总结自《spring揭秘》&#xff0c;作者王福强&#xff0c;非常棒的一本书&#xff0c;墙裂推荐&#xff1b; spring容器根据配置元素组装可用系统分2个阶段&#xff0c;包括spring容器启动&#xff0c; springbean实例化阶段&#xff1b; 本文详细分析spring容…

Java项目通过IDEA远程debug调试

前言 在我们真实项目开发过程中&#xff0c;又是经常会发现一种问题&#xff0c;就是我们在开发环境功能是正常的&#xff0c;在测试环境可能也不太容易发现问题。 结果到了生产环境&#xff0c;由于数据量大&#xff0c;且数据类型变多后&#xff0c;就产生了一些比较难复现…