中断机制

学习教程

目的

目的: 1.硬件的中断响应—->内核驱动中的中断 2.系统调用的函数响应(sys ca11)–>系统调用 3.自定义中断—–>软件的软中断模式 4.信号中断(kil1-signalnum)—->对了解信号的使用创建等 5.系统的异常和错误—–》系统的异常获取了解系统异常的作用

  1. Linux的中断机制
    1. 分类:硬件中断软件中断
      • 硬中断:由电脑主机的8259类似的硬件中断控制芯片发出的中断、 ARM中断控制器发出的中断
      • 软中断:异常第一类:CPU自行保留的中断系统调用异常

代码结构:

asm.s trap.c system_call.s fork.c signal.c exit.c sys.c

中断的工作流程: 1. 1 中断流程

  1. 做CPU工作模式的转化
  2. 进行寄存器的拷贝与压栈
  3. 设置中断异常向量表
  4. 保存正常运行的函数返回值
  5. 跳转到对应的中断服务函数上运行

1.2 linux 中的工作流程

  1. 将所有的寄存器值入栈, 8086
  2. 将异常码入栈 (中断号)
  3. 将当前行数返回值进行入栈,为了在中断执行后能够找到在哪里中断的,能够复原
  4. 调用对应的中断服务函数
  5. 出栈函数返回值
  6. 返回所有入栈的寄存器值

多道程序处理

  • cpu 有两类工作,处理 I/O ,(输入输出) 和进行计算

  • 对于一个进程: $p=Io等待/进程在内存停留时间$

  • n个进程都在 I/o wait 的概率为 (cpu空转的概率 $p^n$

  • cpu 利用率为 $1-p^n$ ,简单理解为n是并行的进程数目

进程和线程

  • 在进程中创造一种更加轻量的执行单位,他们共享进程的绝大部分信息,拥有独立的程序指针、堆栈、寄存器、状态字等。

线程切换过程

  1. 线程主动交出控制器 (yield), 或终止
  2. 保存信息(线程表)
  3. 本地选择另一个线程执行
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#define NUMTHREADS 2

void *handler(void *_tid){
	int tid = *(int*)(_tid);
}

void main() {
	
  pthread_t threads[NUMTHREADS];
	for(int i = 0; i < NUMTHREADS; i++) {
		//POSIX = portable os interface 
		pthread_create(&threads[i], NULL, handler, &i);
	}

	for(int i = 0; i < NUMTHREADS; i++) {
		pthread_join(threads[i], NULL);
	}

	printf("all threads complete\n");
}

互斥–屏蔽中断

屏蔽中断可以阻止进程切换,下面的打印临界区程序有问题,因为打印的时候,可能会被中断打断,导致程序出错 , 可以使用信号量来屏蔽中断

1
2
3
4
5
disabling interrupts
setPrinting(true);
print()
clearPrinting();
enableInterrupts();

临界区

  • 访问共享资源的程序片段
  • 而资源并不能被同时使用(如打印机,打印机同一时间只能被一个人使用)
graph TB 进程1 --> a 进程2 --> b a --> b1 a --> b2 b --> b2 b --> b3 b1 --> c1 b2 --> c1 b2 --> c4 b3 --> c4 style b2 fill:red style b2 color:white

操作系统调度算法

  • 调度问题应用广泛,不仅仅是操作系统领域
    • yarn调度 hadoop 集群
    • quartz调度任务
    • spring调度请求响应
    • React Fiber 调度绘制任务
    • Apache Flink 调度作业

对于调度算法的理解

  • 资源的稀缺
  • 根据不同的场景找到最优解(类似于动态规划问题)

调度(关心什么?)

  • 被调度任务的特征 (计算密集型 vs IO 密集型)
  • 执行时机
    • 新任务何时执行
    • 任务临时终止如何选择下一个任务
    • 任务阻塞如何选择下一个任务
    • 发生中断时候(外部环境变化时) 如何响应
graph TB 运行 --> 就绪 就绪 --> 运行 运行 --> 阻塞 阻塞 -->就绪

kernel参考文章

博客园的文章

其他笔记

[[post/03.基础学科/01.操作系统/1.进程和线程 | 进程和线程知识]]

[[post/14.新语言学习记录/linux/linux基础原理杂记/cpp语言使用/linux下 进程控制【fork】 |fork机制]]