目录
一、系统调用
计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须有操作系统控制。也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call)。除了提供访问硬件资源的能力外,系统调用还可以用于进程控制,用户控制等系统管理功能,即系统调用是操作系统面向应用程序提供的用于与操作系统本身交互的接口。
系统调用的种类和实现由操作系统决定,底层依赖于硬件的驱动程序接口,即通过系统调用屏蔽访问底层硬件的实现。应用程序不应该直接使用系统调用,因为系统调用的使用方式与操作系统本身强绑定,而应该使用标准函数库,由标准函数库封装对系统调用的实现。因为标准函数库的实现依赖于系统调用,所以不同的平台如windows,linux都有对应的标准库函数和对应的编译器。
参考: Linux系统调用详解(实现机制分析)--linux内核剖析(六)
二、CPU中断和DMA
CPU在执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或者内部产生的一种特殊的信息,并且可以立即对所接受到的信息进行处理,这样的信息,我们就称为中断信息。按照中断信息的来源可以分为软中断和硬中断,软中断是在CPU执行过程中产生的,如应用程序异常(如除以0),执行int指令等,软中断主要用于通知CPU终止当前指令序列的执行,比如用户通过系统调用读取文件时需要先发送中断指令,CPU接受中断指令后会保存当前进程的上下文,然后给硬件发送读取文件的指令,然后CPU执行其他的进程;再比如当前进程的CPU时间分片用完了,就会由定时间触发一个软中断通知CPU终止对当前进程的处理,由调度器选择其他的进程执行。硬中断指的由CPU的外部设备如键盘,网卡,鼠标等产生的,硬中断主要用于通知CPU硬件的任务已经执行完了,比如磁盘读取文件,文件读取到内存以后就会发送中断指令给CPU,CPU接受该指令后调用之前注册的中断处理程序将读取文件的内存地址告诉最初的调用方。硬中断主要是为了解决硬件执行任务远远慢于CPU,通过硬中断这种通知方式将CPU和硬件独立开。
CPU中断绝大部分时候会引发进程的上下文切换,即需要保存当前进程的执行环境,然后载入下一个即将运行的进程的执行环境,其性能开销较大,因此可以通过中断率或者上下文切换次数优化应用程序,提升应用性能。
中断是指一种重要的外设与CPU数据交换的方式,因为需要进行断点和现场的保护和恢复,浪费了很多CPU的时间,适合少量数据的传送。DMA(Direct Memory Access,直接存储器访问)是指外部设备不通过CPU而直接与系统内存交换数据的接口技术,适合批量数据传送,整个过程主要由DMA控制器完成。DMA传输整体分为三个过程:第一,预处理,由CPU完成一些必要的准备工作,如向DMA控制器的有关寄存器置初值,设置传送方向、启动该设备等。然后等到I/O设备准备好发送的数据(输入情况)或接受的数据(输出情况)时,I/O设备向DMA控制器发送DMA请求,再由DMA控制器向CPU发送总线请求(统称为DMA请求),用以传输数据;第二,数据传送,传输过程中内存为该DMA通道分配内存空间(即DMA缓冲区),整个过程完全由DMA(硬件)来控制的;第三,后处理,DMA控制器向CPU发送中断请求,CPU执行中断服务程序做DMA结束处理,包括检验送入主存的数据是否正确,测试传送过程中是否出错等。
参考:CPU的内部的中断