Linux------操作系统与进程基本概念
文章目录
- Linux------操作系统与进程基本概念
- 一、冯诺依曼体系结构
- 二、操作系统
-
- [2.1 OS层次图](#2.1 OS层次图)
- [2.2 操作系统的作用](#2.2 操作系统的作用)
- [2.3 管理的理解](#2.3 管理的理解)
- 三、进程
-
- [3.1 进程的概念](#3.1 进程的概念)
- [3.2 描述进程---PCB](#3.2 描述进程—PCB)
- [3.3 PCB的内容](#3.3 PCB的内容)
-
- [3.3.1 查看进程](#3.3.1 查看进程)
- [3.3.2 标识符](#3.3.2 标识符)
- [3.3.3 状态](#3.3.3 状态)
- [3.3.4 程序计数器](#3.3.4 程序计数器)
- [3.3.5 记账信息](#3.3.5 记账信息)
- [3.3.6 上下文信息](#3.3.6 上下文信息)
一、冯诺依曼体系结构
输入设备 : 键盘、磁盘、网卡、显卡、写字板、摄像头等
输出设备 : 显示器、磁盘、网卡、显卡等
存储器 : 内存
运算器和控制器: CPU
上图中的存储器指的是内存
在不考虑缓存情况下,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取
一句话,所有设备都只能直接和内存打交道
冯诺依曼体系结构是现代计算机主要使用的体系结构
在计算机的发展历史上,对于计算机的构造,其实出现过很多不同的构造,例如哈佛结构,图灵结构,但计算机发展至今,冯诺依曼体系结构却是现代计算机主要使用的结构
理由 :首先我们需要知道现代计算机cpu的算力速度是非常恐怖的,而对于硬件来讲, cpu的读写速度大于内存而内存大于磁盘,但在计算机发展的初期,由于科学技术受限,cpu 内存 磁盘 三者之间的速度差别可能不大,
所以存在cpu与磁盘等外设相连,cpu直接读写到磁盘中的情况,但随着科学技术的发展,cpu的读写速度呈指数级上升,cpu的读写速度远大于磁盘的读写速度,根据木桶原理我们可以知道如果cpu直接与磁盘进行数据交换的话属于是暴殄天物了,磁盘会限制计算机的算力,所以大部分的计算机体系结构都被淘汰了,而正是因为冯诺依曼体系结构的合理性,使其没被淘汰
现代计算机以CPU为中心,距离cpu越近,存储效率越高,造价越贵
如果全部用高价格,一定带来的就是计算机太贵了
如果我们全部用便宜的存储介质,计算机价格便宜,但是基本用不了
二、操作系统
首先需要知道的常识是,操作系统其实也是软件(而且是第一个运行起来的软件),也是需要被加载到内存运行的,只有变成一个进程,也就是被执行了,运行起来了操作系统才真正起作用了
这里提到了进程的概念,本文中会提到,此处只需要知道操作系统也是软件也需要被执行起来才有作用
2.1 OS层次图
2.2 操作系统的作用
早期的计算机,由于技术不够成熟,使用的人大部分都是科研人员,是妥妥的程序员,但设计计算机的初衷本质是为了让人们在各行各业都能使用获得便利,所以对于一个小白来讲,也要能使用上计算机,也就是上图中的用户
如果没有操作系统,我们就要和一堆的硬件直接接触,需要了解各种硬件的特性,使用成本太高
由此就有了操作系统:
像这种任何计算机包含的一种最基本的能够进行软硬交互的一款软件,我们把它叫做操作系统(英文缩写OS)
OS包括:
内核:进程管理,内存管理,文件管理,驱动管理:这是OS用于管理硬件的
其它程序:函数库,shell程序等,这些程序能帮助用户更方便的使用OS
操作系统是什么?
是一款专门针对软硬件资源管理工作的软件
操作系统的功能:
对下管理好软硬件资源
对上为用户提供稳定、高效、安全的运行环境
那OS怎么对用户提供各种功能?
首先要知道OS不信任任何用户,所以我们也只能通过接口来与OS打交道,也就是OS层次图中的系统调用接口
系统调用与库函数的区别
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,一些大佬对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发
2.3 管理的理解
既然是管理,那么就有管理者和被管理者
我们可以想象在学校中,校长就是管理者,但是我们从来没见过校长
管理者和被管理者不直接接触,管理者的决策交给执行者(老师、辅导员),通过他们管理被管理者(学生)
按照上面OS的层次图,OS就是校长,驱动程序就是辅导员,底层硬件就是我们学生
通过例子我们可以得出以下的结论:
① 管理者和被管理者并不直接打交道
② 如何对被管理者进行管理? 先进行一些决策,再把这些决策施行
而管理者的决策需要有依据,依据就是数据
而我们的数据怎么被管理者知道呢?
如果一个学校人很少,校长有可能能知道每个人的数据,但是如果人很多呢?该如何聚合这些数据呢?
这就用到了C语言中的结构体,C++中的类
我们将学生具有的属性定义成结构体或类的过程,通常叫做数据的描述
有了结构体或类,那么就可以将数据存放在容器中,数组也好,链表也好,可以进行增删查改,也就是管理数据,把这个过程叫做数据的组织
由此我们得出重要结论:
管理的本质不是管理人,而是管理数据
计算机执行管理时,先把管理对象描述起来,再把管理对象组织起来
先描述 再组织
以上讲的都是对硬件的管理,那么对软件呢?对于软件的管理也是一样,先描述 再组织!
三、进程
3.1 进程的概念
进程 = 可执行程序 + 内核数据结构(PCB)
Windows中任务管理器下的程序就叫进程
Windows中当我们想运行一个软件的时候,会双击一个.exe后缀的文件,这个文件就是可执行程序
上面我们说过操作系统的本质是管理,而管理是先描述 再组织
当想要创建一个进程的时候,要先将可执行程序加载到内存,随后操作系统对其建立对应的PCB(进程控制块)
3.2 描述进程---PCB
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
task_ struct内容分类
标示符 : 描述本进程的唯一标示符,用来区别其他进程
状态 : 任务状态,退出代码,退出信号等
优先级 : 相对于其他进程的优先级
程序计数器 : 程序中即将被执行的下一条指令的地址
内存指针 : 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据 : 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]
I/O状态信息 : 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
记账信息 : 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
其他信息
3.3 PCB的内容
3.3.1 查看进程
由于要查看一个进程,要保证进程一直在运行,这里写一个死循环
查看进程指令:
ps axj | grep "mytest"
ps -l
查看运行中进程的详细信息
另一种查看进程的方法:
ls /proc
proc是linux默认查看进程的目录,而我们创建的的进程的信息也会在proc中创建一个目录
修改程序获得程序的pid ,找到对应的目录(pid下文中会提到)
查看该目录下内容
3.3.2 标识符
查看进程的标识符:
getpid()
身份证可以说是人的标识符,而进程也有一个属于自己标识符pid
3.3.3 状态
退出信号 :我们写的程序末尾会有个return 0,0就是退出码
退出码用于检测程序是正常结束还是异常结束
查看最近一次的退出码:
echo $?
3.3.4 程序计数器
也就是pc指针,永远指向下一条指令的地址
3.3.5 记账信息
OS有一个调度模块,可以较为均匀的调度每个进程,因为进程要获得CPU的资源才能进行,而进程又有很多,他会记录每个进程所使用的时间总和以确保"公平"
3.3.6 上下文信息
假设上述四个进程正在运行
为了保证公平,操作系统规定了进程单次运行的时间片(单次运行的最长时间),我们以为的CPU在同时运行多个进程,其实是CPU的快速切换完成的,在一个时间片运行一个进程,到了时间就切换下一个
假设我现在执行PCB1,一个时间片到了之后需要转换成PCB2,但PCB1进程很可能没执行完,而进程运行会产生大量的临时数据
这样就会引出一个问题 :
当1运行完一次时间片后这些临时数据下次还要用,如果不管,2就会覆盖掉1的临时数据
所以我们需要保护上下文信息和恢复上下文信息,当PCB1运行完一个时间片时,PCB1带走自己的临时数据,PCB回来的时候,再把临时数据给寄存器,接着上次运行