Linux 进程管理

目录

一:进程

二:程序 & 进程

三:Linux 进程管理

四:进程ID

五:进程树

六:进程管理

七:进程状态

八:进程状态切换

九:初始化进程

十:获取进程标识


一:进程

在windows环境下 通过ctrl + shift +esc可以调出任务管理器,可以看到进程

可以看到VM虚拟机,QQ,VS2019在运行

可以看到当前的程序占用了多少的CPU,占用了百分之多少的内存,占用了百分之多少的磁盘,占用了百分之多少的网络,占用了百分之多少的GPU(也就是显卡,有的应用会占用显卡,有的应用不会)

比如腾讯会议是有公屏的就会占用显卡,进程中,那些数字是一直跳动的

需要深入了解一下程序和进程

二:程序 & 进程

什么是程序?

程序只有在运行的时候,在进程的面板上才可以查看到

若是进程上没有看到程序,但是程序仍然存在于电脑[硬盘]中

程序是一种静态的概念,进程是一种动态的概念

程序在安装成功后,就存储在磁盘(硬盘)中了

无论开机关机,只要没有卸载删除,这个程序都是存在的 [静态]

什么是进程?

进程不在磁盘,而是在内存中进行活动 【动态】(在任务管理器中看到的进程数据是不断跳动的,有时候用到某个应用程序的功能的时候就用的多,占用的内存就大了;若应用程序打开但是没使用的时候占用的内存就没有那么大)(就可以比作是一个类,在使用的时候,类的空间就生成了)

进程是需要用户双击运行程序,就可以启动,才在内存当中占用一定的空间,不同的应用程序占用的内存空间也不是固定的

进程是根据程序来生成的,程序在编写好运行后才会产生进程

我们现在编写的代码是个程序,因为我们编写完的代码是存放在磁盘中的某个文件夹下,只要不是卸载删除,无论开机关机,编写的程序代码一直是存在的; 但是程序在编译链接后,点击了运行按钮,运行后在内存中占用一定的空间,就变成了进程

计算机中不对程序进行管理,而是对进程进行管理

对比一下磁盘的空间和内存的空间,明显是磁盘的空间要比内存空间大的大的多 [内存有4G的,最少的硬盘128G]

系统在对进程进行管理,实际上也就是对内存进行管理

如果电脑有些年头,有点卡,又不想要换新的电脑,那内存条加大一点(同时容纳的进程的数量变多)就可以接着使用了

程序(program)是存放在磁盘文件中的可执行文件

只要是程序,就一定需要有一个可执行文件,随便一个文件不能叫做程序,只有可以运行起来的,才可以称之为程序

不能被运行起来的文件仍然是文件(比如 xxx.txt)

程序被运行起来(执行实例)被称为进程,某些操作系统的任务表可以显示正在执行的程序,window10下可以看到任务管理器,同样在ubuntu中也可以看到

三:Linux 进程管理

可以通过下面命令查看到 所有当前的正在运行的进程        ps -aux

ps -aux

可以看到

%CPU(CPU损耗)

%MEM (内存损耗)

STAT(当前的状态)

START(当前的启动时间)

TIME(执行的时间)

COMMAND(对应的命令/目录是哪一个)

这就是当前ubuntu操作系统用命令运行起来的当前进程的查看

有的进程的状态是I,有的是S,Ss,R,这些都是进程的状态,需要了解学习一下进程状态

四:进程ID

操作系统如何管理进程?

如果操作系统要想管理进程,管理软件运行,只是依靠软件的名字是不够的,进程下应用程序会出现同名的情况。因此需要了解PID(process ID)

