0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是LInux 操作系统中断

科技绿洲 来源:Linux开发架构之路 作者:Linux开发架构之路 2023-11-10 11:29 次阅读

LInux 操作系统中断

什么是系统中断

这个没啥可说的,大家都知道;

CPU 在执行任务途中接收到中断请求,需要保存现场后去处理中断请求!保存现场称为中断处理程序!处理中断请求也就是唤醒对应的任务进程来持有CPU进行需要的操作!

有了中断之后,提升了操作系统的性能!可以异步并行处理很多任务!

  • 软中断(80中断)

由CPU产生的;CPU检查到程序代码段发生异常会切换到内核态;

  • 硬中断

硬件设备发起的中断称为硬中断!可以发生在任何时间;比方说网卡设备接收到一组报文;对应的报文会被DMA设备进行拷贝到网卡缓冲区!然后网卡就会向CPU发起中断信号(IRQ):

CPU收到信号后就会执行网卡对应的中断处理程序!

内核在系统中断时做了什么事

每种中断都有它对应的中断处理程序;

对应到内核的某一个代码段;

CPU接收到中断后;首先需要将寄存器中数据保存到进程描述符!PCB

随后切换到内核态处理中断处理程序!执行网卡的程序;

执行完毕之后切换到用户态,根据PCB内容恢复现场!然后就可继续执行代码段了!

硬件中断触发的过程

图片

中断请求寄存器:保存需要发送中断请求的设备记录!

优先级解析器:中断请求是有优先级之分的,因为CPU不能同时执行多个中断请求!

正在服务寄存器:正在执行的请求!比方我正在打字,这里面记录的就是键盘IRQ1 !

图片

操作系统启动时需要将硬件向量值与处理程序地址进行映射!当硬件发送中断信息时只会发送向量值,通过匹配找到对应的处理程序!

Socket基础

Socket读写缓冲区机制

图片

所谓socket,在底层也无非就是一个对象,通过对象绑定两个缓冲区,也就是数据队列,然后调用系统API对这两个缓冲区的数据进行操作罢了!

发数据;用户态转内核态,将数据拷贝到send缓存区,然后调用write系统调用将数据拷贝到网卡,再由网卡通过TCP/IP协议进行数据包的网络发送!

socket两种工作模式

  • BIO

总结:读数据读不到就一直等,发数据发不了就一直等!

  • NIO

读数据读不到就等一会再读,取数据取不到就等一会再取!

接受端缓冲区打满了,线程又抢占不到CPU去清理缓冲区,怎么办!

最后发送端的数据缓冲区也会被打满!

系统调用;用户态------内核态

  • 系统调用:

int 0X80对应的就是系统调用中断处理程序;向量值为128;system_call;

图片

IRQ是有限的,不可能为每一个系统调用都分配一个向量值,所以统一使用80中断来进行系统调用的路由!

为什么要有这两种状态

指令的危险程度不一样;

对于不同的指令,为了保证系统安全,划分了用户空间和内核空间;

linux中:0表示内核态,3表示用户态!

所以:linux在创建进程的时候就会为进程分配两块空间;

用户栈:分配变量,创建对象

内核栈:分配变量!

什么时候进程进行切换至内核态

硬中断;

用户态中代码出现错误也要切换!

进程切换时都做了什么

CPU中存在很多寄存器

图片

这些寄存器保存了进程在进行运算时的一些瞬时数据;如果现在要进行进程切换了;这些数据都需要找个地方保存起来;那么保存到哪里呢?

进程PCB:在OS创建进程的时候同时也会分配一段空间存放进程的一些信息;其中就有一个字段指向一个数据结构;叫做进程控制块PCB:

用来描述和控制进程的运行的一个数据结构——进程控制块PCB(Process Control Block),是进程实体的一部分,是操作系统中最重要的记录型数据结构。

  • PCB是进程存在的唯一标志
  • 系统能且只能通过PCB对进程进行控制和调度
  • PCB记录了操作系统所需的、用于描述进程的当前情况以及控制进程运行的全部信息

所以:在进程进行切换的时候CPU中的数据保存到了PCB中,供CPU回来时读取恢复!

Linux select 多路复用函数

select就是一个函数:只要传入相应的参数就能获得相应的数据:

1、们所关心的文件描述符fd;

2、描述符中我们关心的状态:读事件、写事件、等

3、等待时间

调用结束后内核会返回相关信息给我们!

做好准备的个数

哪些已经做好准备;有了这些返回信息,我们就可以调用合适的IO函数!这些函数就不会再被阻塞了;-

函数详解

int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, timeval *timeout)

- maxfdp1 readset 和 wirteset中的最大有数据位
- readset bitmap结构的位信息;保存我们需要读取的socket序号;
- writeset 写数据信息
- exceptset 异常信息

图片

select函数这里不再细讲,可以翻看以前的文章

图片

将函数需要的参数准备好之后调用select;

select进行80中断;将rset数据拷贝到内核中;查询对应的状态之后设置rset对应的位置值,

完成后又拷贝到用户态中的rset;这样一来rset里面的位信息就代表了哪些socket是准备好了的!

随后遍历这些位信息就可以调用read或wirte进行缓冲区的操作了!

缺点

可以看到,while死循环中每次执行都将rset重新置位;然后循环重新SET位信息;随后才会发起请求!过程较为繁琐且重复!

