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

news2024/11/14 18:41:08

目录

  • 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)
{
 //child
	printf("I am child : %d!, ret: %d\n", getpid(), ret);
}else
{
 //father
	printf("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.coloradmin.cn/o/1440870.html

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

相关文章

ONLYOFFICE文档8.0新功能浅探

ONLYOFFICE文档8.0新功能浅探 上个月末这个月初的几天&#xff0c;ONLYOFFICE版本更新了&#xff01;更新到了一个比较整的大的版本号&#xff0c;8.0版本&#xff0c;看来这个生产力工具的升级速度基本上能保持每年两个版本号的速度&#xff0c;还是很快的&#xff0c;一般来…

微软.NET6开发的C#特性——委托和事件

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;下面我就重点讲讲微软.NET6开发人员需要知道的C#特性&#xff0c;然后比较其他各种语言进行认识。 C#经历了多年发展…

Ajax+JSON学习一

AjaxJSON学习一 文章目录 前言一、Ajax简介1.1. Ajax基础1.2. 同源策略 二、Ajax的核心技术2.1. XMLHttpRequest 类2.2. open指定请求2.3. setRequestHeader 设置请求头2.4. send发送请求主体2.5. Ajax取得响应 总结 前言 一、Ajax简介 1.1. Ajax基础 Ajax 的全称是 Asynchron…

网络连接受限或无连接怎么办?这里提供几个修复办法

本文介绍了如何完成疑难解答步骤,以解决在Windows 10、Windows 8和Windows 7中尝试在Windows计算机上设置或建立网络连接时可能遇到的连接问题错误。 可能错误提示 连接受限或无连接:连接具有有限的连接或无连接。你可能无法访问Internet或某些网络资源。 连接受限。 排除和解…

神经网络基本原理

神经网络是一门重要的机器学习技术。它是目前最为火热的研究方向–深度学习的基础。 神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。人脑中的神经网络是一个非常复杂的组织。成人的大脑中估计有1000亿个神经元之多。 1 介绍 下面是一个包含三个层…

百度Apollo荣获量子位-智能车参考“2023智能车年度评选”两大奖项

2023&#xff0c;是谁在引领智能车浪潮&#xff1f; 量子位-智能车参考发布“2023智能车年度评选”结果。经过业内专业评审和垂直社群万人票选后&#xff0c;百度Apollo荣获「年度十大智能车技术产品/方案」「年度十大智能车领军人物」两项大奖。 年度十大智能车技术产品\方…

二叉树中的最大路径和

124. 二叉树中的最大路径和 - 力扣&#xff08;LeetCode&#xff09; 思路 路径每到一个节点&#xff0c;有 3 种选择&#xff1a;1. 停在当前节点。2. 走到左子节点。3. 走到右子节点。走到子节点&#xff0c;又面临这 3 种选择&#xff0c;递归适合处理这种规模不同的同一问…

Redis 单线程

文章目录 Redis单线程架构Redis 单线程访问速度IO多路复用原理 Redis单线程架构 Redis的单线程架构的效果为&#xff1a;Redis的单线程是对于服务端而言的&#xff0c;Redis允许多个Redis用户端同时在线操作&#xff0c;但同时只有一个用户端在和服务端交互。多个用户同时发送…

生成验证码-超简单

引言 在Web开发中&#xff0c;验证码是一种常见的防止恶意破解、自动化提交的有效手段。在Java项目中&#xff0c;我们可以使用Hutool工具库快速实现验证码功能。Hutool是一个Java工具包&#xff0c;它以简洁易用著称&#xff0c;其中包含了验证码模块&#xff0c;可以让我们轻…

158基于matlab的用于分析弧齿锥齿轮啮合轨迹的程序

基于matlab的用于分析弧齿锥齿轮啮合轨迹的程序&#xff0c;输出齿轮啮合轨迹及传递误差。程序已调通&#xff0c;可直接运行。 158 matlab 弧齿锥齿轮啮合轨迹 传递误差 (xiaohongshu.com)

U3D记录之FBX纹理丢失问题

今天费老大劲从blender建了个模型&#xff0c;然后导出进去unity 发现贴图丢失 上网查了一下 首先blender导出要改设置 这个path mode要copy 然后unity加载纹理也要改设置 这里这个模型的纹理load要改成external那个模式 然后就有了&#xff0c;另外这个导出还有好多选项可…

基于Robei EDA--实现串口通信

一、串口简介 串口作为常用的三大低速总线&#xff08;UART、SPI、IIC&#xff09;之一&#xff0c;在设计众多通信接口和调试时占有重要地位。但UART和SPI、IIC不同的是&#xff0c;它是异步通信接口&#xff0c;异步通信中的接收方并不知道数据什么时候会到达&#xff0c;所…

消息中间件:Puslar、Kafka、RabbigMQ、ActiveMQ

消息队列 消息队列&#xff1a;它主要用来暂存生产者生产的消息&#xff0c;供后续其他消费者来消费。 它的功能主要有两个&#xff1a; 暂存&#xff08;存储&#xff09;队列&#xff08;有序&#xff1a;先进先出 从目前互联网应用中使用消息队列的场景来看&#xff0c;…

深入理解Netty及核心组件使用—上

目录 Netty的优势 为什么Netty使用NIO而不是AIO&#xff1f; Netty基本组件 Bootstrap、EventLoop(Group) 、Channel 事件和 ChannelHandler、ChannelPipeline ChannelFuture Netty入门程序 服务端代码 客户端代码 运行结果 Netty的优势 1. API 使用简单&#xff0c…

从REPR设计模式看 .NET的新生代类库FastEndpoints的威力

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 又到了一年年末,春节将至…

CS50x 2024 - Lecture 2 - Arrays

00:00:00 - Introduction 00:01:01 - Story Time 00:06:03 - Compiling make本身并不是编译器&#xff0c;实际上是一个自动运行编译器的程序&#xff0c;如c语言的clang clang -o hello hello.csrc/ $ clang -o hello hello_world.c /usr/bin/ld: /tmp/hello_world-67f51…

工作与生活平衡:在生活中寻找和谐

工作和生活是我们生活中不断交织的两个重要方面。对许多人来说&#xff0c;找到两者之间的完美平衡已经成为一个持久的挑战。然而&#xff0c;与其专注于平衡&#xff0c;更重要的是要认识到工作和生活并不是可以相互平衡的两个分离实体&#xff0c;而是一个相互影响的循环。正…

WebSocket+Http实现功能加成

WebSocketHttp实现功能加成 前言 首先&#xff0c;WebSocket和HTTP是两种不同的协议&#xff0c;它们在设计和用途上有一些显著的区别。以下是它们的主要特点和区别&#xff1a; HTTP (HyperText Transfer Protocol): 请求-响应模型&#xff1a; HTTP 是基于请求-响应模型的协…

Leetcode刷题笔记题解(C++):面试题 08.07. 无重复字符串的排列组合

思路&#xff1a;因为字符之间互不相同&#xff0c;故使用全排列的方式去解题&#xff1b; 字符串长度为n&#xff0c;将第一个字母分别与后面每一个字母进行交换&#xff0c;生成n种不同的全排列&#xff1b;再用第二个元素与后面每一个元素进行交换&#xff0c;生成n - 1种不…

Spring Authorization Server Spring Security密码加密

文章目录 一、修改密码编码器二、效果三、注意点1. RegisteredClient2. UserDetailsService 一、修改密码编码器 以BCryptPasswordEncoder举例。 直接将其注册成PasswordEncoder 的Bean即可。 Beanpublic PasswordEncoder passwordEncoder() {// 密码为明文方式 // ret…