linux基础五:linux 系统(进程状态2:)

linux 系统

  • 一.进程状态:
    • 1.睡眠状态(sleep):
    • 2.磁盘休眠状态(disk sleep):
    • 3.停止状态(stoped --- T):
    • 4.死亡状态:
    • 5.控制状态(t)
  • 二.僵尸进程和孤儿进程:
    • 1.僵尸状态:
    • 2.孤儿进程:
  • 三.进程优先级:
    • 1.基本概念:
    • 2.系统进程的详细信息!
    • 3.PRI 和 NI
  • 四:linux 进程调度与切换
    • 1.其他概念:
    • 2.进程切换:
    • 3.进程调度:
  • 五.环境变量:
    • 1.mian函数参数(实现命令行的基础):
    • 2.bash 获取命令行字符串是如何进行传参?
    • 3.环境变量:
      • 1.常见环境变量:
      • 2.如何把自己的程序变成不需要./就可以执行:
      • 3.环境变量相关命令:
      • 4.代码获取环境变量:
      • 5.获取单个环境变量:
      • 6.通过环境变量对程序进行加密:

一.进程状态:

/*
* 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 */
};

1.睡眠状态(sleep):

1.表示进程正在等待事件完成!
2对于一个进程我们在运行代码的时候大多数的情况都是一个睡眠状态。
3.运行状态占这个代码运行比较少的一部分时间!
4.下面是我们用来测试睡眠状态的代码!

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

2.磁盘休眠状态(disk sleep):

1.这是一个非常重要的状态这个状态是需要一个前提的!
2.说一个故事:在外面的内存中有一个进程正在跑这个进程主要干把一个数据写入磁盘的命令给到磁盘,磁盘就开始写数据到对应的位置,磁盘一直在写数据,然后这个时候内存中的进程就比较轻松在等待磁盘写入是否成功(条件一)的一个信息,操作系统的内存吃紧(条件二:)操作系统就会开始进行换入换出操作,当换入和换出比较更加紧张的时候就会进行进程的删除。
3.产生一个情况:磁盘进行数据写入完成没有成功,返回一个信息要给到进程,磁盘探了探头找进程,磁盘没有找到进程怎么办?当前磁盘也是非常的忙因为操作系统也一直在找磁盘进行换入换出,那么这个没有完成资源写入的操作的信息就被丢弃了!
4.有了上面的前提就知道了在 diak sleep 状态进程通常会等待IO结束!,这个状态也叫做不可中断睡眠!
5.最后呢这个状态是制作不了动图给大家看是因为如果我写一个数据需要disk sleep 我的操作系统离死也不远了!

在这里插入图片描述

3.停止状态(stoped — T):

1.进程停止状态就是一个直接停止一下之后什么也不去做了!
2.我们需要通过发送命令的方法进行进程停止的管理:
3.命令可以通过命令:kill -l 命令进行查询!
4. 19 (SIGSTOP)停止!
5. 18 (SIGCONT)进程开启!
6. 进程会进行前后台的切换,对应到状态就是字符后面有没有+ 号 , 有+号就是前台进程,没有+ 号就是后台进程!
7.前台进程可以通过 ctrl+c 结束程序!后台程序只能通过 kill -9 进程号 去删除进程!

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

4.死亡状态:

1.死亡状态是一个瞬时状态!这个时间非常非常短,学习过高中物理的同学应该知道有一个瞬时速度的概念跟这里的死亡的瞬时状态非常相似!

5.控制状态(t)

1.这个是我们在进行调试的时候的一个状态!
2.生成的可调试的degug程序进行调试可以观察到这个状态!

在这里插入图片描述

二.僵尸进程和孤儿进程:

1.僵尸状态:

1.下面这个代码的意思就是父进程产生一个子进程,分开进行运行然后子进程完成并且退出。
2.代码和数据被释放了,但是PCB task_struct 没有被释放里面保存着我们需要返回的值。
3.我们需要父进程把这个子进程PCB中的数据拿出来,我们的父进程一直没有去拿这个数据,task_struct 中的内容一直没有被释放在内存中!
4.产生内存泄漏,在系统中对于进程不进行task_struct 对象的释放也会产生内存泄漏!
5.数据读取完成之后task_struct Z -> X
6.所有的进程在结束之前都会产生一个情况就是 Z --> X 状态非常的快!
7.bash 会去自动读取父进程的返回状态!

int main()
{
    pid_t fither = getpid();
    pid_t tmp = fork();

    if(tmp == 0)
    {
        int cat = 5;
        while(cat!=0)
        {
            printf("I am child process pid:%d ppid:%d\n",getpid(),getpid());
            sleep(1);
            cat--;
        }
        exit(0);
    }

    else if(tmp>0)
    {
        while(1)
        {
            printf("I am fither process pid:%d ppid:%d\n",getpid(),getppid());
            sleep(1);
        }
    }
  
    return 0;
}

