【Linux】进程

Hello everybody!最近学习任务比较重,就没有时间去专门写博客。这篇文章是我在学习Linux操作系统的第一节进程时整理的笔记,上面的图片是老师的板书,有几张图片有些杂乱,可能不知道从何看起。不过每张图片后都有十分详细的文字描述,读懂那些文字也就读懂了图片在说什么。

希望大家在看过这篇文章后能够有所收获!

1.计算机最基本的体系结构

冯·诺依曼体系结构:

中央处理器/cpu:

离cpu越近的设备,效率越高,成本越高。

离cpu越远的设备,效率越低,成本越低。

所以,虽然cpu的运算速度很快,但是输入设备和输出设备是很慢的,如果去掉内存,计算机采用最上面的结构,那么整台计算机的效率不取决于cpu,而是取决于输入设备和输出设备。

除非把计算机里面的存储设备换成寄存器,这样的计算机运行效率是非常可怕的,但它的造价也十分高昂(几千万)。

这时内存就起到了十分重要的作用(效率也是很高的),它在极大程度上提高计算机效率的同时,造价也没有高多少,这让大多数人有能力买电脑,手机。买的人多了,就有了网络的需求,后来才发展起了网络。

由此可以看出:冯·诺依曼体系结构是非常伟大的!

2.操作系统

图中介绍的比较清楚

补充:

硬件会更新迭代,当硬件更新后,难道操作系统也要更新一下才能访问更新后的硬件嘛?

这里,硬件厂商会提供对应硬件的驱动程序,每一个硬件都有驱动程序,操作系统是通过驱动层来管理硬件的!

操作系统存在的意义:

对下,很好的管理软硬件。对上,为用户提供良好(稳定的,安全的,高效的)的运行环境(操作系统存在的目的)。

六个字:

先描述,再组织。

描述就是把对象描述出来,组织就是再组织链表,顺序表等以及完成增删查改等操作。

还有就是操作系统对软硬件的管理其实就是对其数据的管理。

由此可见,在操作系统中,存在大量的数据结构,其中包含大量的数据。

数据结构这门学科就是教我们如何高效的管理数据的学科。

另外,为保护操作系统,用户不可以直接访问操作系统,用户必须调用系统调用接口才可以访问操作系统,进而访问软硬件等。

图中,操作系统和系统调用才是完整的操作系统。

3.进程

进程=PCB+自己的代码和数据。

PCB内有程序的基本属性,操作系统通过管理PCB来管理程序。

操作系统也是软件,开机时,需要加载到内存中。PCB需要加载到操作系统中。

最终,操作系统对进程的管理转换成了对链表的增删查改!

ps:查看进程

a:相当于all

xj:显示进程的详细信息

一般,进程的名字和可执行程序的名字一样。

grep是按关键字查找,另外grep启动后也是一个进程,所以会显示有两个进程。

显示进程中,一行多列信息,每一列的含义。

连续执行两条指令。

既想看头部信息,又想按关键字查找,就按上图中的方法。

而pid是操作系统内部的内核数据结构,用户不可以直接访问。只能通过系统调用:getpid。

pid_t是无符号整型。

如何查看进程,如何结束进程,谁是子进程,谁是父进程:

grep -v grep去掉grep的行。

创建子进程。

父进程和子进程共享代码和数据。这是hello world 为什么会被打印两次的原因(父,子进程各自执行一次)。

这样更直观一些。

让父子进程执行不同的代码:

kill掉任何一个进程都不会影响另一个。

在启动一个进程时,系统会在/proc目录下创建一个以进程pid命名的目录,结束进程时会删掉该目录。

ls /proc/pid -l可以看到该进程的具体数据,比如cwd,exe等。

当前路径就是进程当前所处路径:cwd

chdir:修改进程的工作路径,修改之后,log.txt就创建在了修改之后的路径下,而不在可执行程序的路径下!

