赞
踩
目录
答:操作系统遍历所有进程的进程控制块,找到这个进程,然后把这个进程的代码交给cpu,cpu调用即可。
答:管理的本质是对数据的管理。例如:在我们的大学中,学生是被管理者,校长是管理者,校长和学生大多数都没见过几面,那么校长是如何管理学生呢?答案是通过学生的数据,这里的数据包括学生的成绩,性别,籍贯等等,校长通过这些数据来实现对学生的管理。
我们可以这样理解:硬件是被管理者,驱动是执行者,驱动可以收集硬件的数据递交给操作系统,并且执行操作系统的指令,而操作系统只有决策权。
一句话解释:操作系统通过驱动来收集硬件的数据来管理硬件
这句话的意思可以这样理解:
作为校长,我们要收集学生的数据来对学生进行管理,学生的数据的种类是相同的,例如姓名,性别,籍贯,联系方式等等。
这时候我们可以把我们收集的学生的数据抽象为结构体:
先描述就是上面的意思:把收集的数据转换为结构体的形式。
每一个学生的数据都是一个结构体,我们如何把这些结构体连接在一起呢?我们可以想到链表的形式,我们把每一个学生的数据都当作链表的一个节点,通过数据结构的形式实现对多组数据的管理。
再组织就是上面的意思:把收集到的多组数据转换成一种数据结构的对象,我们通过对对象的管理来实现我们对数据的管理。
总结:管理的本质是对数据进行管理
管理的方法是先描述,再组织
在图中,我们可以发现:经理既可以管理业务员,也可以管理安保,后勤,又可以管理仓库,桌椅板凳等等。
得出结论:软件既可以管理软件,也可以管理硬件。
并且:操作系统作为一个软件,既可以管理软件,又可以管理硬件。
我们再引用银行的例子提出一个问题:为什么银行不允许我们直接进入银行的仓库,使用银行的电脑进行操作?
答:银行不相信任何人,银行需要把自己保护起来,但是银行又需要给客户提供服务,所以就出现了我们现在看到的玻璃窗。
我们也可以通过银行来类比操作系统:
操作系统也不相信任何人(防止其他人通过操作系统恶意修改数据),但是操作系统有需要对我们这些用户提供服务,操作系统就使用了银行的方法,通过接口来提供服务。
当用户想要访问数据时,我们给用户操作系统的接口来实现访问数据,又防止了用户对数据的修改。这些接口是c式的接口,这些接口是操作系统通过c语言给我们的函数调用,我们通过系统调用接口来访问数据。
我们所有的软件和硬件的访问都必须通过系统调用接口来进行访问。
我们再举一个银行的例子进行类比:
王大妈想要存1000块钱到银行中,但是王大妈不认识字,所以王大妈通过咨询银行柜台的服务员找到了业务员刘先生,王大妈通过口述自己的信息和诉求给刘先生,储蓄了1000块钱到银行中去。
这种行为在计算机中可以类比为三个行为:
行为1:图形化界面,大多数人不会使用操作系统,于是就设计了图形化界面,图形化界面相当于是一个接口,我们通过点击图像来实现系统调用访问数据。
行为2:编程操作:当普通的程序员进行编程时,我们输入printf打印函数,显示器上就显示了我们想要打印的信息,实质上是程序员通过访问c语言或c++的库来调用函数(系统调用)。
行为3:Linux指令操作:当我们输入指令时,我们知道,Linux系统中有一个shell外壳来筛选指令,shell会把错误或者不合法的指令过滤掉,防止错误的指令的执行,把正确的指令输入给内核。shell就是一个接口,用户通过shell来和内核进行交互操作。
如图所示:
我们从上往下进行解释:
用户通过接口,实现系统调用,并将对应的需求传递给操作系统,由操作系统进行决策,驱动来执行操作系统的决策并收集底层硬件的数据并把底层硬件的数据传递给操作系统。
通常对进程的解释有以下两种:
1:一个运行起来的程序(加载到内存中)叫做进程
2:在内存中的程序叫做进程。
我们该如何理解呢?
我们应该首先理解程序:程序是什么?
答:程序的本质就是文件,例如我们c盘,d盘文件夹中的内容就是程序。
我们画图象来对进程进行理解:
例如我们的磁盘中有三个进程分别是shell排序,qq和微信。
我们双击shell排序.exe
shell排序被加载到了内存中
我们之前就运行了360和腾讯视频
我们发现有太多加载到内存中的程序,操作系统需不需要管理这些程序呢?
答:需要。
如何管理呢?
答:先描述,后组织。
每一个加载到内存中的程序中都有对应的进程控制块,每一个进程控制块中都有对应程序的属性和对应程序的代码和属性地址
该进程块是由结构体组成:
先描述就是把进程的属性和进程对应的代码和属性地址等信息存储到结构体中,后组织就是把这些结构体转换为链表的形式进行控制。
例如:假如我们的cpu想要调用某一个进程该怎么处理
假如我们想要结束掉一个进程该怎么处理?
答:操作系统遍历所有进程的进程控制块,找到进程属性为死亡的进程控制块,终止掉这个进程即可。
进程管理的实质:
答:进程管理的实质是对应进程的pcb进行管理,管理的方式通过对进程控制块形成的链表进行增删查改的形式。
进程的本质:
进程的本质是:进程控制块加上进程对应的磁盘代码。
我们创建两个文件
myproc.c表示的是我们要实验的进程
Makefile是我们要构建的项目:
我们使用vim对文件Makefile进行文本编辑
这些指令的意思如下:myproc:myproc.c是依赖关系,myproc依赖于myproc.c
下面的一行gcc..是依赖方法:把源文件myproc.c进行编译链接形成可执行程序myproc
.PHONY前缀表示即使我们的文件的修改时间没有发生改变,我们依旧可以执行clean指令。
clean没有对应的依赖关系,clean的依赖方法是强制删除myproc文件
我们对源文件进行文本编辑
我们设计一个死循环的c语言程序
使用make指令
我们调用可执行程序
我们怎么看到这个进程呢?
我们点击复制ssh渠道
我们输入以下指令:
grep表示行过滤,这里的意思是筛选出myproc的文件
第一个文件就是我们的进程,第二个是我们的grep指令对应的进程,我们先忽略他
我们再输入指令:
这个指令的意思是显示进程的标题
我们再输入指令
这里的意思是筛选出进程中名字有myproc的进程并显示他们的标题
这里的PID就表示进程的编号,可以看到我们执行的进程的编号是633
当我们执行过这个指令后,PID为633的进程被终止:
接下来,我们看一看与系统有关的系统调用
显示进程的PID
我们对myproc.c的文本进行编辑
我们输入make指令,然后执行myproc.c可执行程序
我们输入指令查看myproc进程的PID
getpid的确可以得到进程的pid
接下来,我们来结束掉这个进程
我们多次执行可执行程序并且多次退出,可以发现,每一次我们的PID都不相同,原因是什么呢?
进程的本质是文件,所以文件一定有对应的地址,我们也可以查看进程的地址
当我们关闭进程时,进程的地址就找不到了
我们再执行进程:
我们进入该进程地址中
我们显示进程地址中的文件
这些都是进程的属性
问题:进程已经被加载到内存中了,我们删除掉进程在磁盘上的代码,进程能否继续运行?
答:可以继续运行
当我们把进程加载到内存时,exe文件显示如下
当我们删除掉进程在磁盘上的代码时:
这个时候进程依然没有结束
进程所在地址中文件
我们可以看到对应的exe文件已经被删除
这时候我们结束掉进程
这个时候,就显示不了文件目录了
getppid的意思是得到一个进程的父进程的pid
我们对myproc.c的文本进行编辑
我们调用myproc可执行程序
我们取消进程,并且重新执行进程
我们可以发现,每一次调用可执行程序,进程的子进程发生了改变,进程的父进程没有发生改变。
我们查看父进程对应的信息:
这个bash就是shell外壳的意思,意思是我们调用的myproc可执行程序对应的进程的父进程是由shell外壳操作的
1:当我们在登陆的时候,系统已经给我们指派了一个shell
2:命令行上启动的进程,一般父进程没有特殊情况下,一般是都是shell
3:shell执行我们的指令时,一般是以子进程的形式执行,子进程的崩溃并不会影响shell本身
我们对fork进行实验:
fork是一个函数,函数执行前只有一个父进程,函数执行后,有一个父进程和子进程
我们调用进程:
第一个进程的父进程就是shell,然后调用fork创建一个子进程,创建的字进程的父进程是原来的子进程。
证明了fork可以创建子进程。
我们看一下fork函数的返回值:
fork函数的返回值:成功的话,子进程的pid返回给父进程,0返回给子进程,失败的话,-1返回给父进程,子进程不会被创建,设定错误码。
我们再写一个代码进行实验:
调用fork成功,子进程的pid为25195,返回给id,0返回给子进程的id
我们发现一个问题:同一个变量id,在后续没有修改的情况下,竟然会两个不同的值,原因是什么呢?
我们再写一串代码:
我们可以发现,子进程和父进程一起进行执行。
这就叫做多进程。
fork后续的代码:被父进程和子进程共享,通过返回值的不同让代码执行后续代码的一部分。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。