中秋节爆肝万字,带你熟悉Linux进程的基本操作!!!_在linux中秋,(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

图片来自网络,侵联删

图片来自网络,侵联删

Linux进程基本操作

1.进程基本概念

在Linux中进程信息被保存在task_struct(PCB)

2.查看进程的方法
ps 

ps aux | greap myproc

ls /proc

3.创建进程

fork():创建一个子进程

#include<iostream>
#include<unistd.h>
using namespace std;
int main()
{
    fork();
    while(1)
    {
        printf("hehe\n");
    }
    return 0;
}

fork之前的代码,被父进程执行,fork之后的代码,父子都可以执行

fork之后,父子进程代码共享

fork之后,父子进行那个先运行不确定,取决于操作系统调度算法

fork函数会有两次返回值,给父进程返回子进程pid,给子进程返回0

image-20210911194317560

  6   pid_t id=fork();
  7   if(id==0)
  8   {
  9     while(1)
 10     {
 11       printf("我是子进程\n");
 12       sleep(1);
 13     }
 14   }
 15   else if(id>0)
 16   {
 17     while(1)
 18     {
 19       printf("父进程\n");
 20       sleep(2);
 21     }
 22   }
 23   else
 24   {
 25     printf("进程创建失败\n");                                                   
 26   }
 27   return 0

image-20210911195055735

结果:父子进程同时执行

4.进程的状态

进程状态------>数据化-------->进程数据被保存到tack_struct中

进程主要有以下几种状态:

R状态:

可以同时存在多个R状态的进程

R状态的进程不一定是正在运行的,表示随时可以调用该进程

系统中所有处于R状态的进程都会被连接起来形成调度队列(run_queue)

S状态:休眠状态(浅度睡眠)通常用来等待某种事件发生,随时可以被唤醒,也可以被杀掉

//休眠状态
#include<stdio.h>
#include<unistd.h>
int main()
{
  printf("I am Running\n");
  sleep(10000000);
  printf("Ending\n");
  return 0;
}

D状态:深度睡眠状态,D状态没有办法模拟,表示该进程不会被杀掉,即便是操作系统,除非重启杀掉,或者主动醒来

image-20210911202604639

T状态:将进程进行暂停

如上图所示,摁下19sigstop即可暂停进程

X状态:死亡进程

Z状态:僵尸状态

进程退出,在操作系统层面,曾经申请的资源,并不是被立即释放,而是要暂存一段事件,供OS(父进程)进行读取,,而父进程没有读取,叫做僵尸状态

为什么要有僵尸进程:

进程创建的目的:完成某种工作

当任务完成的时候,调用方应该指导任务完成得怎么样

(除非不关心)

sjw@iZ2zedu4njy79sqivntvprZ test_9_11]$ cat test.c
#include<stdio.h>
#include<unistd.h>
int main()
{
  printf("I am Running\n");
  sleep(10000000);
  printf("Ending\n");
  return 20;
}
[sjw@iZ2zedu4njy79sqivntvprZ test_9_11]$ echo $?//查看进程码,查看最近一次进程退出时得进程码(如返回值return 0等)
//进程退出时,进程信息(退出码)是会被暂时保存起来的,相关信息被保存到task\_struct,此时,该task\_struct相关数据不应该被释放掉 Z
当有进程来读取信息时,task_struct被释放
如何读取信息:进程wait

进程退出的信息(退出码)会被暂时保存起来

保存在task_struct中,如果没有人读取,此时,task_struct相关数据不应该被释放

模拟僵尸状态:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
  pid_t id=fork();
  if(id==0)
  {
    int count=5;
    while(count)
    {
      printf("I am child, pid:%d, ppid:%d, count:%d\n",getpid(),getppid(),count--);
    sleep(1);
    }
    printf("child exit......\n");
    exit(-1);
  }
  else if(id>0)
  {
    while(1)
    {
      printf("I am father,pid:%d, ppid:%d\n",getpid(),getppid());
      sleep(1);
    }
  }
  else
  {
    printf("fork fail\n");
  }
  return 0;
}


[sjw@iZ2zedu4njy79sqivntvprZ test_9_11]$ make clean
rm -rf *.o myproc
[sjw@iZ2zedu4njy79sqivntvprZ test_9_11]$ make
gcc -c test.c -o test.o
gcc -o myproc test.o
[sjw@iZ2zedu4njy79sqivntvprZ test_9_11]$ ./myproc
I am father,pid:9259, ppid:308
I am child, pid:9260, ppid:9259, count:5
I am father,pid:9259, ppid:308
I am child, pid:9260, ppid:9259, count:4
I am father,pid:9259, ppid:308
I am child, pid:9260, ppid:9259, count:3
I am father,pid:9259, ppid:308
I am child, pid:9260, ppid:9259, count:2
I am father,pid:9259, ppid:308
I am child, pid:9260, ppid:9259, count:1
I am father,pid:9259, ppid:308
child exit......
I am father,pid:9259, ppid:308
I am father,pid:9259, ppid:308
I am father,pid:9259, ppid:308
I am father,pid:9259, ppid:308
I am father,pid:9259, ppid:308
^Z


