文章目录
1.冯诺依曼体系结构
数学家冯·诺依曼提出了计算机制造的三个基本原则(采用二进制、程序存储、顺序执行),以及计算机的五个组成部分(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯·诺依曼体系结构,根据这一原理制造的计算机被称为冯·诺依曼结构计算机。
冯·诺依曼最先提出程序存储的思想,并成功将其运用在计算机的设计之中。冯·诺伊曼体系结构是现代计算机的基础,现在大多计算机仍是冯·诺伊曼计算机的组织结构,因此冯·诺依曼又被称为“现代计算机之父”。
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
截至目前,我们所认识的计算机,都是由一个个的硬件组件组成
- 输入单元:包括键盘, 鼠标,扫描仪, 写板等
- 中央处理器(CPU):含有运算器和控制器等。
- 输出单元:显示器,打印机等
关于冯诺依曼,必须强调几点:
- 这里的存储器指的是内存
- 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
- 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
- 一句话,所有设备都只能直接和内存打交道
例:如果我用qq与同学聊天,那我发送的信息数据是如何流向的:
.冯·诺依曼体系结构特点:
(1)计算机处理的数据和指令一律用二进制数表示。
(2)指令和数据不加区别混合存储在同一个 存储器 中(硬盘)
(3)顺序执行程序的每一条指令。(重点是“顺序”)
2.操作系统(Operator System)
概念
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库, shell程序等等)
设计OS的目的
- 与硬件交互,管理所有的软硬件资源
- 为用户程序(应用程序)提供一个良好的执行环境
在整个计算机软硬件架构中,操作系统的定位是: 一款纯正的“搞管理”的软件
处理器(CPU)管理
- 在多道程序环境下,cpu的分配和运行都以进程(或线程)为基本单位,因此对cpu的管理可理解为对进程的管理。进程管理的主要功能包括进程控制、进程同步、进程通信、死锁处理、处理机调度等
存储器管理
- 为多道程序的运行提供良好的环境,方便用户使用及提高内存的利用率,主要包括内存分配与回收、地址映射、内存保护与共享和内存扩充等功能。
文件管理
- 算机中所有的信息都是以文件的形式存在的,操作系统中负责文件的管理的部分称为文件系统,文件管理包括文件存储空间的管理、目录管理及文件读写管理和保护
设备管理
- 设备管理的主要任务是完成用户的I/O请求,方便用户使用各种设备,并提高设备的利用率,主要包括缓存管理、设备分配、设备处理和虚拟设备等功能
3. 进程
基本概念
课本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体
描述进程-PCB
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。
课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct
task_struct-PCB的一种
- 在Linux中描述进程的结构体叫做task_struct。
- task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
task_ struct内容分类
- 标示符: 描述本进程的唯一标示符,用来区别其他进程。
- 状态: 任务状态,退出代码,退出信号等。 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
- I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。 其他信息
3.1 查看进程的方法
方法一:ps ajx | grep '[ ] ’
方法二:ls /proc:将当前所运行的进程以文件方式打印出来
3.2 通过系统调用获取进程标示符
【getpid/getppid系统调用】
功能描述:
getpid返回当前进程标识,getppid返回父进程标识。
用法:
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);//获取当前进程的pid
pid_t getppid(void);//获取当前进程的父进程的pid
3.3通过系统调用创建进程-fork初识
#include <unistd.h>
pid_t fork(void);
调用fork()函数会创建出一个进程,区分当前进程是父进程还是子进程可以根据fork函数的返回值来判断,如果返回值为0则当前进程是子进程,大于0则当前进程是父进程且这个大于0的数就是被创建的子进程的id。
下面用fock()创建的子进程(fock之后有2个不同的执行流):
3.4进程状态
下面这张图片展示了进程状态之间的关系
查看进程:ps aux / ps axj
命令
- R运行状态(running) : 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列 里。
运行态是进程正在CPU上运行,还是进程只要在运行队列中就叫做运行态呢?
答:所谓的运行态,是只要在运行队列中就叫做运行态,代表我已经准备好了,随时可以被调度!
就像小明正在食堂排队打饭,别人打电话问他在干什么,小明回复说:“我在吃饭”,这时虽然小明并没有打到饭已经开始吃了,但是他已经准备好了,并在排队了。
查看R状态:
-
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)
-
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
-
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT信号让进程继续运行。
-
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态
3.4.1 Z(zombie)-僵尸进程
- 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用),没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
- 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
- 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
僵尸进程危害
- 僵尸进程处于僵死状态,资源并没有完全被释放(进程的ID号、进程的退出状态、进程运行的CPU时间等), 可能会导致资源泄露的问题
- 并且由于操作系统所能创建的最大进程数量是有限的(进程号被大量占用)会导致新的进程无法创建
3.4.2 孤儿进程
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害
4.进程优先级
Linux 是一个多用户、多任务的操作系统,系统中通常运行着非常多的进程。但是 CPU 在一个时钟周期内只能运算一条指令(现在的 CPU 采用了多线程、多核心技术,所以在一个时钟周期内可以运算多条指令。 但是同时运算的指令数也远远小于系统中的进程总数),那问题来了:谁应该先运算,谁应该后运算呢?这就需要由进程的优先级来决定了。
基本概念
- cpu资源分配的先后顺序,就是指进程的优先权(priority)
- 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
查看系统进程
命令: ps -l
我们可以看到一些信息:
UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值
其中,PRI 代表 Priority,NI 代表 Nice。这两个值都表示优先级,数值越小代表该进程越优先被 CPU 处理。不过,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。
- PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为: PRI(new)=PRI(old)+nice
- 这样,当nice值为负值的时候,那么该程序将会优先级值(PRT)将变小,即其优先级会变高,则其越快被执行
- 每次进行新的 PRT 计算时都会旧的PRT都是默认值80,不会因为改变一次就那改变后的那个值进行计算
4.1如何修改进程的nice
用top命令更改已存在进程的nice:
top
进入top后按“r”–>输入进程PID–>输入nice值
修改 NI 值时有几个注意事项:
- NI 范围是 -20~19。
- 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
- 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
- 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。
其他概念
- 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
- 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
- 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
- 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发