LInux的进程知识(基础概念)持续更新

本文详细探讨了Linux进程的管理,包括进程控制块(PCB)的作用,PID的获取与创建过程,进程优先级的概念、调整方法以及进程的不同状态(如运行、睡眠、暂停和孤儿进程)。还介绍了僵尸进程的形成及其危害以及如何使用工具如getpid和nice值进行进程控制。
摘要由CSDN通过智能技术生成


LInux进程的相关信息

1.关于进程

	在CPU中运行着各种各样的程序例如在 在任务管理器中存在各种各样的后台程序

在这里插入图片描述

	一个进程首先我们记住,先描述在组织,对于进程的描述,我们在这个会有一个PCB进行进程的描述
struct task_strcut
{
	//各种属性

	struct task_struct* next;
}
	在这里的先描述属性的样子,然后有next的指针指向下一个进程的PCB
	操作系统对软硬件的资源进行管理,对上层提供高效稳定安全的运行环境   程序没有运行的时候,在磁盘中

在这里插入图片描述

(1) process control block – >内核数据结构

	一个进程,一定要有一个自己的PCB   当加载操作系统的时候,例如我们在通过Xshell链接云服务器的时候,就会开始加载进程
	有几个进程就需要malloc 几个PCB


    通过对这些PCB的进行管理,就相当于对这个链表的结构来进行增删改查   

(2)为什么要有PCB呢?

		OS(操作系统)要对进程进行管理,先描述再组织

(3)Linux 进程控制块

	这里的struct task_strcuct这个结构体就是用来描述进程的PCB的

在这里插入图片描述
在这个会提及到关于操作系统的调度算法
这个在后面介绍完进程的基本概念会介绍

	如何对进程进行动态的管理->把进程的task_struct 放到不同的队列中,这样进程就可以访问不同的资源了

2.进程pid的读取

这里我们了解到一个函数 getpid函数,用来获取当前进程的PID,这是具有唯一性的

每次子进程pid启动时都不一样,进入和退出后分配的pid是不一样的
在这里插入图片描述
创建一个进程 本质就是系统中就多一个进程,多一个进程就是多一个内核数据结构
此时父进程的代码从磁盘加载

(1)进程创建(fork()函数)

fork();//创建一个子进程

在这里插入图片描述
子进程的代码和数据继承父进程的代码和数据
fork函数会返回的是子进程的pid

pid_t id=fork();

是子进程id==0

是父进程id==子进程的id
fork函数会有两个返回值,返回两次
kill父进程是不会影响子进程的运行的,但是出现僵尸进程,没有了父进程的话就无法对子进程进行回收
在这里插入图片描述

(2)getpid 函数(getppid()函数)

	相关的代码实验

在这里插入图片描述
程序运行结果

在这里插入图片描述
在这里的我看到可以检测到child的pid
在这里插入图片描述

在这里我们看到了.exe文件

在这里插入图片描述
同时我们可以看到,进程当前工作的路径

3.进程的优先级

(1)什么事进程优先级

	指定进程获取某种资源的优先级

(2) Linux 下的优先级的特点和查看方式

	task_strcut 进程的控制块  struct中有个成员(内部字段) int prio  用来表示进程的优先级
	在Lnux中 优先级的数字越小,优先级的越高

(3)这里我们会谈及权限和优先级

	这里的区分还是很明显的

优先级:我们已经获取到了某个资源,然后就是拿到这个资源的顺序
权限:主要是我们能否可以拿到这个资源

(4)为什么会有优先级

	1.进程访问的资源(CPU是有限的)
	2.系统的进程大部分情况是软件的进程比硬件的进程多
	3.操作系统关于调度和优先级的原则:分时操作系统,保证绝对的公平
	4.如果进程长时间的不被调用的话是会导致饥饿问题

在这里插入图片描述
我们在这个看到了PRT NI -> nice
这里PRI就是进程的优先级 nice就是进程优先级的修改数据
新的优先级==优先级+nice
达到对进程的优先级的动态修改,修改nice值会在下一个时间片改变Nice值

(5)关于nice值

nice值的范围[-20,19] 一共有40个优先级

首先进程的优先级不可以频繁的修改
每次重新调用的优先级都是从80开始的 时间片程序会在本次的程序轮询结束后识别到进程的优先级改变

	上实验

在这里插入图片描述
我们先让程序跑起来
然后再开一个终端,来监控
可以通过top命令来修该nice值