在这里插入图片描述

2.孤儿进程:

1.如果父进程先进行退出,然后子进程后退出。
2.如果父进程先退出,子进程就被称为“给 孤儿进程”
3.孤儿进程会被 1 号进程init进行领养,并且被1 号进程进行回收!

int main()
{
    pid_t fither = getpid();
    pid_t tmp = fork();

    if(tmp == 0)
    {
        while(1)
        {
            printf("I am child process pid:%d ppid:%d\n",getpid(),getpid());
            sleep(1);
        }
    }

    else if(tmp>0)
    {
        int cat = 5;
        while(cat!=0)
        {
            printf("I am fither process pid:%d ppid:%d\n",getpid(),getppid());
            sleep(1);
            cat--;
        }
        exit(0);
    }
  
    return 0;
}

在这里插入图片描述

三.进程优先级:

1.基本概念:

1.cpu 资源分配的先后顺序,就是指进程的优先级。
2.前提:进程访问某个资源,进程通过一定的方式进行排队确认享受资源的先后顺序!(因为资源比较少)
3.优先权高的有优先执行权限对多任务的linux 环境是非常有好处的!
4.为什么需要优先级(进程排队的方式),举一个例子如果学校的食堂的窗口比学校的所有人都要多基本上是不需要进行排队的!(需要排队:资源紧张!)

2.系统进程的详细信息!

1.命令:ps -l
2.ps -l 查询一些关于进程的信息:
在这里插入图片描述

在这里插入图片描述

3.PRI 和 NI

1.PRI 是优先级的值,值越小优先级越高。
2.PRI 是在[60 , 99]的这个范围里面。
2.PRI系统默认的大小是80:
4.NI 又叫nice(取值范围:[-20 , 19])值 , 是linux系统下用来调整优先级的工具我们不能直接调整PRI 的值是通过给nice值操作系统来进行数值意义的合并.
5.PID = 老的PID + nice 值 这个计算是操作系统在内核中完成的!并且这个操作是通过nice 值和 PID的值在一起进行统一管理优先级!
6.使用top 命令修改进程的nice值:进入top 后按 r 输入进程pid :输入nice值!
7.总结:进程的优先级不需要自己去手动更改这会影响操作系统的稳定性:这个东西是没有修改的必要的操作系统都给你做好了!

在这里插入图片描述

为什么设置优先级约束?
1.如果没有优先级的约束,程序员把自己的程序的优先级调整的非常高,别人的优先级就会比较低。
2.优先级高的进程先获取到资源,后续还会有源源不断的进程产生!
3.导致一个问题,自己程序的优先级较高导致常规进程(系统进程)获取不到资源(产生进程饥饿)

四:linux 进程调度与切换

1.其他概念:

1.竞争性:系统进程数目众多,并且cpu的资源只有一个,导致进程之间必然会产生竞争的关系,合理的竞争关系和资源分配所以产生了优先级!
2.独立性:多进程运行,每一个进程需要独享一个资源,多进程的运行互不干扰!
3.多个进程在多个cpu下同时的运行,这称之为并行。
4.多个进程在一个cpu下通过进程切换的方法,在一段时间里面,让多个进程都得以推进,这称之为并发。

2.进程切换:

1.进程切换是基于时间片进行轮转的方式进行推进多个进程。

3.进程调度:

1.cpu:中有许许多多的寄存器用来保存临时数据。
2.eax,ebx,ecx,edx, eip(pc指针,指向下一条程序的指针)。
3.跑一个进程:这个进程(数据+代码))就由寄存器保存。在cpu中的临时数据被称为硬件上下文。
4.一个进程的时间片已经到了那么程序没有运行完成当前已经执行的代码和产生的数据由对应进程的pcb保存起来!
5.下一个新的进程过来的时候通过赋值进行覆盖!
6.进程二次进行执行的时候代码和数据就直接从对应的pcb中去获取赋值到cpu上面。(二次调度)

在这里插入图片描述

五.环境变量:

1.mian函数参数(实现命令行的基础):

1命令行带参是实现linux下命令行参数的基础:
2.实现命令行参数是需要两个一个是 int argc 一个是 char* argv[] .
3.argc 用来保存argv中的char* 类型的数据的个数!

#include<stdio.h>
#include<stdlib.h>

int main(int argc , char* argv[])
{
    for(int i=0;argv[i];i++)
    {
        printf("%s\n",argv[i]);
    }

    return 0;
}

在这里插入图片描述

2.bash 获取命令行字符串是如何进行传参?

