Linux系统编程之进程基础知识

概述

        在Linux系统中,进程是指一个正在运行的程序实例。每个进程都有一个唯一的进程标识符,即PID,操作系统通过这个PID来唯一识别和管理各个进程。进程不仅仅是程序代码的运行实例,它还包含了程序运行时所需的各种资源,包括:内存空间、文件描述符、输入输出设备等。

进程的组成

        一个Linux进程主要由以下几个部分组成。

        程序段:进程执行的机器指令,通常是从磁盘或Flash上的可执行文件加载到内存中的。

        数据段:包含全局变量和静态变量,通常也被加载到内存中。

        :动态分配的内存区域,用于存储动态分配的数据结构,比如:通过malloc或new分配的内存。

        :用于存储函数调用时的局部变量和函数参数,每次函数调用都会在栈上分配一个新的栈帧。

        文件描述符表:用于记录进程打开的文件和网络连接等,每个进程都有一个文件描述符表。

        进程控制块:英文全称为Process Control Block,通常简写为PCB。操作系统为每个进程维护的一个数据结构,记录了进程的所有相关信息,包括PID、状态、内存分配情况等。

进程的状态

        Linux进程的生命周期是指从进程被创建开始,到进程终止并释放所有资源为止的整个过程。在这个过程中,进程会经历不同的状态,并随着系统环境和任务需求的变化而在这些状态之间转换。

        一个典型的Linux进程,其生命周期通常包括以下几个阶段。

        创建:通过fork系统调用,创建一个新的进程。

        执行:进程在CPU上执行,可能经历多次状态转换。

        阻塞:进程因等待I/O操作或其他事件,暂停执行。

        终止:进程正常结束,或因错误而终止。

        回收:父进程通过wait或waitpid系统调用,回收子进程的资源。

        在Linux系统中,进程可以处于以下几种状态之一。

        就绪状态:进程已经准备好运行,等待CPU时间片。

        运行状态:进程正在CPU上执行。

        阻塞状态:进程因为等待某些事件的发生而暂停运行,如等待I/O操作完成。

        终止状态:进程已经完成或者因错误而终止。

        僵尸状态:进程已经结束,但其父进程尚未调用 wait 或 waitpid 函数回收其资源。

        停止状态:进程被暂停执行,通常是因为接收到 SIGSTOP 或 SIGTSTP 信号。

        进程的上述状态之间可以互相转换,常见的状态转换如下。

        就绪 -> 运行:当进程被调度程序选中,并分配到CPU上执行时,从就绪状态转换为运行状态。

        运行 -> 就绪:当进程的时间片用尽,或被更高优先级的进程抢占时,从运行状态转换为就绪状态。

        运行 -> 阻塞:当进程等待I/O操作完成,或其他事件发生时,从运行状态转换为阻塞状态。

        阻塞 -> 就绪:当进程等待的事件发生后,从阻塞状态转换为就绪状态。

        运行 -> 终止:当进程正常结束,或因错误终止时,从运行状态转换为终止状态。

        终止 -> 僵尸:当进程结束,但父进程尚未回收其资源时,从终止状态转换为僵尸状态。

        运行 -> 停止:当进程接收到SIGSTOP或SIGTSTP信号时,从运行状态转换为停止状态。

        停止 -> 运行:当进程接收到SIGCONT信号时,从停止状态转换为运行状态。

        为了更清晰地查看进程状态之间的转换过程,可参考下面的状态转换图。

        如果想查看进程的当前状态,可以使用ps、top等命令。比如:使用ps aux命令可以查看系统中所有进程的详细信息,包括:状态、PID、CPU使用率、内存使用率等。

