【Linux初阶】进程的相关概念 | 进程管理 & 查看进程 & 获取进程标识符 & fork进程创建

这篇具有很好参考价值的文章主要介绍了【Linux初阶】进程的相关概念 | 进程管理 & 查看进程 & 获取进程标识符 & fork进程创建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 🌟hello,各位读者大大们你们好呀🌟

🍭🍭系列专栏:【Linux初阶】

✒️✒️本篇内容:进程的概念,进程管理初识(描述、管理进程),查看进程的基础方法,获取进程标识符(pid、ppid),fork进程创建(分流应用)

🚢🚢作者简介:计算机海洋的新进船长一枚,请多多指教( •̀֊•́ ) ̖́-

目录

一、什么是进程

二、进程的管理

1.描述进程-PCB

2.程序控制块(PCB)的管理 

三、查看进程

四、通过系统调用获取进程标示符

1.进程和父进程

2.清除进程

五、进程创建 - fork

1.一般进程创建

2.通过系统调用创建进程-fork初识

3. fork的分流应用


一、什么是进程

进程的概念,有很多种不同的说法,我们看的最多的说法之一就是:一个运行起来的(加载到内存) 的程序,被称为进程。进程和程序相比,具有动态属性。

实际上,进程 = 内核数据结构(task_struct)+  进程对应的磁盘代码


二、进程的管理

首先,我们要清楚一个前提——程序是一个文件,它存储在磁盘中。其次,我们要知道,要执行一个程序需要把程序加载到内存中

接下来我们还需要了解一些相关的基础知识,来将进程的知识串联起来。

1.描述进程-PCB

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合
  • 课本上称之为PCB(process control block,中文名为程序控制块),Linux操作系统下的PCB是: struct task_struct
  • PCB对象是操作系统创建的

我们可以把PCB理解为一种struct结构体或类,专门用于存储加载到内存的各个程序的属性,比如程序的状态、运行的优先级等。

【Linux初阶】进程的相关概念 | 进程管理 & 查看进程 & 获取进程标识符 & fork进程创建

 

2.程序控制块(PCB)的管理 

通过上面的知识,我们知道了内存中有从磁盘加载进来的程序块,每个程序块有对应的PCB,那么问题来了,计算机是如何对加载到内存中的程序进行管理的呢?我们通过下面的图示来理解  

【Linux初阶】进程的相关概念 | 进程管理 & 查看进程 & 获取进程标识符 & fork进程创建

  • “管理”的执行本质:先描述,再组织;
  • 描述:PCB(struct task_struct),对程序信息进行了描述;
  • 组织:操作系统通过特定的数据结构,将不同的PCB(程序控制块)及其对应的程序组织(加载到内存的程序块)联系起来,最终实现对程序的管理。

进程 = 内核数据结构(PCB)+  进程对应的磁盘代码。操作系统可以通过PCB找到对应的磁盘代码,因此,只要我们实现了对PCB的管理,也就相当于实现了进程的管理

进程组织:所有运行在系统里的进程都以task_struct链表的形式存在内核里。我们可以在内核源代码里找到它。

内存中PCB和程序块的组织形式如下图所示

【Linux初阶】进程的相关概念 | 进程管理 & 查看进程 & 获取进程标识符 & fork进程创建


三、查看进程

在Linux中查看进程的操作,实际上和我们再window上查看任务管理器是差不多的。

ps axj | head -1 && ps axj | grep ‘myproc’  或
ps axj | head -1 && ps axj | grep 4974(进程id)
  • ps axj - 查看系统所有进程;
  • head -1(数字1) - 打印标题;
  • grep ‘myproc’ - 对除文件myproc外进行行过滤。

【Linux初阶】进程的相关概念 | 进程管理 & 查看进程 & 获取进程标识符 & fork进程创建

  进程在被调度运行的时候,进程就具有动态属性


四、通过系统调用获取进程标示符

1.进程和父进程

  • 进程id(PID)
  • 父进程id(PPID)

gerpid() - 获取当前进程的id(PID)

getppid() -  获取当前进程的父进程的id(PPID)

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
     printf("pid: %d\n", getpid());
     printf("ppid: %d\n", getppid());
     return 0;
}

2.清除进程

kill -9 4974(进程id)    #kill -9 表示强制终止退出

五、进程创建 - fork

1.一般进程创建

实际上,我们运行的一个可执行程序,就是一个进程

命令行上启动的进程,在无特殊情况下,它的父进程都是bash。(bash为进程名,它是一个命令行解释器)

通常进程运行都是在子进程下运行,子进程和父进程相互独立但是又数据共享。目的是保护计算机安全(防止进程对系统进行危险操作)。

当程序单线程运行时,进程在子进程下运行。多次运行同一运行程序,子进程id改变,父进程id不变,说明每次运行该程序的子进程变了,但是每个子进程对应的父进程不变。

2.通过系统调用创建进程-fork初识

  • 运行 man fork 认识fork(除了起始页,还可通过底部命令行指令:/return val查看返回值);
  • fork有两个返回值(如果成功,子进程的pid返回父进程,0返回给子进程;如果失败,返回-1);
  • 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)。

【Linux初阶】进程的相关概念 | 进程管理 & 查看进程 & 获取进程标识符 & fork进程创建

【Linux初阶】进程的相关概念 | 进程管理 & 查看进程 & 获取进程标识符 & fork进程创建

接下来我们看下面这段代码 

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
    //创建子进程 -- fork是一个函数 -- 函数执行前:只有一个父进程 -- 函数执行后:父进程+子进程
     fork();
     printf("我是一个进程,pid:%d, ppid: %d\n", getpid(), getppid());

     sleep(2);
     return 0;
}

