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     else69     {70         printf("This program doesn't belong to you!\n ");71     }72     return 0;73 }

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管理员配置Jupterhub

在Ubuntu上演示如何部署R语言环境&#xff0c;包括 posit的已经编译了一些R的安装 系统已经装了R&#xff0c;我额外编译的R如何让大家都能用到 如何配置RStudio jupyterhub的配置和使用 管理员如何配置jupyterhub 用户如何配置自己的jupyter环境 Ubuntu上的R部署 这一次…

Mendix UI页面布局以案说法

一、前言 试着回想最近一次与公司网站交互的情况&#xff0c;访问了多个页面&#xff0c;并且可能使用了某些功能。有可能基于这种互动&#xff0c;可以向某人介绍公司的一些主要功能。其中一些可能是更肤浅的东西&#xff0c;比如他们的标志是什么样子或他们的主要配色方案是…

笔记二十四、剖析Redux的工作流程

24.1 定义 用做于状态管理的第三方 js 库react框架中使用&#xff0c;也可应用于其他的框架 使用场景 组件间需要共享状态和改变另一个组件的状态在react项目中可以不使用就尽量不用&#xff0c;复杂场景下才使用 24.2 原理图 24.3 代码 安装 yarn add reduxjs/toolkit rea…

GPIO的使用--操作PE02 PE03 PE04实现开关控制灯泡亮灭

效果&#xff1a; 开关控制灯的亮灭 目录 1.找到引脚组别(DEFG) led灯硬件结构 开关硬件结构 2.时钟使能 3.GPIO时钟控制 4.控制实现思路 5. 完整代码 6.视频演示 1.找到引脚组别(DEFG) 开关的引脚组别--E&#xff1b;LED灯的引脚组别--F led灯硬件结构 开关硬件结构…

【linux】基本指令(上篇)

1.快速认识5~6个指令 pwd指令 ls指令 touch指令 cd指令 clear指令 touch指令 详细讲解 首先有一个问题就是当我们创建一个文件&#xff0c;但是没有往里面写内容&#xff0c;那么磁盘上会有该文件吗&#xff1f; 磁盘上会保存&#xff0c;因为创建好的文件&#xff0c;没有…

IDEA安装python插件并配置

目录 一、Mac1. 安装插件2. 新建项目3. 下载第三方库4. 配置镜像源 一、Mac 1. 安装插件 在plugins中搜索python 2. 新建项目 使用本项目独享的虚拟环境&#xff0c;选择解释器 如果需要修改解释器可以进入project structure&#xff0c;在SDKs中点击&#xff0c;选择add py…

clip-path,css裁剪函数

https://www.cnblogs.com/dzyany/p/13985939.html clip-path - CSS&#xff1a;层叠样式表 | MDN 我们看下这个例子 polygon里有四个值分别代表这四个点相对于原图左上方的偏移量。 裁剪个五角星

解决vue3项目打包发布到服务器后访问页面显示空白问题

1.在 vite.config.ts 文件中 加入 base:./ 当你将 base 设置为 / 时&#xff0c;它表示你的应用程序将部署在服务器的根路径上&#xff0c;&#xff08;将 base 设置为 / 表示你的应用程序部署在服务器的根路径上&#xff0c;并且 Vite 会相应地处理资源和路由的路径…

【UE】制作一块布

效果 步骤 1. 新建一个空白模板工程&#xff0c;新建一个Basic关卡 2. 选项模式选择“建模” 3. 创建一个矩形 宽度、深度设为500&#xff0c;宽度细分和深度细分设置为100&#xff0c;然后点击接受 此时在浏览器中编辑器也帮我们创建了一个矩形的静态网格体&#xff0c;这里…

Peter算法小课堂—差分与前缀和

差分 Codeforces802 D2C C代码详解 差分_哔哩哔哩_bilibili 一维差分 差分与前缀和可以说成减法和加法的关系、除法和乘法的关系、积分和微分的关系&#xff08;听不懂吧&#xff09; 给定数组A&#xff0c;S为A的前缀和数组&#xff0c;则A为S的差分数组 差分数组构造 现…

TCP/IP_整理起因

先分享一个初级的问题&#xff1b;有个客户现场&#xff0c;终端设备使用客户网络更新很慢&#xff0c;使用手机热点更新速度符合预期&#xff1b;网络部署情况如下&#xff1a; 前期花费了很大的精力进行问题排查对比&#xff0c;怀疑是客户网络问题&#xff08;其他的客户现…

微信开发者工具真机调试连接状态在正常和未连接之间反复横跳

开启局域网模式能解决这个问题&#xff0c;目前只找到这一个方法

Ubuntu安装HP LaserJet P3010系列打印机驱动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装驱动二、其它设置总结 前言 最近在研究Ubuntu Desktop版&#xff0c;无意间看到了打印机选项&#xff0c;就好奇去试了试。居然配置成功了&#xff0c…

单片机实验(三)

前言 实验一&#xff1a;利用定时器T1的中断控制P1.7引脚输出音频信号&#xff0c;启动蜂鸣器发出一段熟悉的与众不同的具有10个音节的音乐音频。 实验二&#xff1a;使用定时器/计数器来实现一个LCD显示年、月、日、星期 、时、分、秒的电子表&#xff0c;要求时和分可以方便…

负电源电压转换-TP7660H

负电源电压转换-TP7660H 简介引脚说明典型应用电路倍压与反压的应用电路 简介 TP7660H 是一款 DC/DC 电荷泵电压反转器专用集成电路。芯片能将输入范围为 2.5V&#xff5e;11V 的电压转换成相应的-2.5V&#xff5e;-11V 的输出&#xff0c;电压转换精度可达99.9%&#xff0c;电…

女子曝被医生男友下药流产,男子被警方行拘10日,医院停职!

近日&#xff0c;一则关于女子被医生男友暗中下堕胎药导致流产的消息引起了广泛关注。经过一个多月的报案和调查&#xff0c;如今有了新的进展。 11月30日&#xff0c;王女士向华商报大风新闻记者证实&#xff0c;北京中关村某医院涉事医生已被行政拘留&#xff0c;被处以行政拘…

RabbitMQ学习一

RabbitMQ学习 RabbitMQ相关概念Virtual host数据隔离SpringAMQP第一种 基本消息模型第二种 WorkQueues模型第三种 发布订阅模型&#xff08;fanout交换机&#xff09;fanout交换机实例 第四种 Direct交换机direct交换机实例基于注解的方式声明——direct交换机 第五种Topic交换…

Spring Security 6.x 系列(7)—— 源码分析之Builder设计模式

一、Builder设计模式 WebSecurity、HttpSecurity、AuthenticationManagerBuilder 都是框架中的构建者&#xff0c;把他们放到一起看看他们的共同特点&#xff1a; 查看AuthenticationManagerBuilder的继承结构图&#xff1a; 查看HttpSecurity的继承结构图&#xff1a; 查看W…

记录 | onnx-simplifier安装、使用

安装&#xff1a; pip install onnx-simplifier# 若想加速 # [可选] 使用豆瓣源加速 pip install -i https://pypi.douban.com/simple onnx-simplifier# [可选] 使用阿里源加速 pip install -i http://mirrors.aliyun.com/pypi/simple onnx-simplifier使用&#xff1a; pytho…

vue开发中遇到的问题记录

文章目录 前言1、css 即时使用了scoped子组件依然会生效2、路由配置如果出现重复name&#xff0c;只会生效最后一个&#xff0c;且前端的路由无效3、组件之间事件传递回调需要先定义emits: []&#xff0c;不然会警告提示4、动态配置数据中引入了组件为参数&#xff0c;出现警告…