当前位置: 首页 > news >正文

Linux之进程知识点

一、什么是进程

进程是一个运行起来的程序。

问题思考:

❓ 思考:程序是文件吗?

是!都读到这一章了,这种问题都无需思考!文件在磁盘哈。

本章一开始讲的冯诺依曼,磁盘就是外设,和内存与 CPU 打交道,它们之间有数据交互。

你的程序最后要被 CPU 运行,所以要运行起来必须先从磁盘外设加载到内存中。因此,当可执行文件被加载到内存中时,该程序就成为了一个进程。

操作系统里面可能同时存在大量的进程!

既然如此,那操作系统要不要将所以后的进程管理起来呢?

当然要,不要不就乱套了?当前想调用哪个进程,想让哪个进程占用 CPU 资源,

想执行哪个资源,数据一大你不管怎么行?所以我们刚才再次讲解了操作系统管理的概念:

被管理对象的管理本质上是对数据的管理。那么对进程的管理,本质上就是对进程数据的管理。

二、进程控制块(PCB)

/* Process Ctrl Block */
struct task_struct {进程的所有属性数据
};

在操作系统中,我们把描述进程的结构体称为 \textrm{PCB} (Process Ctrl Block) 。

在很多教材中,会把 \textrm{PCB} 称为 进程控制块

❓ 为什么每个进程都要有呢 (task_struct)?

💡 因为操作系统要管理我们的进程,想要管理就必须要 "先描述再组织" 。

❓ 为什么我们的 task_struct 每个进程都要有呢?

💡 因为这是为了管理进程而描述进程所设计的结构体类型,将来当有一个进程加载到内存时, 操作系统在内核中一定要为该进程创建 task_struct 结构体变量, 并且要将该变量链入到全局的链表当中。要删掉一个进程,实际上就是遍历所有的链表结点, 把对应进程的和代码都释放掉,这就叫对链表做管理。 最终你会发现,操作系统对进程的管理,最终变成了对链表的增删查改。什么是进程?目前为止我们可以总结成:进程 = 可执行程序 + 该进程对应的内核数据结构 task_struct 是一个非常大的结构体:

struct task_struct {volatile long state;void *stack;atomic_t usage;unsigned int flags;     unsigned int ptrace;unsigned long ptrace_message;siginfo_t *last_siginfo; int lock_depth;         #ifdef CONFIG_SMP
#ifdef __ARCH_WANT_UNLOCKED_CTXSWint oncpu;
#endif
#endif...
}

三、进程查看

我们先创建一个 mytest.c 文件,然后写上一个死循环,每隔1秒就打印一句话:

通过指令查看进程

任何一个进程都有自己的代码和数据,比如我们常见的 C语言 源文件,经过编译后生成的可执行程序中,就包含着二进制代码和其创建修改的时间、所处位置信息

当可执行程序 myprogress 运行时,各种数据就会被描述,生成相应的进程控制块。

可以用ps ajx指令来查看进程块包含的信息

Linux中的PCB是task_struct,程序会被描述生成相应的 task_struct装载至内存中。

用命令ps ajx | head-1可以查看第一行的信息。

用管道组合一下就可以通过指令来查看正在运行的进程信息:

$ ps ajx | head -1 && ps ajx | grep 进程名 | grep -v grep

grep -v grep命令的意思是过滤掉自身的这一条命令。

我们可以通过函数来主动查看进程的PID。

获取pid的函数——getpid()

