详解Linux进程

进程

  • 1.什么是进程
  • 2.创建进程
    • 2.1进程标识符
    • 2.2初时fork()函数,创建进程
  • 3.进程状态
    • 3.1进程状态的描述
    • 3.2Linux中具体的进程状态
  • 4 僵尸状态
  • 5 孤儿进程
  • 6进程优先级

1.什么是进程

进程在我们的电脑和手机上是无处不在的。例如我们windows系统下的任务管理器
在这里插入图片描述
这一个个的启动项就是我们的进程。我们在这个图片上可以看出,进程是需要用到CPU的资源的。当我们开启一个可执行程序,那么这个可执行文件就被加载到内存中,这个可执行程序就是进程。那么在我们的CPU有那么多的进程,CPU是怎么把他们区分并执行起来呢?
我们刚刚提到CPU去管理进程,这个说法是有些不对的,实际上,真正管理进程的软件是操作系统操作系统就是我们常常说的例如:windows,macOS,linux;
操作系统管理进程的关键就是先描述在组织我们都知道C语言的结构体,他可以描述对象的不同属性,所以操作系统的描述就是在创建结构体,一个对象对应一个结构体。**进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。**我们叫他PCB,Linux的PCB是task_struct。他囊括了进程的信息。
task_struct的内容分类

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

  • 总结进程可以简单的用一个图来表示
    在这里插入图片描述
    进程=内核数据结构+可执行程序

2.创建进程

2.1进程标识符

在linux中一个进程会有一个父进程,我们可以获取进程的id

  • 进程id(pid)
  • 父进程id(ppid)
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
        printf("before fork: I am a process,pid:%d,ppid:%d\n",getpid(),getppid());

        fork();

        printf("after fork: I am a process,pid:%d,ppid:%d\n",getpid(),getppid());

        sleep(2);
        return 0;
}

在这里插入图片描述
在这里插入图片描述
这里说明了fork之后创建了两个进程

2.2初时fork()函数,创建进程

父子进程代码共享,数据各自开辟空间存放,私有一份,也就是写实拷贝。
在这里插入图片描述
子进程被创建,以父进程为模板
接下来我们重点谈一谈fork的返回值
子进程的pid返回给父进程
0返回给子进程
父子进程做不同的工作,两者可以同时运行
为什么是这么返回的呢?我们后面会提到僵尸进程,我们现在只需要知道,父进程是需要找到子进程的,那么子进程的pid返回给父进程就是一种标识。
另一个问题为什么同一个变量既能等于0又大于0?
可以用一个变量,表示不同的内存

前面提到子进程被创建,以父进程为模板,他们共享一份数据,那如果我们对子进程进行修改的话,会影响父进程的数据吗?
答案是不会因为进程之间是具有独立性的当我们的子进程想要修改数据的时候,这时就会发生写实拷贝,给子进程提供一个新空间,空间内的数据都是上面内容的复制。
在这里插入图片描述
(注:写实拷贝我们后面的进程控制还会进一步分析)

3.进程状态

3.1进程状态的描述

状态就是一个整型变量,在task_struct的一个整型变量
状态决定了进程的后续动作。

