说起进程,就得从计算机的最底层说起,因为硬件体系决定了软件的行为。 只有清楚了计算机的大致原理,才能更好的理解进程。
冯诺伊曼体系结构
现代计算机的体系结构就是冯诺依曼体系结构,主要包含五大部件:
输入设备:鼠标、键盘等
输出设备:显示器、打印机等
存储器:内存
控制器和运算器:处理器
在计算机中,所有硬件都是围绕存储器(即内存)运行的。 输入设备在存储器中写入数据;运算器从存储器中读取数据并处理数据,然后将数据写入存储器;输出设备从存储器中读取数据并输出;控制器控制这些设备的读写操作。 冯诺依曼体系结构中,数据和指令均存储在存储器中。
这五个部件的主要关系如下图,细线代表控制线,空心箭头代表数据线。
操作系统的作用
单纯的使用硬件,尽管已经可以完成一些计算了,但显然不够方便,我们总不能每次都通过更改硬件来完成不同的计算任务吧。
因此我们需要一个软件来管理这些硬件(或软件),以便于让这些硬件(或软件)能够以我们想要的方式来运行,这个管理软件就称其为操作系统。
操作系统的存在,可以让我们软件开发人员不必过于关心底层硬件的细节,我们只需要使用操作系统所提供给我们的一些接口,便可以使这些硬件各司其职。进而实现自己想要的功能。
按下开机键,处理器通过BIOS中的引导信息将操作系统从硬盘中加载至内存(存储器)中,之后操作系统便接管了计算机的一切软硬件。 我们通过操作系统所提供的面向用户的交互方式来操作计算机。 当然,这只是我为了便于理解所抽象出来的大致过程,具体细节要复杂的多。
还需要提到一个库函数的概念,库函数是为了解决系统调用接口对开发人员而言不太友好而存在的。库函数即是对系统调用接口的封装,使其方便使用。
进程概念
有了对计算机软硬件的大致了解,便可以引入进程的概念了。
进程(process),顾名思义,进行中的程序。有时也称之为任务(task)。
一个处理器同一时间只能处理有限个进程,然而显然现代操作系统可以同时运行很多个进程,这归功于分时技术。 为了处理多个进程,便给每个进程一个时间片,当时间片用完且进程尚未结束,处理器便会处理其他时间片未用完的进程,就这样不断切换轮转。 由于处理器的运行速度很快,便给我们一种很多进程同时运行的感觉。
当我们用C语言写了一个程序从main函数开始运行时,操作系统便会创建一个进程(即创建进程描述符PCB)并将其添加至PCB表(双向链表)中。
操作系统是通过进程描述符(或进程控制块)PCB来完成对进程的管理的。
在Linux中,PCB就是一个结构体(task_struct)。这个结构体中包含了很多信息,都是关于描述一个进程的信息。如:进程标识(PID)、进程状态、程序计数器(PC)、上下文数据、优先级、内存指针等等。
Linux中查看进程可以通过这几种方式,
这就是进程,后续将会继续了解多进程编程。