冯诺依曼结构和进程概念及其相关的内容的简单介绍
目录
编辑
冯诺依曼体系结构
操作系统(Operator System)
进程
引入
基本概念
描述进程-PCB
task_ struct内容分类
进程 ID (PID)和查看进程
进程状态:
进程创建:
进程终止:
进程间通信 (IPC):
冯诺依曼体系结构
冯诺依曼体系结构是现代计算机的基础架构,它将计算机的主要部分分为以下几个核心组件:
中央处理单元(CPU):
-
算术逻辑单元(ALU):执行计算任务,如加法、减法等运算。
-
控制单元(CU):负责解读程序指令,并控制各部分执行任务。
存储器(内存):存储数据和程序指令,CPU可以从内存中取出数据和指令进行处理。
输入/输出设备(I/O):与外部设备进行数据交换,输入设备将外部数据送入计算机,输出设备将计算结果输出到外部。
总线:连接CPU、内存和I/O设备的通信通道,负责在各个部分之间传输数据。
工作流程:
-
取指(Fetch):从内存中读取下一条指令。
-
解码(Decode):控制单元解码指令并确定需要执行的操作。
-
执行(Execute):通过ALU执行运算或处理数据。
-
存储(Store):将结果存回内存(如果需要)。
注意:
-
这里的存储器指的是内存
-
不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
-
外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
假设你和你朋友在不同的地区利用qq进行聊天,
在我们的角度上你们各自的电脑分别是两个冯诺依曼结构,我们的网卡使我们电脑连接我们的网络,我们聊天时利用网卡发送消息通过网络,接受信息通过网络。
当我们的数据在计算机内部流转时,本质就是进行拷贝,我们的计算机的效率实际就是拷贝的效率。
为什么要有内存?
我们没有内存时:
但是哦你要知道我们的CPU运行是非常的快的,外设是非常的慢的。
如果我们计算机要是想这个样设计的话,那么我们整个计算机的效率就是以我们外设的效率为准(木桶原理)
如果我们增加了内存的话,我们的CPU的效率就不会受我们的外设影响,而是我们的内存和外设进行交流,
那么我们的CPU的效率就和我们的内有关,我们内存的运行速度还是挺快的。虽然达不到我们CPU的速度那么快,但是会比我们的外设快很多。
而我们的内存也不会很贵,价格适中,效率也可以,所以导致我们的计算机的造价没有那么贵,所以我们普通人也可以用得起电脑
操作系统(Operator System)
概念
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
-
内核(进程管理,内存管理,文件管理,驱动管理)
-
其他程序(例如函数库,shell程序等等)
设计OS的目的
-
与硬件交互,管理所有的软硬件资源
-
为用户程序(应用程序)提供一个良好的执行环境
定位
在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件
如何理解 "管理"
-
管理的例子 描述被管理对象
-
组织被管理对象
我们的操作系统就像我们的管家,不用我们的去概念底层的是如何实现的,只需要你把你要干什么,要什么告诉我们的操作系统,他就会去实行,完成我们的任务。
无论我们上面怎么实现,我们的硬件设备会满足我们的冯诺依曼体系结构,每一种硬件都要有我们自己对应的驱动程序。
为什么要有操作系统?
-
操作系统对下也要进行软硬件资源的管理。稳定的,高效的,安全的,能进行良好的。
-
操作系统对上要给用户提供一个良好的稳定的,高效的,安全的运行环境。
但是注意我们的操作系统他是不相信我们任何用户的,所以他会将我们的底层封闭起来,就像我们的银行不相信我们的前来银行取钱的人,他不会让你直接去他自己的仓库中拿,而是提供一个个的窗口为我们提供相关服务,我们的操作系统向上也提供了相关接口,方便我们的上层使用。( 李美,也就是我们的系统调用)
进程
引入
在我们现实生活中,我们的校长要管理好学生,不需要直接和我们学生直接见面,所以我们的操作系统在管理我们的底层硬件时也不用直接管理他们。
是如何实现的呢?
管理的本质是对我们的数据进行管理。
在我们的管理者和被管理者之间需要有一个中间角色,它对上采集决策,对下执行决策。
我们的校长去管理学生的数据时,创建一个我们的学生的结构体(struct) ,里面包含我们的学生的一些资料,我们校长对学生的信息进行管理实际上是对我们的结构体进行管理,我们将我们的学生的结构体利用我们的链表将没所有学生的信息串联起来,那么我们去遍历和查找我们的信息,实际上就转换为对链表的增删查改了。
那么我们操作系统是如何管理硬件的呢?我们的硬件虽然不同,但是他们的属性是一样的,只是属性的内容不一样,所以我们的只需要建立一个结构体就行就可以管理我们的硬件,也是我们对链表的管理。
这种方法我们称为先描述在组织。
基本概念
-
课本概念:程序的一个执行实例,正在执行的程序等
-
内核观点:担当分配系统资源(CPU时间,内存)的实体。
我们的操作系统在管理我们的进程的时候同一个名为task_struct PCB的结构体来管理我们的进程的属性。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息
比如我们自己写的代码加载到我们的内存中,我们将它的代码内容加载进去,但是中数据是不利于我们管理的,但是我们的数据执行到哪了,和状态等一列属性是可以的,我们将其组织起来便于管理。
描述进程-PCB
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。 课本上称之为PCB(process control block),Linux操作系统下的PCB是
task_ struct内容分类
-
标示符: 描述本进程的唯一标示符,用来区别其他进程。
-
状态: 任务状态,退出代码,退出信号等。
-
优先级: 相对于其他进程的优先级。
-
程序计数器: 程序中即将被执行的下一条指令的地址。
-
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
-
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
-
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
-
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。 其他信息
在 Linux 中,进程是操作系统进行资源分配和调度的基本单位。每个进程都有独立的内存空间、文件描述符、环境变量等资源。以下是进程的几个关键点:
进程 ID (PID)和查看进程
每个进程都有一个唯一的进程 ID,用于标识和管理。进程的信息可以通过 /proc 系统文件夹查看
进程状态:
-
运行 (Running): 进程正在 CPU 上执行。
-
就绪 (Ready): 进程等待 CPU 调度。
-
阻塞 (Blocked): 进程等待某些事件(如 I/O 完成)。
-
僵尸 (Zombie): 进程已终止,但其父进程尚未回收资源。
-
停止 (Stopped): 进程被信号暂停。
进程创建:
通过 fork() 系统调用创建新进程,新进程是父进程的副本。
#include <stdio.h>
#include <unistd.h> // 包含 fork() 和 getpid() 的声明
#include <sys/types.h> // 包含 pid_t 的定义
int main() {
// 创建子进程
pid_t pid = fork();
if (pid < 0) {
// fork() 失败
fprintf(stderr, "Fork failed!\n");
return 1;
} else if (pid == 0) {
// 子进程
printf("Hello from the child process! (PID: %d)\n", getpid());
} else {
// 父进程
printf("Hello from the parent process! (PID: %d, Child PID: %d)\n", getpid(), pid);
}
return 0;
}
进程终止:
进程可通过 exit() 系统调用终止,或由信号强制终止。
进程间通信 (IPC):
进程可以通过管道、消息队列、共享内存、信号量等方式进行通信。