(1)top命令的使用

	在终端输入top 按下r键输入检测到的pid
	再输入要改变的nice值

在这里插入图片描述
当我重新大概test程序后优先级恢复
在这里插入图片描述
输入top
在这里插入图片描述
按下r键
在这里插入图片描述
输入目标的pid
更改nice值
在这里插入图片描述
在这里插入图片描述
可以看到nice发生改变

(2)关于知识点的补充

	并发:多个进程在一个cpu上采用进程切换的方式
	并行,多个进程在多个cpu下分别同时运行
	进程具有独立性,指不影响存在,不会因为其中一个的消失而消失 但是会影响其中一个的状态

4.进程的状态

	介绍一下进程的几种状态

R运行状态(running):并不意味着进程一定在运行中,它表明进程要么在运行队列中要么在运行中
S睡眠状态(sleeping):意味着进程在等待某个事件3的完成(这里的睡眠也可以叫做中断睡眠)(interrupt sleeping)
D磁盘休眠状态:有时候也叫不可中断睡眠状态(uninterruptible sleep)在这个进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送SIGSTOP信号给进程来停止这个进程,这个被暂停的进程可以通过发送SIGCONT 信号来让进程继续运行
X死亡状态(dead):这状态只是一个返回状态,你不会在任务列表里看到这个状态
Z僵尸进程(zombie):僵死状态是一个比较特殊的状态。当进程退出并且父进程(使用wait系统调用,后面讲) ,没有读取到子进程的退出的返回代码时就会出现产生僵死进程

(1)关于进程的实验

僵尸进程(重要)

我们写一段代码,实现让子进程先跑完,父进程还在跑
在这里插入图片描述
运行程序
在这里插入图片描述
在右侧我们开一个监控台
在这里插入图片描述
可以看到Z状态,就是子进程跑完,父进程没有对齐进行回收,导致的

僵尸进程的危害
	如果父进程或者操作系统一直对子进程的退出状态进行度的haul,那么
	子进程的退出状态就会一直维持下去 ;这样这个子进程的PCB就会一直存在,不会被释放,可能会造成内存泄漏,那么子进程就会变成僵尸进程
运行状态
	注意printf和scanf都要等待硬件资源,在打印的时候会,因为在等待屏幕和键盘资源而显示睡眠状态

在这里插入图片描述
我们在这里实现不断的累加,让程序一直在运行,通过检测台,可以看到程序处于R状态
在这里插入图片描述
这里可以看到程序在运行

		注意在这里我们提及到硬件资源,一般程序中涉及到外设硬件,程序的状态一般处于睡眠状态,
		等待硬件资源就绪
深度睡眠状态

当操作系统中的内存不够使用的时候,就会主动将一部分进程挂起来节省资源;但是当内存空间严重不足的时候,挂起就已经解决不了问题,操作系统就会主动杀掉某些进程
这样一来,操作系统可能会把一些重要的进程给杀死 比如一个进程正在往磁盘里面写入资源 在写入这个数据的时候,该进程处于阻塞态,等待数据完全写入后,磁盘给予进程一个信息,表示数据已经写入完毕 但是一旦进程被操作系统杀掉,并且磁盘写入失败,那么这部分的数据就丢失了,磁盘在把写入失败的信号无法再给到进程,这样磁盘只好丢失这些数据,去服务其他进程

就是为了防止这样的情况发生,Linux会将这样的进程设置为D状态(深度睡眠状态) 这样的进程是无法被用户杀掉,也无法被操作系统杀掉的,只有通过断电 和等待其自己醒来
注:深度睡眠一般只发生在高IO的状态下,且如果操作系统存在多个这样的进程的 话,说明操作系统快崩溃了

暂停状态

暂停状态 也是阻塞态的一种,通过kill可以让一个程序处于暂停状态

在这里插入图片描述

在这里插入图片描述
这里显示到了可以通过kill -19 命令来实现进程的停止并且进程就一直停在此处
在这里插入图片描述
我们通过kill命令实现了进程的暂停和继续 并且进程的pid 没有变化,说明程序一直在阻塞在该位置停止
在这里插入图片描述

孤儿进程
	孤儿进程就是指在父进程退出后,子进程被操作系统领养的一种情况,被操作系统领养的进程就被称为孤儿进程

在这里插入图片描述
在这里注意,变成孤儿进程后是被系统的1号进程收养,不是bash进程

  • 59
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值