目录
1.冯诺依曼体系结构
大部分计算机都遵循冯诺依曼体系结构
存储器:内存
输入设备:键盘,摄像头,话筒,磁盘,网卡...
输出设备:显示器,音响,磁盘,网卡...
输入设备:键盘,摄像头,话筒,磁盘,网卡...
输出设备:显示器,音响,磁盘,网卡...
CPU:中央处理器
运算器:算术运算,逻辑运算
控制器 : CPU是可以响应外部事件,协调外部就绪事件,比如,拷贝数据到内存
控制器 : CPU是可以响应外部事件,协调外部就绪事件,比如,拷贝数据到内存
所有设备都只能直接和内存打交道
2.操作系统
任何计算机系统都包含一个基本的程序集合,称为操作系统
(OS)
操作系统(OS)包括
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)
目的是
与硬件交互,管理所有的软硬件资源
为用户程序(应用程序)提供一个良好的执行环境
![](https://img-blog.csdnimg.cn/aa382449b9bf49b0ad42e0cc4789c27a.png)
操作系统是怎么管理进行进程管理的呢?
很简单,先把进程描述起来,再把进程组织起来!
3.进程
进程就是
对应的代码数据+进程对应的PCB结构体
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
查看进程
![](https://img-blog.csdnimg.cn/683827a136ce4d999d00c0f210a24d59.png)
通过系统调用获取进程标示符
父进程ppid (相当于shell外壳)
子进程pid
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("pid: %d\n", getpid());
printf("ppid: %d\n", getppid());
return 0;
}
通过系统调用创建进程-fork初识
fork有两个返回值
fork之后父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
![](https://img-blog.csdnimg.cn/427a502212424b91bbbf1d1a97d38c0f.png)
![](https://img-blog.csdnimg.cn/cbb666ac7e7b4d35b76f8ad8795cf67b.png)
为什么会有2个返回值
1:因为fork内部,父子会执行各自的return0语句
4.进程状态
新建:字面意思
运行: task_struct结构体在运行队列中排队,就叫做运行态
阻塞:等待非CPU资源就绪,阻塞状态!
挂起:当内存不足的时候,OS通过适当的置换进程的代码和数据到磁盘,进程的状态就叫做挂起!
![](https://img-blog.csdnimg.cn/d86075a8741a4fd698b0f0c61f640fb7.png)
进程前台进程和后台进程(&)
R:对应上面的运行态
T:暂停状态 没有等待资源(调试)
S:对应的就是上面的阻塞状态 | 可中断睡眠 在等待资源
D:睡眠状态,磁盘睡眠,深度睡眠,不可被中断,不可以被被动唤醒
X:dead终止,瞬时性非常强
Z:僵尸状态
是什么
一个进程已经退出,但是还不允许被OS释放,处于一个被检测的状态---僵尸状态
为什么维持该状态,为了让父进程和OS来进行回收
ps aux / ps axj 命令 进行进程状态查看
僵死状态
僵尸进程:子进程先于父进程退出,父进程没有对子进程的退出进行处理,因此子进程会保存自己的退出信息而无法释放所有资源成为僵尸进程导致资源泄露。
![](https://img-blog.csdnimg.cn/df3869e5d7a94f88a36895d37239c768.png)
孤儿状态
孤儿进程:父进程先于子进程退出,子进程成为孤儿进程,运行在后台,父进程成为1号进程(而孤儿进程的退出,会被1号进程负责任的进行处理,因此不会成为僵尸进程)
孤儿进程的运行是在后台的
看图可知道会被1号接管
其它概念
竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高 效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
5.环境变量
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
常见环境变量
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。
查看环境变量方法
echo $NAME //NAME:你的环境变量名称
和环境变量相关的命令
1. echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
3. env: 显示所有环境变量
4. unset: 清除环境变量
5. set: 显示本地定义的shell变量和环境变量
环境变量通常是具有全局属性的,
可以被子进程继承下去
6.程序地址空间
![](https://img-blog.csdnimg.cn/09234ddaa51d4678a5ba1b4f83cc924d.png)
![](https://img-blog.csdnimg.cn/65ce42df4361465591811e26e1329658.png)
![](https://img-blog.csdnimg.cn/5271ca6f905d4189a046d6f18ae00286.png)
7.为什么要有虚拟空间
1、虚拟地址空间可以保护物理空间不被错误修改,提高了系统的安全性。
2、虚拟进程地址的存在,可以更方便的进行进程与进程数据代码的解耦,保证进程的独立性。
3、 虚拟地址空间可以让进程以统一的视角来看待进程对应的代码和数据等各个区域,方便使用