目录
冯诺依曼体系结构冯·诺依曼结构_百度百科 (baidu.com)
冯诺依曼体系结构
冯·诺依曼结构_百度百科 (baidu.com)
冯诺依曼提出了计算机制造的三个基本原则,采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯·诺依曼体系结构。在我们生活中的计算机,如笔记本、服务器,大部分都遵守冯诺依曼体系!
存储器:一定要明确,存储器所指的是内存,它的特性是“掉电易失”,当我们的计算机因外力失去电时,如停电等情况,容易损坏或者丢失数据。
中央处理器(cpu):运算器+控制器+其它(其它部分不细研究)。
输入设备:如键盘,麦克风,摄像头等。
输出设备:如音响,显示器等。
关于输入输出设备这里在补充一点,有些设备既是输入设备又是输出设备,如磁盘、网卡。
对上述概念有些认识以后,我们首先来谈论一下CPU:它给人们的印象总是“高高在上”,但事实上CPU是很“笨”的,它只会被动的去接收别人的指令,接收别人的数据,根据接收到的“任务”去完成相应的操作。根据我们的生活常识,能够去执行某项指令的前提一定是能够认识和理解这个指令,也就是说CPU其实有一个属于自己的指令集,当它接收到指令后,在“大脑”中搜索对应的指令,明确自己要去完成什么样的工作后,去执行指令。
cpu要执行指令做相应的操作,首先一定要有数据(我们写的代码呀、1234......),根据我们的思考,cpu应该是要从内存或者磁盘上获取,我们知道cpu的执行速度很快,而磁盘的执行速度很慢,如果它俩“组队”的话,这个计算机的效率就会非常的慢。基于这样的情况,内存会事先将数据从磁盘上加载给自己,比如开机的时候,将操作系统什么的加载到内存中,cpu在从内存中获取数据进行相应的操作就比较快了。当cpu进行完相应处理后,将更新的数据写回到内存中,内存在将这更新的数据刷新到磁盘上,在这部分理解上你可以把内存想象成一个“大大的缓存”!
基于上述的概念描述,我们可以总结几个小点:
●CPU不和外设“打交道”,只和内存打交道。
●外设有数据要载入,只能载入到内存中。内存要向外写出,也只能写在外设上。(原因是这这样的体系结构能够提高整个计算机的效率)
●内存和外设交互的过程,我们将其称为IO的过程。(inpot/output)
●一句你听过的话:“程序运行前要先加载到内存中”!
原因:这是由体系结构决定的,cpu只能从内存中读取数据,不会直接和外设拿“数据”。
●我们写的代码要编译成二进制指令,是要交由cpu进行处理,因为cpu要根据接收到的指令来完成工作,当接收到二进制的指令后,分析好要处理的数据,根据和自己的指令集“比对”确定要怎样“处理”!
感性理解冯诺依曼体系结构:
假设在一个假期中,小张突然想起了一个许久没有联系的朋友,随机在电脑中打开了QQ,在对话框中输入了要发送的消息,随即向朋友发送了过去。下图所示感性的描述了这个过程:
通过上述的图解可以更好的理解上述的理论部分!
操作系统
什么是操作系统:
操作系统是对软硬件资源进行管理的软件!
为什么要有操作系统:
操作系统对下要完成对硬件的合理管理(手段),对上要提供安全的、稳定的、高效的执行环境(目的)。
怎样管理:
谈到管理我们需要先管理者和被管理者有一个感性的理解:我们步入大学后,校长就是我们最大的管理者,将我们的生活安排的井井有条,什么时候学理论知识,什么时候实践,什么时候体侧等等,但是我们作为学生(被管理者)从入学到毕业并没有见过校长几面!
校长既然要通过数据来对学生进行管理,其中重要的一环就是要获取到数据,可是管理者和被管理者又不直接交互,那么这个时候新的角色就出现了,执行者(辅导员):
根据上图,可以进行如下总结:
1.操作系统根据数据对硬件进行管理。(管理的本质)2.驱动进行数据的采集和决策的执行。
这时又有新的问题要进行解决,当被管理者的数量非常多的时候,操作系统看着眼前琳琅满目的信息头大的不行,这时要做两件事情:
先描述:因为我要管理的的对象不管有多少,信息种类都是一样的,这时就可以定义一个类将其信息描述出来。
在组织:利用数据结构将这些信息组织起来。
3.管理的方法,先描述,在组织!
4.根据生活常识我们知道,校长不单单对学生进行管理,对辅导员也要进行管理。与之对应的操作系统也不仅仅管理硬件,对软件也要进行管理。
有了上述的描述,对操作系统是如何对下管理有了写了解,接下来在探索一下操作系统如何对上提供服务,这里在举一个例子:
不管有钱没钱,我们都有过去银行存取钱的经历,在这个过程中,我们总是隔着厚厚的钢化玻璃将我们的诉求告知工作人员,之所以不让我们直接去“库房拿钱”,虽然你是个本分人,但是银行不是不信任你,是不信任所有人,今天你张三只拿走了属于你的500,明天李四可能会把银行"洗劫一空",基于这样的原因,银行才会开设一个个小窗口和用户交流。
回到正题,操作系统不是不相信某个用户,而是不相信所有用户。如果让用户可以直接访问硬件,这是会出问题的,为了既能提供服务又能将自己保护起来,对用户提供了操作系统接口。这样一来,你有什么诉求先和接口说,能办的给你办了,不合理的要求直接驳回!
紧接着回到银行的例子中来,来办理业务的客户中,难免有文化水平较低不能理解各种流程办理的客户,基于这种情况,银行会安排专门的人为大家提供保姆级别的服务!对应理解,计算机体系中针对上述情况,给用户提供了用户操作接口。
综上所述,计算机软硬件体系结构就介绍完了!
进程概念
什么是进程
关于进程有这样的描述,一个运行起来(加载到内存中)的程序就是一个进程。“书读百遍其义自见”,反复揣摩这句话好像懂了又好像没懂。在这里我们对进程进行一个感性的理解:
程序的本质就是文件,存放在磁盘中。程序运行要先加载到内存中,当众多程序加载到内存中后,操作系统要对它们进行管理,管理的方法我们上述谈论到过,先描述,在组织!
这里的描述就要引进一个PCB(进程控制块)的概念,它是一个内核结构体,对进程的所有属性,进程对应代码和属性地址进行描述:
将PCB用数据结构组织起来:
这样一来,对进程进行管理,就转换成对数据结构的管理。
小总结:●进程 = 内核数据结构(PCB)+进程对应的磁盘代码。
见见进程
如今互联网发达的时代,电脑几乎成为了家庭的必备电子产品,可能在上一秒你还在打游戏,在打游戏的过程中,你可能会遇到这样的场景:闪光弹刚丢出去,面对敌人正想来一波扫射,可就在这时你的屏幕卡了,键盘鼠标都快敲碎了都没有反应,最后迫于无奈,你只好使出“大招”,快捷键打开任务管理器,结束这个任务:
如果所示就是一个个进程
在linux下见见进程:
执行上述代码,代码跑起来后就是一个进程!
查看和杀掉进程:
ps ajx | head -1 && ps ajx gerap "名称" //查看进程
kill -9 PID //杀掉一个进程
见见系统调用
getpid和getppid
通过系统调用创建进程
测试:
●fork是一个函数,函数执行前是一个父进程,函数执行后父进程+子进程!
●fork函数后的代码,被父子进程共享。
●父子进程的返回值不同,可以根据这一特性执行后续共享代码的一部分!
进程状态
一个CPU有一个运行队列,当描述一个进程的PCB入到CPU的运行队列中时,这个进程就是运行状态(R),和这个进程是否正在运行无关。
当CPU在处理队列中的进程时,当有进程要访问外设时,就会出现如下的场景。CPU的处理速度很快,而外设的速度很慢,CPU又不能等待外设,所以只能让要访问外设对应进程的PCB去等,如果多个进程同时访问一个外设,这些进程的PCB就会入到该外设的队列中等待,这种状态叫做阻塞状态!
如果阻塞的进程越来越多,内存的空间迟早会被占满,因为这些阻塞状态的进程既占用着空间,又没有被执行。 这时如果有新的进程要载入内存该怎么办呢?这里就要在介绍一种状态:当发生上述场景的时候,“我”占用着内存,短时间内又不会被使用,且有内存不够用的风险,那么基于这种情况,就把“我”的代码和数据暂时保存到磁盘中,这个过程可以将其叫做内存数据的换入换出。这样做的好处就是将空间节省了出来,这个状态就叫做挂起状态!
小总结:
●一个CPU有一个运行队列,每个外设也会有一个属于其自己的队列。
●让进程入队列,本质上就是让描述该进程的PCB入队列。
●当某个进程的PCB在CPU的运行队列中,就是运行状态。
●进程不只是等待(占用)cpu的资源,也会需要外设资源。
●当多个进程访问外设,外设“忙不过来”,在该外设队列中等待的状态,叫做阻塞状态!
●阻塞状态太多,占用内存且短时间不会被使用时,会将该进程的代码和数据暂时保存到磁盘上,这时的状态就是挂起状态。
●进程的不同状态,本质上就是在不同的队列中等待某种资源。
linux操作系统下的具体状态
运行状态:代码方面很简单,随便写了一些。执行程序后,查看myprocess的进程状态,发现是运行状态(R)!
阻塞状态:
printf()函数调用的效果是将数据打印到显示器上,这个过程中在访问外设,而外设很慢(相对CPU而言),大部分时间都在等IO就绪,只有一点点时间是在执行打印代码,所以查看该进程的状态我们发现是阻塞状态!
暂停状态1(stopped):
Kill -19 PID //暂停进程
Kill -18 PID //进程继续
将上述的代码重新跑一下,用kill -19 pid暂停该进程:
kill -18 pid继续该进程:
细心观察会发现,暂停后在继续,状态恢复了,但是怎么少了一个加号呢?其实加号“+”代表的是该进程是在前台运行,而没有加号表示在后台。对比下s+和s的区别:
S+:前台
S:后台
暂停状态2(t)
这个状态下的进程表示正在被追踪,状态演示:写好一段简单的代码,进入调试状态,打一个断点,运行程序会在断点处停下来,查看进程状态,此时该进程就是小t状态,表示该进程正在被追踪
深度睡眠状态(D):
简单的理解,在高IO的场景下,X进程要等待很久的时间,当资源吃紧,操作系统进行管理的时候,极端情况下会直接杀掉一些进程,但是X进程被杀掉可能会导致重要信息丢失,基于这样的情况将X改为深度睡眠状态,就不会被杀掉了。
在深度睡眠状态下的进程无法被操作系统杀掉,只能通过断电或者等该进程自己醒来!
僵尸状态(Z)
进程的使命就是完成某项任务,当它的使命完成退出时,任务完成的结果我们要知道!所以在一个进程退出后,不会立即释放进程对应的资源,而是要先保存一段时间,让父进程会这操作系统读取!出现僵尸状态的场景:子进程退出了,但是没有被回收。
子进程退出,父进程不退出,查看子进程的状态:
上述Z状态的进程我们称之为僵尸进程。
僵尸进程的危害:
●进程退出后要等父进程回收资源,如果父进程一直不读取,那么子进程就会一直处于僵尸状态(Z)。●维护退出状态要用数据维护,也属于进程基本信息,所以要保存在task_struct(PCB)中,也就是说,Z状态一直不退出, PCB也就一直都要维护!
●如果一个父进程创建了很多子进程,就是不回收,这种场景就会造成内存资源的浪费。
●僵尸进程会造成内存泄漏。
孤儿进程
孤儿进程的场景是,子进程还在,父进程先退出了,这时孤儿进程会被1号进程领养,后续当子进程退出的时候要由1号进程回收。
进程优先级
优先级的作用是,决定先做和后做的问题。提出优先级这个概念的原因是资源太少了,如果不是人人都能“吃饱”,那么谁先吃,谁后吃?
linux下的进程优先级特点:最终的优先级 = 老的优先级(标杆) + NI(nice)值。NI的范围是【-20,19】我们可以对其进行调整。