一、理解冯诺伊曼现代计算机体系
现代计算机的硬件体系是由冯诺依曼提出来的。
冯诺依曼提出了数据采用二进制存储,并且存放位置由地址确定。
输入设备:为了输入程序和数据。
输出设备:为了显示输出结果。
存储器:记忆程序和数据。
控制器:控制程序的执行。
运算器:完成数据加工处理。
二、理解操作系统
1.操作系统存在的意义
光有了硬件也不行,直接对硬件进行操作难度太大。所以大佬们写了一个操作系统。
操作系统功能:管理计算机软硬件资源
操作系统的定位:搞管理的软件
操作系统的目的:让计算机更好用
2.理解shell
对于一般用户是不可以直接操控内核。
- 是因为可能操作的不当,使内核发生问题;
- 是直接操作内核不太友好,不方便。所以我们要通过shell(内核的外壳)来操作内核。
shell最直观的定义:命令行解释器。
shell的作用:
- 将使用的命令翻译给内核处理
- 将核心的处理结果翻译给使用者
在windows中,我们也无法直接使用内核。需要操作图形界面来完成访问内核。(例如我们点击某个图标运行某个程序,这个点击图标的过程就会翻译给内核)
在linux中,我们使用shell来访问内核,例如执行ls命令,shell就会将命令翻译给内核并执行。
bash就是shell的一种。
在Linux中不止bash这一种shell程序,在/bin下有很多shell程序。
并且所有命令程序也都在这个文件下。
2.理解库函数和系统调用关系
库函数就是在封装了系统调用的接口,是建立在系统调用的基础上,这样的好处有
- 用户更加方便使用,库函数一般比较友好。
- 功能更加丰富,大佬们会在系统调用的基础上丰富其功能。
三、进程如何被计算机管理
1.什么是进程?(进程描述信息)
站在操作系统的角度,进程就是一个运行中程序描述-PCB(进程控制块)
为什么要描述一个进程?
举个例子:小明学习成绩很好,可以获得奖学金,学校校长要颁发奖学金,但是校长本身并不认识小明,那么校长怎么确定要把奖学金颁发给小明呢?于是校长找到学校信息管理处的老师,通过小明的信息确定小明可以获得奖学金,然后校长就给小明颁发奖学金了。同样地,那么我们如何操控进程呢?我们也是把进程的信息描述起来,如果要操作进程,需要先获取它的描述信息,再去操作它。
linux下pcb实际是一个结构体名为 task_struct,你可以在/usr/src/kernels/(你的内核版本号)/include/linux/sched.h这个文件中找到他的定义。
在task_struct中,包含了
- 内存指针:用来找到代码和数据在内存中的位置
- 状态:用来描述进程当前状态
- 优先级:优先级越高的越优先被调用(可以通过renice来设置)
- 程序计数器:保留程序上次执行的位置,存储着程序下一条要执行指令的地址
- 上下文数据:进程执行时,寄存器中的数据
- 标识符ID:唯一标识一个进程的标志
- 记账信息:用来记录一个进程在CPU上运行的时间。
- IO状态信息:包括显示的IO请求,分配给其的IO设备和被进程使用的文件列表
2.进程查看、创建、退出操作
查看:
通过ps命令,根据参数的不同可以查看线程或者进程的不同信息。
创建:
pid_t fork(void);创建一个进程。
- 返回值<0,进程创建失败
- 在父进程中返回值为创建进程ID
- 在子进程中返回值=0
退出
- 在程序中可以使用void exit(int status);退出一个进程。
- 在bash下可以使用kill命令杀死一个进程
- exit命令可以退出bash程序
3.进程状态
4.查看进程的属性信息
通过ps -aux查看的进程属性包括
5.进程调度
通过不同的进程调度算法来调度进程。
三、虚拟地址空间
1.虚拟地址空间是什么?
2.虚拟地址空间怎么实现的?
虚拟地址空间是一个结构体mm_struct,这个结构体也是用来描述进程pcb中的内存指针,通过这个内存指针能找到相应的代码和数据。
可以在 /usr/src/kernels/(你的内核版本名)/include/linuxe/mm_types.h中找到该结构体的定义。
虚拟地址空间的地址是连续的,但是程序加载到物理内存中的位置是散乱排序的,我们平时在调试程序的时候看到的内存地址也都是虚拟地址空间的地址。在虚拟地址空间和物理内存之间,通过页表来映射两者的位置。后面会讲述虚拟地址空间映射到物理内存的三种方式。
3.写时拷贝技术
这就是写时拷贝技术,在向变量中写入数据的时候,就会拷贝这个变量并为其开辟新的空间存储。
4.三种虚拟地址和物理内存转换方式
- 分页式
- 分段式
- 段页式