进程基础1

本文解析了进程的概念,包括其在操作系统中的实例化过程,以及进程控制块(PCB)的作用。介绍了进程的状态,如运行(R)、睡眠(S)、深度睡眠(D)等,并探讨了进程的调度机制,涉及优先级和记账信息。此外,还讲解了如何在Linux环境下查看和管理进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程(process进度/task任务):进程是程序(.exe:可执行程序,也称可执行文件)在操作系统中运行的实例。
其实进程就是正在执行的程序,就是你在双击.exe让它跑起来的时候,操作系统会根据.exe在内存中创建一个进程。我们所看到的可执行程序只是一个普通的文件,当它运行起来的时候,操作系统就会创建出对应的进程。

从操作系统管理进程的角度来进一步地了解进程
管理:描述被管理的对象+把被管理的对象组织到一起
因为被管理的对象有很多,所以还得借助数据结构进行组织。
1、对被管理的对象进行描述,以struct结构体的方式进行描述;
2、将被管理的对象组织起来->数据结构。(数据结构解决的问题就是处理大量的数据,如何能够对大量的数据高效地进行处理。如果数据只有一两个,根本用不上数据结构,直接定义变量就行了。)
操作系统是一款搞管理的软件,管理硬件设备,管理各种软件资源。其中,进程就是一种软件资源
先用结构体把进程描述出来,再把一大堆的进程使用一定的数据结构组织到一起去。
进程管理:
1、使用struct结构体描述一个进程的属性;
2、使用数据结构把很多个进程的结构体组织到一起。

描述进程->PCB(书上提到的一个概念,换句话说,不管是什么操作系统,只要这个操作系统里面涉及到描述进程这样的一个概念,它都叫PCB):进程控制块,可以理解为进程属性的集合。
Linux操作系统下的PCB是task_struct结构体,task_struct这个结构体是PCB的一种。
PCB和task_struct就类似于先前的博客中提到的shell和bash。
shell:媒婆,用户和操作系统内核之间沟通的桥梁。一个比较通用的概念。
bash:王婆,CentOS上默认的shell程序。
在Linux上,task_struct是一个非常大的结构体,里面包含的内容非常多,也非常杂。在这里我挑出几个核心的来进行简单的介绍:
1、进程的身份标识,更具体点说它叫做进程id(pid):一个进程的唯一身份标识符。同一台机器上的任何两个进程的进程id都不会相同。
2、内存指针
进程是程序运行的实例,既然进程都已经跑起来了,那得让操作系统知道进程在跑的时候都得执行哪些代码。
一组内存指针,指向代码和代码依赖的数据。
还有和其他进程共享的内存块的指针。
3、每个进程都得执行对应的代码,代码是由cpu执行的。
cpu的核数代表cpu的个数。假设物理机有8个cpu,给虚拟机分配4个cpu,4个cpu有上百个进程,而每个进程都应该执行相应的代码,但cpu只有4个,而且一个cpu单位时间只能执行一个,这就需要操作系统对进程进行调度,一个cpu单位时间只能运行一个进程,让这个cpu去执行进程1的代码,然后再去执行进程2,…,由于cpu它在微观角度执行的速度飞快,cpu执行有多快?cpu有个重要指标->主频,一般多大?1.80GHz,就是一秒钟处理器能执行1.8G条指令。1G叫做10亿。
并行:两个cpu同时运行两个进程的代码。
并发:一个cpu通过快速调度的方式执行多个进程的代码,由于调度速度极快,导致宏观上看起来好像是并行执行。cpu切换的速度极快,进程1执行几条,切换到进程2,…,可能切换了几百个进程都在一秒钟之内完成的。

task_struct里面描述进程的属性中也得有一些相关的属性去支持进程的调度,用一些字段来作为进程调度的辅助信息。