在这里插入图片描述
自己实现一个命令去进行加减乘除!

int main(int argc , char* argv[])
{
    if(argc == 4)
    {
        int a=atoi(argv[2]);
        int b=atoi(argv[3]);

        if(strcmp(argv[1],"add")==0)
            printf("%d+%d=%d\n",a,b,a+b);
        else if(strcmp(argv[1],"sub")==0)
            printf("%d-%d=%d\n",a,b,a-b);
        else if(strcmp(argv[1],"rid")==0)
            printf("%d*%d=%d\n",a,b,a*b);
        else if(strcmp(argv[1],"dev")==0)
        {
            if(b==0)
            {
                printf("The dividend cannot be zero!\n");
            }
            else 
            {
                printf("%d/%d=%d\n",a,b,a/b);
            }
        }
    }
    else
    {
        printf("user error: plase ./mybin [add|sub|rid|dev] a b\n");
    }
    return 0;
}

3.环境变量:

1.常见环境变量:

1.PATH:指定的命令搜索路径
2.HOME:当前用户的家目录也是登录进入的默认路径
3.SHELL当前shell 的路径一般是:/bin/bash
4. 命令:echo $环境变量名

在这里插入图片描述

2.如何把自己的程序变成不需要./就可以执行:

方法一:把当前可执行程序拷贝到系统的默认命令池中

在这里插入图片描述

方法二:把当前程序的路径添加到path这个环境变量中

在这里插入图片描述

3.注意:如果改变了path的默认路径这个操作是一次性的下一次打开服务器是回去默认值的!

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

3.环境变量相关命令:

1.echo $环境变量名 -------打印环境变量内容。
2.export 添加的环境变量名=路径 -------添加环境变量
3.env 查看当前的所有环境变量名称和路径
4.unset 变量名称 -------清除环境变量
5.set 显示本地定义的shell变量和环境变量!

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

4.代码获取环境变量:

1.命令行第三个参数!
2.通过bash进行管理保存的形式和argv 相同!

1.执行代码的效果和使用env命令相同!

int main(int argc , char* argv[],char* env[])
{
    for(int i=0;env[i];i++)
    {
        printf("%s\n",env[i]);
    }
    return 0;
}

5.获取单个环境变量:

1.使用getenv()函数
2.函数参数是环境变量的名称返回的是路径!

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

在这里插入图片描述

6.通过环境变量对程序进行加密:

1.获取当前用户名称!
2.进行名称的比较!
3.只有root可以冒充其他用户,这个程序起到了一个加密操作!

 60 int main()
 61 {
 62     char* tmp = getenv("USER");
 63 
 64     if(strcmp(tmp,"LIMO")==0)
 65     {
 66         printf("function()\n");                                     
 67     }
 68     else
 69     {
 70         printf("This program doesn't belong to you!\n ");
 71     }
 72     return 0;
 73 }

在这里插入图片描述

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

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

相关文章

同城服务足浴按摩软件系统开发方案;

足浴按摩软件是一款线上系统小程序&#xff0c;旨在方便用户在线预约按摩师、选择适合自己的服务项目和时间&#xff0c;并在家中或指定地点享受按摩服务。这款上门按摩小程序为用户提供了便利和个性化的按摩服务体验。 用户可以通过手机随时随地通过足浴按摩软件预约按摩师&am…

【java】编译时bug 项目启动前bug合集

文章目录 1. jdk8中 Optional orElseThrow 编译时报错java: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出2. 启动项目时提示 Error running Application: Command line is too long. Shorten command line for Application or also for Spring Boot default configurati…

【每日OJ —— KY11 二叉树遍历】

每日OJ —— KY11 二叉树遍历 1.题目&#xff1a;KY11 二叉树遍历2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;KY11 二叉树遍历 2.解法 2.1.算法讲解 1.首先需要创建二叉树结构。 2.其次&#xff0c;根据题目根据题目遍历的顺序要求来实现构建二叉树的…

基于mps的pytorch 多实例并行推理

背景 大模型训练好后&#xff0c;进行部署时&#xff0c;发现可使用的显卡容量远大于模型占用空间 。是否可以同时加载多个模型实例到显存空间&#xff0c;且能实现多个实例同时并发执行&#xff1f;本次实验测试基于mps的方案&#xff0c;当请求依次过来时&#xff0c;多个相…

【分布式事务】Seata 开源的分布式事务解决方案

1. 什么是seata Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 2. seata发展历程 阿里巴巴作为国内最早一批进行应用分…

使用 CSS Grid 的响应式网页设计:消除媒体查询过载