进程控制块

        进程控制块,即PCB,是操作系统为每个进程维护的一个数据结构,记录了进程的所有相关信息。PCB是系统感知进程存在的唯一标志,系统通过PCB来管理和控制进程。PCB可以被操作系统中的多个模块读取或修改,比如:调度程序、资源分配程序、中断处理程序等。这些模块通过访问或修改PCB,来管理和控制进程的执行状态和资源分配情况。

        PCB中包含的主要信息如下。

        进程标识符:即PID,唯一标识进程的整数。PID在任何时刻都是唯一的,但可以重用。当进程终止并被系统回收后,其PID可以被其他新创建的进程使用。

        进程状态:记录进程当前所处的状态。

        程序计数器:指向进程下一条要执行的指令。

        寄存器状态:保存进程的寄存器值,用于进程切换时恢复现场。

        内存管理信息:包括进程的虚拟地址空间、页表等。

        文件描述符表:记录进程打开的文件和网络连接等。

        优先级:用于调度程序确定进程的优先级。

        父进程ID:记录创建该进程的父进程的PID。

        子进程列表:记录该进程创建的所有子进程的PID。

        资源限制:包括进程可以使用的最大内存、文件描述符数量等。

// 进程控制块PCB
struct task_struct
{pid_t pid;  // 进程IDchar comm[16];  // 进程名mm_struct *mm;  // 内存描述符files_struct *files;  // 文件描述符表fs_struct *fs;  // 文件系统信息signal_struct *signal;  // 信号处理信息thread_info *thread_info;  // 线程信息struct list_head tasks;  // 进程链表节点struct task_struct *parent;  // 父进程指针struct task_struct *children;  // 子进程链表头struct task_struct *sibling;  // 兄弟进程链表unsigned long state;  // 进程状态int priority;  // 进程优先级int nice;  // 进程的nice值int static_prio;  // 静态优先级int policy;  // 调度策略struct sched_param sched_param;  // 调度参数unsigned long flags;  // 进程标志unsigned long timeout;  // 超时时间unsigned long rt_priority;  // 实时优先级unsigned long deadline;  // 截止时间unsigned long runtime;  // 运行时间unsigned long vruntime;  // 虚拟运行时间unsigned long utime;  // 用户模式下的运行时间unsigned long stime;  // 内核模式下的运行时间unsigned long nvcsw;  // 自愿上下文切换次数unsigned long nivcsw;  // 非自愿上下文切换次数unsigned long start_time;  // 进程启动时间unsigned long exit_time;  // 进程退出时间// ...
};

进程调度

        Linux系统中的所有进程形成一个树状结构,称为进程树。进程树的根节点是进程ID为1的init进程,它是系统启动后的第一个进程,负责启动其他系统进程和服务。每个进程都可以创建子进程,子进程又可以创建自己的子进程,从而形成一个多级的进程树。

        Linux内核负责决定哪个进程何时获得CPU时间,调度算法决定了进程的优先级和执行顺序,常见的调度策略如下。

        先来先服务:英文全称为“First-Come, First-Served”,缩写为FCFS。FCFS是一种简单的调度算法,按照进程到达的顺序进行调度。第一个到达的进程最先执行,然后是第二个到达的进程,依此类推。FCFS算法逻辑简单,容易理解和实现。但不够公平,缺乏优先级。比如:如果一个长作业首先到达,它会占用CPU较长时间,导致后续到达的短作业等待时间过长。

        短作业优先:英文全称为“Shortest Job First”,缩写为SJF。SJF是一种基于进程预计执行时间的调度算法,优先调度执行时间较短的进程。SJF可以减少平均等待时间,提高系统的整体吞吐量。但必须预先知道或估计每个进程的执行时间,这在实际应用中可能难以实现。

        时间片轮转:英文全称为“Round Robin”,缩写为RR。RR是一种基于时间片的调度算法,每个进程轮流分配固定的时间片,时间片用尽后切换到下一个进程。这样,每个进程都能获得平等的CPU时间,避免了某些进程长时间占用CPU。RR适用于交互式系统,可以快速响应用户的输入,但频繁的上下文切换可能会增加系统开销。

        优先级调度:英文全称为“Priority Scheduling”,缩写为PS。PS根据进程的优先级进行调度,高优先级的进程优先获得CPU时间。它的特点是比较灵活,可以根据进程的重要性和紧急程度动态调整优先级。缺点是低优先级的进程可能会因为高优先级进程的存在,而长期得不到CPU时间。

        完全公平调度:英文全称为“Completely Fair Scheduler”,缩写为CFS。CFS是Linux内核从版本2.6.23开始采用的默认调度算法,其设计目标是:在所有可运行的任务之间公平地分配CPU时间,确保没有任务长期得不到处理。CFS的主要特点有以下几点。

        (1)公平性。CFS使用一个称为虚拟运行时间的概念来衡量任务的执行时间,虚拟运行时间反映了任务相对于其他任务的执行情况。另外,CFS使用红黑树来维护等待执行的任务列表。任务根据其虚拟运行时间进行排序,确保运行时间最少的任务优先得到CPU时间。

        (2)可预测性。CFS提供了确定性的响应时间,实时任务优先于普通任务执行,这对于需要及时响应的应用程序非常重要。

        (3)适应性。CFS能够动态调整其行为,以适应不同的工作负载,包括:交互式应用和批处理任务。在多核系统中,CFS尝试将任务分配到不同的核心上,以减少CPU的空闲时间。

        (4)调度延迟。CFS会设定一个目标调度周期(通常为100毫秒),并试图让所有任务在这个周期内至少执行一次。CFS还会动态调整每个任务的时间片,确保运行时间较少的任务获得更多的机会。

        (5)优先级支持。CFS根据nice值调整任务的权重,从而影响其虚拟运行时间。

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

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

