浅谈冯诺依曼体系,操作系统和进程概念
文章目录
- 浅谈冯诺依曼体系结构和操作系统
- 冯诺依曼体系结构
- 冯诺依曼体系结构图
- 操作系统
- 进程
- task_struct内容分类
- 进程=内核数据结构(task_struct)+进程对应的磁盘代码
- 查看进程
- ps 列出系统中运行的进程
- ps ajx 查看系统中所有运行的进程
- ps ajx | grep '程序名' :罗列出对应进程
- ps ajx | head -1 && ajx | grep '程序名' :罗列出对应进程同时显示标题
- kill -9 进程id :杀死进程
- getpid 返回进程的标识符【id】(返回类型是pid_t-本质是size_t)
- 通过查看 /proc目录查看进程
- 进程的调用
- getppid()查看父进程
- fork 创建子进程
浅谈冯诺依曼体系结构和操作系统
冯诺依曼体系结构
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
冯诺依曼体系结构图
这里的存储器指内存(带电存储,掉电易失),而磁盘(具有永久存储能力)是外存,是外设的一种。
运算器+控制器+其他大致等于cpu。cpu有自己的指令集(简易指令集和复杂指令集),且只能被动的接受别人的指令和数据,并转换成指令集后计算数据。(速度从慢到快:cpu>内存或存储器>外设)
控制器负责数据或者外设准备动作的捕捉;运算器主要做数学运算和逻辑运算。
众所周知,cpu的速度最快,内存较快,而外设较慢。若没有内存,cpu在处理数据的速度则取决于外设,而外设较慢;所以cpu在处理数据时必须从内存中拿!
数据在存储器和外设之间传递被称为IO的过程,从内存的角度上看,把数据从输入设备存入内存的过程叫做input,而把内存中的数据输出到输出设备的过程叫做output,这就是IO的过程。
得出结论:冯诺依曼体系规定:cpu不直接与外设沟通,而内存直接与他们直接联系-作为两者之间的桥梁。
操作系统
操作系统是一个进行软硬资源管理的软件,通过合理的软硬件管理,为用户提供良好的执行环境
对于管理的理解:比如企业的CEO对员工进行管理,并不需要CEO天天跟员工接触,而是对员工的数据进行管理!那么管理者怎么对被管理者管理呢?中间就需要执行者去执行管理者的命令去拿到被管理者的数据给管理者。操作系统通过驱动对硬件进行管理
对众多被管理者的数据进行整合分类提炼,构造结构体然后把对应数据填充进去,那么对数据的管理转化为对结构体的管理;把各个结构体通过链表结构联系起来,那么就是转化为对链表对管理;总的来说就是把数据抽象出来再做管理—先描述,再组织-面向对象的本质 总的来说管理的本质:对数据做管理;管理的方法:先描述再管理!
操作系统通过驱动对外设做管理,更深层次就是软件通过操作系统的接口对硬件做管理(简称系统调用-c式)比如printf函数
进程
进程是什么?起初可以说一个运行起来(加载到内存)的程序叫进程或者在内存的程序叫进程,但是看完以下分析后应该对进程有更深入的了解。
我们写出二进制可执行程序放在磁盘,程序运行时内存上有对应加载进来的程序的代码和数据,此时内存上会构造出对应加载进来程序的代码和数据的pcb(pcb之间的数据结构为链表),cpu通过对pcb的管理从而对加载进来的程序的管理,对进程的管理转化成对链表的增删查改!
task_struct内容分类
标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息
进程=内核数据结构(task_struct)+进程对应的磁盘代码
查看进程
我先创建一个myproc.c在里面写相应代码,和Makefile在里面写相应条件
然后编译运行
可以看到这个程序一直在运行
ps 列出系统中运行的进程
ps ajx 查看系统中所有运行的进程
然后通过管道筛选到我们刚刚写的程序
ps ajx | grep ‘程序名’ :罗列出对应进程
图中上面那个就是我们想要的进程拉
ps ajx | head -1 && ajx | grep ‘程序名’ :罗列出对应进程同时显示标题
kill -9 进程id :杀死进程
输入kill -9 6473杀死刚刚那个进程;对此我们可以知道:进程在调度运行的时候,进程就具有动态属性!
getpid 返回进程的标识符【id】(返回类型是pid_t-本质是size_t)
我们稍微修改myproc.c得以查看进程的标识符(id)
通过ps查看确实就是!
且每次重新运行后进程的id是不同的!
通过查看 /proc目录查看进程
以数字开头的进程或者文件就是进程!没错,在Linux下进程也是目录或文件!
我们终止掉进程后就发现进程对应目录被清理掉了!
我们进到目录里,可以看到exe对应的目录就是可执行程序在磁盘上对应的目录!并且我们通过ls 查看知道进程对应的目录只有读和执行的权限!
现在我另起一个界面删除可执行程序myproc,那进程会被中断吗?不会!进程还运行!
但是我们可以在/proc目录查看到可执行程序对应在磁盘的目录显示红色并且闪动
进程的调用
getppid()查看父进程
我将myproc.c稍作修改
可以发现每次重新运行程序时子进程会改变但是父进程不会改变,通过查看可以知道父进程对应的是shell进程(bash)!每次退出shell后bash才会改变!
因此我们可以知道:命令行上启动的进程,一般情况下它的父进程都是bash
fork 创建子进程
fork函数执行前,只有一个父进程,执行后有父进程和子进程两个进程。
通过man查看,知道返回值为 pid_t,然后在当时界面下输入/return val查看返回值,可以知道如果成功就把pid返回给父进程,而把0返回给子进程,如果失败就把-1返回给父进程,子进程没有返回值
然后我们通过运行得知确实如此,但是我们打印了两次!且我在以往的c和c++学习中没遇到过一次性有两个返回值的情况!
利用fork返回值的特性再对myproc.c修改,如果返回值是0那么就执行子进程且每次睡眠1秒,如果返回值大于0就执行父进程且每次睡眠2秒。
然后我们执行可以知道先是执行了一次父进程然后执行了两次子进程
综上得出:fork()之后,会有父进程和子进程两个进程在执行后续代码,且后续代码共享!可以通过返回值和id不同辨识父子进程!
好啦以上就是我对关于冯诺依曼体系结构、操作系统的理解和对进程概念、怎么查看进程、杀死进程,调用进程的介绍。