/*
 - The task state array is a strange "bitmap" of
 - reasons to sleep. Thus "running" is zero, and
 - you can test for combinations of others with
 - simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
  • R (Running):该进程正在运行中。
  • S (Sleep):该进程目前正在睡眠状态,但可以被唤醒。
  • D:不可被唤醒的睡眠状态,通常这个进程可能在等待I/O的情况。
  • T :停止状态,发送一个暂停信号给进程,进程就暂停了。
  • t:追踪停止状态,通常在断点调试时,进程处于此状态。
  • X :死亡状态,这个状态是用来告诉操作系统的,所以我们观察不到此状态。
  • Z (Zombie):僵尸状态,进程已经死亡,但是却无法被删除至内存外。

在linux中我们可以用指令查看进程的状态

ps aux / ps axj 

3.2Linux中具体的进程状态

我们可以写一段死循环代码来让一个进程一直运行方便我们观察

我们可以用这个指令让我们更方便看

ps ajx | head -1 && ps ajx | grep test

4 僵尸状态

僵尸状态:进程已经退出,当前进程的状体还需要自己维持,供上层读取,
也就是代码已经被释放了,但是进程的PCB还在,执行完程序的数据还没有被上层(父进程)获取相关数据。

没有读取的危害
僵尸状态的数据如果一直没有读取,那么他就会一直存在,他的PCB会一直占取着内存,导致内存泄漏。

为什么要有这样的状态呢?
我们前面提到,创建进程就是为了完成某种工作的,我们要知道他有没有完成工作,就要读取他PCB里面的数据结果。

5 孤儿进程

字面意思:父进程先退出了,留下的子进程就变成了孤儿。
当父进程衍生出一个或多个子进程后,父进程先退出了,只留下了衍生出的一个或多个子进程,这些子进程就叫孤儿进程。
但是没有父进程那子进程怎么返回呢?
我们来看看这个子进程的ppid变成了什么?
这里操作系统会让1号进程(init)来领养这个子进程,当然这个子进程也就由init返回了。这里1号进程也就是操作系统。

那如果操作系统在这个不做这个优化会怎么样呢?
和僵尸进程类似的,子进程无法返回就会一直存在着,这时就会造成内存泄漏。

6进程优先级

这几年,人们越来越喜欢旅游,特别是在节假日的时候,人是非常多的,但是地方就那么大,所以不可避免的我们需要排队;这里我们就可以类比操作系统了,内存就只有那么大,他能运行的进程是有限度的,所以进程也需要排队,这就是我们进程排队。
==进程优先级的前提:==进程要访问某种资源,通过排队,确认先后顺序。

我们来看看进程的优先级,打印出所有的优先级

ps -la

在这里插入图片描述

这里的PRI就是我们所说的优先级
linux中的默认优先级是80,可以被修改,范围是【60,99】,一共有40个优先级。
Linux优先级就是数字,数字越小优先级更高

我们可以手动的改变优先级

  1. top
  2. r
  3. 输入要改变进程的pid
  4. 输入NI值
    在这里插入图片描述
    在这里插入图片描述
    我们不能直接改变pri,而是改变nice值;
    pri=pri(old)+nice
    如果我们的nice过大超过了pri的范围,那么系统会自动调整成范围之内。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Vue前后端分离的停车场管理系统设计与实现+毕业论文(12000字)

介绍 本系统主要包含普通用户与管理员两个用户角色&#xff1a;普通用户功能模块&#xff1a;可以方便地对车位进行查询&#xff0c;车位申请和个人缴费。 管理员功能模块: 管理系统用户&#xff0c;停车位&#xff0c;用户缴费信息管理&#xff0c;登录日志管理。 普通用户…

白色微立体的智能界面,就喜欢这种简洁白净。

本次发一些微立体风格的智能家居界面&#xff0c;风格为微立体&#xff0c;也叫轻拟物风格&#xff0c;或者新拟态风格。

25Ramdisk 启动模式简介

Ramdisk 启动模式简介 ramdisk是一种虚拟磁盘技术,我们的PE系统几乎都是使用ramdisk方式从计算机启动的.那么,ramdisk有哪些特点呢? Ramdisk 将内存虚拟为一个磁盘 Ramdisk技术会将你的一部分内存虚拟成一块磁盘分区.使用U盘启动pe系统时,打开pe系统里的文件资源管理器,你会看…

(文章复现)考虑分布式电源不确定性的配电网鲁棒动态重构

参考文献&#xff1a; [1]徐俊俊,吴在军,周力,等.考虑分布式电源不确定性的配电网鲁棒动态重构[J].中国电机工程学报,2018,38(16):4715-47254976. 1.摘要 间歇性分布式电源并网使得配电网网络重构过程需要考虑更多的不确定因素。在利用仿射数对分布式电源出力的不确定性进行合…

云防护是怎么能帮助用户做好网络安全

在数字化时代&#xff0c;网络安全威胁呈现出愈发复杂和多样化的趋势。 无论是个人用户、小型企业还是大型企业&#xff0c;都面临着来自全球各地的网络攻击风险。这些攻击可能导致数据泄露、服务中断、财务损失甚至声誉受损。因此&#xff0c;采取有效的安全防护措施变得至关…

数据处理的两个基本问题

文章目录 数据处理的两个基本问题bx、si、di、bp机器指令处理的数据所在位置汇编语言中数据位置的表达寻址方式指令要处理的数据有多长&#xff1f;div 指令伪指令 dddup 数据处理的两个基本问题 我们知道&#xff0c;计算机是进行数据处理、运算的机器&#xff0c;那么有两个基…

基于Tampermonkey 实现自动答题和视频播放

目录 一、环境准备 二、下载Tampermonkey 三、安装脚本 四、启用脚本 一、环境准备 微软自带的 edge 浏览器(电脑端) 二、下载Tampermonkey 安装地址&#xff1a;Tampermonkey 篡改猴(油猴脚本) 下载完成会在浏览器拓展中自动生成一个插件&#xff0c;此时点击管理拓展&…

linux 内核模块入门

内核模块可以动态地被安装到内核&#xff0c;从而扩展内核的功能&#xff0c;使用内核模块时不需要重新编译内核。内核模块常用的场景是驱动&#xff0c;随着芯片种类的增加&#xff0c;硬件种类的增加&#xff0c;这些芯片或者硬件(比如网卡) 的驱动可以以模块的方式进行开发&…

ONT60 旋转链表 思路分享

题干链接&#xff1a;ONT60 旋转链表 ​ 这道题是反转链表题的pro升级版&#xff0c;但比反转链表略微复杂一些。如果有做过旋转数组那道题&#xff08;链接在这里&#xff1a;https://blog.csdn.net/wyd_333/article/details/126712919&#xff0c;但当时刷这道题的时候我用的…

Linux|centos7-postgresql数据库|yum安装数据库和配置repmgr高可用集群以及repmgr的日常管理工作

一、 前言 postgresql 的yum部署其实还是有点东西的&#xff0c;本文就做一个小小的记录&#xff0c;高可用方面repmgr插件还是非常不错的&#xff0c;但如何部署以及部署后如何使用也是一个难点&#xff0c;因此&#xff0c;也在本文里做一个记录 环境介绍&#xff1a; 第…

【Redis教程0x0A】详解Redis哨兵机制

1. 引言 Redis的哨兵机制是基于主从架构的。 在 Redis 的主从架构中&#xff0c;由于主从模式是读写分离的&#xff0c;如果主节点&#xff08;master&#xff09;挂了&#xff0c;那么将没有主节点来服务客户端的写操作请求&#xff0c;也没有主节点给从节点&#xff08;slav…

java: 错误: 无效的源发行版:17

目录 一、java: 错误: 无效的源发行版&#xff1a;17 报错 原因 解决方法 二、pring-boot-starter-parent下面的版本报红 原因 解决方案 一、java: 错误: 无效的源发行版&#xff1a;17 报错 创建了一个sprintboot项目&#xff0c;运行CommunityApplication时&#xf…

小白从0学习ctf(web安全)

文章目录 前言一、baby lfi&#xff08;bugku-CTF&#xff09;1、简介2、解题思路1、解题前置知识点2、漏洞利用 二、baby lfi 2&#xff08;bugku-CTF&#xff09;1.解题思路1、漏洞利用 三、lfi&#xff08;bugku CTF&#xff09;1、解题思路1、漏洞利用 总结 前言 此文章是…

动态规划刷题(算法竞赛、蓝桥杯)--合唱队形(线性DP)

1、题目链接&#xff1a;[NOIP2004 提高组] 合唱队形 - 洛谷 #include <bits/stdc.h> using namespace std; int n,ans; int a[105],f[105][2];//f[i][2]中2表示正反两个方向int main(){cin>>n;for(int i1;i<n;i){cin>>a[i];}//正方向求最长上升子序列 a[…

HWOD:字符的排序

一、知识点 char的最大值是127&#xff0c;最小值是-128 自己填充的char型数组&#xff0c;以字符串打印&#xff0c;打印之前要手动在末尾加上 \0 二、题目 1、描述 Lily上课时使用字母数字图片教小朋友们学习英语单词&#xff0c;每次都需要把这些图片按照大小&#x…

财务管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. …

Spring Boot单元测试全指南:使用Mockito和AssertJ

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

算法学习15:数论(高斯消元,组合数,卡特兰数)

算法学习15&#xff1a;数论&#xff08;高斯消元&#xff0c;组合数&#xff0c;卡特兰数&#xff09; 文章目录 算法学习15&#xff1a;数论&#xff08;高斯消元&#xff0c;组合数&#xff0c;卡特兰数&#xff09;前言一、高斯消元1.输入一个包含n个方程&#xff0c;n个未…

用vscode仿制小米官网

html内容: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><link rel&quo…

Intellij IDEA 类注释模板设置

1、配置全局USER 在此配置全局USER&#xff0c;用于填充自动生成的注释中的作者author属性。 注释模板中的user参数是默认是获取系统的用户&#xff08;当然注释作者也可以直接写固定值&#xff09;&#xff0c;如果不想和系统用户用同一个信息&#xff0c;可以在IDEA中进行配…