【Linux初阶】进程的相关概念 | 进程管理 & 查看进程 & 获取进程标识符 & fork进程创建

3. fork的分流应用

 通过文档我们了解到,fork 之后通常要用 if 进行分流【通过返回值不同实现分流】

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
     pid_t id = fork();
     if(id < 0)
    {
         perror("fork");
         return 1;
     }
     else if(id == 0)
     { 
        //child
        printf("I am child : %d!, id: %d\n", getpid(), id);
     }
     else
     { 
        //father
        printf("I am father : %d!, id: %d\n", getpid(), id);
     }

     sleep(1);
     return 0;
 }

 结果是,父进程和子进程将会同时运行,因此我们可以得出结论

  • fork() 之后,会有父进程+子进程两个进程执行后续代码(拥有多个线程,多个执行流,这就是我们所说的多线程
  • fork后续的代码,被父子进程共享(注意:共享不代表需要一个进程执行所有代码)
  • 通过返回值不同,可以让父子进程各自执行后续共享代码的一部分

 【Linux初阶】进程的相关概念 | 进程管理 & 查看进程 & 获取进程标识符 & fork进程创建

 通过对进程和合理化利用,就可以多进程/多线程运行程序,实现并发式编程!!!


 🌹🌹 Linux进程的相关概念大概就讲到这里啦,博主后续会继续更新更多Linux操作系统的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪 文章来源地址https://www.toymoban.com/news/detail-426535.html

到了这里,关于【Linux初阶】进程的相关概念 | 进程管理 & 查看进程 & 获取进程标识符 & fork进程创建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux 用户账号管理 - 查看进程是以哪个用户身份在运行

    在 Linux 系统中,我们可以使用不同的命令来查看某个进程是以哪个用户身份在运行的。本文将介绍三种常用的命令:使用 ps 命令、使用 pstree 命令和使用 /proc 目录。 ps 命令可用于列出当前系统正在运行的进程,并提供有关各个进程的详细信息。以下是使用 ps 命令查看进程是

    2024年02月12日
    浏览(46)
  • 【Linux】腾讯云服务器(Linux版)如果获取UUID(通用唯一标识符)

    实例元数据包括UUID、实例ID、MAC编号等等,可以通过如下接口查看元数据列表 https://cloud.tencent.com/document/product/213/4934

    2024年02月10日
    浏览(40)
  • 【Linux初阶】fork进程创建 & 进程终止 & 进程等待

     🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:fork进程创建,理解fork返回值和常规用法,进程终止(退出码、退出场景、退出方法、exit),进程等待(wait、waitpid),阻塞等待和非阻塞等待 🚢🚢作者简介:本科在读,计算机海洋

    2024年02月06日
    浏览(50)
  • 【进程相关概念】面试常见问题,进程状态,进程优先级,并行与并发,进程通信等

    前言: 大家好,我是 良辰丫 ,今天我们来认识一下 进程 的相关概念,当接触到进程,也就意味着我们进入了javaEE的学习阶段,这篇文章主要带大家去学习一些面试题,帮助大家更好的去学习并熟悉进程,跟着我的步伐一起进入学习吧!!!💞💞💞 🧑个人主页:良辰针不戳 📖所属专栏

    2023年04月08日
    浏览(83)
  • 【Python】多线程编程 ① ( 线程相关概念 | 进程 | 线程 | 协程 / 纤程 | 管程 )

    进程 与 操作系统 : 进程 是 操作系统 中 能够独立运行的单元 , 是 操作系统 对 正在运行的 应用程序 的 抽象结构 描述 ; 操作系统 中 运行的每个 应用程序 就是一个进程 ; 一个操作系统中可以运行 多个 进程 ; 每个 应用程序 都会被 操作系统 分配一个 进程 ID ; 多个进程之间

    2024年02月15日
    浏览(37)
  • Linux Tip 03 文件类型属性、权限管理、拓展名、主要目录介绍、文件的相关操作、文件内容查看、文件的修改、文件和目录的权限、文件的查找

    一、用户的存储 在Linux系统中 系统上所有的账号和一般身份的用户以及root的相关信息都存在/etc/passwd这个文件中 个人的密码记录在/etc/shadow中 所有的组名都记录在/etc/group中 二、文件类型和属性 三、文件和目录的权限管理 四、文件的类型 五、文件的拓展名 文件长度的限制

    2023年04月10日
    浏览(62)
  • 【操作系统核心概念】进程管理和进程调度

    本文主要讲的是操作系统的一些核心概念, 主要讲解 进程管理和进程调度 的问题, 当然学习完本篇并不会让你能从零打造一个操作系统, 而只是让读者有了对操作系统核心概念的基本认识. 关注收藏, 开始学习吧🧐 操作系统是一组做计算机资源管理的软件的统称 , 其本质上也

    2024年02月12日
    浏览(61)
  • 【Linux初阶】进程替换的应用 - 简易命令行解释器的实现

    🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:使用代码手段实现一个简易的命令行解释器,其中功能包括:打印输出提示符、获取用户输入、字符串切割、执行命令、ls指令下拥有颜色提示、cd、echo; 🚢🚢作者简介:计算机海洋的

    2024年02月07日
    浏览(77)
  • 【Linux初阶】进程地址空间 | CUP与可执行程序的交互原理

     🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:计算机空间初识(子进程变量修改实验),感性理解进程虚拟地址空间,进程地址空间基础(概念、区域划分与调整、程序对内存数据的修改、按需分配虚拟地址空间),解答为什么存

    2024年02月05日
    浏览(88)
  • 【Linux笔记】Linux进程概念与进程状态

    进程的概念: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序

    2024年02月06日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包