0
点赞
收藏
分享

微信扫一扫

【Linux】进程概念万字详解(上篇)

上善若水山西太原 2022-09-09 阅读 215

目录

🍃1. 冯诺依曼体系结构

  • 概念
  • 体系结构

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系.

在这里插入图片描述

我们所认识的计算机,都是有一个个的硬件组件组成:

注意

  • 数据流向

我们先看一下计算机的存储分级:

在这里插入图片描述
通过这个图,我们可以理解为什么计算机的数据流向是固定的:

  • 实例

请添加图片描述


🍃2. 操作系统

  • 概念

何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:

  • 设计OS的目的
  • 计算机体系

请添加图片描述

注意

  • 系统调用和库函数概念
  • 管理

那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢?很简单,先把进程描述起来,再把进程组织起来!

用学校来举例:


🍃3. 进程

  • 基本概念:
  • 描述进程-PCB

请添加图片描述

说明:

请添加图片描述

  • task_ struct内容分类

🍃4. 查看进程

在这里插入图片描述

在这里插入图片描述

  • 关闭进程

请添加图片描述

  • 以文件形式查看进程 ——/proc是Linux系统下查看进程的目录
ls /proc

在这里插入图片描述

ls /proc/pid

在这里插入图片描述

ll /proc/pid

请添加图片描述


🍃5. 创建子进程fork

  • 什么是fork

在这里插入图片描述

  • 使用 fork 创建进程

在这里插入图片描述

在这里插入图片描述

  • 理解fork

在上面的代码中,我们发现一个程序有两个返回值,我们来进一步理解

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
void DoThing()
{
	int count = 0;
 	while(count < 5)
    {
        printf("pid : %d, ppid : %d, count : %d\n", getpid(), getppid(), count);
        count++;
        sleep(1);
    }
}
int main()
{
    pid_t ids[5];
    printf("I am father : %d\n", getpid());
    for(int i = 0; i < 5; i++)
    {
        ids[i] = fork();
        if(ids[i] == 0)
        {
            //child
            DoThing();
            exit(1);
        }
    }
    printf("%d %d %d %d %d\n", ids[0], ids[1], ids[2], ids[3], ids[4]);
    getchar();                                                                                                                                                                          

    return 0;
}



🍃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 *task_state_array[] = {
	"R (running)",       /*  0*/
    "S (sleeping)",      /*  1*/
    "D (disk sleep)",    /*  2*/
    "T (stopped)",       /*  4*/
    "T (tracing stop)",  /*  8*/
    "Z (zombie)",        /* 16*/
    "X (dead)"           /* 32*/
};

进程变迁图:

在这里插入图片描述


  • 查看进程
ps aux

在这里插入图片描述

ps axj

请添加图片描述


  • R运行状态(running)

请添加图片描述

查看运行状态:

#include<iostream>      
#include<sys/types.h>      
#include<unistd.h>      
      
int main()      
{      
  while(true);    
  return 0;    
}  

在这里插入图片描述


  • S 浅度睡眠状态(sleeping)

请添加图片描述

查看运行状态:

#include<stdio.h> 
#include<unitsd.h>     
int main()      
{      
  sleep(100) ; //睡眠100秒
  return 0;    
}  

在这里插入图片描述

  • 挂起状态(也属于S 状态)

请添加图片描述


  • D 深度睡眠状态(Disk sleep)

在这里插入图片描述


  • T暂停状态(stopped)

我们先看看kill指令:

请添加图片描述

暂停进程

在这里插入图片描述

请添加图片描述

那要怎么样才能暂停呢?

请添加图片描述


  • X死亡状态(dead)
  • Z僵尸状态(Zombie)

🌿6.1 僵尸进程

写一个监控命令行脚本,语法类似C语言:

while :; do ps axj | head -1 && ps axj | grep practice | grep -v grep; sleep 1; echo "########################"; done
  1 #include <stdio.h>
  2 #include <unistd.h>
  3 
  4 int main()
  5 {
  6   pid_t id = fork();
  7   if(id == 0)
  8   {
  9     //child    
 10     while(1)
 11     {                                                                                                                          
 12     printf("I am a child, running!\n");
 13       sleep(2);
 14     }
 15   }
 16   else
 17   {
 18     //parent    
 19     printf( "father do nothing!\n");
 20     sleep(50);
 21   }
 22   return 0;
 23 }

在这里插入图片描述

  • 僵尸进程危害

🌿6.2 孤儿进程

代码演示:

 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 
  5 int main()
  6 {
  7   pid_t id = fork();
  8   if(id == 0)
  9   {
 10     //child    
 11     while(1)
 12     {
 13     printf("I am a child, running!\n");
 14       sleep(2);
 15     }
 16   }
 17   else
 18   {
 19     //parent    
 20     printf( "father do nothing!\n");
 21     sleep(10);
 22     exit(1);                                                                                             
 23   }
 24   return 0;
 25 }

在这里插入图片描述


🍃7. 进程优先级

  • 基本概念
  • 查看优先级
ps -l

在这里插入图片描述

我们很容易注意到其中的几个重要信息,有下:

UID:
在这里插入图片描述

  • PRI and NI
  • PRI vs NI

🌿 调整优先级

  • 调整优先级:
top
进入top后按"r" → 输入进程PID → 输入nice值

PRI的默认值是80
在这里插入图片描述

进入top
请添加图片描述

按r,输入PID值

请添加图片描述

输入nice值,然后按q退出

在这里插入图片描述

此时我们再用ps命令查看进程的优先级信息,即可发现进程的NI变成了10,PRI变成了90(80+NI)。

在这里插入图片描述

注意:若是想将NI值调为负值,也就是将进程的优先级调高,需要使用sudo命令提升权限。

  • 四个重要概念

🍃8 . 环境变量

  • 基本概念:

🌿 常见环境变量

  • 查看环境变量的方法

我们可以通过echo命令来查看环境变量,方式如下:

echo $NAME //NAME为待查看的环境变量名称

查看环境变量PATH

echo $PATH

在这里插入图片描述

  • 测试PATH

创建文件

#include <stdio.h>
int main()
{
printf("hello world!\n");
return 0;
}

在这里插入图片描述

在这里插入图片描述

  • 解决方法

  • 测试HOME

普通用户
请添加图片描述

超级用户
请添加图片描述


🌿 环境变量相关的命令

echo显示某个环境变量值
export设置一个新的环境变量
env显示所有环境变量
unset清除环境变量
set显示本地定义的shell变量和环境变量

  • 环境变量的组织方式

在这里插入图片描述


🌿 通过代码如何获取环境变量

请添加图片描述

方法一:命令行第三个参数

#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
int i = 0;
for(; env[i]; i++){
printf("%s\n", env[i]);
}
return 0;
}

运行结果就是各个环境变量的值:
请添加图片描述

方法二:通过第三方变量environ来获取。

#include <stdio.h>
int main(int argc, char *argv[])
{
extern char **environ;
int i = 0;
for(; environ[i]; i++){
printf("%s\n", environ[i]);
}
return 0;
}

请添加图片描述


🌿 通过系统调用获取环境变量

例如,使用getenv函数获取环境变量PATH的值。
请添加图片描述

举报

相关推荐

0 条评论