【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://xiahunao.cn/news/2775735.html

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

相关文章

鸿蒙开发-UI-图形-图片

鸿蒙开发-UI-组件 鸿蒙开发-UI-组件2 鸿蒙开发-UI-组件3 鸿蒙开发-UI-气泡/菜单 鸿蒙开发-UI-页面路由 鸿蒙开发-UI-组件导航-Navigation 鸿蒙开发-UI-组件导航-Tabs 文章目录 一、基本概念 二、图片资源加载 1. 存档图类型数据源 2.多媒体像素图 三、显示矢量图 四、图片…

有哪些方法可以配置并发服务器?

通过合理配置并发服务器&#xff0c;可以提高服务器的处理能力和响应速度&#xff0c;从而更好地满足用户需求。本文将介绍一些常见的并发服务器配置方法&#xff0c;以帮助您更好地实现服务器的高效运行。 一、选择合适的操作系统 操作系统的选择是并发服务器配置的重要环节…

【XR806开发板试用】轻松连上华为云实现物联网

本文为极术社区XR806试用活动文章。 一.开始 偶然的机会在网上看到了鸿蒙开发板的试用,作为一个"老鸿蒙"岂能放弃这个机会,报名之后不出意料地得到了使用名额,在此感谢极术社区. 收到开发板之后其实还有点失望了,就那么一个小小的核心板,其他啥也没有,连一根数据线…

【MySQL】:深入理解并掌握DML和DCL

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. DML1.1 添加数据1.2 修改数据1.3 删除数据 二. DCL2.1 管理用户2.2 权限控制…

3分钟部署完成Docker Registry及可视化管理工具Docker-UI

安装docker-registry 由于镜像文件会非常占用空间&#xff0c;因此需要选择一个磁盘充裕的位置来存放镜像数据。 这里设置为&#xff1a;-v /data/registry:/var/lib/registry&#xff0c;其中/data/registry是宿主机存放数据的位置。 docker run -d -p 5000:5000 --restart…

【Linux】vim的基本操作与配置(下)

Hello everybody!今天我们继续讲解vim的操作与配置&#xff0c;希望大家在看过这篇文章与上篇文章后都能够轻松上手vim! 1.补充 在上一篇文章中我们说过了&#xff0c;在底行模式下set nu可以显示行号。今天补充一条&#xff1a;set nonu可以取消行号。这两条命令大家看看就可…

第62讲商品搜索动态实现以及性能优化

商品搜索后端动态获取数据 后端动态获取数据&#xff1a; /*** 商品搜索* param q* return*/GetMapping("/search")public R search(String q){List<Product> productList productService.list(new QueryWrapper<Product>().like("name", q)…

林浩然与杨凌芸的Java奇遇记:Lambda表达式大冒险

林浩然与杨凌芸的Java奇遇记&#xff1a;Lambda表达式大冒险 Lin Haoran and Yang Lingyun’s Java Adventure: The Grand Expedition of Lambda Expressions 在Java编程世界的一隅&#xff0c;住着一对编程界的“才子佳人”&#xff0c;男主角名叫林浩然&#xff0c;女主角唤作…

【Fabric.js】监听画布or元素的点击、选中、移动、添加、删除销毁、变形等各事件

在fabric使用过程中&#xff0c;如果想要玩各种花样&#xff0c;那么fabric的事件监听是一定、必须、肯定要掌握&#xff01;&#xff01;&#xff01; 例子就用vue项目组件里的代码&#xff0c;fabric的使用跟vue、react、angular之类的框架都没任何关系&#xff01; 并且本de…

Redis核心技术与实战【学习笔记】 - 31.番外篇:Redis客户端如何与服务器端交换命令和数据

简述 Redis 使用 RESP 协议&#xff08;Redis Serialzation Protocol&#xff09;协议定义了客户端和服务器端交互的命令、数据的编码格式。在 Redis 2.0 版本中&#xff0c;RESP 协议正式称为客户端和服务器端的标准通信协议。从 Redis 2.0 到 Redis 5.0 &#xff0c;RESP 协…

