目录
一:进程
在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系统调用