一,引言
本篇主要讲解操作系统的相关概念,由来,创建操作系统的意义。之后会了解一下什么是进程,如何创建一个进程等等。
二,操作系统
首先计算机的基础依托于冯诺依曼体系结构如图:

为什么如今的所有计算机都依托这个体系呢?因为这是一种性价比的体现。只看数据部分,一台计算机必不可少的输入设备,存储器,输出设备,运算器。运算器进行数据的处理。存储器就是如今的内存。由此可以发现,想要进行运算必须要经过存储器。
设立这个的原因就是拷贝效率的问题,运算器的速度非常的快,内存就慢一点,而想磁盘,网卡等等就更慢。价格是也是如此。为此想要一台效率高且内存大的计算机。就必须依托于此体系结构。
而操作系统是一个管理软硬件的软件。大体上来看,操作系统的核心主要包括:进程管理,任务管理,线程管理等等,但是为了不直接的接触到操作系统。操作系统还进行外壳的封装。如以前的xshell等等。
操作系统的目的就是为用户提供更加稳定的执行环境。如图:

为此本质上来说操作系统就是一个搞管理的软件,向下管理硬件,向上提供系统调用函数。为此当用户进行开发操作时,需要用到如在屏幕上显示,或者从键盘上获取等等操作时,看似仅仅调用了函数操作。其实函数内部都封装了系统调用接口,系统经过识别所需要的哪一种硬件进行控制。
在进行系统调用的过程中,由于操作系统本身为了防止误操作等等,本身不允许进行查看,但是上层的开发是需要进行调用的。为此在实现操作系统的同时也提供了向上的系统调用接口。我们在使用操作系统的操作时,只需要调用这些接口就可以实现对应的功能。
最终操作系统是如何实现对以上的种种管理的。以后的文章会进行讲解。
三,进程
首先什么是进程呢,在最开始的讲解中说到,数据的处理就要分级传入的。为此由想要打开哪个软件,首先要先把该软件的所需要的程序加载到内存中来。操作系统本身来处于在内存之中。当加载了很多程序之后,就要发挥操作系统的管理功能。操作系统将一个个的程序的属性创造成一个个对象也就是一个个节点。最后在通过操作系统算法等等进行管理。而这个操作系统所创建的节点是可以找到拷贝的数据。为此对数据的管理就转变了对这个结构的管理。而进程就是这一个个结构对象加对应的数据程序。而这样子的结构体在Linux通常task_struct结构体要进行管理。
一个对应进程信息的结构体通常包含以下属性:标识符,状态,优先级等等。实际上在Linux中所有的指令,以及运行起来的程序等等都叫做进程 。下面在Linux中初步见一下进程到底是什么样子的。
这是一个死循环的程序,运行该程序时,该程序会一直执行。由上文中运行中的程序也是进程。而进程由对应的结构体对象和写的代码数据。那么就可以通过Linux来查看对应的结构体信息。如下:

此时就查到了正在运行的进程。这是需要补充两个知识点:
1,ps ajx | head -1 ------表示将表头显示出来
2,ps ajx | grep 运行程序名称 -----查询对应程序的进程
在上文中写到进程的信息有标识符等等。这里的pid 表示这个进程的编号。而ppid表示这个进程的父进程的编号。在代码编写过程中使用getpid函数可以获得该进程的pid;使用函数gitppid可以获得这个进程父进程的ppid。
在Linux目录中/proc包含了所有正在执行的进程。如下:

这里面的数字代表这所有的进程,数字里面的内容代表这所有的动态属性。
在查看指定进程的动态属性是会发现如下情况:

cwd指向进程执行所在文件目录。exe指向进程所在文件。也就是说每一个进程进行执行的过程中会记录所在文件目录的地址。
此时会发现进程之上有父进程。那么进程之下也应该有子进程。
fork函数表示在进程之中创建子进程。如图:

此时引入了二个问题:
fork函数是否有返回两种值。
return语句为什么会返回两次。
当代码执行到fork函数时,函数就会创建子进程,并且完成子进程对父进程的拷贝。因此两个进程都会运行并且完成返回。且返回的值不相同。因此结果不管是if还是else都执行了。