Linux进程
对于进程的理解,我们要从计算机的重要的冯诺依曼体系结构讲起,只有知道我们的程序/文件是如何在计算机中被操作运行并输出到显示器中,通过对于操作系统的理解,才能对于进程进行一定的理解。
文章目录
- Linux进程
- 冯诺依曼体系结构
- 操作系统
- 操作系统是什么?
- 为什么要有操作系统?
- 操作系统怎么办?
- 操作系统如何管理程序?
- 进程
- 如何查看进程?
冯诺依曼体系结构
如上图所示这就是冯诺依曼体系结构图,在计算机中都要遵循这一体系,才能有效且高效的进行数据处理运算和输出
认识计算机组件
外设
- 输入设备:包括硬盘,鼠标,摄像头,话筒,磁盘,网卡….
- 输出设备:显示器,播放器,磁盘,网卡…
CPU
- 运算器:对于我们输入的数据进行计算(算术运算,逻辑运算)
- 控制器:对于我们的计算硬件流程进行一定的控制
存储器:内存
关于冯诺依曼体系强调:
- 不管是外设还是存储器还是CPU都是独立的个体!
- 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
- 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
总之,所有设备都只能直接和内存打交道,进行交互,这样可以方便理解该体系
上述一些设备既是输入设备又是输出设备,各个硬件单元是可以独立的,但是必须由总线连接起来:1.系统总线,2.IO总线
上述系统总线有很多种标准,IO总线可以理解为,输入设备—>存储器—>输出设备
如下是程序运行流程:
问题如下:
1.为什么一个程序要运行,必须要先加载到内存中运行?
答:因为冯诺依曼体系结构的规定
这里的存储器指的是内存,前文我们学到了缓冲区,那么我们缓存的数据应该在哪里呢?实际上是在存储器中,编译器在运行程序中,占据一部分内存作为缓冲区。
2.为什么不直接将数据从输入设备直传递给中央处理器,然后处理数据之后直接由输出设备输出?
我们先理解一个概念:输入设备输入数据的速度比价慢,存储器读取数据较快,中央处理读取数据很快,两两之间速度的差别为
103级别
解释:
当输入设备在输入完毕数据的时候,CPU早已经等了几百年了,然后瞬间处理完毕,交给输出设备,输出设备仍然慢慢悠悠地输出,且此时输入设备在慢慢地输入数据,CPU的快速处理数据的功能无法体现。整体这个体系受到了输入设备的限制。
3.那么为什么冯诺依曼体系结构满足了数据处理的需求?根据木桶原理,读取数据的速度决定于输入设备?
解释:
我们知道输入设备和存储器以及CPU之间读取数据的速度差别为103,当我们将输入设备读取的数据提前加载到内存中,在CPU处理完其他数据的时候,存储器将下一部分数据导入CPU,进行运算,因为速度级别相差不大,总体来看,整个过程就是输入设备一直输入数据加载到存储器中,存储器和CPU进行交互,处理完毕的数据返回给存储器,总体流程都是和存储器有关。
总结:当使用冯诺依曼体系结构的时候,读取数据的速度取决于存储器,存储器和其他设备进行交互,且存储器的读取速度适中,可以满足用户的需求。
4.关于各种设备存储分级金字塔
总结:
- 寄存器:在CPU中,读取数据最快,价格贵,容量小
- 三级缓存:位于CPU中,可以提高CPU运行效率
- 内存:即存储器
- 硬盘:输入输出设备
5.当我们在QQ上跟好友发一条信息,好友接收信息的过程是什么?不考虑网络,根据冯诺依曼体系回答。
操作系统
我们认识了计算机中数据运算的冯诺依曼体系结构,那么对于文件/数据的处理已经有了大概的认识,我们要知道的是,在电脑中我们不只是对于一个文件或者一个程序来进行处理,同时多个文件进行数据处理的时候,如何合理的管理好处理文件的先后呢?
操作系统的简介
任何计算机系统都包含那一个基本的程序集合,称为操作系统。
操作系统是什么?
操作系统是一款进行管理软硬件的软件
简略的理解为:通过驱动程序来对于计算机的底层硬件(网卡、硬盘等进行管理),最后实现内存管理、进程管理、文件管理、驱动管理。
为什么要有操作系统?
1.操作系统是用来帮助用户,管理好下面的软硬件资源
2.为了给用户提供一个良好(稳定、高效、安全)的运行环境
总结
手段:操作系统通过管理好底层的软硬件资源
目的:为用户提供一个良好的执行环境
为了给用户?给那些用户?
操作系统存在的意义就是为了给用户提供良好的执行环境,让用户更加方便简洁的来操作计算机,来为用户提供更好的体验
用户主要分为普通用户(大众),程序员(开发)。普通用户使用的是程序员开发的软件,所以普通用户是不会会直接跟操作系统打交道,主要是程序员来与操作系统进行交互。
操作系统怎么办?
操作系统怎么来向用户提供良好的运行环境,供其使用,怎么使得各种软件能在操作系统的管理下进行运行,接下来我们需要理解的是操作系统如何向上对接用户的使用
操作系统里面,有各种数据,但是操作系统并不相信任何用户。
解释:
操作系统是为了用户而服务的,但是我们并不知道,也并不能将操作系统任意的暴露给用户,让用户去直接去操作,去修改操作系统。
以银行系统举例:
- 在银行中,其并不相信所有的人,所以才会设置防弹板隔离人与银行柜台,为了相互保护
- 但是银行也要运行其功能,提供一个小窗口可以令用户来存取钱财,这是为了实现功能
所以,操作系统为了保证自己的数据安全,也为了保证给用户能提供服务,操作系统以接口的方式给用户提供调用的入口,来获取操作系统的内部的数据。
操作系统向上提供系统调用接口(system call)
这个接口是操作系统用C语言来实现的(因为操作系统是以C语言为基础来实现的),该接口供自己的内部函数调用,也就是所谓的系统调用。
所有访问操作系统的的行为,都只能通过系统调用来实现。
总结:
- 操作系统向上是为了用户的使用,同时为了自己的数据安全,提供了系统调用接口(system call)
- 向下可以合理的通过驱动程序来对于由硬件依照冯诺依曼体系结构形成的底层硬件进行管理和处理数据。
- 通过上述功能,奠定了操作系统在计算机系统中的重要地位,以操作系统、驱动程序、底层硬件共同构成了计算机的基本运行载体,至少计算机要依靠这一载体来运行。
底层硬件:各个硬件通过冯诺依曼体系结构组成底层硬件
驱动程序:将对应的各个硬件通过驱动程序连接起来,向上提供操作接口,供操作系统使用和管理。
操作系统:是对于各种驱动提供的接口进行管理操作,来向下管理好软硬件的软件。
底层硬件、驱动程序、操作系统共同构成了计算机的基本运行载体,至少计算机要依靠这一载体来运行。
用户操作接口:包含shell外壳、lib、部分指令,shell是命令语言、命令解释程序以及程序设计语言的统称,实际上是一个命令解释器,通过解释用户输入的命令并把它传递给系统内核中去执行,为用户提供使用操作系统的接口,是用户和系统内核的桥梁。lib是指库文件,各种语言的库文件。
用户:通过指令操作、开发操作、管理操作向下通过用户操作接口的shell外壳、lib、部分指令等,调用系统调用,实现与操作系统的交互。
库函数与系统调用之间是上下层的调用和被调用关系。
操作系统如何管理程序?
操作系统的管理无非是对于驱动程序以及软硬件资源的管理。
明确管理与被管理者之间的关系:
- 管理者与被管理者之间是不需要见面的
- 管理者没有见到被管理者的情况下,只要能获得对应人员的管理信息即可,就可以在以后进行管理,管理的本质是:通过对于数据的管理,来实现对于人的管理
- 管理者与被管理者之间的数据是通过执行者传递数据的
上述中,我们对于整个管理流程,先对于我们所需要的数据进行描述(需要学生的基本信息),描述后,建立起对应的结构体来存储信息(C语言的方式),由执行者讲所有学生数据放在一个链表中连接起来,由此这一数据结构使得,数据变得有序起来(这是组织),最后交给老师(操作系统)等待老师进行下一步的指令
总结:操作系统如何管理软硬件呢? 先描述,后组织
在操作系统中,管理任何对象,最终都可以化为对于某种数据结构的增删查改。
进程
一个已经加载到内存中的程序叫做进程。
通俗来讲:正在运行的程序,叫做进程。
解释:
操作系统是一个管理软硬件关系的软件,所以操作系统也需要在内存中加载。
什么时候操作系统被加载到内存中的呢?
答:在计算机开启的时候,加载操作系统到内存中去,然后才能正常的运行和管理其他软硬件。
所以,加载进程到内存中去,实际上是将进程放在了操作系统所占的内存中。
描述进程-PCB:进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合
总结:
真正的进程=内核PCB数据结构对象+data和code
- 任何一个进程,加载到内存中的时候,形成真正的进程时,都先形成描述该进程属性的PCB内核结构体对象,多个进程通过数据结构的方式连接起来,统一由操作系统来管理(增删查改)
- data和code可以得到可执行程序.exe
- 操作系统真正管理的不是data和code,而是PCB内核结构体对象
- 当操作系统需要执行某一进程的时候,只需要由描述该进程属性的PCB通过其中的相应的指针信息来找到对应的data和code,从而执行该程序
Linux操作系统下的PCB是: task_struct
task_struct是PCB的一种:
- 在Linux中描述进程的结构体叫做task_struct。
- task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
如何查看进程?
在window中,启动任务管理器,找到进程,即可图形化显示当前计算机上的所有进程信息
在Linux系统下,我们可以通过proc目录查看