相关文章

2024智能机器人与自动控制国际学术会议 (IRAC 2024)

主办,承办,支持单位 会议官网 www.icirac.org 大会时间:2024年11月29-12月1日 大会简介 2024智能机器人与自动控制国际学术会议 (IRAC 2024)由华南理工大学主办,会议将于2024年11月29日-12月1日在中国广…

【Pytest+Yaml+Allure】实现接口自动化测试框架

一、框架思想 requestsyamlpytestallure实现接口自动化框架。结合数据驱动和分层思想,将代码与数据分离,易维护,易上手。使用yaml编写编写测试用例,利用requests库发送请求,使用pytest管理用例,allure生成…

利用 Jsoup 进行高效 Web 抓取与 HTML 处理

Jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 JQuery 的操作方法来取出和操作数据。 官网:https://jsoup.org/ 中文文档:Jsou…

蓝桥杯不知道叫什么题目

小蓝有一个整数,初始值为1,他可以花费一些代价对这个整数进行变换。 小蓝可以花贵1的代价将教数增加1。 小蓝可以花费3的代价将整数增加一个值,这个值是整数的数位中最大的那个(1到9) .小蓝可以花费10的代价将整数变为原来的2倍, 例如,如果整…

【JavaEE初阶】枫叶经霜艳,梅花透雪香-计算机是如何运行的?

本篇博客给大家带来的是与计算机相关的知识点, 包括:计算机的组成, 指令, 进程(重点). 文章专栏: JavaEE初阶 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 1. 计算机的组成 1.1 计算机的发展史 计算…

SuperMap Objects组件式GIS开发技术浅析

引言 随着GIS应用领域的扩展,GIS开发工作日显重要。一般地,从平台和模式上划分,GIS二次开发主要有三种实现方式:独立开发、单纯二次开发和集成二次开发。上述的GIS应用开发方式各有利弊,其中集成二次开发既可以充分利…

Linux网络——NAT/代理服务器

一.NAT技术 1.NAT IP转换 之前我们讨论了, IPv4 协议中, IP 地址数量不充足的问题,NAT 技术就是当前解决 IP 地址不够用的主要手段, 是路由器的一个重要功能。 NAT 能够将私有 IP 对外通信时转为全局 IP. 也就是一种将私有 IP 和全局IP 相互转化的技术方法: 很…

使用八爪鱼爬虫抓取汽车网站数据,分析舆情数据

我是做汽车行业的,可以用八爪鱼爬虫抓取汽车之家和微博上的汽车文章内容,分析各种电动汽车口碑数据。 之前,我写过很多Python网络爬虫的案例,使用requests、selenium等技术采集数据,这次尝试去采集小米SU7在微博、汽车…

C语言笔记(自定义类型:结构体、枚举、联合体 )

前言 本文对自定义类型的结构体创建、使用、结构体的存储方式和对齐方式,枚举的定义、使用方式以及联合体的定义、使用和存储方式展开叙述,如有错误,请各位指正。 目录 前言 1 结构体 1.1 结构体的声明 1.2 结构体的自引用 1.3 结构体变…

【消息序列】详解(6):深入探讨缓冲区管理与流量控制机制