压敏电阻简介

压敏电阻 原理 压敏电阻器是一种具有瞬态电压抑制功能的元件&#xff0c;可以用来代替瞬态抑制二极管、齐纳二极管和电容器的组合。压敏电阻器可以对IC及其它设备的电路进行保护&#xff0c;防止因静电放电、浪涌及其它瞬态电流&#xff08;如雷击等&#xff09;而造成对它们…

【Java】eclipse连接MySQL数据库使用笔记(自用)

注意事项 相关教程&#xff1a;java连接MySQL数据库_哔哩哔哩_bilibilijava连接MySQL数据库, 视频播放量 104662、弹幕量 115、点赞数 1259、投硬币枚数 515、收藏人数 2012、转发人数 886, 视频作者 景苒酱, 作者简介 有时任由其飞翔&#xff0c;有时禁锢其翅膀。粉丝群1&…

【C语言】通过socket看系统调用过程

一、通过socket看系统调用过程 在Linux操作系统中&#xff0c;系统调用是用户空间与内核空间之间交互的一种方式。当一个应用程序需要执行操作系统级别的任务时&#xff0c;比如创建一个网络套接字&#xff08;socket&#xff09;&#xff0c;它必须通过系统调用请求内核来执行…

dddddddddddddddddddd

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

Linux 36.2@Jetson Orin Nano基础环境构建

Linux 36.2Jetson Orin Nano基础环境构建 1. 源由2. 步骤2.1 安装NVIDIA Jetson Linux 36.2系统2.2 必备软件安装2.3 基本远程环境2.3.1 远程ssh登录2.3.2 samba局域网2.3.3 VNC远程登录 2.4 开发环境安装 3. 总结 1. 源由 现在流行什么&#xff0c;也跟风来么一个一篇。当然&…

一起玩儿Proteus仿真(C51)——04. 直流电机的启停、加减速和正反转仿真(L298)(二)

摘要&#xff1a;本文介绍PWM信号的产生办法和直流电机的启停、加减速和正反转的仿真程序的编写方法 前边已经介绍了2中生成PWM信号的方法了。那么怎样才能节省一下资源&#xff0c;只使用一个定时器呢&#xff1f;这就是介绍的第三种方法&#xff0c;单定时器中断法生成PWM信号…

多线程JUC:等待唤醒机制(生产者消费者模式)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;多线程&JUC&#xff1a;解决线程安全问题——synchronized同步代码块、Lock锁 &#x1f4da;订阅专栏&#xff1a;多线程&am…

伯克利研究院推出Ghostbuster用于检测由LLM代笔的文本

Ghostbuster的架构&#xff0c;用于检测人工智能生成文本的最先进的新方法 像 ChatGPT 这样的大型语言模型写得非常好&#xff0c;但事实上&#xff0c;它们已经成为一个棘手的问题。学生们已经开始使用这些模型代写作业&#xff0c;导致一些学校禁止 ChatGPT。此外&#xff0c…

RocketMQ客户端实现多种功能

目录 RocketMQ客户端基本流程 消息确认机制 1、消息生产端采用消息确认加多次重试的机制保证消息正常发送到RocketMQ 单向发送 同步发送 异步发送 2、消息消费者端采用状态确认机制保证消费者一定能正常处理对应的消息 3、消费者也可以自行指定起始消费位点 广播消息 …

在Visual Studio中引用和链接OpenSceneGraph (OSG) 库

在Visual Studio中引用和链接OpenSceneGraph (OSG) 库&#xff0c;按照以下步骤操作&#xff1a; 构建或安装OSG库 下载OpenSceneGraph源代码&#xff08;如3.0版本&#xff09;并解压。使用CMake配置项目&#xff0c;为Visual Studio生成解决方案文件。通常您需要设置CMake中的…