如下图所示(进程ID号 有且只有一个

每个linux进程都一定有一个唯一的数字标识符,称为进程ID(process ID)

进程ID总是一非负整数(0-65535)

每一个程序在运行的时候变成了一个进程,这个时候操作系统就会为这个进程分配一个单独的ID号,这个ID号数量总数65535,ID号是在65535内部之间随意取一个 

现在打开某一个程序,和之后打开某一个相同程序,ID号是不同的

(进程ID 随机分配0-65535之间随意的ID)

取 PID[进程ID] 是否有一定的顺序?

如图,PID,有1 2 3 4 但是没有5 ,虽然是有一定的顺序,但是PID是有缺失的

自己跑动的程序也会随机分配有一个PID

可以写一个死循环,运行程序(重新生成解决方案),产生进程测试一下

#include<iostream>
using namespace std;

int main()
{
	while (1)
	{

	}
	return 0;
}

运行一下程序 

g++ main.cpp -o main

./main

查看进程

ps -aux

查看发现:

在 18::05 有一个./main [进程],同时 PID [进程ID号] 是45244 

R+  表示  在运行

ctrl+c结束程序

./main再次运行程序

同样查看进程

此时可查看到

在 18::06 有一个./main [进程],此时分配到的 PID[进程ID] 是45260 

由上示例看出,同一个程序,前后两次运行不同,pid号随机分配

五:进程树

第一次运行的进程【0号进程】

可以通过下面这个命令查看一下

进程的一个树状结构【进程树】        pstree

pstree

systemd就是最初的那个进程 (程序运行起来的最初的进程)

systemd其实还不算是真正的0号进程,因为0号进程在ubuntu中被隐藏掉了,在ubuntu中只能看到1号进程

相当于由这个1号进程来管理所有的进程,初始的进程就是一个进程管理者

Networkmanager            专门管理网卡,专门管理网络的

gdm3                               ubuntu的主题(登录界面)

vmtoolsd                            虚拟机的工具(也算一个进程)

sshd

安装的远程连接,ssh服务

进程树:以上的都是ubuntu操作系统运行起来都会有的基础进程

六:进程管理

进程管理

这个管理称为PCB           P:process  C:conrtol  B:brok

Linux系统是一个多进程的系统,进程之间具有并行性、互不干扰的特点

Linux中进程包含PCB(进程控制块)、程序以及程序所操纵的数据结构集,可分为“代码段”、“数据段”和“堆栈段”

每一个进程都有自己的代码,每一个进程都有自己的数据,每一个进程都有自己的堆栈,通过管理这些,进而来管理进程

七:进程状态

运行状态R(TASK_RUNNING)

可中断睡眠状态S(TASK_INTERRUPTIBLE)

不可中断睡眠状态D(TASK_UNINTERRUPTIBLE)

暂停状态T(TASK_STOPPED或TASK_TRACED)

僵尸状态Z(TASK_ZOMBIE)

退出状态X(TASK_DEAD)

八:进程状态切换

进程状态之间可以相互切换

九:初始化进程

Init进程 【初始化进程】

进程ID为1通常是init进程,在自举过程结束时由内核调用

init进程绝不会终止(这个进程是用来管理其他进程的,这个进程杀不掉)

它是一个普通的用户进程(与交换进程不同,它不是内核中的系统进程),但是它以超级用户特权运行

十:获取进程标识

#include <sys/types.h>

#include <unistd.h>

pid_t getpid(void);   返回:调用进程的进程I D

pid_t getppid(void);   返回:调用进程的父进程I D

uid_t getuid(void);   返回:调用进程的实际用户I D

uid_t geteuid(void);   返回:调用进程的有效用户I D

gid_t getpgid(void);   返回:调用进程的实际组I D

gid_t getegid(void);   返回:调用进程的有效组I D

getpid 相当于在代码端可以直接看到,当前这个程序的一个进程号

使用getpid查看进程号    示例 

#include<iostream>
#include <sys/types.h>
#include <unistd.h>


using namespace std;

int main()
{
	while (1)
	{
		cout << "pid = " << getpid() << endl;
		sleep(1);
	}
	return 0;
}

在终端运行一下程序

g++ main.cpp -o main

./main

可以查看程序运行进程号 

可以自己通过代码来创建一个新的进程,也就是说,程序不再是单一的一个main函数从头走到尾

现在的程序需要做到多进程开发,也就是说一个程序,main函数运行的时候,通过代码的编译链接执行,在代码当中创建出一个有很多个进程,叫做多进程的运行方式

学习进程管理的目的                            多进程运行方式

之后学习在代码中自己创建进程       fork系统调用

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenruhan_QAQ_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值