目录
目录
一.冯诺依曼结构体系
计算机硬件体系结构:
输入设备:键盘,鼠标,扫描仪等等
输出设备:显示器,打印机等等
运算器&控制器:中央处理器----->cpu
存储器:物理内存
注意:
- 数据处理按照图中黑色的线流向 信号控制按照紫色的线进行
- cpu想要处理数据必须先从输入设备将数据存储到物理内存中,cpu再从存储器中获取数据,然后将处理后的数据传递给存储器,最后由存储器将数据交给输出设备输出
- 不考虑缓存的情况下,cpu只能对内存进行读写,不能访问外设(输入输出设备)
- 输入或者输出也只能从存储器中获取
- 所有设备只能和内存之间进行联系
二.操作系统
一句话总结操作系统:一款在计算机中搞管理的软件
(1)操作系统包括:内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(函数库,shell程序等等)
(2)设计操作系统的目的:1.管理计算机的软硬件
2.便于用户进行对计算机的操作
(3)系统调用:系统会暴露自己的部分接口来提供给开发者使用,被提供的接口叫做系统调用
(4)库函数的概念:为了方便用户进行开发,将封装起来的系统调用接口叫做库函数
三.进程概念
1.进程是什么?
总的来说进程就是运行中的程序
在操作系统的角度,进程是系统对运行中的程序动态运行过程的描述--->使用pcb控制块
在Linux系统中,进程是一个tsak_struct的结构体,系统通过这个结构体描述实现对程序的管理及调度
2.pcb(进程控制块)
----->系统对进程管理调度的重要依据,一般情况下,他包括以下内容:
1.进程标识符
2.处理机的信息
3.进程调度的信息
4.进程控制信息
3.task_struct结构体
在Linux下进程控制块是一个task_struct结构体,task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。他的内容主要包括
- 标识符:表述本进程的唯一标识符,用来区别于其他进程
- 状态:任务状态,退出代码,退出信号等等
- 优先级: 相对于其他进程的优先级
- 程序计数器: 程序中即将被执行的下一条指令的地址
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
- 其他内容
四.进程状态
1.cpu分时机制
由操作系统进行管理,cpu可以一直处理数据,但是由于操作系统进行控制cpu只处理一个程序很短的时间(一个时间片内),然后就切换到下一个程序,以快速达到一种效果----多个程序在同时运行的效果。
在从一个时间片运行到下一个时间片的时候,上下文数据中会记录程序上一次运行到的位置和信息,从而以便于在下次运行的时候找到上次运行的位置
2.前台进程&后台进程
前台进程:指占据了一个终端的进程
后台进程:指没有关联的终端,默默运行在系统后台中
3.进程状态的分类
(1)运行态(R):正在运行的程序或者在运行队列里的程序(指拿到时间片就能执行的程序)
(2)可中断休眠态(S):一种阻塞态(因为某种运行条件不满足,而暂时不能被调度运行的状态,比如(sleep(10)))
操作调度的时候就会看进程是否满足了被唤醒的条件,满足了则进入运行态进行调度
(3)不可中断休眠态(D):无法被中断条件打断的阻塞态,只能等待阻塞的条件被满足之后,才能调度运行
(4)停止态(T):什么都不做(和休眠不同,休眠是一种阻塞态,中断后还会被调度)
可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行。
(5)死亡态(dead): 这个状态只是一个返回状态,你不会在任务列表里看到这个状态
(6)僵尸态:进程退出运行了,进程信息依然保留,但是资源没有完全被释放,等待处理的一种状态
4.僵尸进程
一个进程运行结束了,应该向他的家属进程返回一个退出代码(退出原因或者死亡原因),在家属进程接受到退出代码以后,家属进程会管理子进程,并且将子进程进行资源的释放
(1)产生原因: 当子进程先于父进程退出,并且当父进程没有获取到父进程的返回代码时,父进程就无法将子进程的资源进行释放,就会产生僵尸进程
(2)僵尸进程的危害:
1.持续僵尸状态:当子进程结束运行之后,他会将自己的退出原因保存在自己的pcb中来供父进程进行查看,如果当父进程一直不进行读取退出原因,子进程就会一直处在僵尸进程
2.资源泄露:假如父进程创建了多个子进程,且子进程都未被父进程读取死亡原因,那么多个子进程的资源就无法完全得到释放,造成资源浪费
(3)如何避免僵尸进程:
进程等待:等待子进程退出,父进程获取子进程的退出原因,释放子进程的资源,避免产生僵尸进程
5.孤儿进程
产生原因:当父进程先于子进程退出之后,就会产生孤儿进程
特性:孤儿进程会运行在后台,父进程成为1号进程
*****孤儿进程退出后不会成为僵尸进程,1号进程(子进程原本的父进程)会在孤儿进程退出之后立即处理子进程
守护进程:一种特殊的子进程:运行在后台不受任何影响
五.环境变量
1.环境变量的概念:
一般是指在操作系统中用来指定操作系统运行环境的一些参数
保存了当前程序运行环境参数的变量
常见环境变量:
- PATH : 指定命令的搜索路径
- HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
- SHELL : 当前Shell,它的值通常是/bin/bash
2.优点:
(1)即时生效:让运行环境配置更加灵活,通过环境变量可以给运行的程序传递数据
(2)终端shell的环境变量由两种:环境变量和普通变量。其中环境变量具有进程之间的传递特性,但是普通环境变量没有
例如:环境变量可以将环境变量的值传递给以后的数据:
export A = 1000;
在程序中使用getenv("A"),再将程序运行就会发现A所代表的值就是1000.
然而,普通变量布局由这个特性
3.相关的接口和指令
(1)char* getenv(char* name)------>通过环境变量的名称来获取环境变量的数据
(2)相关指令
env 查看所有环境变量
set 查看所有变量
echo 打印指定内容(可以是变量内容)到终端显示
export 声明一个变量未环境变量
unset 删除一个变量
4.在程序中访问环境变量
(1)char* getenv(char* name)------>通过环境变量的名称来获取环境变量的数据
(2)main函数的第三个参数
main(int argc , char* argv[] , char* env[])
其中
argc 程序运行的参数个数
argv 用字符指针数组保存所有的运行参数
env 保存了系统中设置的环境变量(其中最后一个环境变量以NULL结尾)
(3)全局变量:extern char** environ
六.程序地址空间
1.概念
OS为每个进程描述的一个的虚拟地址空间,进程中的每个变量的地址都是虚拟地址,虚拟地址经过页表映射之后,得到物理地址,进而访问物理内存
在Linux下,系统通过mm_struct结构体所描述的一个虚拟的,连续的,完整的地址空间
2.优点
(1)实现数据在物理内存上的离散式分布,提高碎片化内存利用率
(2)每一个进程都有一个完整独立的虚拟地址空间,则地址可以任意使用,不用担心冲突
(3)在进行页表映射之后,可以进行访问权限的控制
3.内存管理方式
1.分段式管理
(1)概念:将一个整体的地址空间划分为多个段(代码段,数据段,堆区,栈区....)
重要的两个要素:段表 + 地址组成
段表:一种数据结构,其中描述的信息:段号,物理内存的起始地址
(2)作用:利于编译器对地址的管理
(3)虚拟地址组成:段号 + 段内偏移量
(4)查找实际物理内存的方法
通过段号找到段表项,得到一块物理内存的起始地址
物理内存起始地址+偏移量 == 数据在物理内存中的存储位置
2.分页式内存管理
(1)概念:将一个整体的地址空间划分为大量小的分页(默认4096字节为一页)
(2)关键要素:页表+虚拟地址组成
页表:页号,亲内存块起始地址,缺页中断位,访问权限位
虚拟地址组成:页号+页内偏移
(3)作用:实现数据的离散存储,提高内存利用率
(4)查找物理存储的地址:
通过页号在页表中找到对应的页表项,得到物理内存块的起始位置,加上页内偏移量就是实际的访问位置
分段式和分页式的不同:
分段式:利于地址管理,但是内存利用率较低
分页式:更加倾向于碎片化管理,提高内存利用,以及内存访问控制
3.段业式内存管理:
先将地址空间进行分段,再在每个段内使用分页式管理(结合了分段式和分页式的优势)
4.内存交换和缺页中断
内存管理:程序运行会占据大量的内存空间,但是物理内存是有限的(意味着物理内存总会由耗尽的时候),为解决这种问题,使用内存交换的方式解决
内存交换:按照某种规则将内存中的某些数据移出去,放到硬盘存储,腾出来的空间供当前运行的程序使用。
缺页中断:当进程要访问一块内存的时候,经过页表映射的时候发现缺页中断被置位(这块内存中原先的数据不在现在的空间中),就会触发缺页中断
当要访问的数据正好是内存交换出去的数据的时候就会触发缺页中断。