操作系统概述
计算机软件分为系统软件和应用软件,系统软件包含(操作系统,程序设计语言(机器语言,汇编语言,高级语言,4GL语言),数据库);
进程管理
进程状态:
等待(等待某个事件)就绪(等待事件发生)运行(占用cpu)
进程的同步和互斥靠pv操作实现
eg:有s个进程,求pv操作
p操作:s=s-1 if(s>=0) 继续进行 else 进入等待
v操作 s=s+1 if(s<=0) 唤醒等待 else 不管
如何解决资源分配问题:银行家算法
#include<stdio.h>
struct work
{
int r1, r2, r3;
int flag=0;
};
int main()
{
struct work sum;
struct work a[5];
struct work b[5];
int n = 5;
struct work num;
scanf(" %d %d %d", &sum.r1, &sum.r2, &sum.r3);//总可分配资源
for (int i = 0; i < 5; i++)
{
scanf("%d %d %d", &a[i].r1, &a[i].r2, &a[i].r3);//最大需要资源,达到可运行
scanf("%d %d %d", &b[i].r1, &b[i].r2, &b[i].r3);//先有资源
num.r1 = num.r1 + b[i].r1;//属于已经分配资源
num.r2 = num.r2 + b[i].r2;
num.r3 = num.r3 + b[i].r3;
}
num.r1 = sum.r1 - num.r1;//未分配资源
num.r2 = sum.r2 - num.r2;
num.r3 = sum.r3 - num.r3;
while (n)
{
for (int i = 0; i < n; i++)
{
if (a[i].falg == 0)
{
if (num.r1 >= a[i].r1 - b[i].r1 && num.r2 >= a[i].r2 - b[i].r2 && num.r3 >= a[i].r3 - b[i].r3)
{
num.r1 = num.r1 - (a[i].r1 - b[i].r1) + a[i].r1;
num.r2 = num.r2 - (a[i].r2 - b[i].r2) + a[i].r2;
num.r3 = num.r3 - (a[i].r3 - b[i].r3) + a[i].r3;
n--;
a[i].flah = 1;
printf("%d->", i);
}
}
}
}
}
如何解决死锁问题:
1.死锁预防
2.死锁避免
3.死锁控制
4.死锁解除
存储管理
页式存储
app使用->逻辑地址
计算机->内存物理地址
需要将逻辑地址于内存地址进行链接
页面置换算法:
1.先进先出FIFO
2.最佳置换OPT(理想状态,从前往后)
3.最近最少使用LRU(从后往前推算)
(有点类似于cache,会根据使用的多少,然后考虑是否清除)
文件管理
树形目录结构:(Linux叫做根目录,Windows叫做盘符)
绝对地址:从根目录开始到目的地址(很长一串特别的详细)
相对地址:有可能是在同一个小地址下,只需在跳转一次就能到达,如果要返回上一层记得加点
设备管理
1.数据:传输控制方式(数据对象)
2.程序控制方式(cpu->外设)//cpu去访问外设
3.程序中断方式(I/O访问cpu如果cpu正在执行,中断保存)
4.DMA代替cpu部分功能,控制I/O进行,I/O去访问DMA,DMA就进行状态保存,在cpu再去访问DMA
系统开发和项目管理
软件 项目的生命周期于开发模型
1.计划(问题的定义,可行性研究)
2.开发(需求分析,总体设计,详细,编码,测试)
3.运行(维护)
软件开发模型
1.瀑布模型(软件计划,需求分析,软件设计,程序编码,软件测试,运行维护)
需求明确,原型化模型,演化模型,增量化模型’
2.V模型(拔高测试)
需求分析(系统测试所有模块集合)概要设计(集成测试模块于模块之间)详细设计(单元测试单个模块)编码
软件开发:高内聚,低耦合
动态测试:
1.白盒测试:只关心细节,逻辑驱动,路径,结构
2.黑盒测试:只关心输入输出,不关心细节
3.灰盒测试:都关心一丢丢
静态测试:程序员之间debug;
项目管理计划评审表(RERT)最短工期计算=关键路径(开始->结束)最长时间
松弛时间,最晚-最早开工时间