活动
main函数编译有问题,div 函数和系统中某个函数重名,浮点输出有问题,scanf也有问题
修改如下
scanf_s("%d %d", &a, &b);
printf("div:%lf\n", div1(a, b));
整体代码如下
#include "pch.h"
#include <iostream>
#include "../Staticlibtest/head.h"
int main(void)
{
int a, b;
printf("enter two numbers:");
scanf_s("%d %d", &a, &b);
printf("add:%d\n", add(a, b));
printf("sub:%d\n", sub(a, b));
printf("mul:%d\n", mul(a, b));
printf("div:%lf\n", div1(a, b));
return 0;
}
知识点
本章研究进程调度时机、过程。
时机:
1.中断和进程调度的区别:中断不改变进程;进程调度是中断之后,切换进程。
2.中断类型:
硬中断:高电平-中断;
软中断(异常):故障、退出、陷阱;
3.schedule调用:
进程主动调用:阻塞系统调用进程调用schedule函数;
松散调用:内核代码随时调用,need_resched标记;
4.上下文
用户空间-用户进程上下文
内核空间-进程上下文
内核空间-中断上下文
5.进程调度时机=调用schedule函数的时机:
内核主动→schedule
中断→用户空间
6.调度策略:算法的目的资源利用效率最高/响应最即时。
7.调度算法:实现调度策略的算法。
8.进程分类方法
资源占用:I/O消耗型进程、处理器消耗型进程;
交互类型:交互式进程、批处理进程、实实时进程;
9.实施进程(_FIFO、_RR)>普通进程(CFS)
10.CFS:交互式进程响应较好,周期=进程数占用时间
理论运行时间=调度周期权重
11.每次调度时选择最小vruntime的进程
12.时钟中断周期=10ms
13.linux传统优先级与权重的转换关系是经验值
14.进程切换=任务切换=进程上下文切换:切换全局目录→切换内核态堆栈和硬件上下文。
15.进程上下文:用户地址空间、控制信息、硬件上下文;
16.进程切换寄存器器:CR3、ESP寄存器、EIP寄存器及其他寄存器;
17.Linux系统运行过程:
用户态进程X→中断→保存现场→schedule 上下文切换→用户态Y→restore_all→iret箭头用户态进程Y
18.进程
19.进程上下文切换相关代码分析pre→next
中断保存硬件上下文的方法:保存现场、恢复现场
进程上下文的切换保存硬件上下文:switch_to宏
20.操作系统整体架构
22.进程占用的内存在3G以上属于内核态,所有进程共享。内核就像出租车,选择进程运行,没有进程就空跑。
实验
switch_to 因宏定义,无法跟踪,设置断点失败。
实验过程如下