一.冯诺依曼体系结构
了解进程概念之前我们先来学习一下冯诺依曼体系结构
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
计算机的硬件体系结构
五大硬件单元:输入设备,输出设备,运算器,控制器,存储器
所有的设备都是围绕内存工作的
截至目前,我们所认识的计算机,都是有一个个的硬件组件组成
1.输入单元:包括键盘, 鼠标,扫描仪, 写板等
2.中央处理器(CPU):含有运算器和控制器等
3.输出单元:显示器,打印机等
举个栗子:当我们用qq发消息的时候,大致流程如下
关于冯诺依曼体系需要注意以下几点:
1.这里的存储器指的是内存
2.不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
3.外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
一句话,所有设备都只能直接和内存打交道
二.操作系统
是什么:软件—管理计算机上的软硬件资源
定位:让计算机更加好用
管理:描述+组织
系统调用:操作系统向用户提供的用于访问内核的接口
库函数:针对典型功能的封装接口
库函数与系统调用的关系:库函数封装了系统调用接口
总结:
计算机管理硬件
1.描述起来,用struct结构体
2.组织起来,用链表或其他高效的数据结构
三.进程概念
进程: 在用户的角度是运行的程序;在操作系统的角度是程序运行的动态描述--pcb,Linux操作系统下的PCB是: task_struct结构体(进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合);pcb其中包含程序运行的各项信息,实现操作系统对于运行中程序的管理。
3.1进程状态
描述进程当前处于什么状态
应该如何被操作系统调度管理
查看进程指令:ps -ef -aux
创建进程:pid_t fork(void)
种类:就绪,运行,阻塞
Linux分类:
运行态-R:正在运行的,以及拿到时间片就能运行的
可中断休眠态-S:可以被打断的阻塞状态
不可中断休眠态-D:不可被打断的阻塞状态
停止态-T:停止运行
僵尸态-Z:程序退出后的中间等待处理状态
3.2三种常见进程
1.僵尸进程:
僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,没有读取到子进程退出的返回代码时就会产生僵死(尸)进程。
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
避免:进程等待
处理:退出父进程
危害:资源泄露(内存+进程数量)
2.孤儿进程:
孤儿进程:父进程先于子进程退出,子进程成为孤儿进程
特性:运行在后台,父进程成为1号进程
孤儿进程退出不会成为僵尸进程
3.守护进程:
守护进程-精灵进程:是一个特殊的孤儿进程,运行在后台,与终端脱离关系。
四.环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
例如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
常见的环境变量
PATH : 指定命令的搜索路径,程序的默认运行路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。
环境变量相关指令
- echo: 显示某个环境变量值
- export: 设置一个新的环境变量
- env: 显示所有环境变量
- unset: 清除环境变量
- set: 显示本地定义的shell变量和环境变量
环境变量的特性:具有进程之间的传递性
程序中获取环境变量的接口:
在这里插入代码片char *getenv(char *name);
name:环境变量名称
返回值:对应name环境变量的数据,如果找不到返回NULL
五.程序地址空间
进程地址空间:每个进程都有一份;给每一个进程虚拟一个完整的地址空间;进程的虚拟地址空间。
虚拟地址空间:实际上就是一个地址空间的描述,本质上是一个结构体描述:struct mm_struct
注意: 虚拟地址和物理地址之间的转化由操作系统完成。
操作系统给每个进程虚拟一个独立的完整的虚拟地址空间,让每一个进程都可以访问自己独立的连续的虚拟地址,但是实际的数据存储可以经过映射之后,可以存储到物理内存的任意位置不用连续,实现数据在物理内存上的离散式存储。
离散式存储提高了内存利用率!
总结:程序地址空间,本质上是操作系统为进程通过mm_struct描述的虚拟的地址空间,让每个进程都能访问一个独立的完整的连续的虚拟地址,经过映射之后,实现在物理内存上的离散存储,提高内存利用率,提高了内存访问控制。