辅助操作系统进行调度的属性,举几个例子:
(1)优先级:决定了进程被调度到cpu上执行的先后顺序。
(2)上下文:保存了该进程上次在cpu上执行的现场。
cpu:执行代码。cpu从内存中把要执行的指令取过来,并且用一组寄存器来保存一些运行的现场,常见的esp,ebp(函数调用栈的栈顶和栈底),eip(程序计数器,存放当前指令的下一条指令在内存中的地址)…这些寄存器其实就相当于是进程当前执行到的现场,保存上下文保存的就是这一组寄存器的内容,从cpu上拷贝到内存中,放到进程task_struct中上下文那个字段里
(3)记账信息:决定进程什么时候需要占用cpu以及什么时候需要放弃cpu,得有一个具体的量化指标,那就是记账信息。
在Linux里面,使用指令执行了多少条这样的一个数目来作为记账的一个标准。
(4)进程状态,有些进程是在cpu上跑着,有些进程没在cpu上跑着,得能够知道当前进程到底是正在上位还是离开cpu,就得有这样一个状态字段来标识当前进程的详细的一个状态。
4、IO相关信息(文件描述符表)
5、信号相关信息

组织进程
所有运行在操作系统中的进程都以task_struct 双向链表 的形式存储在内核中。操作系统只要拿到头结点,就能够获取到链表中任何一个结点的信息。
操作系统创建一个进程,先创建一个task_struct结构体,把结构体插入到链表中;
操作系统销毁一个进程,找到链表上task_struct的那个结点,删除和销毁该结点。

查看进程:看一下程序对应的进程
pidof +进程名//通过进程名,查看进程id。
在Linux下也有一个像Windows的任务管理器一样的工具,功能差不多,只不过用法不一样。Windows下的任务管理器是一个窗口,是一个图形化的界面。而Linux下有一个命令行的工具,指令ps查看进程。但是,ps只能打印出当前这样一个窗口下都有哪些进程。其实,我想看到的是所有窗口或者换句话说,我想看到整个操作系统上一共都有哪些进程,ps aux(3个命令行参数,这三个参数一定要记牢),这是我们在使用Linux的时候,最常用的指令之一。
在本窗口下
./hello
在新窗口下
ps aux | grep hello会有一个./hello进程
./hello
再开一个新窗口
ps aux | grep hello会有两个./hello进程
虽说可执行程序hello只有一个,但是这样一个可执行程序可以被多次运行,每运行一次,操作系统就会对应创建出一个进程。
可执行程序和进程是两个完全不同的概念
可执行程序本质上就是一个文件,它带有一个可执行权限。同一个可执行程序可以执行多次,从而生成不同的进程,虽说两个进程名字都叫“./hello”,但是它们本质上是两个截然不同的进程。
把其中的一个进程“干掉”->Ctrl+c
1、如果当前的指令(操作系统中内置的一些可执行程序)它在执行的过程中比较长,你要想把它终止掉。
2、中断当前的程序

在本窗口下
./hello
在新窗口下
rm hello //删除可执行文件
问:在新窗口下rm hello后,本窗口下的./hello进程还在不在?hello文件能不能被删得掉?
答:本窗口下的./hello进程还在,而且hello文件也能被删掉。

cpu
内存:hello
磁盘:hello可执行程序在磁盘上保存着,因为它本质上就是一个文件。
./hello 操作后,操作系统就会把hello(可执行文件)的内容加载到内存中。当你把磁盘上的hello文件删掉了,内存中的仍然还在,所以./hello进程也就能够继续运行。

