【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中继续调度。这就叫进程切换!

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-21 03:04:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-21 03:04:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-21 03:04:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-21 03:04:05       20 阅读

热门阅读

  1. Go语言中常见HTTP处理错误

    2024-04-21 03:04:05       12 阅读
  2. Android JNI使用dlopen动态链接库

    2024-04-21 03:04:05       16 阅读
  3. Kibana启动报错:Kibana server is not ready yet

    2024-04-21 03:04:05       14 阅读
  4. konva.js 工具类

    2024-04-21 03:04:05       12 阅读
  5. 设计模式(分类)

    2024-04-21 03:04:05       12 阅读
  6. OpenXR API概览与核心组件解析

    2024-04-21 03:04:05       15 阅读