【Linux】进程学习(一):基本认识

目录

  • 1.基本概念
  • 2.初步理解
  • 3.描述进程-PCB
    • 3.1task_struct-PCB的一种
    • 3.2task_ struct内容分类
  • 4.组织进程
  • 5.查看进程
    • 5.1通过ps指令查看
    • 5.2通过系统目录查看
  • 6.通过系统调用获取进程的PID和PPID
  • 7.通过系统调用创建进程-fork初识

1.基本概念

  • 课本概念:程序的一个执行实例,正在执行的程序等
  • 内核观点:担当分配系统资源(CPU时间,内存)的实体。

2.初步理解

以前我们的任何启动并允许程序的行为,都是由操作系统帮助我们将程序转换成为进程,来完成特定的任务。(在Linux中,./运行一个程序。在windows中,鼠标双击运行一个程序。他们都将一个程序转换成了进程)

如图,我们将磁盘中的程序加载到了内存当中,形成了代码和数据。
在这里插入图片描述

但这并不算一个进程,操作系统为了管理这些加载到内存当中的代码和数据,需要先描述再组织,在内核当中为这些代码和数据创建一个个的数据结构对象。(操作系统书中叫PCB,Linux操作系统下是task_struct

在这里插入图片描述
例如:

  • 我们想要释放进程A,操作系统就在所有PCB中寻找关于进程A的,然后free释放掉对应的代码和数据以及PCB。
  • 我们想要运行进程中优先级最高的,操作系统就遍历所有的PCB找到对应的进程,将其加入CPU中运行。
  • 我们想要再运行一个程序,操作系统将磁盘中的程序加载到内存中转化为代码和数据。并且又为其创建一个PCB,将进程的属性加入PCB中,并链入原先的PCB链表当中。

因此:

  • 对进程的管理转化为对PCB链表进行增删查改。
  • 进程 = 加载到内存中的代码和数据 + 内核关于进程的相关数据结构

3.描述进程-PCB

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

3.1task_struct-PCB的一种

  • 在Linux中描述进程的结构体叫做task_struct。
  • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

3.2task_ struct内容分类

  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  • I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息

4.组织进程

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

5.查看进程

5.1通过ps指令查看

  • 单独使用ps命令,会显示所有进程信息。

ps -axj

在这里插入图片描述

通过对grep指令的搭配,可以查找想要查看的进程信息

ps -axj | head -1 && ps -axj |grep myprocess | grep -v grep

在这里插入图片描述

  • 因为grep也是进程,因此加入grep -v grep可以过滤掉grep进程信息。

5.2通过系统目录查看

进程的信息可以通过 /proc 系统文件夹查看

在这里插入图片描述

其中有很多文件夹都是以数字命名,这些数字其实就是对应进程的PID,对应文件夹当中记录着对应进程的各种信息。
在这里插入图片描述

当我们创建一个进程后,就会在/proc目录下创建对应的文件夹保存进程的信息。一旦我们关闭掉这个进程,/proc目录下相应的进程文件夹就会被删除。

6.通过系统调用获取进程的PID和PPID

通过使用系统调用函数getpid和getppid即可分别获取进程的PID和PPID。

在这里插入图片描述
使用下列代码测试。

在这里插入图片描述
运行结果,通过getpid获取的pid值与ps命令查询的值是相同的。
在这里插入图片描述
其次,通过不断启动终止进程,我们发现每次启动进程的pid都会改变,但是ppid并不会改变,这个ppid又是什么呢?

在这里插入图片描述
21615是我们的bash(命令行解释器)。
在这里插入图片描述
我们可以得到一些结论:

  • bash命令行解释器,本质上它也是一个进程!
  • 命令行解释器启动的所有程序,最终都会变成进程,而该进程对应的父进程都是bash

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

//创建子进程
//有两个返回值,创建成功给父进程返回子进程PID,给子进程返回0
//创建失败返回-1#include<unistd.h>int fork(void)

fork 函数能在当前进程下主动创建 子进程 ,用于代码程序中。

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>int main()
{printf("AAAAAAAAAAAA\n");int ret = fork();printf("BBBBBBBBBBBB,PID: %d \n",getpid());sleep(1);return 0;
}

运行结果:

在这里插入图片描述
BBBBBBBB被打印了两次,可见fork系统调用之后程序就变成了两个执行流,即一个父进程一个子进程。

但通常我们可以根据fork的不同返回值,搭配if完成分流,使父子进程执行不同的代码。

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

运行结果:
其中,fork之后的两个执行流,谁先执行由调度器决定

在这里插入图片描述

fork函数工作原理:

  • fork 创建子进程时,会新建一个属于子进程的PCB 然后把父进程 PCB 的大部分数据拷贝进子进程的PCB中,即子进程和父进程的PCB中的数据绝大部分是相同的。两个进程的PCB指向同一份代码和数据即两者共享一份代码和数据

我们知道进程是具有独立性的,父子进程同样具有独立性。

但父子进程两者共享同一份代码和数据,他们的独立性从何谈起?

  • 从代码层面:代码是只读的,父子进程只能读取代码,只不过可能读取的部分不同,相互不影响
  • 从数据层面:当其中一个执行流尝试修改数据时,OS 会给当前进程触发写时拷贝 机制

如何理解fork函数有两个返回值?

当return时,函数的主体功能已经完成,此时子进程已经被创建,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。

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

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

相关文章

QGIS介绍

一.基本概念 QGIS的官方网站为&#xff1a;https://www.qgis.org Github地址&#xff1a;https://github.com/qgis/QGIS QGIS采用开源证书GNU GPLv2 (GNU General Public License version 2&#xff09;发布&#xff0c;主要采用C语言开发&#xff0c;用户界面依赖Qt平台。 二…

PlantUML绘制UML图教程

UML&#xff08;Unified Modeling Language&#xff09;是一种通用的建模语言&#xff0c;广泛用于软件开发中对系统进行可视化建模。PlantUML是一款强大的工具&#xff0c;通过简单的文本描述&#xff0c;能够生成UML图&#xff0c;包括类图、时序图、用例图等。PlantUML是一款…

【Linux】线程

线程 我们常常会在linux中或者在操作系统这门课中听到进程和线程的名称&#xff0c;我们之前认识了进程的概念&#xff0c;现在我们来了解一下线程的概念 线程概念&#xff1a; 什么是线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定…

Linux命令-base64命令(编码/解码文件或标准输入输出)

说明 base64将 文件 或 标准输入 编码或解码为标准输出; 语法 base64 [OPTION]... [FILE]参数 -d, --decode # 解码 -i, --ignore-garbage # 解码时&#xff0c;忽略非字母字符 -w, --wrapCOLS # 在指定的字符数后自动换行(默认为76), 0 为禁用自动换行--help # 显示此帮助…

k8s 部署java应用 基于ingress+jar包

k8 集群ingress的访问模式 先部署一个namespace 命名空间 vim namespace.yaml kind: Namespace apiVersion: v1 metadata:name: ingress-testlabels:env: ingress-test 在部署deployment deployment是pod层一层封装。可以实现多节点部署 资源分配 回滚部署等方式。 部署的…

牛客网SQL进阶127: 月总刷题数和日均刷题数

官网链接&#xff1a; 月总刷题数和日均刷题数_牛客题霸_牛客网现有一张题目练习记录表practice_record&#xff0c;示例内容如下&#xff1a;。题目来自【牛客题霸】https://www.nowcoder.com/practice/f6b4770f453d4163acc419e3d19e6746?tpId240 0 问题描述 基于练习记录表…

OpenAI使用的海量数据集介绍

1. OpenAI使用的数据 OpenAI为了训练其尖端的自然语言处理模型&#xff0c;如GPT-4&#xff0c;采用了极为庞大的数据集。虽然具体的细节可能不完全公开&#xff0c;但我们可以根据历史信息和公开报道推测&#xff0c;这些数据集通常包含&#xff1a; WebText&#xff1a;早期…

ComfyUI 学习笔记

目录 ComfyUI 入门教程 什么是ComfyUI&#xff1f; windows安装教程&#xff1a; 组件技巧学习 ComfyUI 入门教程 老V带你学comfyUI-基础入门 - 知乎 什么是ComfyUI&#xff1f; ComfyUI 是一个基于节点的 GUI&#xff0c;用于Stable Diffusion。你可以通过将不同的no…

conda创建环境,查看环境,激活环境,查看包,复制环境,删除环境,查看cuda版本,查看pytorch版本

创建环境 conda create --name [yourEnvname]查看环境 conda env list首次激活 conda 虚拟环境&#xff0c;使用source activate激活&#xff0c;以后可以使用 conda activate 激活虚拟环境 source activate [yourEnvname]激活环境 conda activate [yourEnvname]查看环境下…

基于SSM的图书馆预约占座系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的图书馆预约占座系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

java基础(2) 面向对象编程-java核心类

面向对象 面向对象对应的就是面向过程&#xff0c; 面向过程就是一步一步去操作&#xff0c;你需要知道每一步的步骤。 面向对象的编程以对象为核心&#xff0c;通过定义类描述实体及其行为&#xff0c;并且支持继承、封装和多态等特性 面向对象基础 面向对象编程&#xff0…

HARRYPOTTER: FAWKES

攻击机 192.168.223.128 目标机192.168.223.143 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -p- -A 192.168.223.143 开启了21 22 80 2222 9898 五个端口&#xff0c;其中21端口可以匿名FTP登录&#xff0c;好像有点说法,百度搜索一下发现可以用anonymous登录…

L1-088 静静的推荐

一、题目 二、解题思路 如果有的学生天梯赛成绩虽然与前一个人相同&#xff0c;但其参加过 PAT 考试&#xff0c;且成绩达到了该企业的面试分数线&#xff0c;则也可以接受——同一批次这样的人可以有多个&#xff01;&#xff01;&#xff01;如果 pta 分数不低于 175 &#…

智慧工地安全带识别检测系统-准确识别有无佩戴安全带-及时预警---豌豆云

安全带佩戴识别系统对视频监控画面开展实时分析识别。当视频画面出现工作员未佩戴安全带时&#xff0c;安全带佩戴识别系统主动触发告警提示&#xff0c;并通过短信、邮件、报警语音等方式进行通知。 安全带是建筑工地的作业人员工作必备的安全防护设备&#xff0c;按标准佩戴…

QT初始程序

#include "widget.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);Widget w;w.show();return a.exec();} 解释&#xff1a; Qt系统提供的类头文件没有.h后缀Qt一个类对应一个头文件&#xff0c;类名和头文件名一致QA…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书添加模块UI设计实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

如何写一个其他人可以使用的GitHub Action

前言 在GitHub中&#xff0c;你肯定会使用GitHub Actions自动部署一个项目到GitHub Page上&#xff0c;在这个过程中总要使用workflows工作流&#xff0c;并在其中使用action&#xff0c;在这个使用的过程中&#xff0c;总会好奇怎么去写一个action呢&#xff0c;所以&#xff…

Linux线程 分离和同步与互斥 条件变量

Linux线程 分离和同步与互斥 条件变量 1. 分离线程2. 线程互斥与互斥量3. 线程同步与竞态条件4. pthread库与条件变量5. 生产者-消费者 1. 分离线程 什么是线程分离&#xff1f; 线程分离是指线程在结束时&#xff0c;操作系统会自动回收其资源&#xff0c;而无需其他线程显式地…

Java:内部类、枚举、泛型以及常用API --黑马笔记

内部类 内部类是类中的五大成分之一&#xff08;成员变量、方法、构造器、内部类、代码块&#xff09;&#xff0c;如果一个类定义在另一个类的内部&#xff0c;这个类就是内部类。 当一个类的内部&#xff0c;包含一个完整的事物&#xff0c;且这个事物没有必要单独设计时&a…

[职场] 进入大数据领域需要掌握哪些软件 #其他#职场发展#职场发展

进入大数据领域需要掌握哪些软件 学习大数据首先我们要学习Java语言和Linux操作系统&#xff0c;这两个是学习大数据的基础&#xff0c;学习的顺序不分前后。 Java 大家都知道Java的方向有JavaSE、JavaEE、JavaME&#xff0c;学习大数据要学习那个方向呢? 只需要学习Java的…