Linux基础——进程初识(一)

1. 硬件

①冯诺依曼体系

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。其详细结构如下图所示

在这里有几点要说明

1. 这里的储存器实际上指的是内存

2. 输入设备与输出设备都属于外设

常见的输入设备如:鼠标,键盘,摄像头,话筒,磁盘,网卡等

常见的输出设备如:显示器,播放器硬件,磁盘,网卡

3. 运算器与控制器都属于中央控制器(即CPU)

运算器的功能是对我们的数据进行计算任务(算数运算,逻辑运算)

控制器的功能是对我们的计算硬件流程进行一定的控制

值得注意的是

1. 在不考虑缓存情况时,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)

2. 在冯诺依曼体系中每一个部件都是一个独立个体

3. 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取

根据上面的情况,我们可以总结出一个结论:所有设备都只能直接和内存打交道 

在了解了冯诺依曼体系后,我们也可以解释一些之前无法解释的问题,如:

为什么一个程序要运行,必须要先加载到内存中?

答:因为冯诺依曼体系结构规定了必须这样做。

在实现进度条小程序时,我们知道默认缓存的数据被储存了起来,那么这些数据存储在哪?

答:储存器中。

②实际举例

在这里我们举一个实际例子

我们在使用QQ向朋友发送消息时,数据是如何流动的?

如果发送的是文件时,那么自己的输入设备和朋友的输出设备都应该是磁盘,朋友在收到文件后,采取的措施是将文件保存到本地磁盘中。 

2. 软件

①什么是操作系统

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)(operating system)

内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)

简单来说,操作系统是一个对软硬件资源进行管理的软件。

计算机中有如上图所示的层状结构,在其中我们可以看到操作系统通过直接管理驱动程序来实现间接管理底层的硬件,在管理好软硬件资源之后,操作系统为了保证自己数据安全,也为了保证给用户能够提供服务,操作系统以接口的方式给用户提供调用的入口来获取操作系统内部的数据,这就是系统调用,它是操作系统提供的用C语言实现的,自己内部的函数调用。所有访问操作系统的行为,都只能通过系统调用来完成。那么操作系统存在的意义是什么呢?为什么我们需要操作系统呢?根据上面对层状结构的解释,我们可以有以下理解

1.操作系统帮助用户,管理好下面的软硬件资源
2.为了给用户提供一个良好(稳定,高效,安全)的运行环境

即:操作系统通过管理好底层的软硬件资源(手段),为用户提供一个良好的执行环境(目的) 

在C语言中我们经常会调用系统库,那么这个系统库与系统调用又有何关系和

②操作系统如何进行管理

那么在知道了操作系统是什么之后,它是如何对软硬件进行管理的呢?

首先我们要知道一般管理资源都分为决策者,执行者与被管理者,举几个例子,在大学中,校长就相当于决策者,辅导员是执行者,各个学生就是被管理者,在公司中,老板就相当于决策者,小组长是执行者,员工就是被管理者。在这些例子中,我们可以发现,管理者和被管理者是不需要见面的,既然如此,那么管理者在不见被管理者的情况下,如何做好的管理呢?——其实,只要能够得到管理信息,就可以进行管理决策,由此我们也可以看到管理的本质——通过对数据的管理,达到对人的管理。既然管理者和被管理者面都不见,那怎么拿到对应的数据呢?——通过执行者。

管理者在决定好要收集到被管理者的什么数据之后,如:校长需要收集到学生的学院、专业、班级、学号、姓名、性别、身高、体重、籍贯、电话等数据,通知辅导员收集数据之后,再将其反馈到校长处,校长为了能够更好的管理数据决定描述每一个学生的具体情况,将每个学生视作一个结构体的具体对象,对学生的描述可以如下图所示

在描述好之后,为了将它们互相联系起来,可以向Student结构体中添加struct Student* next来衔接下一个学生,这之后每有一个学生便实例化一个对象,并使它们链接起来,这样就将对学生数据的管理转换成了对链表的管理,这种方式就是操作系统管理资源的方式,即:在操作系统中,管理任何对象,最终都可以转化成为对某种数据结构的增删查改,这种管理资源的方式我们将其称为“先描述,后组织”,即对于任何一个要管理的资源,都要先对其进行描写(有什么属性),这之后再使用一种数据结构来管理它们

3. 进程

①什么是进程

对于一个已经加载到内存中的程序,叫做进程,通俗一点来说,正在进行的程序,我们将其称之为进程。

②进程的理解

因为操作系统是需要同时运行多个进程的,那么操作系统要如何管理进程呢?这在之前我们就提到过——先描述,后组织。对于任意一个进程,在磁盘将其加载到内存时,都是加载的代码与数据进去,而操作系统想要管理它,就要先对一个进程作出相应的描述,为了描述这样一个进程,操作系统有自己的描述进程的结构体对象,即——PCB(process control block),它是一个进程属性的集合体,在这个结构体中包含了许多的进程属性,然后操作系统会根据自己的PCB类型,为传输进来的代码和数据创建相应的PCB对象。

操作系统为了管理这些进程,会将它们转换为单链表方便管理。那么,我们就可以认为进程=操作系统对应的PCB+相应的代码与数据。

③Linux中的进程

在了解了PCB后,Linux中的进程又是什么样的呢?在LInux中,操作系统所使用的PCB为task_struct,其包含进程的所有属性,且LInux是使用双链表的形式来管理进程的。下面就让我们来创建一个进程,其代码如下

int main()
{
    while (1)
    {
        printf("这是一个进程\n");
        sleep(1);
    }

    return 0;
}

然后我们可以使用

ps ajx | grep code1

来查看我们想要查看的进程属性,运行有

在这里我们能够看到除了我们想看到的自己的进程外还有一个auto code1进程,我们要想只显示自己的进程可以添加一个过滤命令,即

ps ajx | grep code1 | grep -v grep

此外为了方便我们更好的了解进程属性可以打印一个表头出来,即

ps ajx | head -1 && ps ajx | grep code1 | grep -v grep

运行效果如下