文章目录 前言介绍 CSS Grid让我们开始吧实现高级响应性1、Repeat() 2、Auto-fit3、Minmax()结论 前言 你是否厌倦了在实现响应式网站时需要管理多个媒体查询&#xff1f;说再见复杂的代码&#xff0c;拥抱更简单的解决方案吧&#xff1a;CSS Grid。 在这篇文章中&#xff0c;…

AI时代架构师之路:技术、洞察和创新的完美融合

随着人工智能技术的飞速发展&#xff0c;我们正置身于一个由数据驱动的时代。在这个充满无限可能性的AI时代&#xff0c;架构师成为设计和构建先进系统的关键角色。然而&#xff0c;在追逐技术的同时&#xff0c;架构师需要修炼一系列综合素养&#xff0c;使其在技术、业务和伦…

苍穹外卖——删除购物车信息

1. 删除购物车中一个商品 1.1 产品原型 1.2 接口设计 1.3 数据模型 shopping_cart表&#xff1a; -- auto-generated definition create table shopping_cart (id bigint auto_increment comment 主键primary key,name varchar(32) null comment 商品名称…

Jmeter接口自动化测试断言之Json断言

json断言可以让我们很快的定位到响应数据中的某一字段&#xff0c;当然前提是响应数据是json格式的&#xff0c;所以如果响应数据为json格式的话&#xff0c;使用json断言还是相当方便的。 还是以之前的接口举例 Url: https://data.cma.cn/weatherGis/web/weather/weatherFcst…

【LeetCode】 160. 相交链表

相交链表 题目题解 题目 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&am…

python实现决策树可视化Graphviz和plot_tree

文章目录 效果展示graphviz安装教程实例演示数据集介绍属性说明划分训练集、测试集graphviz可视化plot_tree效果展示 graphviz安装教程 实例演示 数据集介绍 Wine葡萄酒数据集是来自UCI上面的公开数据集,这些数据是对意大利同一地区种植的葡萄酒进行化学分析的结果,这些葡…

C++-设计一个特殊类

目录 一.设计一个类&#xff0c;不能被拷贝 二.设计一个类只能在堆上创建对象 三.设计一个类只能在栈上创建对象 四. 请设计一个类&#xff0c;不能被继承 五.请设计一个类&#xff0c;只能创建一个对象(单例模式) 1.单例模式&#xff1a; 2. 饿汉模式 一.设计一个类&#x…

服务器巡检表

《服务器巡检表》检查项&#xff1a; 1、系统资源 2、K8S集群 3、Nginx 4、JAVA应用 5、RabbitMQ 6、Redis 7、PostgreSQL 8、Elasticsearch 9、ELK日志系统 获取软件开发全套资料进主页。

Python实现FA萤火虫优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

shell编程系列(8)-使用sed处理文本

文章目录 引言sed用法详解在文本中定位打印文本替换文本删除文本新增文本 结语 引言 在日常工作学习中我们都会遇到要编辑文本的场景&#xff0c;例如我们要用vim或者nano等命令去编辑代码&#xff0c;处理文本文件等&#xff0c;这些命令的特点都是需要我们进行交互式的实时处…

Set系列的集合

无序&#xff1a; 存取的顺序不一样 不重复&#xff1a;可以去重 无索引&#xff1a;不能使用普通for进行遍历&#xff0c;也不能通过索引获取元素 Set集合的实现类 HashSet&#xff1a;无序&#xff0c;不重复&#xff0c;无索引 LinkedHashSet&#xff1a;有序&#xff…

【报名】2023产业区块链生态日暨 FISCO BCOS 开源六周年生态大会

作为2023深圳国际金融科技节系列活动之一&#xff0c;由深圳市地方金融监督管理局指导&#xff0c;微众银行、金链盟主办的“2023产业区块链生态日暨FISCO BCOS开源六周年生态大会”将于12月15日下午14:00在深圳举办。 今年的盛会将进一步升级&#xff0c;以“FISCO BCOS和TA的…

自定义函数中的(int*a,int*b)与(int*a,int n)

事实上第一种更安全&#xff0c;不会因越界发生占位&#xff0c;从而导致错误。

三个方法,rar格式转换为zip压缩包

今天和大家分享三个rar压缩包改成zip格式的方法&#xff0c;希望能够帮助到大家&#xff01; 方法一&#xff1a; 直接修改rar压缩包的后缀名变为zip&#xff0c;就可以修改压缩包文件格式了 方法二&#xff1a; 先将rar压缩包解压出来&#xff0c;然后再将解压出的文件进行…

【技术分享】远程透传网关-单网口快速实现西门子S7-200 串口PLC程序远程上下载

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条&#xff0c;用于实现网络连接一台西门子S7-200 PLC及其编程软件一个9针串口头及连接线&#xff0c;用于连接PLC一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡&#xff0c;WIFI联…