Linux系统编程·进程概念引入
|
文章目录
- 自学网站
- 写在前面
- 冯诺依曼体系结构
- 谈谈硬件
- 操作系统
- 谈谈软件
- 管理的理解 I
- 管理的理解 II
- 进程
- 什么叫做进程?
- 进程控制块—PCB
- 练习题
自学网站
推荐给老铁们两款学习网站:
面试利器&算法学习:牛客网
风趣幽默的学人工智能:人工智能学习
首个付费专栏:《C++入门核心技术》
写在前面
不知不觉写博客已经一年过去了,还是有点小感慨的呀。目前大三,每天都有很多任务需要完成,所以就不多说了,OK,下面我们开始更新Linux系统编程和网络编程方面的知识,讲的比较深入哦,而且这部分内容还是有难度的,不过我会尽可能的让知识不那么抽象,跟上我的脚步,一起加油吧。
冯诺依曼体系结构
谈谈硬件
如果大家学习过《计算机组成原理》这门课的话,一定听说过冯诺依曼体系结构,生活当中的大部分计算机都遵循冯诺依曼体系结构。那什么是冯诺依曼体系结构呢?
上面所说的中央处理器就是我们常听的CPU。
我们知道,计算机由一个个硬件组成:
- 输入设备:包括键盘、鼠标、扫描仪、网卡、磁盘等;
- 输出设备:包括显示器,打印机、磁盘、网卡等;
- 存储器:其实就是内存;
- 中央处理器(CPU):含有运算器和控制器等。
注意哦,磁盘既是输入设备也是输出设备,因为既可以从硬盘读取数据也可以向硬盘写入数据。
上面的存储器就是我们常听说的内存,有一个疑问是:为什么CPU与输入设备和输出设备不直接交互呢,而是在它们中间放一个内存呢,这样设计有什么优势吗?
说到底,上面的问题无非想要知道的是为什么要存在内存?
可以分两个方面解释:
- 技术角度:CPU速度 > 寄存器存取的速度 > L1~L3Cache(缓存) > 内存 >> 外设(磁盘) >> 光盘磁带,很明显,外设的速度太慢了,所以从数据角度,外设几乎不和CPU打交道,而是直接和内存打交道,CPU也同样如此,也就是说,外设不和CPU直接交互。所以,内存在我们看来就是体系结构中一个大的缓存,用于适配外设和CPU速度不均的问题的;
- 成本角度:寄存器 >> 内存 >> 外设(磁盘),所以内存就是方便我们使用较低的成本,获得较高的性能。
综上所述,所以如果将CPU与外设直接交互,想想木桶原理。
同样这也就解释了,为什么我们编写的程序,编译好之后(.exe文件在磁盘中),要运行,必须加载到内存当中,因为这是体系结构规定的啊!
关于冯诺依曼体系结构,需要注意:
CPU和外设不能直接交互,而是通过内存,也就是说,所有设备都只能和内存打交道。
好,我们对于冯诺依曼体系结构的理解不能仅仅停留在概念上,要深入到对软件数据流的理解上,试想,当我们登录QQ开始和一位朋友聊天的时候,数据的流动过程是怎么样的?
上面的图片就能说明问题了,好的,下面我们谈完硬件部分的基础知识,再来谈谈软件。
操作系统
谈谈软件
首先要说明的是,操作系统是一款搞管理的软件。
操作系统是一款搞管理的软件,那什么叫做管理,如何理解管理呢?
这部分内容直接说不好理解,我们拿生活当中的事举个栗子:
管理的理解 I
学校里面有校长,有辅导员,有学生,而学校的管理者是校长,但是我们知道,平常我们是不常见到校长的,也就是说,校长连我们面都见不到,他是怎么管理我们的呢?这也就说明了,管理我们不需要直接和我们打交道,那他是怎么做到的呢?
其实管理的本质是对数据的管理。
管理并不是对管理对象进行直接管理,而是只要拿到被管理对象的所有相关数据,我们对数据的管理,就可以体现对人的管理。
管理的理解 II
我们人认识世界的方式:通过属性认识世界。也就是说,在我们人的眼中,一切皆对象,一切事物都可以通过取对象的属性,来达到描述对象的目的。
比如C++中的类:
class OBJ
{
//成员属性
};
所以就像上面所说的学生那个例子,校长就是通过抽取所有同学的属性,来描述对应的同学的。
我们知道LinuxOS是用C语言写的,那在C语言中有没有一种数据类型,能够达到描述某种对象的功能?当然有,不就是结构体吗!所以,学生的属性就就可以像下面这样:
struct Student
{
学生基本信息(身高、姓名、年级、电话…);
在校基本信息(宿舍号、专业、学号…);
考试成绩(C,C++,Java.Python,操作系统…);
其他信息;
struct Student* prev;
struct Student* next;
}
我们惊奇的发现,对学生的管理,变成了对链表的增删查改!
这里需要再次提到管理的本质是对数据的管理,从而转换成对某种数据结构的管理。
所以,管理的核心理念就是:先描述,再组织。
进程
什么叫做进程?
学习操作系统肯定常听到进程、线程,那什么叫做进程呢?
进程其实就是一个运行起来的程序。可能这样说你不理解,没关系,请看下图:
所以,其实进程就是可执行程序+该进程所对应的内核数据结构。
进程控制块—PCB
前面我们说到:
进程 = 可执行程序 + 该进程所对应的内核数据结构。
那“进程所对应的内核数据结构”是啥呢?
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
很多时候我们称其为PCB,而我们现在所学习的Linux操作系统,它的PCB叫做 task_struct
(可以这样想:PCB是汽车,而Linux中具体的PCB——task_struct是宝马)
程序是文件吗?是的,而文件在磁盘中。
操作系统中可能存在大量进程,操作系统要不要将所有的进程管理起来呢?当然要,对进程的管理,本质是对进程数据的管理,所以本质也就是对进程的内核数据结构的管理。
这就好像我们前面说的那个学生的例子,所以为什么管理进程要有PCB呢?
先描述,再组织。(其实这也就解释了为什么说我们之前在实现数据结构的时候,总是先定义一个结构体)
比如定义顺序表:
typedef int SLTDataType;
struct SeqList
{
SLTDataType* a;
size_t size;
size_t capacity;
}
好的,有了上面的认知,下面我们再重新谈回操作系统:
在此之前呢,再举一个小栗子:
生活中我们去银行办理业务的时候,只能通过银行提供的窗口,所以可以认为银行是一个封闭体,只是提供了一些接口。为什么要这样呢,因为银行是不相信任何人的,所以银行给所有人提供服务的方式是通过窗口完成的。
为啥要讲银行体系结构呢,其实也是为了类比操作系统:
操作系统和银行一样,也是不相信任何人的,要防止少数人,又要给多数人提供服务,所以操作系统也是通过给用户提供接口的方式。
我们知道,Linux是用C语言写的一款操作系统,所以接口也就是用C语言给我们提供的函数调用,也就是系统调用。
上面巴拉巴拉讲了这么多,那操作系统为什么要给我们提供服务呢?
比如我们之前经常使用的 printf or cout ,这是向显示器打印内容的,显示器是硬件吗?当然是。所以所谓的打印,本质就是将数据写到硬件上,但是我们自己的C程序,有资格向硬件写入吗?答案是没有的,所以计算机和操作系统设计出来就是给人用的(给人提供服务的)。
那操作系统是如何提供服务的呢?
我们知道操作系统是不相信任何人的,不会直接暴露自己底层的任何数据结构,代码逻辑和其他数据相关的细节!所以操作系统是通过系统调用的方式,对外提供接口服务的。
Linux操作系统是用C语言写的,所以这里所谓的接口,本质就是C函数,而我们现在所学习的Linux系统编程,本质就是学习这里的系统调用接口。
OK,有了上面的概念,大家先自行理解这张图片的内容哦,后面文章再谈,那咱们就先再见咯。
对了,差点忘记了,来几道练习题巩固一下这方面的知识:
练习题
1、不属于冯诺依曼体系结构必要组成部分是:
A.CPU
B.Cache
C.RAM
D.ROM
解释:
A CPU 运算器与控制器
B Cache 缓存(一种技术)
C RAM 内存(存储器)
D ROM 磁盘(输入输出设备)
2、操作系统的主要功能有()
A.控制和管理计算机系统软硬件资源
B.对汇编语言,高级语言和甚高级语言程序进行翻译
C.管理用各种语言编写的源程序
D.管理数据库文件
解释:
操作系统的定位就是控制和管理计算机上软硬件资源让计算机更加好用;
对汇编语言,高级语言和甚高级语言程序进行翻译,这个功能是编译器的功能,将高级语言解释为机器指令能够被机器识别执行;
源程序以及数据库文件都是存储在磁盘上的,这是操作系统中,文件系统管理部分的主要功能。