初步了解冯诺依曼体系
我们常⻅的计算机,如笔记本。我们不常⻅的计算机,如服务器,⼤部分都遵守冯诺依曼体系。

输入单元:包括键盘,鼠标,扫描仪,写板等
中央处理器(CPU):含有运算器和控制器等
输出单元:显⽰器,打印机等
- 这⾥的存储器指的是内存
- 不考虑缓存情况,这⾥的CPU能且只能对内存进⾏读写,不能访问外设(输⼊或输出设备)(数据层⾯)
- 外设(输⼊或输出设备)要输⼊或者输出数据,也只能写⼊内存或者从内存中读取。
⼀句话,所有设备都只能直接和内存打交道。
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
信息传输就是从一个设备拷贝到另一个设备;
一、为什么要有内存
有了内存,计算机的价格就更加的平均化,更具性价比,让普通人都能大范围的购买使用计算机
二、认识操作系统
1.是什么
一个基本的程序集合就是操作系统,操作系统就是一款进行软硬件
管理的软件
操作系统包括:
- 内核:进程管理,文件管理,内存管理和驱动管理
- 其他程序:例如各种预装程序,外壳shell
2.为什么
操作系统向下进行软硬件资源的管理,向上给用户提供良好的操作环境和服务
1.体系结构狭义上将就是芯片结构:如x86,x64;
软硬件体系结构则是从硬件到用户
层状的体系结构,高内聚低耦合2.访问操作系统,需要通过系统调用,实际上通过函数调用,只不过是系统帮助实现的,向我们使用的printf()函数底层就封装了一层系统调用函数
3.只要访问了硬件,就一定贯穿了整个操作系统
4.库有可能就封装了系统调用
3.理解操作系统
3.1如何理解管理
在学校中,校长"决策",扮演着管理者的身份,校长(管理者)交付指令给各级辅导员进行"执行",由辅导员传达给学生(被管理者),完成一次指令的执行;在计算机中,操作系统就是所谓的"管理者",驱动程序就是"执行者",各个硬件就是"被管理者";
校长无需和学生面对面交流,只需拿到学生的相关数据就可以进行决策,同样操作系统也只需拿到硬件的数据对硬件进行管理,而如何拿到数据进而进行增删查改?操作系统是用C语言写的,它能通过结构体struct{}解决每个设备属性数据问题,c++中有类的概念;这一过程我们可以叫他"描述";但是如此庞大的数据集很难进行管理,所以我们可以通过链表进行节点的链接,这一过程我们可以叫他"组织",此时数据结构的功能就大大展现出来,所有的管理无外描述+组织
在组织数据中,STL(算法和容器)同样发挥着重要作用,所以类和STL是c++最重要的模块,在语言的层面就已经给我们做了面向对象和层次的划分。
3.2 如何理解系统调用
操作系统向上提供对应的服务(让用户有访问硬件的能力)
四、进程
书上的概念:进程是程序的一个执行实例,或者正在执行的程序。
核心概念:进程担当这分配系统资源(CPU时间,内存)的实体。
4.1 是什么
进程=PCB(task_struct)+自己的代码和数据
这时候对进程的管理就变成了链表的增删查改
PCB里包含进程的所有属性
4.2 指令操作
进程都会有一个PID,进程开始之前操作系统都会根据编码给它分配一个PID,如何去查看,需要用到getpid(),这一系统调用函数

查进程 ps ajx(查所有的进程任务)
ps ajx | head -1 ;ps ajx | grep 所要查看的程序/对应的PID
ctrl+c:杀掉进程 ,之后就看不到这一个进程
这个 grep --color=auto 3443285 并不是原来那个进程,而是 grep 命令本身。当我过滤到这一个命令,结果就是:
注意:历史上执行起来的指令,工具,运行起来的程序,都是进程!!!
/proc 以文件的形式查看所有进程
当你进入到某个进程里会有各种这个进程所包含的各种文件信息,其中exe是磁盘中的可执行程序(即便你把rf删除了磁盘中的可执行程序文件,但是内存中的程序依旧在执行,因为内存中早已有了它的拷贝)
其中的cwd(currrent work dir 当前工作路径),进程开始会自动记录下它当前的路径,而如果要改这个cwd,可以在程序代码中使用chdir函数,chdir(路径)可以修改cwd
getppid();获取父进程的pid

从中我们发现父进程的PID在每次运行启动时都不变,只有子进程的PID在变,那么这个可执行程序的父进程是谁?

可以看到他的父进程是bash
补充知识点:命令行解释器:bash/-bash(远程登录),OS会给每一个登录用户分配一个bash,bash也是一个进程
4.3 创建子进程
创建子进程
pid_t fork();一个系统调用函数
进程之间互相独立,互不干扰,



fork(),创建子进程的时候,如果创建返回0,再将子进程的PID返回给父进程,如果创建失败返回-1;
- fork会有两个返回值?
是的,父进程和子进程的关系是1:n,所以父进程需要拿到子进程的PID后续方便管理,子进程没有自己的代码和数据,所以默认会把父进程的拷贝一份,自己来执行
- 既然父子进程同时进行,那么一个函数将会被返回2次?
既然return()了,那么核心工作就已经全部搞定了,执行fork函数后就已经完成了申请子进程pcd,拷贝父进程pcb(除了PID),甚至放入调度序列。即执行完fork之后,子进程就已经开始在运行了,所以父进程需要返回一次,子进程也要返回一次- 子进程如果修改了父子的共享(全局)数据,会影响到父进程吗,会影响进程之间的独立性吗?
不会!父子进程任何一方如果要修改,OS会在底层把被修改的数据拷贝一份,这就是写时拷贝
由此验证,父进程的ret始终保持不变!








