Linux——进程概念详解

news2025/1/4 7:08:06

目录

一.什么是进程?

        2.PCB的含义,为什么会存在PCB?

整体解析操作系统对进程的管理方式:

二.对比Windows系统:

 三.Linux——进程

 学习一个新指令:ps ajx

四.接下来学习几个进程的系统调用函数:

1. getpid()函数:

2.getppid();

3.fork();

         例1:

         例2:

        例3:fork函数的完整用法:


一.什么是进程?

        1.定义

        一个运行起来 (加载到内存) 的程序——进程。程序本质:就是文件,文件的所在位置为磁盘;进程和程序相比,进程具有动态属性。

        有太多的被加载进内存的程序,操作系统要不要进行管理呢? 答案是: 必须要,若要进行管理,六字真言:“ 先描述后组织 !”。那么PCB就出现了,PCB就是将这些被加载进行的程序的属性信息整理出来,形成的一个完整的数据结构。

        2.PCB的含义,为什么会存在PCB?

        为了便于系统描述和管理进程的运行,在0S的核心中为每个加载进来的程序专门定义了一个数据结构一一进程控制块PCB (ProcessControl Block)。PCB作为进程实体的一部分,记录了操作系统所需的,用于描述进程的当前情况以及管理进程运行的全部信息,是操作系统中最重要的记录型数据结构。PCB的作用就是是使一个在多道程序环境下不能独立运行的程序(含数据),能成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。
        可见,在进程的整个生命期中,CPU完全是通过控制PCB就能对该进程进行控制和管理,即系统是根据其PCB而不是任何别的什么而感知到一进程的存在的,况且说,PCB是进程存在的唯一标志。


PCB 中的内容主要包括:

        调度信息和现场信息两大部分。

        1.调度信息包括进程名、 进程编号Pid、优先级、当前状态、资源信息、程序和数据的位置信息、隶属关系和各种队列指针信息等;

        2.现场信息主要包括程序状态字、时钟寄存器和界限寄存器等描述进程运行情况的信息。

整体解析操作系统对进程的管理方式:

         上图解析: 操作系统对多个加载到内存的程序的管理方式: 先描述(将描述程序的属性数据),再组织(将这些属性数据制作成相应的结构体PCB)。

        此外每个进程都是有优先级的,比如进程1的优先级最高,进程2次之,那么Cpu会优先执行进程1的程序,但在此之前CPU会遍历所有进程的PCB,查看它们的优先级信息,找到优先级最高的PCB后,将PCB对应的该进程的代码传到CPU中进行处理!
        若有某个进程要退出了,那么Cpu会遍历所有PCB,并且根据其中的属性信息判断是否“死亡”,一旦发现“死亡”便会释放掉该进程的代码数据!此时这个进程就被释放了。

这就和之前将操作系统一样,管理者对被管理者的管理方式:不对人做管理,而是对数据做管理。

       所谓的CPU对进程进行管理---->就变成了对进程相应的PCB进行管理对进程管理----> 最终转化成了对链表的增删查。


二.对比Windows系统:

 在Windows系统中,它对进程的管理方式也是一样的:

蓝框相当于一个链表,CPU可对加载进来的进程进行遍历。

查看PCB:

 

点击属性就能看到一个进程的PCB属性内容。

结束进程任务:


  

 三.Linux——进程

试验1:

        首先创立一个文件夹course,在文件夹中新建.c文件,makefile自动构建化工具,然后编译生成.exe文件 

 学习一个新指令:ps ajx

功能:可以查看当前系统下所有的进程的状态信息(包括)。

指令:ps ajx | grep [filename]

利用管道符,在列出所有进程状态信息的基础上,使用grep查找出指定的进程关键字

 紫框下面的这个进程就是 使用指令ps ajx grep 的进程,这个不用管,紫框圈住的是重点。

指令:ps ajx |head -1

head -1显示进程状态信息的属性标题栏:

 若是想要结束某个进程,则使用: kill -9 [该进程的PID编号]

kill -9可以强制释放掉任何进程


四.接下来学习几个进程的系统调用函数:

1. getpid()函数:

参数:无参;函数类型 pid_t

功能:获取当前进程的Pid编号 

头文件:#include<unistd.h>        #include<sys/types.h>

 试验案例:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main(){
    while(1){
        printf("我是一个进程,我的ID为:d\n",getpid());
        sleep(1);
    }
return 0;
}

运行该代码: 

验证:通过使用ps ajx命令去查看该进程的PID,发现一样

通过多次运行该进程,终止该进程的操作后,发现:该进程的Pid编号一直在变化 

        进程每每被调度一次,就会变ID。这是因为进程被执行后调入内存都会被操作系统重新分配,所以每次执行同一个进程的ID都不一样。


2.getppid();

参数:无参;函数类型 pid_t

功能:获取当前进程的父进程的PPid编号 

头文件:#include<unistd.h>        #include<sys/types.h>

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main(){
    while(1){
        printf("我是一个进程,我的父进程的ID为:d\n",getppid());
        sleep(1);
    }
return 0;
}

