【linux进程】深度理解进程--什么是进程什么是pcb进程创建

news2024/11/24 16:23:15

目录

  • 前言
  • 一,对PCB的理解
  • 二,CPU对进程列表的处理
  • 三,进程标识符:pid
    • 1. 查看系统进程1: ps axj
    • 2. 查看系统进程2: /proc
  • 四,系统调用函数:getpid
  • 五,父进程和子进程的概念
  • 六,创建子进程--fork函数的使用
    • 1. 创建一个子进程并观察
    • 2. fork返回值的理解
    • 3. 进程的独立性

前言

进程这章节的内容是我们学习linux遇到的第一座大山,它的重难点程度不亚于C++中的继承多态。由于它的内容很多,所以也会分多篇文章进行介绍。在学习进程之前,建议同学们先阅读文章对冯诺依曼体系结构和操作系统的理解。

一,对PCB的理解

先简单认识一下进程的概念:

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

同学们肯定是理解不了这种概念的。
我们打开windows的任务管理器:

在这里插入图片描述
这些就是当前我电脑上存在的进程。

结论:操作系统中,进程可以同时存在非常多!

既然有这么多进程同时存在,那操作系统怎么管理这些进程呢?
虽然现在我们不知道什么是进程,但是我们可以通过先描述,再组织这一结论得出,操作系统管理进程肯定也是管理进程对应的数据,请看下图:

在这里插入图片描述
难道这些在内存里的代码和数据就是进程吗?
如果是进程,那问题又来了,这个进程被调度多久时间了,代码/数据是从哪开始到哪结束的,有多个进程时,凭什么优先调度我?这些问题都不能在上图中表示出来。

结论:对于操作系统来讲,这个被加载到内存的可执行程序根本就不是进程!它只是进程对应的代码和数据!

OS为了管理已经被加载进来的进程,都要为每个进程创建一个struct结构体(用来描述),使用链表或其他数据结构将它们链接在一起(用来组织)。

在OS学科中,每个进程都会有一个struct PCB,这个PCB中包含了每个进程的所有属性,也叫进程控制块

struct PCB
{
	// id
	// 代码/函数地址
	// 状态(是否被CPU处理)
	// 优先级
	// 内存指针(指向自己的代码和数据)
	struct PCB* next
}

所以上图可修改为:
在这里插入图片描述

结论:
(1) PCB是在操作系统内部管理进程的内核数据结构。
(2) 进程 = PCB + 自己的代码和数据!
(3) 对进程的管理,就变成了对链表的增删查改!

讲到这里可能同学们还是有点迷糊,现在把它们和我们生活中的事物类比理解:

我们把学校类比成内存,OS类比成学校的教务管理系统,把一个学生类比为加载到内存的代码和数据,而学生在教务系统中的属性信息类比为进程中的PCB在OS的内部。
怎么证明你是这个学校的学生呢?因为你的信息在这个学校教务系统中。
所以OS对进程的管理,本质是对PCB的管理,而并非把可执行程序加载进来对可执行程序进行直接管理!

对PCB的再理解:
PCB是操作系统中的概念(linux中有PCB,windws中也有PCB…),而我们学习的linux操作系统是一款具体的操作系统,在linux系统中具体实现的PCB,叫做 task_struct

struct task_struct
{
	// linux进程控制块
}

二,CPU对进程列表的处理

进程被链接在链表中会等待CPU去PCB找数据做处理,那么CPU怎么知道要处理哪些数据呢?这不得不提到进程排队的概念:

把对应的PCB从链表中提取到队列中队,PCB中的数据不会一次性被CPU处理完,它有时被处理,有时在等待被处理,这是一种动态运行的特征,请看下图:

在这里插入图片描述
理解进程动态运行:

只要我们的进程task_struct将来在不同的队列中,进程就可以访问不同的资源。

结论:
(1) 调度运行进程,本质就是让进程控制块task_struct进行排队!
(2) 再给进程下一个定义:进程 = 内核task_struct + 程序的代码和数据!

三,进程标识符:pid

我们先构建一个代码样例:
在这里插入图片描述

让它运行起来:
在这里插入图片描述

1.得到第一个结论:

./xxx 本质就是系统创建进程并运行

在这里插入图片描述

可以得到启示:

我自己写的代码相乘的可执行文件 == 系统命令。在linux系统中大部分执行的操作,本质就是运行进程。

在这里插入图片描述

2.每个进程都有自己的唯一标识符,叫做进程pid

1. 查看系统进程1: ps axj

先来查看当前系统中的进程信息:

使用指令:ps axj

在这里插入图片描述

这样查看的是所有的进程,很难帮助我们学习,现在我们根据上面的样例代码,所有进程中搜索我刚刚写的可执行程序:

使用指令:ps axj | grep myprocess

在这里插入图片描述
将进程信息的第一行打印出来:

使用指令: ps ajx | head -1

在这里插入图片描述

把上面进程中每行多列的含义进行对应起来:

使用指令:ps ajx | head -1 && ps axj | grep process

在这里插入图片描述

3.在Linux下使用指令终止进程
在我们的程序运行时,可以在运行的地方按CTRL+c来结束进程,但是还有一种方法可以结束进程:

