linux基础五:linux 系统(进程状态+进程优先级+调度和切换+环境变量)

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.通过环境变量对程序进行加密:
      • 7:本地变量和环境变量的区别!
    • 4.环境变量一开始是从哪里获取到的?

一.进程状态:

/*
* 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.函数参数是环境变量的名称返回的是路径!

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

在这里插入图片描述

2.使用:environ变量获取
3.需要通过extern 进行声明:
4.和遍历env的效果差不多!

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

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 }

在这里插入图片描述

7:本地变量和环境变量的区别!

1.如何去创建一个本地变量直接变量名称=变量内容
2.环境变量具有全局属性可以在父子之间进行继承。
3.本地变量只能通过echo $变量名称 打印本地变量内容。
4.在代码中的getenv函数获取不到本地变量!
5.只在bash中有效并且不可以被子进程去获取到!

在这里插入图片描述

在这里插入图片描述

4.环境变量一开始是从哪里获取到的?

1.bash 一旦登录就启动的!
2.在用户家目录下有一个 ./bash_profile 文件提供用户开始的环境变量!
3.可以改变给 ./.bash_profile 中添加内容可以让bash刚刚打开的时候就打印出我们想要的内容!
4.我们观察到其实.bash_profile中添加的环境变量不多主要都还在文件/etc/bashrc中!

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

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

在这里插入图片描述

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

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

相关文章

基于51单片机风扇控制器系统设计

**单片机设计介绍&#xff0c;基于51单片机风扇控制器系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的风扇控制器系统是一种用于控制风扇转速和温度管理的电子设备。下面是一个简单的设计介绍&#xff1a;…

Python小案例:打印10以内的素数

解析 1、利用循环控制范围&#xff08;1,100&#xff09; 2、通过循环判断素数 3、利用标记位法进行打印素数 代码 #求1——100之间的素数 for i in range(2,101):# 设置标记位is_primeNumis_primeNum Truefor j in range(2,i):if i%j 0:# print(f"{i}不是素数"…

第三方支付原理

1.什么是第三方支付 所谓第三方支付&#xff0c;就是一些和各大银行签约、并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台。在通过第三方支付平台的交易中&#xff0c;买方选购商品后&#xff0c;使用第三方平台提供的账户进行货款支付&#xff0c;由第三方通知卖…

04.里氏替换原则(Liskov Substitution Principle)

暴论&#xff1a;一般的&#xff0c;如果一个富二代不想着证明自己&#xff0c;那么他一辈子都会衣食无忧。 一言 里氏替换原则想告诉我们在继承过程中会遇到什么问题&#xff0c;以及继承有哪些注意事项。 概述 这是流传较广的一个段子&#xff1a; “一个坐拥万贯家财的富二…

博客文章SEO:提升博客排名和吸引更多读者的方法来啦!

互联网发展到现在&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;一直发挥着不可替代的作用。搜索引擎的流量往往更加定向&#xff0c;来自搜索引擎的流量转化率更高&#xff0c;可以帮助企业更好地实现销售和推广目标。因此&#xff0c;通过合理的SEO策略&#xff0c;你…

Data Linked UI

DataLinkedUl是一个Unity框架,它允许您在为您的应用程序创建用户界面时实现专业的数据驱动方法。使用此资产,您可以创建灵活的基于瓦片的任意大小的复杂接口系统。 核心功能: 灵活性-允许适应和调整数据变化,允许各种结构和功能配置,而不需要对现有系统进行重大破坏。 可伸…

跨境独立站反向代购系统是什么?如何搭建?

淘宝代购是近年兴起的一种购物模式&#xff0c;是帮国外客户购买中国商品。主要是通过万邦 科技的外贸代购系统&#xff0c;把淘宝、天猫等电商平台的全站商品通过API 接入到你的网站 上&#xff0c;瞬间就可以架设一个有数亿产品的大型网上商城&#xff0c;而且可以把这些中文…

BFD多跳检测配置

定义 双向转发检测BFD&#xff08;Bidirectional Forwarding Detection&#xff09;是一种全网统一的检测机制&#xff0c;用于快速检测、监控网络中链路或者IP路由的转发连通状况。 目的 为了减小设备故障对业务的影响&#xff0c;提高网络的可靠性&#xff0c;网络设备需要…

Hadoop学习笔记(HDP)-Part.16 安装HBase

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

暂时pass的题目的学习笔记(按类型分类 ):动态规划、递归

动态规划类 学习笔记来自公众号labuladong 动态规划的一般形式就是求最值——其核心问题是穷举但动态规划的穷举有些特别&#xff0c;因为这类问题存在重叠子问题 如果暴力穷举的话效率会极其低下&#xff0c;所以需要**「备忘录」或者「DP table」**来优化穷举过程&#xff…

广州华锐视点:VR仿真实训室中控系统成为VR课堂教学必备工具

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐走进我们的生活。从游戏娱乐到医疗教育&#xff0c;VR技术的应用范围日益广泛。近年来&#xff0c;VR技术在教育领域的应用也取得了显著的成果&#xff0c;为提高教育质量和培养创新人才提供了全…

【Linux】less 命令使用

less命令 less 与 more 类似。 less是一个非常常用的文本查看工具&#xff0c;它可以用于查看任意大小的文本文件&#xff0c;支持滚动翻页、搜索、标记等功能。在本文中&#xff0c;我们将详细介绍less命令的用法、参数和实例&#xff0c;并对其背后的原理和相关技术进行简要…

Spring 的设计思想、创建和使用、Bean 作用域和生命周期

文章目录 Spring 设计思想Spring 是什么&#xff1f;什么是 IoC&#xff1f; Spring 创建和使用创建 Spring 项目注册 Bean 对象获取并使用 Bean 对象 Spring 更方便地存储和读取对象配置文件使用注解使用类注解使用方法注解 获取 Bean 对象属性注入Setter 注入构造方法注入Res…

ORACLE数据库实验总集 实验二 Oracle数据库逻辑存储结构管理

一、实验目的 &#xff08;1&#xff09;掌握 Oracle数据库表空间的管理 &#xff08;2&#xff09;掌握数据库表空间不同状态时对数据操作的影响。 二、实验要求 &#xff08;1&#xff09;分别创建永久性表空间、临时性表空间、撤销表空间 &#xff08;2&#xff09;完成表…

Vue--第六天

vuex概述&#xff1a; 组件通信感觉有点白雪。。。。。。。。。。 创建项目&#xff1a; 为了学习简介&#xff0c;先选几个&#xff0c;后续是要勾选很多的 建好后再进行组件导入 创建空仓库&#xff1a; 使用&#xff1a; 上面是store访问&#xff0c;下面是辅助函数的方式…

2023年个人工作总结怎么写?工作任务完成自动记录的待办软件

2023年已经接近尾声&#xff0c;不少人已经开始期待新的一年到来了。不过对于大多数职场人士来说&#xff0c;最近还有一项让人头疼的任务需要完成&#xff0c;这就是撰写2023年个人工作总结。 那么年度个人工作总结怎么写呢&#xff1f;其实很简单&#xff0c;年度工作总结一…

5、RocketMQ-Producer生成消息过程 (五)

生产者已经被启动了&#xff0c;接下来我们就得研究研究如何去发送消息给Broker。 前面分析Producer的启动逻辑&#xff0c;启动完成之后就是发消息&#xff0c;接下来我们就来分析Producer的send消息过程&#xff0c;同时发消息过程中存在一些问题以及解决方法也得考虑。 查…

Java POI读写Excel文档

Java POI读写Excel文档 简介 由apache公司提供Java编写的免费开源的跨平台的Java API提供API给Java程序对Microsoft Office格式档案读和写的功能 包结构 HSSF读写Microsoft Excel XLS(2003版本的Excel)XSSF读写Microsoft Excel OOXML XLSXHWPF读写Microsoft Word DocHSLF提…

Honeywell PM43 loadfile.lp RCE漏洞复现(CVE-2023-3710)

0x01 产品简介 Honeywell PM43 是美国霍尼韦尔&#xff08;Honeywell&#xff09;公司的一款打印机产品。 0x02 漏洞概述 Honeywell PM43 P10.19.050004之前版本存在输入验证错误漏洞&#xff0c;攻击者可通过该漏洞在服务器端任意执行代码&#xff0c;写入后门&#xff0c;获…

行云海CMS SQL注入漏洞复现

0x01 产品简介 行云海cms是完全开源的一套CMS内容管理系统,简洁,易用,安全,稳定,免费。 0x02 漏洞概述 行云海cms中ThinkPHP在处理order by排序时可利用key构造SQL语句进行注入,LtController.class.php中发现传入了orderby未进行过滤导致sql注入。攻击者除了可以利用 SQL 注入…
最新文章