#include<stdio.h>
#include<unistd.h>  //Linux中睡眠函数的头文件
#include<sys/types.h>
​
int main()
{int sec = 0;while(1){printf("这是一个进程,已经运行了%d秒 当前进程的PID为:%zu\n", sec, getpid());sleep(1); //单位是秒,睡眠一秒sec++;}return 0;
}
​

可以看出他们的PID是一样的。

注: 当程序重新运行后,会生成新的 PID

因为查看进程的指令太长了,所以我们可以结合前面学的自动化构建工具 make ,编写一个 Makefile 文件,文件内容如下所示:

top指令

top

这个指令之前有介绍过,相当于Windows中的 ctrl+alt+del 调出任务管理器一样,top 指令能直接调起 Linux 中的任务管理器,显然,任务管理器中包含有进程相关信息

通过proc目录查看进程信息

$ /proc/

这些数字所代表的就是PID。

杀进程

我们再来回忆一下我们是如何杀掉一个进程的…… \textrm{ctrl + c}

这是我们之前讲的,在 Linux 命令行中的热键,遇到问题解决不了可以用它来中止。

所谓的 \textrm{ctrl + c} 就是用来杀进程的。除此之外,你也可以选择在另一个终端中使用 kill 命令:

$ kill -9 [pid]   # 给这个进程发送9号信号

当前你只需要知道可以通过 kill -9 命令杀掉进程就行了,至于这个 9 号信号,我们会放在后面的信号章节去讲!

比如我们现在想杀掉刚才运行的, 打出进程 \textrm{pid} 的 mytest 进程,其 \textrm{pid} 为 22160:

父进程

进程间存在 父子关系

比如在当前 bash 分支下运行程序,那么程序的 父进程 就是当前 bash 分支

其中,PID 是当前进程的ID,PPID 就是当前进程所属 父进程 的ID 我们一样可以通过函数来查看 父进程 的ID值

//函数:获取当前进程PPID值
#include<unistd.h>
#include<sys/types.h>
​
pid_t getppid(void);    //用法跟上面的函数完全一样
​

使用fork()创建子进程

写上如下代码:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main(void) {pid_t id = fork();printf("Hello, World!\n");sleep(1);
}

运行后发现

❓ 思考:

  • 同一个 id 值,使用打印,没有修改,却打印出来了不同的值?为什么?这合理吗?

  • fork 如何做到会有不同的返回值?

再看看如下代码

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main(void) {pid_t id = fork();/* id:  0 子进程, >0 父进程 */if (id == 0) {// childwhile (1) {printf("我是子进程,我的pid: %d,我的父进程是 %d\n", getpid(), getppid());sleep(1);}} else {// parentwhile (1) {printf("我是父进程,我的pid: %d,我的父进程是 %d\n", getpid(), getppid());sleep(1);}}
}

我们发现,这两块代码是可以同时执行的。

原因:fork 之后,父进程和子进程会共享代码,一般都会执行后续的代码。这也是为什么刚才的 printf 会打印两次的原因。fork 之后,父进程和子进程返回值不同,所以可以通过不同的返回值去判断,让父子执行不同的代码块。

fork函数工作原理:

fork 创建子进程时,会新建一个属于 子进程 的 PCB ,然后把 父进程 PCB 的大部分数据拷贝过来使用,两者共享一份代码和数据 各进程间是相互独立的,包括父子进程。 这句话的含义是当我们销毁父进程 后,它所创建的子进程并不会跟着被销毁,而是变成一个 孤儿进程。

最后,return 是代码吗?是的!所以当我们走到 return 时父进程有了,子进程也已经在运行队列了,fork 后代码共享,父子进程当然会执行后续被共享的 return 代码。因此,父进程执行一次 return,子进程执行一次 return,最后就是两个返回值了。

相关文章:

Linux之进程知识点

一、什么是进程 进程是一个运行起来的程序。 问题思考&#xff1a; ❓ 思考&#xff1a;程序是文件吗&#xff1f; 是&#xff01;都读到这一章了&#xff0c;这种问题都无需思考&#xff01;文件在磁盘哈。 本章一开始讲的冯诺依曼&#xff0c;磁盘就是外设&#xff0c;和内…...

一种供水系统物联网监测系统

1.1供水系统 1.1.1监测范围选择依据 &#xff08;1&#xff09;管网老化区域管网 管网建设年代久远&#xff0c;通常管网发生破损问题较大&#xff0c;根据管网本身属性和历史发生事件的统计分析&#xff0c;结合数理统计&#xff0c;优先选择管网老化区域的管段所在区域进行…...

Linux驱动开发——字符设备(2)

目录 虚拟串口设备驱动 一个驱动支持多个设备 习题 虚拟串口设备驱动 字符设备驱动除了前面搭建好代码的框架外&#xff0c;接下来最重要的就是要实现特定于设备的操作方法&#xff0c;这是驱动的核心和关键所在&#xff0c;是一个驱动区别于其他驱动的本质所在&#xff0c;…...

【MySQL数据库原理】MySQL Community安装与配置

目录 安装成功之后查看版本验证1、介绍、安装与配置数据库2、操作MySQL数据库3、MySQL数据库原理安装成功之后查看版本验证 SELECT VERSION();查看mysql版本号 1、介绍、安装与配置数据库 下载安装包:https://download.csdn.net/download/weixin_41194129/87672588 MySQL…...

【ROS参数服务器增删改c++操作1】

需求:实现参数服务器参数的增删改查操作。 在C中实现参数服务器数据的增删改查&#xff0c;可以通过两套API实现:. ros::NodeHandle ros::param下面为具体操作演示&#xff1a; 在src下面的自己定义的作用包下面新建文件。 比如我的是一直存在的demo03_ws文件下的src里面&…...

elasticsearch 常用数据类型详解和范例

主要内容 elasticsearch 中的字符串&#xff08;keyword&#xff09;类型 的详解和范例 elasticsearch 中的字符串/文本&#xff08;text&#xff09;类型 的详解和范例 elasticsearch 中的数字&#xff08;数值&#xff09;类型 的详解和范例 elasticsearch 中的布尔&#…...

力扣119杨辉三角 II:代码实现 + 方法总结(数学规律法 记忆法/备忘录)

文章目录第一部分&#xff1a;题目第二部分&#xff1a;解法①-数学规律法2.1 规律分析2.2 代码实现2.3 需要思考第三部分&#xff1a;解法②-记忆法&#xff08;备忘录&#xff09;第四部分&#xff1a;对比总结第一部分&#xff1a;题目 &#x1f3e0; 链接&#xff1a;119.…...

安装pandas遇到No module named ‘_bz2’ 的解决方案

出现这个问题我们可以按照这篇博客去解决&#xff1a; https://blog.csdn.net/bf96163/article/details/128654915 如果解决不了&#xff0c;可以这样去做&#xff1a; 1.确保安装了 对应的库 // ubuntu安装命令 sudo apt-get install bzip2-devel // centos安装命令 sudo y…...

【数据治理-05】什么数据才是货真价实的数据资产,一起聊聊数据资产

在国家层面一些列文件、纲要、政策、办法等政府力量的推动下&#xff0c;数据资产这个词越来越频繁的出现在我们寻常工作当中&#xff0c;现在越来越觉得这个词被滥用&#xff0c;大有“一切数据皆是资产”的感觉&#xff0c;业务数据是资产、技术数据是资产&#xff0c;不能共…...

第三章 ARM处理器体系结构【嵌入式系统】

第三章 ARM处理器体系结构【嵌入式系统】前言推荐第三章 ARM处理器体系结构3.1 概述3.2 ARM处理器的结构3.7 ARM的异常中断处理最后前言 以下内容源自《【嵌入式系统】》 仅供学习交流使用 推荐 无 第三章 ARM处理器体系结构 留着占位 敬请期待 3.1 概述 3.2 ARM处理器的…...

最速下降法

首先&#xff0c;计算函数f的梯度向量&#xff1a;∇f(x1,x2)[2x150x2]\nabla f(x_1,x_2) \begin{bmatrix}2x_1\\50x_2\end{bmatrix}∇f(x1​,x2​)[2x1​50x2​​] 然后&#xff0c;选择一个初始点(x10,x20)(x_1^0,x_2^0)(x10​,x20​)&#xff0c;比如(0,0)(0,0)(0,0)。 接…...

R语言实践——ggplot2+ggrepel绘制散点+优化注释文本位置

简介 书接adjustText实践——调整matplotlib散点图标签&#xff0c;避免重复 上文中&#xff0c;matplotlibadjustText对于我的实例来说并没有起到很好的效果。所以&#xff0c;博主决定在R中利用gglot2ggrepel绘制&#xff0c;期待效果。 操作过程 博主不常使用R&#xff…...

[TIFS 2022] FLCert:可证明安全的联邦学习免受中毒攻击

FLCert: Provably Secure Federated Learning Against Poisoning Attacks | IEEE Journals & Magazine | IEEE Xplore 摘要 由于其分布式性质&#xff0c;联邦学习容易受到中毒攻击&#xff0c;其中恶意客户端通过操纵其本地训练数据和/或发送到云服务器的本地模型更新来毒…...

css3关键帧动画

CSS3关键帧动画是一种在网页设计中常用的技术&#xff0c;通过使用CSS3的关键帧动画功能&#xff0c;可以实现网页上各种形式的动画效果&#xff0c;例如淡入淡出、滑动、旋转、缩放等&#xff0c;这些动画效果可以让网页更加生动有趣&#xff0c;吸引用户的注意力&#xff0c;…...

在 macOS Mojave 之后的每一个版本中都隐藏着比特币白皮书(Bitcoin Whitepaper)

今天我在尝试解决打印机故障问题时&#xff0c;发现了自2018年Mojave版本以来&#xff0c;macOS都附带了一份Satoshi Nakamoto&#xff08;即中本聪&#xff09;的比特币白皮书PDF副本[1]。 我已经询问了十几位使用Mac的朋友&#xff0c;他们都确认macOS里面有这个文件。这个文…...

一文看懂SpringBoot操纵数据库

1.前言 很多同学进入公司就开始参与项目开发&#xff0c;大多数情况是对某个项目进行维护或者需求迭代&#xff0c;能够从0到1参与到项目中的机会很少&#xff0c;因此并没有多少机会了解某些技术的运行机制。换句话说&#xff0c;有的面试官在面试的时候就会探讨深层的技术问题…...

科普:java与C++的区别

Java与C是两种广泛使用的编程语言&#xff0c;它们在某些方面存在不同之处。本文将详细介绍Java与C的区别。 一、C与Java的历史 C语言是由Bjarne Stroustrup在20世纪80年代初期开发的一种面向对象编程语言&#xff0c;它是C语言的扩展。Java语言是由Sun Microsystems公司于20…...

突发!ChatGPT疯了!

‍数据智能产业创新服务媒体——聚焦数智 改变商业今天&#xff0c;笔者正常登录ChatGPT&#xff0c;试图调戏一下他。但是&#xff0c;突然震惊的发现&#xff0c;ChatGPT居然疯了。之所以说他是疯了&#xff0c;而不是崩溃了&#xff0c;是因为他还能回复我&#xff0c;但回…...

docker-compose容器编排使用详解+示例

文章目录一、docker-compose概述1、产生的背景2、核心概念3、使用的三个步骤4、常用命令二、下载安装1、官方文档2、下载3、卸载三、使用compose1、前置知识&#xff0c;将一个springboot项目打包为镜像2、编写docker-compose.yml文件3、启动docker-compose4、停止一、docker-c…...

可用的rtsp ,rtmp地址以及使用VLC和ffmpeg 播放视频流

可用的 rtmp地址: rtmp://ns8.indexforce.com/home/mystream 可用的 rtsp地址: rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4 可搭配VLC播放器使用&#xff0c;以及虚幻4 流媒体使用&#xff0c;实现直播效果 1.使用VLC 播放&#xff1a;https://www.vi…...

用提示词写程序(3),VSCODE+Claude3.5+deepseek开发edge扩展插件V2

edge扩展插件;筛选书签,跳转搜索,设置背景 链接: https://pan.baidu.com/s/1nfnwQXCkePRnRh5ltFyfag?pwd86se 提取码: 86se 导入解压的扩展文件夹: 导入扩展成功: edge扩展插件;筛选书签,跳转搜索,设置背景...

spring-boot接入websocket教程以及常见问题解决

我们使用spring-boot接入websocket有三种方式&#xff1a;使用EnableWebSocket、EnableWebSocketMessageBroker以及ServerEndpoint&#xff0c;本文主要介绍使用ServerEndpoint方式的流程以及碰到的问题解决 接入方式 添加依赖 确保spring-boot-starter-websocket依赖 <d…...

深度学习|pytorch基本运算-hadamard积、点积和矩阵乘法

【1】引言 pytorch对张量的基本运算和线性代数课堂的教学有一些区别&#xff0c;至少存在hadamard积、点积和矩阵乘法三种截然不同的计算方法。 【2】hadamard积 hadamard积是元素对位相乘&#xff0c;用“*”连接张量&#xff0c;代码&#xff1a; # 导入包 import torch …...

【Net】TCP粘包与半包

文章目录 TCP粘包与半包1 背景2 粘包&#xff08;packet stick&#xff09;3 半包&#xff08;packet split&#xff09;4 为什么会出现粘包/半包&#xff1f;5 如何解决&#xff1f;6 示例7 总结 TCP粘包与半包 在网络编程中&#xff0c;粘包和半包问题是常见的 TCP 协议特有…...

探索大语言模型(LLM):RSE流程详解——从文档中精准识别高相关片段

前言 在信息爆炸的时代&#xff0c;如何从海量的文本数据中快速准确地提取出有价值的信息&#xff0c;成为了众多领域面临的共同挑战。RSE&#xff08;检索增强摘要生成&#xff09;流程应运而生&#xff0c;它通过一系列精细化的步骤&#xff0c;能够有效地从原始文档中识别出…...

Goreplay最新版本的安装和简单使用

一&#xff1a;概述 Gor 是一个开源工具&#xff0c;用于捕获实时 HTTP 流量并将其重放到测试环境中&#xff0c;以便使用真实数据持续测试您的系统。它可用于提高对代码部署、配置更改和基础设施更改的信心。简单易用。 项目地址&#xff1a;buger/goreplay: GoReplay is an …...

Codeforces Round 1026 (Div. 2) C. Racing

Codeforces Round 1026 (Div. 2) C. Racing 题目 In 2077, a sport called hobby-droning is gaining popularity among robots. You already have a drone, and you want to win. For this, your drone needs to fly through a course with n n n obstacles. The i i i-…...

Perforce P4产品简介:无限扩展+全球协作+安全管控+工具集成(附下载)

本产品简介由Perforce中国授权合作伙伴——龙智编辑整理&#xff0c;旨在带您快速了解Perforce P4版本控制系统的强大之处。 世界级无限可扩展的版本控制系统 Perforce P4&#xff08;原Helix Core&#xff09;是业界领先的版本控制平台&#xff0c;备受19家全球Top20 AAA级游…...

StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践

导读&#xff1a; 本文将深入探讨基于 StarRocks 和 Iceberg 构建的云原生湖仓分析技术&#xff0c;详细解析两者结合如何实现高效的查询性能优化。内容涵盖 StarRocks Lakehouse 架构、与 Iceberg 的性能协同、最佳实践应用以及未来的发展规划&#xff0c;为您提供全面的技术解…...

金融全业务场景的系统分层与微服务域架构切分

构建一个支持金融全业务场景的会员账户体系&#xff0c;是一项复杂但极具战略价值的工程。为了支持跨国收付款、供应链金融、信用账户、票据、银行卡发卡等场景&#xff0c;需要采用清晰的分层架构和服务划分策略&#xff0c;确保系统具备可扩展性、合规性、安全性和高可用性。…...