目录 一、概述 1.1. 缓冲区管理的重要性 1.2. 实现方式 1.2.1. HCI_Read_Buffer_Size 命令 1.2.2. HCI_Number_Of_Completed_Packets 事件 1.2.3. HCI_Set_Controller_To_Host_Flow_Control 命令 1.2.4. HCI_Host_Buffer_Size 命令 1.2.5. HCI_Host_Number_Of_Complete…

Element Plus的快速入门

一、什么是Element Plus Element : 是饿了么团队研发的,基于Vue3,面向设计师和开发者的组件库。 组件:组成网页的部分,例如超链接,按钮,图片,表格,表单,分页条等等。 …

健身房小程序服务渠道开展

健身不单单是锻炼身体、保持身材,也是一种社交方式,城市里门店不少,每家都有一定流量和老客,但仅靠传统线下拉客/自然流量前往和线上朋友圈、短视频发硬广等方式还不够。 商家需要找到更多潜在目标客户,而消费者也对门…

Docker--通过Docker容器创建一个Web服务器

Web服务器 Web服务器,一般指网站服务器,是驻留于因特网上某种类型计算机的程序。 Web服务器可以向浏览器等Web客户端提供文档,也可以放置网站文件以供全世界浏览,或放置数据文件以供全世界下载。 Web服务器的主要功能是提供网上…

HTMLCSS:3D金字塔加载动画

效果演示 这段代码通过CSS3的3D变换和动画功能&#xff0c;创建了一个旋转的金字塔加载动画&#xff0c;每个侧面都有不同的颜色渐变&#xff0c;底部还有一个模糊的阴影效果&#xff0c;增加了视觉的立体感。 HTML <div class"pyramid-loader"><div cl…

selinux及防火墙

selinux说明 SELinux 是 Security-Enhanced Linux 的缩写&#xff0c;意思是安全强化的 linux 。 SELinux 主要由美国国家安全局&#xff08; NSA &#xff09;开发&#xff0c;当初开发的目的是为了避免资源的误用。 httpd进程标签&#xff08;/usr/share/nginx/html &#…

vue 富文本图片如何拖拽

在Vue项目中实现富文本编辑器&#xff08;如vue-quill-editor&#xff09;的图片拖拽功能&#xff0c;需要结合Quill.js及其相关插件进行配置 安装必要的依赖包&#xff1a; 你需要安装vue-quill-editor作为富文本编辑器的基础组件。为了支持图片拖拽功能&#xff0c;你还需要…

秋招面试基础总结,Java八股文基础(串联知识),四万字大全

目录 值传递和引用传递 静态变量和静态代码块的执行顺序 Java​​​​​​​集合的框架&#xff0c;Set,HashSet,LinkedHashSet这三个底层是什么 多线程篇 Java实现多线程的方式 假设一个线程池&#xff0c;核心线程数是2&#xff0c;最大线程数是3&#xff0c;阻塞队列是4…

MySQL原理简介—12.MySQL主从同步

大纲 1.异步复制为MySQL搭建一套主从复制架构 2.半同步复制为MySQL搭建一套主从复制架构 3.GTID为MySQL搭建一套主从复制架构 4.并行复制降低主从同步延迟或强制读主库 1.异步复制为MySQL搭建一套主从复制架构 (1)MySQL主从复制的原理 (2)搭建主从复制架构的配置 (1)MySQ…

一文了解Spring提供的几种扩展能力

基于 spring bean 的扩展 1. BeanPostProcessor spring 提供的针对 bean 的初始化过程时提供的扩展能力&#xff0c;从方法名也很容易看出&#xff0c;提供的两个方法分别是为 bean 对象提供了初始化之前以及初始化之后的扩展能力。 package com.wyl.conf;import org.spring…

【隐私计算大模型】联邦深度学习之拆分学习Split learning原理及安全风险、应对措施以及在大模型联合训练中的应用案例

Tips&#xff1a;在两方场景下&#xff0c;设计的安全算法&#xff0c;如果存在信息不对等性&#xff0c;那么信息获得更多的一方可以有概率对另一方实施安全性攻击。 1. 拆分学习原理 本文介绍了一种适用于隐私计算场景的深度学习实现方案——拆分学习&#xff0c;又称分割…