进程状态:辅助进程进行调度的一个重要信息
当前这个进程,它是正在运行,还是在休息,还是在做其他的事情,进程状态也就是围绕着这些信息来进行描述的。
Linux中进程有以下几种状态:
1、R(running) 就绪状态,它可能是正在执行,也可能即将要执行。
操作系统中有一个就绪队列,放的就是task_struct结构体,其实就是若干个进程,都是即将要在cpu上运行的进程。只要进程它的task_struct在就绪队列里面,它就是R状态。
在这里插入图片描述
在这里插入图片描述
2、S(sleeping) 睡眠(可中断睡眠)状态,进程在cpu上运行完,就可以切换出来了,这时有很大的可能性就是一个睡眠状态,如果在代码中调用一下sleep函数,你的进程也就会进入到S状态。
在这里插入图片描述
在这里插入图片描述
3、D(disk sleep) 深度睡眠(不可中断睡眠)状态,如果这个进程它在密集的访问外存或者IO设备,就会进入到这样一个D状态。
【本人遇到过以下情况:
当你的一个文件足够大时,此时你执行rm命令,再开一个窗口执行ps aux | grep rm命令,这时你就会 发现是D+状态。而且Ctrl+z\c、Ctrl+\、kill +pid、kill -9 +pid都没反应。

S状态的这个睡眠是可以被打断的。而D状态的这个睡眠是没法被打断的,不是特别常见。
Xshell是通过ssh方式登陆到Linux环境上的,而Linux内部是有一个sshd这样的一个进程来作为服务进程,有了服务进程之后,才能在Windows机器上远程访问Linux机器。该进程要密集的访问网卡,也就是IO设备。
4、T(stopped) 暂停状态,把一个正在运行的程序Ctrl+z放到后台,就显示成T状态。在这里插入图片描述在这里插入图片描述
使用fg命令,把后台的程序放到前台,就变成R+/S+状态。
或者通过给指定进程发送 SIGSTOP 信号让其停止,发送 SIGCONT 信号让其继续运行。
5、t(tracing stop) 暂停状态,它是用于一些调试的情况下,gdb,断点,停下来就是依靠这种状态。在这里插入图片描述
6、X(dead) 肉眼看不见的状态,死了的状态,只是在代码中存在,昙花一现,为啥你在ps aux下看不到一个X状态的进程啊?其实ps是在遍历链表,一旦进程“死了”,那其对应的task_struct也就被销毁了,链表上也就没有这个进程结点了,也就看不见了。
7、Z(zombie) 僵尸状态,这是一种比较特殊的状态。z状态的进程便是所谓的僵尸进程
当你在ps aux后,你会在STAT那一列看到除了上述7种状态外的其他标识,在此额外做一下简单介绍:
+:+表示前台的进程
<:<表示优先级较高的进程
N:N表示优先级较低的进程
s、L、l
僵尸进程1
在这里插入图片描述
截图时间不匹对,所以进程id不同
在这里插入图片描述
在这里插入图片描述
僵尸进程2
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意观察两个僵尸进程的状态及成因。

操作系统中的优先级
显然优先级高的进程有优先执行权力。
ps -l
PRI表示的就是优先级,用一个数字来表示,值越小表示优先级越高。
NI:表示nice值,相当于是优先级这个指标它的一个修正参数。
最终进程的优先级它相当于是PRI+nice值,结果是真实操作系统在调度的时候所参考的优先级。
修改nice值,nice的取值范围是-20~19,共40个级别。
nice指令:一开始执行程序就指定nice值
nice -n +nice值 ./main
renice/top指令:调整已存在进程的nice值
renice +nice值 -p +pid
top ->r ->pid ->nice值
top指令,它也是一个任务管理器,它显示的更加直观一些。其中,VIRT表示的是进程占用的虚拟内存总量,RES表示的是进程占用物理内存的总量,SHR表示的是进程和其他进程共享的内存总量。top还支持一些功能,比如说,它能够把当前的进程按照一个cpu占用率来排序,top默认结果是cpu占用率高的在前面。还可以按照内存大小去排序,了解一下就好。

其他概念
1、竞争性:系统进程数目众多,而CPU资源只有少量,甚至只有1个,所以进程之间是具有竞争性的。
为了高效完成任务,更合理地竞争相关资源,便有了优先级这个概念。
2、独立性:

多进程运行,需要独享各种资源,多进程运行期间互不干扰。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值