文章目录
1.冯诺依曼体系结构
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
- 输入设备:键盘,网卡,鼠标,摄像头,麦克风,硬盘…
- 输出设备:显示器,声卡,喇叭,网卡,硬盘…
- 输入输出设备(外围设备)
- 内存:掉电易失性存储介质
1.越靠近 CPU 速度越快,容量越小,价格越贵。
2.每一种存储器设备只和它相邻的存储设备打交道
在认识层面上,可以认为内存整体是外设和cpu的"缓存",程序运行时内存对数据进行了预加载,把程序缓存起来了。
关于冯诺依曼,必须强调几点:
1.这里的存储器指的是内存
2.不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
3.外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
4.一句话,所有设备都只能直接和内存打交道
2.操作系统
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell程序等等)
1.操作系统是什么? :操作系统是一个搞管理的软件,做软硬件管理的。
2.如何理解管理?:
- 真正的管理是要有决策权,区分决策权和执行权。
3.操作系统如何管理: 先描述,在组织
- 描述起来,用struct结构体。(Linux下的代码基本都是C语言写的,所以描述一个对象的时候,使用的都是struct所定义出来的。)
- 组织起来,用链表,二叉树或者其他更高效的数据结构。(数据结构表示了数据的组织方式)
2.1系统调用和库函数概念:
在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
库函数vs系统调用: 具有上下级的关系, 库函数(用户级别的库) 可能调用系统调用的接口。
4.为什么有操作系统?
在一套系统中,需要有管理者进行统筹。对上,给用户一个稳定高效的执行环境。
对下,管理好软硬件资源,提供稳定的软硬件环境。
3.进程
3.1基本概念
进程 = 对应的文件+进程属性
进程:可执行程序与管理进程需要的数据结构的集合。
3.2描述进程-PCB(Process control block)
系统允许多个进程同时运行,OS需要对进程进行管理,如何管理进程?
- 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
- 课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct
task_struct是PCB的一种:
- 在Linux中描述进程的结构体叫做task_struct。
- task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
task_ struct内容分类:
- 标示符: 描述本进程的唯一标示符,用来区别其他进程。(pid)
- 状态: 任务状态,退出代码,退出信号等。
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
- I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息
3.3查看进程
进程的信息可以通过ls /proc 系统文件夹查看
ps aux | grep mybin //查看进程信息
这个20592为这个进程的PID(相当于一个身份编号,且这个编号会随着程序的结束而消失,下一次在运行这个可执行程序的时候,PID编号也会随之改变)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
while(1){
sleep(1);
}
return 0;
}
3.4通过系统调用获取进程标示符
- 进程id(PID)
- 父进程id(PPID)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("pid: %d\n", getpid());
printf("ppid: %d\n", getppid());
return 0;
}
可执行程序每关闭一次,前面的编号就会变,父进程不会变。
父进程创建子进程->子进程完成基本命令->进程是具有独立性的。
bash运行原理:bash是命令解释器,通过创建子进程去完成任务。