然后在另外一个窗口输入以下监控脚本:

image-20210911210810042

while :; do ps aux | head -1 && ps aux | grep myproc|grep -v grep;echo "#############################"; sleep 1; done

刚开始运行时,二者都是S状态,到子进程运行完毕退出进行时,子进程编程僵尸进程

image-20210911211033832

僵尸进程的危害:

造成内存浪费

造成内存泄漏

孤儿进程

Linux中,进程关系,主要是父子关系,

孤儿进程:父进程退出,子进程还在运行

孤儿进行会立即被系统领养(操作系统:1号进程Init)

​ 监控脚本:

while :; do ps axj | head -1 && ps axj | grep myproc|grep -v grep;echo "#############################"; sleep 1; done

#include<stdio.h>
#include<stdlib.h>
#include<unstd.h>
int main()
{
	pid_t id=fork();
	if(id==0)
	{
		while(1)
		{
			printf("I am child,pid:%d,ppid:%d\n",getpid(),getppid());
			sleep(1);
		}
	}
	else if(id>0)
	{
		int count=5;
		while(count)
		{
			printf("I am father,pid:%d,ppid:%d,count:%d\n",getpid(),getppid(),count--);
		}
		exit(-1);
	}
	return 0;
}

查看进程:

ps aux |grep Mytest

进程是能够知道自己当前所处的工作目录的

5.进程的优先级

cpu分配资源的先后顺序,即是进程的优先级,优先级越高说明进程被执行的越早

在Linux下输入:

ps -l

image-20210917191658420

出现如上图所示的结果,有几个内容需要我们关注一下:

UID:代表执行者的身份

PID:当前进程的代号

PPID:父进程的代号

PRI:代表进程的优先级,该数字越低,代表进程的优先级越高,被执行的越早(默认该值为80)

NI:代表进程的nice值

NI与PRI的关系:

PRI用来表示进程的优先级,该值越低,代表进程的优先级越高,被执行的越早,该值默认为80,而NI用来改变进程的优先级,NI的取值范围为-2019,PRI(new)=PRI(old)+NI,也就是说我们通过修改NI的值来改变进程的优先级,那么被修改后的进程优先级PRI的取值范围为6099,60代表优先级最高的,99代表优先级最低(ps:每次修改PRI后再次修改时PRI默认为80,在80的基础上进行修改)

修改进程优先级的方法:

 top命令--->输入r--->输入想要修改的进程的pid--->输入NI值--->q保存退出

image-20210917193108076

如上图所示我们将上面的进程NI修改为20,而PRI变为60,即最高优先级

其它概念:

独立性:多个进程独自运行,独自享受各种资源,多个进程之间互不干扰

并行:多个进程在多个CPU上分别,同时进行运行

并发:多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程得以推进,称为并发

6.环境变量

环境变量一般使之操作系统中用来指定运行环境得一些参数

如:编写c/c++代码时,在连接的时候,从来不知道我们所连接的动态静态库在哪里,但是照样链接得动,就是相关环境变量帮助环境变量进行查找

常见环境变量

PATH:指定当前搜索路径

HOME:指定用户的主工作目录(即用户登录到LInux系统中时,默认的目录)

SHELL:当前Shell,它的值通常为/bin/bash

查看环境变量的方法

echo $NAME//NAME:你的环境变量名称

image-20210917194515582

我们执行mpproc时前面必须加./,而执行ls之类的却不用加,就是因为ls进行了环境变量的配置,我们也可以进行配置,使之向ls一样直接执行

sudo cp -f mpproc /usr/bin
//直接将我们的可执行程序mpproc复制到/usr/bin目录下,但是这种方法不推荐,因为以后如果同名的或者该目录下文件过多可能会造成误删

image-20210917195215201image-20210917195255911

这样我们就可以像ls一样执行mpproc,除了这种方式之外还有一个更推荐的方法

首先我们先删除这次的配置:

sudo rm -rf /usr/bin/mpproc
//注意不要直接把bin目录直接给删了

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
TO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
[外链图片转存中…(img-mq5EeUYC-1713480256689)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值