使用指令: kill -9 要杀掉的进程id
(注:这里的-9是信号参数,直接使用即可)

2. 查看系统进程2: /proc

在Linux系统的根目录下,有一个动态文件proc,它里面存放着所有进程的信息,之所以叫动态文件是因为它会随着进程的改变而随时更新它的内容!
在这里插入图片描述

查看所有进程文件:

使用指令: ls /proc/

查看特点的进程文件:

使用指令: ls /proc/pid

我们每启动一个进程都会在proc文件目录下创建一个以该进程的pid为名称的文件夹。
在这里插入图片描述

可以发现,在自行创建的进程中有很多我们看不懂的文件,这些文件也不需要掌握,但是有两个文件需要大家注意,一个是cwd一个是exe:

在这里插入图片描述

1. exe指向可执行程序的位置:
进程的pcb中会记录自己对应的可执行文件的路径。
2. cwd代表当前文件:
进程的当前工作路径。

四,系统调用函数:getpid

每次查看进程使用都要使用ps指令,我感觉非常的麻烦,于是这里有一个系统调用函数可以直接返回当前进程的pid,由于操作系统是由C语言编写的,所以可以直接在程序中调用此函数:

使用函数: getpid()

使用man手册查看getpid相关信息:

在这里插入图片描述

使用方式:
在这里插入图片描述
在这里插入图片描述

五,父进程和子进程的概念

在使用ps指令查看进程详情时,除了pid我们可以看见左边还有一个ppid,这是parent pid的意思,也就是父进程的pid,请看下图:
在这里插入图片描述

再来学习一个可以查看父进程id的系统调用函数:
在这里插入图片描述

使用函数: getppid()

使用方式:
在这里插入图片描述
在这里插入图片描述

可以发现,每次运行时,子进程的id都在变化,然而父进程的id一直没变!这是因为在命令行中,父进程一般是命令行解释器: bash

在这里插入图片描述

六,创建子进程–fork函数的使用

Linux中创建进程的方式有两种:

1. 命令行中直接启动可执行程序
2. 通过代码创建进程

启动进程的本质就是创建进程,一般是通过父进程创建子进程,构成一种父子关系而命令行中启动的进程都是由bash为父进程模拟创建子进程的!

使用man指令查看fork函数信息:
在这里插入图片描述

1. 创建一个子进程并观察

写一个代码样例创建子进程观察情况:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2. fork返回值的理解

请大家自行使用man手册查看forh函数的返回值,这里把它翻译成中文:

在这里插入图片描述

理解下面的代码:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

首先,fork之后,父子进程都会执行代码的本质是它们都被内存调度了,而当一个函数执行到return时,它的核心工作才算执行完成,于是我们可以想象一下fork函数内部的一些代码信息:

在这里插入图片描述

在这里插入图片描述

3. 进程的独立性

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

CSS颜色设置

我们在显示屏上看到的各种颜色都是通过红(red)、绿(green)、蓝(blue)三原色组合而成的,按不同的比例混合这三种颜色就可以得到其它颜色,通过调整红、绿、蓝三种颜色的数值可以最大限…

微信开发者工具审查界面元素

一、打开调试器 二、审查元素 点击调试器左边的箭头,将鼠标放在界面上即可审查元素

Node-RED-L2-Node-RED在Linux系统启动时自动运行

Node-RED在Linux系统启动时自动运行 目的步骤1创建服务文件:2重新加载服务:3启用服务:4启动Node-RED服务:5检查服务状态:6其他说明7如果没启动正确的Node-RED执行路径:确保使用绝对路径: 检查用…

Servlet入门:服务端小程序的初试(自己学习整理的资料)

目录 一.前言 二.建立基础结构​编辑 三.具体步骤 找到Tomcat文件并打开Tomcat。 在webapps中创建一个自己的文件夹。 在classes中新建一个Java文件。 在lib中导入需要的jar文件包。 配置环境变量 在Java文件的目录下打开cmd并输入 javac -d . HelloServlet.java进行…

深兰科技陈海波应邀出席2024长三角论坛暨虹桥人才创新发展大会

近日,以“人才引领 联动共融——国际化创新与长三角协同”为主题的“2024长三角人才发展论坛暨虹桥人才创新发展大会”在上海国际会议中心隆重举行。上海市委常委、组织部部长、市委人才办主任张为应邀出席并做大会致辞。 深兰科技创始人、董事长陈海波作为特邀企业…

多用户自定义商城小程序源码系统 独立部署 到源代码包以及搭建部署教程

系统概述 随着移动互联网的迅猛发展,消费者的购物习惯逐渐向线上转移。传统电商平台虽然提供了一定的便利,但也存在一些局限性,如高昂的入驻费用、缺乏个性化定制等。为了适应市场需求,多用户自定义商城小程序源码系统应运而生。…

linux 之0号进程、1号进程、2号进程

一、0号进程 0号进程,通常也被称为idle进程,或者也称为swapper进程,其 pid 等于0。 0号进程是linux启动的第一个进程,它的task_struct的comm字段为"swapper",所以也称为swpper进程。 kernel/include/linux/init_task…