结果如下: 

 通过多次运行该进程,终止该进程发现:

        父进程仍是不变的。对于getppid来说,它只是需要重新启动该进程,所以id是一直不变,就好比一个公司的CEO在没有特殊情况下是不变的,而手底下的员工(getpid)可能一直在更新换代! 

        

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main(){
    while(1){
        printf("我是一个进程,我的ID为:%d,我的父进程为:%d\n",getpid(),getppid());
        sleep(1);
    }
    return 0;
}

结果测试: 

 

 通过查询父进程的pid编号,可以发现它来自于bash,bash就相当于爷爷进程,bash创造了父进程,父进程创造了子进程。

 父进程是bash 几乎我们在命令行上面执行的所有指令,它们都是bash的子进程。

bash进程是稳坐钓鱼台,其他苦活累活都交给bash的子进程去做。


3.fork();

         例1:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main(){
        fork();
        printf("我是一个进程,我的ID为:%d, ppid:%d\n",getpid(),getppid());
        return 0;
}

运行该代码: 

      结果:使用fork函数后,如上图:尽管只有一个printf,但显示出了两行内容。第一个行的进程,Pid是15410,而它的ppid(父进程)为9730。从第二行进程的父进程ppid可以发现也是15410,从这里我们可以推测出它是第一个进程的Pid。第二个进程pid为15411,而第一个进程的ppid 9730可以推出是bash的pid (父进程) ,进程好比多叉树,bash是根节点,bash可以衍生出多个子节点。

         例2:

运行该代码:

总结: 还是两个进程同时在执行,这两个进程和bash仍是祖孙三代,多了个id号,这个id是接收了fork的返回值。

对于fork:

给屏幕显示出的第一行进程(即父进程)的id值, 是返回了子进程(即第二行的进程) 的pid号赋给id;

给屏幕显示出的第二行进程(即子进程)的id值, 将0赋给了id;

 再强调一次,总结中说的父进程不是bash,它是相对于孙子进程来说是父进程,即孙子的父亲是父进程(bash的儿子)。

        例3:fork函数的完整用法:

执行结果如下: 

 

结果解析: 红框中的父子进程是同时进行着,意味着该进程现在有两个执行流,正是fork函数的使用,使得一个程序中可以同时执行两个while循环。

注:以前我们写的C语言/C++/Java代码都是一个执行流,在以后学习了多线程知识便可C++/Java中使用多个执行流

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

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

相关文章

版图设计IC617 virtuoso工具使用,创建一个库

库是用于创建自己的芯片的&#xff0c;一个库可以看成一个芯片&#xff0c;一个芯片又包含各种元器件。cell就是用于定义具体的元器件的。元器件包含版图&#xff0c;原理图&#xff0c;逻辑符号&#xff0c;等各种视图。 一 创建库过程 1.1 库的创建 1. 在Library Manager下…

PaLM 2重磅来袭,深挖谷歌92页技术报告亮点总结

谷歌CEO桑达尔・皮查伊&#xff08;Sundar Pichai&#xff09;亲切地将2023年称为是一个AI busy year&#xff0c;当地时间5月10日&#xff0c;谷歌IO大会上&#xff0c;谷歌大语言模型PaLM 2虽迟但到。作为一个“AI-first”公司&#xff0c;谷歌在Bard聊天机器人爆出事实性错误…

异常排查 | 重复Cookie访问导致HTTP请求引发空指针异常

文章目录 一、场景描述二、异常说明三、查找问题四、调试排查五、思考分析六、解决方案七、写在最后 近几日&#xff0c;遇到一个困惑了我很久的异常&#xff0c;是浏览器页面向Tomcat服务器发起HTTP请求时&#xff0c;服务器发还回来的一处异常 java.lang.NullPointerExceptio…

html实现酷炫星空可视化大屏(附源码)

文章目录 1.设计来源1.1 可视化架构1.2 可视化大屏界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/130884793 html实现酷炫星空可视化大屏(附源码) &#xff0c;html大…

华为OD机试真题(Java),跳跃游戏 II(100%通过+复盘思路)

一、题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]0i j < 返回到达 num…

Talk预告 | ICML‘23 Oral 字节跳动 AI Lab 研究员郑在翔:人工智能如何助力蛋白质设计?

本期为TechBeat人工智能社区第500期线上Talk&#xff01; 北京时间5月25日(周四)20:00&#xff0c;字节跳动 AI Lab 研究员 — 郑在翔的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “人工智能如何助力蛋白质设计 ”&#xff0c;届时将介绍基于…

