前言
本文介绍了冯诺依曼体系结构、操作系统及进程概念。
一、冯诺依曼体系结构
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
1.简介冯诺依曼体系
截至目前,我们所认识的计算机,都是由一个个的硬件组件组成
- 输入单元:键盘,网卡, 鼠标,扫描仪, 写板等;
- 输出单元:磁盘,网卡,显示器,打印机等;
- 中央处理器(CPU):含有运算器和控制器等;
关于冯诺依曼体系要注意的是:
- 这里的存储器指的是内存;
- 不考虑缓存的情况,这里的CPU只能对内存进行读写,不能访问外设(输入或者输出设备);
- 所有的设备都只能直接和内存打交道。
2.CPU
在整个计算机中CPU是运行速度最快的,其次是CPU中配置的寄存器,之后是内存,外设是最慢的。(CPU的运行是通过电流的交互,而外设等都是机械运动,所以速度差距是很大的)
CPU虽然是速度最快的,但是它只能被动接受别人的数据,CPU只有通过识别别人的指令(制造CPU时内置的指令集)才能执行别人的指令。
3.存储器
存储器指的是内存。
如果没有内存,CPU只能从外设获取数据,但是外设的速度是相对较慢的,这就意味着此时整个程序的运行速度取决于外设,这会导致程序的运行效率较慢。
木桶效应
一个水桶无论有多高,它盛水的高度取决于其中最低的那块木板。
内存的存在,解决了这个问题,可以先包数据存放在内存中,再加载到CPU中进行处理,这就提高了数据的处理速度。
所以CPU中的数据必须从内存中拿!!!
3.IO(输入输出)
我们所说的IO(即,input/output,输入输出)就是从内存的角度上看:把数据从输入设备存入内存的过程就是input,把数据从内存放置到输出设备的过程就是output。这就是IO的过程。
4.总结
程序的数据必须加载到内存,CPU执行的代码访问的数据必须从内存中读取。(冯诺依曼体系决定的)
二、操作系统(OS)
1.操作系统是什么?
操作系统是一个进行软硬件资源管理的软件,操作系统包含进程管理、文件管理、内存管理以及驱动管理。
2.为什么有操作系统?(功能)
操作系统:对下进行合理的管理软硬件资源(目的),对上为用户提供稳定的、高效的、安全的的执行环境(手段)。
3.操作系统如何实现功能?
管理的本质是对数据做管理。操作系统并不是直接对计算机中的各种软硬件进行管理,而是通过提取出要管理的事物的数据,对数据进行分析,最终做出决策,下发指令给驱动,由驱动进行执行,达到管理的目的。
操作系统管理软件是先用struct结构体将它描述起来,再用链表等数据结构将它组织起来。
- 例子:学校校长对学生的管理
校长并不直接接触学生,而是通过辅导员将学生的数据(姓名、性别、年龄、成绩等等)传给校长,再对数据进行分析,对每一个学生的管理方案进行决策,将指令传给辅导员,由辅导员执行对学生的管理。- 总结
管理的本质是对数据做管理,管理的方法是先描述再组织。
计算机的体系结构:
三、系统调用和库函数
- 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
- 系统调用在使用上,功能比较基础,对用户的要求相对比较高,所以,有一些开发者对部分的系统调用做了适当的封装,从而形成了库。有了库,就更有利于上层用户或者开发者进行二次开发。
- 用户不是直接和操作系统进行操作交流的,需要通过调用用各种接口间进行交流(对应计算机体系结构图中的用户操作接口和system call)。
四、进程
1.概念
- 大多数课本中的概念:一个运行起来的(加载到内存中的)程序叫做进程,即在内存中的程序叫做进程
- 内核的观点:进程是担任分配系统资源(CPU运行时间、内存等)的实体
2.描述进程的数据结构——PCB
1.PCB
进程的信息被统一放在一个叫进程控制块的结构体中,可以将它理解为进程属性的集合。PCB(process control block),linux操作系统下的PCB是task_struck结构体。
2.程序和进程
程序本质是放在磁盘上的可执行文件(.exe文件)。
进程则是将程序加载到内存中(根据冯诺依曼结构体系,程序要允许需要先加载到内存中)并且由操作系统进行管理,生成一个描述自身性质(属性)的数据结构(PCB)。
因此,进程是由内核数据结构(PCB)和进程在磁盘上的对应代码共同组成的。
3.task_struct
Linux中描述进程属性的数据结构PCB叫做task_struct(task_struck是PCB的一种),它被装载在RAM(内存)中。
task_struct内容分类:
- 标识符:描述进程的唯一标识符,用于区分不同的进程;
- 状态:任务状态、退出码、退出信号等;
- 优先级:相对其他进程的优先级;
- 程序计数器:记录程序中即将被执行的下一条指令的地址(不是下一条指令)
- 内存指针:包括程序代码和进程相关数据的指针以及与其他进程共享的内存块的指针;
- 上下文数据:进程执行时处理器的寄存器中的数据;
用一个例子说明:
张三同学因为生病需要休学一年,那么在他正式学修前需要准备申请休学的材料,同时要带走他在学校放置的物品。
休学回来后,他将申请恢复,同时将自己带走的物品重新放回学校。
这些被张三带走又带回的物品就是他的上下文数据。 - I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表;
- 记账信息:包括处理器的时间总和,使用的时钟数总和、时间限制、记账号等。
所有运行在操作系统中的进程都以task_struct链表的形式存在内核中。
3.查看进程
1.方法1
- 创建文件myproc.c和Makefile
- 查看进程
先复制一个ssh会话,再用ps ajx | head -1 && ps ajx | grep myproc | grep -v grep
命令显示该可执行文件中的进程信息。
我们可以用ctrl + c终止进程,也可以用kill - 9 (进程pid)杀掉进程
进程运行的本质是读取并执行程序内部的代码,从启动到终止这个进程的过程会有很长一段时间,在整个过程中它都具有动态属性。即,进程在调度运行的时候就具有动态属性。
2.方法2
修改myproc.c文件
使用命令:ls /proc/(进程pid) -d
查看进程
如图:通过进程pid来查看进程,当进程被杀死就无法再进行查看了。
如图,进程也可以被当作一个文件看待。
当然,重新执行进程时操作系统会为进程分配一个新的pid。
4.系统调用
1.getpid
获取进程的pid。该函数的返回值就是进程的pid。
2.系统调用获取进程标示符
getpid();//获取本进程的标示符 getppid();//获取本进程父进程的标示符
总结
以上就是今天要讲的内容,本文介绍了冯诺依曼体系结构、操作系统以及进程的相关概念。本文作者目前也是正在学习Linux相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。
最后,如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!