Linux操作系统与进程

冯诺依曼体系

在讨论操作系统时,就需要了解冯诺依曼体系结构,这对于我们了解操作系统有很大的帮助。
众所周知,我们在使用一款操作系统,一定是看中了它的安全、高效、稳定这三个特点,如果没有这三个特点,谁会使用呢?那么为什么冯诺依曼体系留存到现在呢?是因为他的高效,没有内存时,直到输入设备作为硬件比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 028 }

在这里插入图片描述

fork()

上述我们用fork()系统函数创建了一个进程。

问题:如何理解fork()会有两个返回值?
答: fork()是函数,所以在fork()内部已经创建好了子进程,而return id也属于代码,所以两个进程分别return一次,return两次不奇怪。

我们运行上述代码的时候,发现两个进程会个子运行属于自己的代码,这是因为:进程要具有独立性,即使是父子都不能影响

总结

本文主要是以创建进程为主,理解什么是进程,进程的创建方式,并且在操作系统内事如何管理的,要记住:先描述在组织!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值