4.进程状态与优先级

让中间的指令总是被执行。

为什么我的进程一直在执行,查到的状态却总是S呢?

因为在cpu真正执行printf函数时才是r状态,在数据从内存刷新到显示器时,进程处于等待阶段,才会是S状态。由此可见,cpu的速度是很快的!

有+号,表示在前台运行,没有+号,表示在后台运行。在前台运行时,可以用ctrl c终止,后台不可以,只能kill掉。

在对应指令后加&表示在后台运行。

kill -9:杀掉

kill -19:暂停

kill -18:继续

T/t目前可以理解成一个意思,在调试时进程会暂停,也可以通过kill -19 pid来暂停进程。

其实,在我们调试打断点时,进程运行到断点时,系统会给进程发送19号命令让其暂停。

之前遇到暂停的场景:调试!

在内存严重不足的时候,操作系统有权利杀掉进程,释放空间。

D:深度睡眠,不可被杀!

4.1僵尸进程和X状态

僵尸进程的实验代码。

在以后我们会用接口:waitpid对子进程的数据进行回收。

孤儿进程的实验代码。

以后用waitpid对子进程的数据进行读取,子进程会从z状态进入x状态,然后由OS进行释放。

4.2进程运行状态

这张图片左上角的是操作系统进程状态的理论,而Linux中的r s z x等状态是具体实现!

4.3阻塞状态

其实s状态就是阻塞状态,d状态也是阻塞状态。

例如在cpu执行scanf时,等待用户输入数据时的状态就是阻塞状态。

设备也有自己的数据结构,它们的数据通过链表的方式链接起来。

各种设备也有自己的等待队列(wait_queue),需要设备数据的进程会从cpu中的运行队列取下来链接到对应设备的等待队列中,这样该进程就不会被cpu调度了。这个状态就是进程的阻塞状态。等对应设备的状态变为OK时,操作系统会把进程重新链入到运行队列中,这个过程叫做唤醒。其实t状态也算是一种阻塞状态!

4.4阻塞挂起状态

有进程处于阻塞状态且OS内存十分吃紧,OS会将阻塞的进程的数据和代码转移带swap分区。此时,被转移的进程处于阻塞挂起状态。这是以时间换空间的做法。

但是swap分区的空间不宜过大(一般为内存的一到两倍),如果太大,操作系统会过度依赖swap分区,系统的效率会降低。

4.5进程切换

函数返回值是通过寄存器返回的!

进程在cpu中产生的临时数据叫做进程的上下文数据。

当某个进程的时间片结束,cpu中的数据会存储到该进程的pcb中,cpu接着调度下一个进程,当再次轮到该进程调度时,pcb中的上下文数据在转到cpu中继续调度。这就叫进程切换!

相关推荐
大聪明-PLUS1 分钟前
C++中变量的声明和初始化
linux·嵌入式·arm·smarc
被制作时长两年半的个人练习生22 分钟前
如何调试llama.cpp及判断是否支持RVV
linux·服务器·llama
赖small强35 分钟前
【音视频开发】Linux V4L2 (Video for Linux 2) 驱动框架深度解析白皮书
linux·音视频·v4l2·设备节点管理·视频缓冲队列·videobuf2
四谎真好看40 分钟前
Linux 附录二,实验一
linux·运维·服务器·学习笔记
神秘的土鸡43 分钟前
Linux中使用Docker构建Nginx容器完整教程
linux·nginx·docker
Molesidy1 小时前
【Embedded Development】BootROM的详细分析以及Linux开发板的上电启动流程初步分析
linux
wdfk_prog1 小时前
[Linux]学习笔记系列 -- [block]kyber-iosched
linux·笔记·学习
赖small强1 小时前
【Linux驱动开发】Linux dd 命令详解
linux·dd命令
傲世(C/C++,Linux)2 小时前
Linux系统编程——TCP客户端
linux·运维·tcp/ip