IO分类,IO模型,Java中的IO模式

写在前面 本文看下几个比较容易混肴的概念,IO分类,IO模型,Java的IO模式。当然,都是我自己的理解,有哪里不对的,烦请留言告知。 1:IO分类 IO分类是针对阻塞与非阻塞,异步与同步来讲…

.net 到底行不行!2000 人在线的客服系统真实屏录演示(附技术详解)

业余时间用 .net 写了一个免费的在线客服系统:升讯威在线客服与营销系统。 时常有朋友问我性能方面的问题,正好有一个真实客户,在线的访客数量达到了 2000 人。在争得客户同意后,我录了一个视频。 升讯威在线客服系统可以在极低…

基于SSM+Vue+MySQL的农家乐预约管理系统

系统展示 用户前台界面 管理员后台界面 农家乐后台界面 系统背景 随着乡村旅游的兴起,农家乐作为一种结合农业体验与休闲度假的新型旅游模式,受到了广大游客的青睐。然而,传统农家乐在预约管理方面存在效率低下、信息不透明等问题&#xff0c…

头戴式耳机百元测评推荐有哪些?头戴式耳机性价比排名推荐!

在音频设备日益普及的今天,头戴式耳机因其出色的音质和舒适度备受欢迎。然而,面对市场上琳琅满目的百元耳机,消费者常常感到困惑。头戴式耳机百元测评推荐有哪些?在这篇文章中,我们将测评并推荐几款性价比极高的头戴式…

Python爬虫之requests模块(一)

Python爬虫之requests模块(一) 学完urllib之后对爬虫应该有一定的了解了,随后就来学习鼎鼎有名的requests模块吧。 一、requests简介。 1、什么是request模块? requests其实就是py原生的一个基于网络请求的模块,模拟…

第一届POLARDB数据库性能大赛-亚军0xCC☣☢比赛攻略

关联比赛: 第一届POLARDB数据库性能大赛 1 赛题分析 本次大赛的初赛和复赛的赛题内容是一脉相传的,主要内容都是实现一个KV数据库存储引擎,实现随机插入,随机查询,区间查询这三个功能。赛题的难点主要有两个:1、实现在…

C#常用数据结构栈的介绍

定义 在C#中&#xff0c;Stack<T> 是一个后进先出&#xff08;LIFO&#xff0c;Last-In-First-Out&#xff09;集合类&#xff0c;位于System.Collections.Generic 命名空间中。Stack<T> 允许你将元素压入栈顶&#xff0c;并从栈顶弹出元素。 不难看出&#xff0c;…

图片如何转化为pdf格式?这几种方法超好用!

图片如何转化为pdf格式&#xff1f;在日常工作与学习中&#xff0c;图片与PDF文件作为两种截然不同的文档格式&#xff0c;各自扮演着重要角色&#xff0c;图片以其直观性著称&#xff0c;能够瞬间捕捉并展示视觉信息&#xff0c;无需额外软件即可快速浏览&#xff0c;但其内容…

免费制作证件照的小程序源码

1、效果展示 证件照制作&#xff0c;证件照免费制作&#xff0c;证件照调用api源码&#xff0c;解析代码。证件照制作小程序包&#xff0c;可以下载程序包&#xff0c;最初级版本免费下载。以上是高级版本。如果你有开发能力的话可以自己写前端&#xff0c;然后以下调用以下api…

粉丝精准!小红书卖儿童绘本项目,单月变现近2w(附详细教程)

AI绘本故事以其创新性、个性化、互动性和教育意义&#xff0c;迎合了宝爸宝妈对高质量儿童读物的需求&#xff0c;同时融合科技与教育&#xff0c;满足了他们对孩子全面发展的期待&#xff0c;因此在小红书上备受追捧。 今天给大家分享一个【小红书卖儿童绘本】项目&#xff0…

Spring Boot使用注解方式整合MyBatis

文章目录 实战讲稿&#xff1a;Spring Boot使用注解方式整合MyBatis课程目标课程内容1. 创建员工映射器接口1.1 创建子包1.2 创建接口 2. 测试员工映射器接口2.1 自动装配员工映射器2.2 测试按标识符查询员工方法2.3 测试查询全部员工方法2.4 测试插入员工方法2.5 测试更新员工…

如何保持测试环境的稳定性?

日常自动化测试中最担心的就是环境不稳定问题。不稳定的测试环境&#xff0c;经常可能导致测试失败。 解决方法&#xff1a;尽量保持测试环境的稳定性&#xff0c;包括硬件、软件和网络等方面。 如何保持测试环境的稳定性&#xff1f; 要保持测试环境的稳定性&#xff0c;可…

从零开始,Docker进阶之路(二):Docker安装

Docker 要求 CentOS7 系统的内核版本在 3.10以上 1.通过 uname -r 命令查看你当前的内核版本 uname -r2. 使用 root 权限登录 Centos。确保 yum 包更新到最新。 yum -y update 慢慢等&#xff0c;小编也是等了十分钟之久 3.卸载旧版本(如果安装过旧版本的话) yum remove do…