冯诺依曼,操作系统,Linux进程描述查看和状态

Posted 你快看看我

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冯诺依曼,操作系统,Linux进程描述查看和状态相关的知识,希望对你有一定的参考价值。

一.冯诺依曼体系


程序运行之前,必须先加载到内存中,因为可执行程序(文件)是在硬盘(外设)上。局部性原理,数据要处理必须预装到内存中,寄存器不仅仅CPU具有,其他外设也是有的,并且各种硬件单元之间连接用的是总线(IO总线,系统总线)
关于冯诺依曼,必须要强调几点:
1.这里的存储器指的是内存
2.不考虑缓存情况,这里的CPU只能对内存进行读写,不能访问外部设备
3.外部设备要输入或者输出数据,也只能写入内存或者从内存中读取
举个例子,从你登录上QQ开始和某位朋友聊天开始,数据的流动过程如图:通过网卡,文件输出为硬盘

二.操作系统

是一组能有效地组织和管理计算机硬件和软件资源,合理地对各类作业进行调度以及方便用户使用的程序集合。任何计算机系统都包含一个基本的程序集合,称之为操作系统(OS)。操作系统包括内核【进程管理,内存管理,文件管理,驱动管理(又称硬件管理,直接接触硬件的软件层,让操作系统和硬件进行解耦)】,其他程序【例如库函数,shell程序等等】。
操作系统的目的是与硬件交互,管理所有的软硬件资源;为用户程序(应用程序)提供一个良好的执行环境。在整个计算机软硬件构架中,操作系统的定位是:一款纯正的“搞管理”的软件,即先描述,构建数据结构的过程,再组织,管理是对数据结构的管理。

系统调用和库函数概念:
再开发角度,操作系统会对外表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以有些开发者可以对部分系统调用进行湿度封装,形成了库,有了库就很有利于更上层用户或者开发者进行二次开发。

三.进程

进程是程序的一个执行实例,正在执行的程序等,担当分配系统资源(CPU时间,内存)的实体。

1.描述进程-PCB

进程信息被放在一个叫进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB,Linux操作系统下的PCB是task_struct。task_struct是Linux内核的一种数据结构,他会被装载到RAM(内存)里并且包含着进程的信息。
task_struct内容分类:
标示符:描述本进程的唯—标示符,用来区别其他进程
状态:任务状态,退出代码,退出信号等(查一睡间态)
优先级:相对于其他进程的优先级
程序计数器:程序中即将被执行的下一条指令的地址.(CPU:取指令→分析指令→执作指令)最近正在执行指令的下一条地址,所以所谓的函数跳转,分支判断,循环等,都是修改eip完成的,此时eip称为程序计数器
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据:进程执行时处理器的寄存器中的数据
l/O状态信息:包括显示的I/O请求,分配给进程的l/O设备和被进程使用的文件列表
记账信息:可能包括处理器时间总和,使用的时钟数总和;时间限制
其他信息

2.查看进程

进程的信息可以通过/proc系统文件夹查看的
如果获取PID为1的进程信息,你需要查看/proc/1这个文件夹
kill -9 pid 结束后台进程

3.进程状态

进程状态查看 ps aux / ps axj 命令

R运行状态((running):并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。如果一个CPU可以同时存在多个R状态的进程,进程是R状态,不代表正在运行,代表可被调度
S睡眠状态(sleeping):意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep) )
浅度睡眠:通常用来进行等待某种事件的发生,随时可以被唤醒或者杀掉
深度睡眠:表示该进程不会被杀掉,即便是操作系统,我自动唤醒才可以恢复
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停止状态(stopped):可以通过发送SIGSTOP信号给进程来停止(T)进程。这个被暂停的进程可以通过发送SIGCONT信号让进程继续运行。
X死亡状态(dead) :这个状态只是一个返回状态,你不会在任务列表里看到这个状态。(瞬间状态)

4.两种特殊的进程状态

1.Z(zombie)-僵尸进程:
僵尸进程是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以只要子进程退出,父进程还在运行,但是父进程没有读取子进程的状态,子进程进入Z状态
进程退出在系统层面,曾经申请的资源并不是被立即释放,而是要暂存一段时间,供OS(父进程)进行读取。进程被创建的目的是为了完成某种工作任务。
2.那么为什么要有僵尸进程呢?
进程退出的信息(退出码)是会被暂时保存起来的(保存在task_struct),如果没有人读取,此时该task_struct)相关数据不应该被释放掉
3.僵尸进程的危害
进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!
那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!进程释放不读取也会内存泄漏
4.孤儿进程
父进程先退出,子进程就称之为“孤儿进程”,孤儿进程被1号init进程领养(立即被系统领养),当然要有init进程回收了。

四.进程的优先级

因为资源有限所以有优先级,CPU资源是有限的但是进程是多个的。CPU资源分配的先后顺序,就是指进程的优先权,可以改善系统整体性能。进程排队的本质让进程PCB结构体进行排列,找到PCB队列头部即为优先级最高的。
1.PRI and NI
PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高。那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值。PRI值越小越快被执行,那么加入nice值后,将会使得PRI为:PRI(new)=PRI(old)+nice
这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行所以,调整进程优先级,在Linux下,就是调整进程nice值,nice其取值范围是-20至19,一共40个级别。
2.PRI vs NI
需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。可以理解nice值是进程优先级的修正修正数据
3.用top命令更改已存在进程的nice
top,进入top后按“r”–>输入进程PID–>输入nice值

以上是关于冯诺依曼,操作系统,Linux进程描述查看和状态的主要内容,如果未能解决你的问题,请参考以下文章

冯诺依曼,操作系统,Linux进程描述查看和状态

Linux--进程

Linux进程

Linux进程

Linux进程

Linux进程管理