select多路复用器底层原理分析

图片

图片

图片

图片

图片

图片

图片

图片

图片

epoll函数

了解到select的缺点后发现:select每次得到数据都要进行复位,然后又进行重复的步骤去内核中获取信息;感觉就是很多时间都花在重复的劳动上,为了解决这个问题,linux在2.6引入epoll模型,单独在内核区域开辟一块空间来做select主动去做的事,select是主动查,epoll则是准备数据,线程来了直接取就行了;大大提升了性能

既然是函数,看看相关的函数实现:

实现思路:

在内核创建一块空间;总所周知;linux下一切皆文件;所以所谓创建的空间也就是一个文件描述符fd,然后这个文件结构中有两个指针指向另外两个地址空间:事件队列、就绪队列

事件队列:存放已经建立所有socket连接

就绪队列:准备就绪的socket;也就是read或write的时候不用阻塞的socket;

其实epoll就像一个数据库;里面有两个数据表;一个放连接列表;一个放准备就绪的连接列表;

既然有这两个队列;就要涉及到增删查;这就是另外两个函数的来由;

创建epoll空间
int epoll_create(int size);


int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

对事件队列进行增删改:

epfd : epoll的文件描述符号:因为内核中可能有多个epoll

op : 参数op有以下几个值:EPOLL_CTL_ADD:注册新的fd到epfd中,并关联事件event;EPOLL_CTL_MOD:修改已经注册的fd的监听事件;EPOLL_CTL_DEL:从epfd中移除fd,并且忽略掉绑定的event,这时event可以为null;

fd : 表示socket对应的文件描述符。

图片

epoll底层原理解析

图片

图片

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5031

    浏览量

    117736
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10445

    浏览量

    206566
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206738
  • 操作系统
    +关注

    关注

    37

    文章

    6288

    浏览量

    121886
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79545
收藏 人收藏

    评论

    相关推荐

    LINUX操作系统

    Linux操作系统,分为好几种,它们有什么区别吗?今天安装了个乌班图操作系统,这个LINUX操作系统如何?本人不太清楚,还请前辈指点一下?谢
    发表于 12-16 18:34

    Linux操作系统安装与使用

    嵌入式网络编程+嵌入式Linux系统一、Linux操作系统安装与使用(命令)二、Linux开发工具(gcc、gdb、make)三、
    发表于 11-05 08:25

    Linux操作系统

    linux的教学内容1 、Linux概述 2 、Linux操作系统安装3、 Linux的内核 4 、Li
    发表于 04-10 16:54 0次下载
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系统</b>

    Linux操作系统原理及应用

    Linux操作系统原理及应用 1.1  操作系统的地位 1.2  操作系统的功能 1.3  操作系统的发
    发表于 04-28 14:53 0次下载

    Linux操作系统实时性分析及改进策略

    实时操作系统要求具有速度快和可预测性的特点,必须保证实时任务在要求的时间内完成。本文在分析Linux 操作系统中断方式和进程调度等影响实时性的因素后,对
    发表于 06-15 10:13 14次下载

    Linux与其他操作系统的区别

    Linux与其他操作系统的区别 Linux与其他操作系统的区别  Linux可以与MS-DOS、OS/2、Windows等其他
    发表于 01-18 12:42 1593次阅读

    什么是Linux操作系统

    什么是Linux操作系统  简单地说,Linux是一套
    发表于 12-26 12:04 1371次阅读

    十大Linux操作系统

    近期公布的超级计算机 Top500排行榜显示,所有入榜的超级计算机都在运行 Linux 操作系统。尽管 Linux 操作系统在桌面上的表现不尽如人意,但作为运行在全球数据中心的服务器、
    发表于 11-23 10:48 9586次阅读

    趣谈Linux操作系统

    趣谈Linux操作系统
    的头像 发表于 01-13 16:00 6093次阅读

    基于linux的十大操作系统排名

    基于linux内核开源的特性,并随着linux的不断发展,各种基于Linux操作系统版本也在不断发行出来,其中每一个不同版本的Linux
    发表于 07-10 16:23 1.5w次阅读

    Linux操作系统与Windows操作系统的五大区别

    Linux操作系统和Windows操作系统身为三大操作系统巨头里面的两大巨头,他们有什么区别呢?首先,先要声明一点,所有以Linux内核为基
    发表于 07-10 16:28 7553次阅读

    Linux嵌入式操作系统有哪些优势

    嵌入式Linux操作系统是将Linux操作系统进行裁剪,使Linux操作系统能够在嵌入式计算机
    发表于 07-10 16:34 4720次阅读

    五款常用的Linux操作系统

     Linux操作系统诞生于1991年的10月5日。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。
    发表于 07-16 14:48 1902次阅读

    linux属于什么操作系统

    Linux属于一种类UNIX操作系统Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX
    的头像 发表于 11-08 11:01 1745次阅读

    LInux 操作系统中断介绍

    LInux 操作系统中断 什么是系统中断 这个没啥可说的,大家都知道; CPU 在执行任务途中接收到中断
    的头像 发表于 11-13 11:36 406次阅读
    <b class='flag-5'>LInux</b> <b class='flag-5'>操作系统</b><b class='flag-5'>中断</b>介绍