松江企业做网站,qq教程网站织梦,小程序页面设计用什么软件,58网站自己做冯诺依曼体系结构os管理 一.冯诺依曼体系结构#xff1a;1.简单介绍#xff08;准备一#xff09;2.场景#xff1a;1.程序的运行#xff1a;2.登录qq发送消息#xff1a; 3.为什么需要内存#xff1a;1.简单的引入#xff1a;2.计算机存储体系#xff1a;3.内存的意义… 冯诺依曼体系结构os管理 一.冯诺依曼体系结构1.简单介绍准备一2.场景1.程序的运行2.登录qq发送消息 3.为什么需要内存1.简单的引入2.计算机存储体系3.内存的意义 二.操作系统1.概念引入2.故事引入校园环境做背景1.管理者和被管理者是不需要见面2.管理者如何获取被管理者信息3.数据量较大的时候怎么办4.建立学生的数据结构保存在容器中5.总结管理的过程就是一个 先描述再组织的一个过程 3.系统调用和库函数的概念1.基本概念2.从上到下需要注意的一些问题 三.进程管理1.承上启下2.基本概念2-1事实 3.描述进程PCB task_struct(linux系统下)4.场景一加载多个程序到内存5.task_struct 内容分类5-1程序计数器 6.组织和查看进程6-0在C/C下获取当前程序的子父进程号的函数6-1查看进程简单方式6-2创建文件6-3chdir() 修改当前工作目录 7.系统调用创建进程——fork7-1创建子进程7-2三个问题1给父进程返回子进程的pid 给子进程返回02一个函数只能返回一个值这个tmp有两个值返回了两次吗3if 和else 的判断都满足条件说明 tmp0 并且大于04一个进程奔溃了影不影响另一个进程 8.进程状态8-1进程排队问题一需要找到结构体的首地址问题二队列 8-2状态8-3运行8-4阻塞8-5挂起 一.冯诺依曼体系结构
1.简单介绍准备一 常见的输入设备磁盘 键盘鼠标摄像头麦克风声卡网卡数位板。 常见的输出设备显示器声卡网卡打印机。 输入输出声卡网卡。 cpu的功能进行运算操作控制cpu的信息流动。 存储器就是我们的内存所以的设备都只能和内存打交道。 2.场景
1.程序的运行
一个程序的运行是直接加载到内存当中的 2.登录qq发送消息 3.为什么需要内存
1.简单的引入 1.假设我们的体系结构中只有输入设备输出设备cpu三个主要部分 2.结论系统效率大大降低效率只取决与输入输出设备 2.计算机存储体系 1.从上到下速度越来越慢 2.造价越来越便宜 3.每级之间效率相差不大 3.内存的意义 1.因为cpu直接和输入输出设备进行交互太缓慢运行程序多的时候就只能看输入和输出设备 2.输入设备的中的可执行程序加载到内存中cpu没有执行之前程序都可以预先加载到内存中。 3.cpu要进行运算就从内存中去拿到程序。 4.执行结果也可以在内存中进行保存让输出设备一个一个的拿出去。 有了上面两个知识的铺垫我们就可以解释内存存在的意义
1.整个系统的效率就由内存的效率决定了 2.减少了使用成本并且体系结构使用稳定 3.综上所述整个硬件体系就不存在影响效率的问题了转换到了软件的问题整个机器的效率就要看操作系统了。
二.操作系统
1.概念引入 1.操作系统本质是一个软件是第一个软件。 2.操作系统和底层硬件之间的联系结构图。 2.故事引入校园环境做背景 校长—做决策 辅导员—保证管理和决策落地 学生----被管理人 1.管理者和被管理者是不需要见面 1.管理者和被管理者之间是通过管理者获取到被管理者的信息进行管理本质上是对信息做管理。 2.管理者如何获取被管理者信息 1.通过辅导员拿到被管理者的信息 3.数据量较大的时候怎么办 1.当管理者在面对大量的被管理者的时候这么多的数据如何去处理把对人的管理变成对数据的管理 4.建立学生的数据结构保存在容器中 1.我们知道每一个学生都有相同的属性不同的内容每一个学生的属性内容都是不一样的。 2.建立学生结构体把信息保存在容器中进行对学生数据的管理 3.对学生的管理就转移到了对容器的每一个学生信息结构体的增删查改。 5.总结管理的过程就是一个 先描述再组织的一个过程 通过上面的介绍对于底层硬件的管理就是 1.操作系统(驱动管理)-----------校长。 2.硬件驱动--------辅导员 3.硬件本身--------学生 4.总结对于硬件的管理本质上就是一个先描述再组织的过程。 描述结构体进行描述 组织使用数据结构进行组织 5.为什么需要操作系统 5-1没有操作系统需要自己管理和控制硬件 5-2对下更好的控制软硬件资源 5-3对上提供良好的运行环境 5-4稳定高效安全。 3.系统调用和库函数的概念
1.基本概念 1.在开发角度对外会表现为一个整体但是会暴露自己的部分接口供上层进行开发使用这部分由操作系统提供的接口叫做系统调用。 2.系统调用在使用上功能比较基础对用户的要求相对比较高所以有心的开发者可以对部分系统进行适度的封装从而形成了库有了库就更加利于用户的使用和开发者的开发。 3意义解决系统调用减少接口使用成本 4.上面这个概念有可能不是特别容易听懂说一个故事 可以把系统调用接口想象成银行的取钱的窗口一个比较会存取钱的人不需要lib库可以直接和系统接口交互来了呢可以直接取号去到窗口办理业务。那么现在有一位老大爷要来取钱老大爷什么也不会那么这个老大爷就找到了大堂经理lib库大堂经理就帮助老大爷进行拿号到窗口办理业务取钱的整个过程相当于调用系统接口借助了lib库的帮助一样。 2.从上到下需要注意的一些问题
1.从上到下是不可以发生越级访问。 2.不可以绕过操作系统 3.操作系统从头到尾是贯穿的。
三.进程管理
1.承上启下
操作系统是怎么进行进程管理的呢 非常简单先描述再组织的一个过程
2.基本概念 课本上程序的一个执行实例正在执行的的一个程序 内核上担当分配系统资源cpu时间 内存实体。 上面这些概念不是特别的好可以不看用网上比较火的说法就是如说
2-1事实 1.我们可以同时启动多个程序—多个exe加载到内存中 2.操作系统需要管理多个加载到内存中的程序 3.操作系统如何管理加载到内存中的程序呢先描述再组织 3.描述进程PCB task_struct(linux系统下) task_struct(进程控制块进程属性的合集) 是PCB的一种是linux系统下的描述进程属性的结构体它会被装载到RAM(内存)里并且包含进程的信息。 4.场景一加载多个程序到内存
总结 进程 可执行程序内核PCB对象 进程 可执行程序内核数据结构 5.task_struct 内容分类 标示符: 描述本进程的唯一标示符用来区别其他进程。 状态: 任务状态退出代码退出信号等。 优先级: 相对于其他进程的优先级。 程序计数器: 程序中即将被执行的下一条指令的地址。 内存指针: 包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子要加图CPU寄存器]。 IO状态信息: 包括显示的I/O请求,分配给进程的IO设备和被进程使用的文件列表。 记账信息: 可能包括处理器时间总和使用的时钟数总和时间限制记账号等。 其他信息 5-1程序计数器
程序计数器: 程序中即将被执行的下一条指令的地址。
6.组织和查看进程 1.PCB-task_struct :PCB操作系统规定的名称 2.结构体中包含进程的所有属性 6-0在C/C下获取当前程序的子父进程号的函数 #includeunistd.h #includesys/types.h 1.获取当前程序的进程getpid(): 2.获取当前程序的父进程getppid(): 6-1查看进程简单方式 方法一查看系统文件夹/proc/ 下的进程信息 方法二通过命令进行查询 ps ajx | head -1 ps ajx | grep mybin ps ajx 查看当前系统的所有进程 方法三使用脚本进行进程的刷新 while : ; do ps ajx | head -1 ps ajx | grep mybin ;sleep 1 ; done 功能可以进行实时的进程信息观察 6-2创建文件 1.我们知道在C语言中我们使用fopen()函数打开一个文件进行只写操作如果当前路径下没有这个文件会创建一个文件用来进行写入 2.那么 这个路径在linux中是以什么进行保存的呢 3.我们查看了proc中存放的该进程的程序 cwd(当前工作路径)/LIMO/proc_learn/ exe(可执行程序的路径)/LIMO/proc_learn/mybin 4.fopen() 函数可以找到cwd的路径并且在这个路径下生成文件 6-3chdir() 修改当前工作目录 动图效果
7.系统调用创建进程——fork
7-1创建子进程 使用man fork 查看一下信息 1.复制当前进程称为父进程生成一个子进程。 2.fork有两个返回值 3.父进程拿到新开辟子进程的pid子进程拿到pid为0的返回值 4.子进程的意义我们想要生成的子进程去给我们做事情 44 int main()45 {46 int n15;47 while(n1--)48 {49 printf(当前进程%d 当前父进程: %d\n,getpid(),getppid());50 }51 52 pid_t tmp fork();53 printf(程序pid: %d,getpid());54 55 while(1)56 {57 if(tmp 0)58 {59 60 printf(当前进程是子进程的进程号%d 当前父进程: %d\n,getpid(),g etppid());61 }62 else63 {64 65 printf(当前进程是父进程的进程号%d 当前父进程: %d\n,getpid(),g etppid());66 }67 sleep(1);68 }69 return 0;70 }//观察一下动图效果 7-2三个问题
1给父进程返回子进程的pid 给子进程返回0 父进程子进程 1n 一个父进程有可能有多个子进程所以想要父进程可以确定的找到某一个子进程就需要返回子进程的pid 。对于子进程来说父进程只有一个所以找到父进程是非常容易的所以返回0 2一个函数只能返回一个值这个tmp有两个值返回了两次吗 fork()函数的实现 子父进程共享变量在return的时候发生写时拷贝变量名是相同的地址不相同进程号不相同拷贝使用不同的内存空间在linux下可以使用同一个变量名表示不同的内存 3if 和else 的判断都满足条件说明 tmp0 并且大于0
这个问题需要一些后面的知识以后再说
4一个进程奔溃了影不影响另一个进程 命令 kill -9 进程号 单独杀死一个进程 动图效果
8.进程状态
8-1进程排队 1.进程具有这样的连接状态只要进程的task_struct 进行这样的排队。直接连在这个地方。我们只要有这个节点就可以找到这个链表就可以链入全局双链表或者链入队列 问题一需要找到结构体的首地址 找到了task_struct 的首地址就可以对对象数据进行任意的访问 在全局还是任何队列消息非常容易找到 问题二队列 1.进程·不是一直在运行的有可能在等待软硬件的资源进程放在cpu中也不是一直都会运行的 2.只要是进程排队就是pcb排队 3.如何排队就是通过struct listnode 结构体保存信息进行排队 8-2状态 运行阻塞挂起都是一个状态这些状态都有对应的队列 进程的一个状态就是进程在状态队列进行的一个排队把对应的struct listnode 加到保存的对应的位置 这些状态是如何进行保存的呢
struct task_struct { int status; …………………… } #define New 1 #define Ready 2 #define runing 3 #define block 4 8-3运行 1.一个cpu一个运行队列 2.struct runqueue{ int num; task_struct* q ;//保存了pcb中的struct listnode 这个对象的地址 } 3.已经加载到运行时队列表示的意思是我已经准备好被随时的进行调度了 8-4阻塞 1.这个时候就进入了阻塞状态。 2.为什么产生需要获取软硬件的资源所以进入阻塞状态 3.阻塞状态是有一个阻塞队列的和运行队列是一个作用 4.阻塞队列等待队列是由对应的的硬件提供的 5.进程进入等待队列是把进程链入底层设备的一个过程 6.对于设备来说输入数据完成就是表示硬件已经就绪这个状态只有操作系统最清楚操作系统在这个地方就进行了管理 总结进程在等待软硬件资源的时候如果没有准备好我们的task_struct 1.将自己设置为阻塞状态进入对应软硬件提供的等待队列。 2.把自己的pcb链入对应软硬件提供的等待队列。 3.状态的改变导致pcb会被os变迁到不同的队列中
8-5挂起 1.进入挂起的前提是资源已经非常吃紧了 2.这个挂起也叫做阻塞挂起 3.在阻塞状态下把进程相关的代码和数据转换到外设中节省内存空间。 4.意义我们可以慢一些但是不可以为了快产生资源吃紧导致有可能最后操作系统就挂掉了