springboot+vue智慧食堂系统(java项目源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的智慧食堂系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&a…

Rancher添加集群报错:Etcd Cluster is not healthy

原因&#xff1a; 有一台虚拟机在升级内核失败后&#xff0c;回滚至快照。但由于快照版本太老旧&#xff0c;和当前的rancher版本不匹配&#xff0c;服务器上的agent等需要清楚后&#xff0c;重新在rancher添加集群&#xff1b;但是只删除了rancher镜像以及agent相关容器&#…

Linux设备树:删除节点和属性的方法

[摘要]&#xff1a;本文主要介绍了在设备树中删除节点&#xff08;node&#xff09;和属性&#xff08;property&#xff09;的方法。为了便于理解&#xff0c;笔者先介绍了 dtsi 和 dts 的关系&#xff0c;然后构建了虚拟的需求场景&#xff0c;最终给出示例。 背景知识 设备…

易基因:MeRIP-seq等揭示m6A reader YTHDF1在结直肠癌PD-1免疫治疗中的作|Gut

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 结直肠癌&#xff08;colorectal cancer &#xff0c;CRC&#xff09;是全球最常见的癌症之一&#xff0c;转移性CRC患者的5年生存率低于20%。免疫检查点阻断&#xff08;Immune checkpo…

基于LLMs的多模态大模型(MiniGPT-4,LLaVA,mPLUG-Owl,InstuctBLIP,X-LLM)

这个系列的前一些文章有&#xff1a; 基于LLMs的多模态大模型&#xff08;Visual ChatGPT&#xff0c;PICa&#xff0c;MM-REACT&#xff0c;MAGIC&#xff09;基于LLMs的多模态大模型&#xff08;Flamingo, BLIP-2&#xff0c;KOSMOS-1&#xff0c;ScienceQA&#xff09; 前…

《汇编语言》- 读书笔记 - 第3章-寄存器(内存访问):mov、add、sub、push、pop

《汇编语言》- 读书笔记 - 第3章-寄存器&#xff08;内存访问&#xff09; 3.1 内存中字的存储问题 3.1 3.2 DS 和 [address]问题 3.2 3.3 字的传送问题 3.3问题 3.4 3.4 mov、add、sub 指令3.5 数据段问题 3.53.1~3.5 小结检测点 3.1 3.6 栈3.7 CPU 提供的栈机制问题 3.6 3.8 …

基于LSB实现文本、图片、压缩包的隐藏

关于LSB的相关介绍&#xff1a; LSB全称为 Least Significant Bit&#xff08;最低有效位&#xff09;&#xff0c;是一种基于图片最低有效位修改储存信息的隐写方法&#xff0c;在CTF杂项中经常会遇到&#xff0c;LSB属于空域算法中的一种&#xff0c;是将信息嵌入到图像点中…

OPCUA从入门到精通看这里就够了

本文将会从以下几个方面介绍 1.OPCUA是什么 2.OPCUA常用的工具有那些 3.OPCUA的官网 4.使用opcua常用的方法和功能介绍 5.根据官网自己封装了一个opcuaclient类&#xff0c;并说明每个方法的用处 6.根据4中的opcuaclient类自己写了demo 本文所有用到的资料在此下载包括U…

Android平台音视频推送选RTMP还是GB28181?

技术背景 早在2015年&#xff0c;我们发布了RTMP直播推送模块&#xff0c;那时候音视频直播这块场景需求&#xff0c;还不像现在这么普遍&#xff0c;我们做这块的初衷&#xff0c;主要是为了实现移动单兵应急指挥系统的低延迟音视频数据传输。好多开发者可能会疑惑&#xff0…

信息系统建设和服务能力评估证书CS

信息系统建设和服务能力评估体系CS简介 简介&#xff1a;本标准&#xff08;团标T/CITIF 001-2019&#xff09;是信息系统建设和服务能力评估体系系列标准的第一个&#xff0c;提出了对信息系统建设和服务提供者的综合能力要求。 发证单位&#xff1a;中国电子信息行业联合会。…

整型,浮点型,大小字节知识细节一网打尽!

目录 一. 整型 2.11 C语言内置整型 2.12整型在内存如何存储&#xff1f; 2.12 原码&#xff0c;反码&#xff0c; 补码 2.13 当 整型遇上unsigned 2.1 unsigned 与 signed 解析 2.2 printf 输出 有无符号数解析 2.3 有关练习 二. 浮点型 2.51 浮点型与整型在存储上的…

视频会议产品对比分析

内网视频会议系统如何选择&#xff1f;有很多单位为了保密&#xff0c;只能使用内部网络&#xff0c;无法连接互联网&#xff0c;那些SaaS视频会议就无法使用。在内网的优秀视频会议也有很多可供选择&#xff0c;以下是几个常用的&#xff1a; 1. 宝利通&#xff1a;它支持多种…

港联证券|新产品“内卷”,史上最火光伏展能否带动光伏板块行情

在光伏成为“能源老大”之前&#xff0c;指数何时能够跑赢A股股主要股指&#xff0c;或是散户关注的重点。 时隔两年&#xff0c;SNEC上海光伏展如约举办。本届展会吸引了3000余家光伏公司参展&#xff0c;累计50万人涌进场馆&#xff0c;现场人群拥挤度丝毫不逊于过去两年资金…

Navicat连接Oracle时报错ORA-28547

错误信息 这是因为Navicat自带的oci.dll并不支持oracle11g&#xff0c;网上这么说的&#xff0c;需要去官网下载支持的版本。 直接动手。 1. 先DBeaver的连接到oracle数据库&#xff08;为了查询版本&#xff09; 1.1 查询版本 SQL&#xff1a;select * from v$version;1.2 …