摘要
本章主要是说一下冯诺依曼体系结构和进程的一部分东西。
目录
摘要
一、冯诺依曼体系结构
二、操作系统的概念
三、设计OS的目的
四、管理
五、进程的基本概念
六、PCB
七、在Linux环境下查看进程
八、使用代码创建进程
九、思维导图
一、冯诺依曼体系结构
如下方图片所示黑色箭头是控制信号,红色是数据信号,冯·诺依曼体系结构,也称为普林斯顿结构,是现代计算机发展的基本结构形式,由数学家冯·诺依曼提出。它奠定了现代电子计算机的基本结构,规定了五大组成部件:运算器、控制器、存储器、输入设备和输出设备,并规定了以二进制形式表示数据和指令。
冯·诺依曼体系结构的主要特点包括:
1、单处理机结构:计算机以运算器为中心,运算器、控制器等部件都通过运算器进行数据的加工处理。
2、存储程序思想:将程序指令和数据存储在同一存储器中,CPU从存储器中取出指令和数据进行相应的计算。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。
3、指令和数据以二进制形式表示:这种表示方式使得计算机内部的处理更加统一和高效。
4、指令由操作码和操作数组成:操作码指示计算机执行何种操作,操作数则是操作的对象。
5、指令顺序执行:按照指令在存储器中的排列顺序,逐条取出指令来执行。
二、操作系统的概念
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:内核(进程管理,内存管理,文件管理,驱动管理)和其他程序(例如函数库,shell程序等等)。
怎么举例呢,有点像是一个银行,我门是无法直接去银行的仓库里面自己拿钱,并且银行也只会流出几个窗口让我门进行取钱, 这一步就有点像怕我们去抢钱,这个就是为了保护银行的安全,也就是相当于内核,在冯诺依曼体系结构中,我知道了,我们是不能直接进行访问控制器的,是利用存储器读取我们所输入的数据,从而进行访问,这个在我们访问过程中,是不认识如何访问控制器的,就像有些老爷爷老奶奶去银行存钱的时候就不会。
所以需要一些东西把这个封装起来我们就可以进行访问,这个访问也会变得轻松,这个就是外壳程序,也就是相当于把操作的成本降低,安全性提高,这个就是操作系统,他的结构就像下方图片所示。
三、设计OS的目的
设计操作系统的目的主要是为了更有效地管理和使用计算机硬件和软件资源,提供友好的用户接口,并保护系统的安全和稳定。以下是设计操作系统的几个主要目的:
1、提高资源利用率:操作系统通过合理调度和管理计算机的各种资源(如CPU、内存、硬盘等),确保它们得到高效的利用。它可以根据任务的优先级和系统的负载情况,动态地分配资源,从而避免资源的浪费和冲突。
2、方便用户使用:操作系统提供了一个友好的用户接口,使得用户可以轻松地与计算机进行交互。无论是图形用户界面还是命令行界面,操作系统都致力于简化用户的操作过程,提高用户的工作效率。
3、提供强大的系统功能:操作系统内置了许多系统级的功能,如文件管理、设备驱动、网络通信等。这些功能使得用户可以方便地进行文件操作、设备控制和网络通信,而无需深入了解底层硬件和软件的细节。
4、保证系统安全稳定:操作系统负责保护系统的安全,防止未授权的访问和恶意软件的攻击。它采用了一系列的安全机制和技术手段,如访问控制、加密和防火墙等,确保系统的稳定运行和数据的安全。
5、支持多任务并发执行:操作系统允许多个任务(或进程)同时运行,通过合理的调度和管理,使得这些任务能够并发执行,从而提高系统的吞吐量和响应速度。
6、提供可扩展性和可维护性:操作系统设计时要考虑系统的可扩展性和可维护性,使得系统能够方便地添加新功能或修复漏洞,同时保持系统的稳定性和兼容性。
综上所述,设计操作系统的目的是为了更有效地管理和使用计算机资源,提供友好的用户接口,保证系统的安全稳定,并支持多任务并发执行。这些目的的实现,使得操作系统成为计算机系统中不可或缺的重要组成部分。
四、管理
管理怎么解释呢,就像我们在学校中是基本上见不到校长的,校长需要管理学生,那么每年那么多学生是怎么管理的过来,总不能每年来新生校长都要一个一个进行登记吧,所以只是就出现了院长辅导员等等,一个一个下方进行手机,级别一个比一个高就相当于管理,但是呢几千个学生也没法一个一个看信息,还需要排序啊,把某一部分人放在一起,统计出来,然后这时候我就想起来之前写过的通讯录,当时第一反应就是第一一个结构体,去统计信息,所以这个也是类似,要不信息也是很斑驳的,所以在操作系统这里,也是先描述,在组织。
描述起来,用struct结构体,组织起来,用链表或其他高效的数据结构这样就能进行描述这个管理的过程,总结来说就是六个字先描述在组织。
在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
这个就是在描述过后就可以进行组织,怎么进行组织呢,就是封装起来,这个封装就是相当于库,在这个库我之前在学习c和c++就是经常使用。
五、进程的基本概念
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,也是操作系统结构的基础。它实质上是程序在多道程序系统中的一次执行过程,具有动态性,即动态产生、动态消亡。同时,进程具有并发性,任何进程都可以同其他进程一起并发执行;独立性,作为能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;以及异步性,由于进程间的相互制约,使进程具有执行的间断性。
从理论角度看,进程是对正在运行的程序过程的抽象;从实现角度看,进程是一种数据结构,目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。狭义上,进程可以视为一段程序的执行过程;广义上,进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
在操作系统中,进程是动态执行的基本单元。它既是基本的分配单元,也是基本的执行单元。根据进程的特点,进程可以被分类为交互进程、批处理进程和守护进程等。交互进程通常是由shell启动的,并可以与用户进行交互操作;批处理进程则负责按照顺序启动其它进程;守护进程是执行特定功能或者执行系统相关任务的后台进程。
总的来说,进程是计算机系统中的核心概念之一,它负责程序的执行和资源的管理,对于计算机系统的稳定性和效率至关重要。
总结一下:进程就等于对应的代码和数据+进程对应的PCB结构体。
六、PCB
这个就是相当于上文中说管理的时候,统计学生信息时创建的结构体就是这个PCB,他的全称是process control block,Linux操作系统下的PCB是: task_struct。
task_struct-PCB的一种在Linux中描述进程的结构体叫做task_struct,task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
task_ struct内容分类如下方代码框中。
标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
七、在Linux环境下查看进程
组织进程:可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。
查看进程:进程的信息可以通过 /proc 系统文件夹查看,例:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹,大多数进程信息同样可以使用top和ps这些用户级工具来获取,如下方截所示,因为代码看不见彩色不好看所以就给看截图了。
ps
用于显示当前系统的进程状态。通过 ps
命令,你可以查看系统中正在运行的进程,以及它们的状态、优先级、所使用的资源等信息,常用的 ps
命令选项有:
e
: 显示所有进程。
f
: 全格式显示。
l
: 长格式显示。
u user
: 显示指定用户的所有进程。
x
: 显示没有控制终端的进程。
如下方代码就是查看了一下进程和父进程,test.c的代码在代码框里,结果在块里。
[ly@VM-24-9-centos Linux_1]$ vim text.c
[ly@VM-24-9-centos Linux_1]$ gcc -o text text.c
[ly@VM-24-9-centos Linux_1]$ ll
total 16
-rwxrwxr-x 1 ly ly 8464 Apr 13 20:07 text
-rw-rw-r-- 1 ly ly 152 Apr 13 20:07 text.c
[ly@VM-24-9-centos Linux_1]$ ./text
pid: 15074
ppid: 10266
[ly@VM-24-9-centos Linux_1]$
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{printf("pid: %d\n", getpid());printf("ppid: %d\n", getppid());return 0;
}
八、使用代码创建进程
fork是创建进程的函数,fork有两个返回值,父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝),如下方代码他的返回值有两个人,也就是会创建两个进程所以只是一个代码也会打印两次。
[ly@VM-24-9-centos Linux_1]$ ./text
hello proc : 17484!, ret: 17485
hello proc : 17485!, ret: 0
[ly@VM-24-9-centos Linux_1]$
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{int ret = fork(); printf("hello proc : %d!, ret: %d\n", getpid(), ret);sleep(1);return 0;
}