一、冯诺依曼体系结构
目前我们认识的计算机都是由一个个硬件组成
- 输入单元:键盘,鼠标,扫描仪等
- 输出单元:显示器,打印机
- 中央处理器(cpu):含有运算器和控制器
关于冯诺依曼体系,必须强调几点:
- 存储器是指内存
- 不考虑缓存的情况,cpu只能对内存进行读写,不能访问外设
- 外设要输入或输出数据,也只能从内存里读取
- 所有设备都只能和内存打交道
二、操作系统(operate system)
操作系统是一个基本的程序集合,常见的操作系统有Windows,Linux,Unix,安卓等。操作系统包括
- 内核:(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(函数库,shell程序等)
设计os的目的:
- 与硬件交互,管理所有的软硬件资源
- 为用户程序(应用程序)提供一个良好的执行环境
定位:操作系统是一款纯正的“搞管理”的软件
- 对上:提供良好的执行环境
- 对下:进行资源管理
如何理解操作系统的“管理”?
操作系统的管理即将被管理的对象描述起来,组织起来
- 管理者:操作系统
- 被管理者:硬件
- 管理:通过数据进行
- 操作系统通过驱动程序获取硬件的数据来管理硬件,操作系统不会直接和硬件打交道
就像一个学校,校长是管理者(os),我们是被管理者(硬件),校长不会直接管理我们,而是通过辅导员等对我们进行管理。校长下达命令,由辅导员来执行(将对象组织起来)。而每个学校的数据库中都存有每个学生的信息,各学期的成绩等(将对象描述起来)
所以操作系统管理硬件就是:
- 描述起来,用struct结构体
- 组织起来,用链表或其他更高效的数据结构
系统调用和库函数的概念:
- 在开发角度,操作系统对外表现为一个整体,只会暴露自己的部分接口,供上层开发使用,者部分由操作系统提供的接口,就叫系统调用
- 系统调用在使用上,功能比较基础,对用户的要求也比较高,所以开发者对部分系统调用进行了适度的封装,从而形成了库。
- 库是对系统操作的一层封装
vs是集成开发环境,所有的功能全都放在一起
Linux上的每个工具都是独立的一部分,(vim,gcc,gdb)
三、进程:
操作系统对进程的管理,就是将进程描述起来,将进程组织起来
基本概念:
- 程序的一个执行实例,正在执行的程序
- 担当分配系统资源(cou时间,内存)的实体
程序——加载到内存(冯诺依曼体系决定)——进程——描述起来(tack_struct)——组织起来(链表)
描述进程——PCB:
- 进程的相关信息都被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合
- Linux操作系统下的PCB被叫做task_struct,task_struct是Linux内核的一种数据结构,他会被价值到内存里并且包含着进程的信息
task_struct(进程控制块)的内容:
- 标识符:每个进程都有一个标识符,可以看成是标签,用来区分其他进程
- 状态:进程当前的任务状态,退出代码,退出信号等
- 优先级:相对于其他进程的优先级
- 程序计数器(eip):程序中即将被执行的下一条指令的地址
- 内存指针:包括程序代码和进程的相关数据的指针,还有其他进程共享的内存块的指针
- 上下文数据:进程执行时处理器的寄存器中的数据,
- I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
- 记账信息:可能包括处理器时间总和,使用的时钟总和,时间限制,记账号等
- 其他信息
进程组织:
所有运行在系统里的进程都以task_struct链表( 双链表)的形式存在在内核里
查看进程:
进程信息可以通过/proc系统文件夹查看,在Linux下用 ps -l命令可以查看当前目录下所有进程的部分信息
同样我们也可以使用top和ps这些用户级工具来获取,如获取进程
- 如:我们要获取PID为1的进程信息,需要查看/proc/1这个文件夹
- ps aux | grep 6151 或 ps axj | grep 6251
- top aux | grep 6151
获取进程的标识符:
- 进程id :PID;getpid();
- 父进程id:PPID;getppid();
- 同一个程序,每次调用,进程的pid不同
下面我们通过简单的代码获取进程的标识符
通过系统调用创建进程——fork初识:
- fork有俩个返回值
- 成功:子进程返回0,父进程返回子进程的id(子进程只有一个父进程,而父进程可以有多个子进程)
- 失败:子进程返回errno,并不被创建,父进程返回-1;
- 父子进程代码共享,数据个开辟一份空间,私有一份(采用写时拷贝)
- fork之后要有if分流
进程状态:
- R运行状态:表明程序要么正在运行,要么在运行队列里
- S睡眠状态:也叫浅度睡眠,可中断睡眠,意味着等待事件完成
- D磁盘休眠状态:也叫深度睡眠,不可中断睡眠,这个状态的进程退出会等待IO的结束
- T停止状态:可以通过发送SIGSTOP信号给进程,用来停止该进程,这个被暂停的进程可以使用信号SIGCONT让进程继续进行
- X死亡状态:这个状态只是一个返回状态,任务列表中看不到这个状态的进程
- 除此之外还有僵尸进程,孤儿进程等
D状态不执行任务也不能被唤醒的状态,且不能被kill,所以如果内存中有多个D状态的进程,就会使操作系统内存不足,导致系统宕机
可以通过信号修改进程的状态:
信号:共64个
- 1~31(普通信号)
- 34~64(实时信号)
一些常用的信号:
- kill -l:查看所有信号
- kill -SIGSTOP pid
- kill -SIGCONT pid
- kill -SIGKILLpid //9号信号——SIGKILL(尚方宝剑,可以杀死大多进程)
也可以通过信号的序号使用相应的信号
- kill -9 6233 //杀死pid = 6233的进程