冯诺依曼体系
在讨论操作系统时,就需要了解冯诺依曼体系结构,这对于我们了解操作系统有很大的帮助。
众所周知,我们在使用一款操作系统,一定是看中了它的安全、高效、稳定这三个特点,如果没有这三个特点,谁会使用呢?那么为什么冯诺依曼体系留存到现在呢?是因为他的高效,没有内存时,直到输入设备作为硬件比cpu慢得多,输入一串字符到cup在到显示屏上,可能需要半个小时;有内存后,会发现效率一些增加了好多,所以这就是冯诺依曼体系能留到现在的原因。
操作系统
概念:操作系统是一款管理软硬件资源的软件。
从概念入手,我们能知道他是管理者。那么如何理解“管理”呢?
理解“管理”
讲个故事:假如你是某学校的学生,校长希望能管理好学校所有学生,那么他应该怎么做呢?那就是拿到学生们的信息。这个时候校长希望从学校中找到你,怎么办?校长不可能一张一张纸去找你的信息,这个时候就打开学校的教务系统,输入了你的学号就找到了你,这个时候校长就能对你进行管理。也就是说校长只要能拿到你的信息,就能管理你。那么问题又来了,关于你喜欢什么不喜欢什么,校长在意吗?并不在意,他只想知道你姓名年龄学号籍贯等信息,所以他就用一类信息对你进行了描述,并且适用于所有学生。
由图下我们可以看出是一个链表,链接了许多学生的信息,所以我们能得出来操作系统的管理:一定是先描述,在组织。
由此可见,操作系统管理的并不是程序,而是程序的数据。
操作系统管理的层状结构
图上是操作系统的层状结构,会发现操作系统处于中间位置,也就说操作系统要上为用户提供服务,下要对硬件进行管理。
问题:为什么我们不直接访问底层硬件?
答:如果用户不小心对底层硬件进行损坏,操作系统根本不知道,当操作系统去使用的时候才发现坏了,那就来不及了。所以操作系统只为我们提供接口,供我们对底层调用。
进程
进程可能大家很陌生,那么我就用一段代码帮助大家理解。
图下我写了一个死循环,当我运行起来之后,并且执行
ps axj | grep test | grep -v grep
会发现,这个程序在前端运行,没有问题,但是ps是查看进程状态的命令,所以这就是说,当前我们运行起的程序就是一个进程。
进程的管理
我们前面也说了,操作系统对程序的管理是先描述在组织,那么一个启动了的程序就是一个进程,所以操作系统对进程的管理方式也是先组织再描述。
那么你说了,先描述在组织,用什么描述啊?
描述
我们层学过C语言,当我们要对一个又不同类型的物体进行描述的时候怎么描述呢?结构体!对!Linux也是有C写的,所以他描述的方式就是用一个结构体进行描述的,就像是学生有学号唯一标识,进程也有能够唯一标识PID。
想要获取一个进程的id,我们就需要调用系统结构 getpid();
1 #include <stdio.h>
2 #include<unistd.h>
3 #include<sys/types.h>
4 int main()
5 {
6 pid_t pid=getpid();
7 while(1)
8 {
9 printf("我是一个进程,我的pid是%d\n",pid);
10 sleep(5);
11 }
12 return 0;
13 }
进程创建方式-----fork()
上述,我们也了解了一个进程创建方式,就是运行可执行文件,那么我们怎么通过代码创建呢?那就是利用fork()接口。
如下图,我们利用fork()函数创建了两个进程,并且同时运行个子的代码。fork会有两次返回值,如果返回值等于0,创建子进程成功;如果返回值大于0(子进程的pid),就是父进程,如果是-1,那么就是创建失败。(多进程)
1 #include <stdio.h>
2 #include<unistd.h>
3 #include<sys/types.h>
4 int main()
5 {
6
7 pid_t id=fork();
8 if(id<0) return -1;//小于0表示创建子进程失败
9 if(id==0)
10 {
11 //创建子进程成功
12 while(1)
13 {
14 printf("我是一个子进程,我的pid是%d,ppid%d\n",getpid(),getppid());
15 sleep(1);
16 }
17 }
18 else{
19 //父进程
20
21 while(1)
22 {
23 printf("我是一个父进程,我的pid是%d,ppid%d\n",getpid()),getppid());
24 sleep(1);
25 }
26 }
27 return 0;
28 }
fork()
上述我们用fork()系统函数创建了一个进程。
问题:如何理解fork()会有两个返回值?
答: fork()是函数,所以在fork()内部已经创建好了子进程,而return id也属于代码,所以两个进程分别return一次,return两次不奇怪。
我们运行上述代码的时候,发现两个进程会个子运行属于自己的代码,这是因为:进程要具有独立性,即使是父子都不能影响。
总结
本文主要是以创建进程为主,理解什么是进程,进程的创建方式,并且在操作系统内事如何管理的,要记住:先描述在组织!!