计算机组成原理
四、计算机组成原理
4.1 衡量储存器使用哪几个指标?
- 速度、容量、单位成本
- 外存、内存、cache
4.2 I/O
4.2.1 定义
- 一个进程虽然任意时刻只能处理一个请求,但是处理每个请求事件时,耗时控制在1毫秒以内,这样1秒内就可以处理上前个请求,把事件拉长来看,多个请求复用了一个进程,这就是多路复用,这个思量类似于一个cpu并发多个进程,所以也叫时分多路复用。这种机制可以显著提高系统的性能和资源利用率,减少不必要的线程切换和上下文切换开销。
- IO多路复用时通过一个线程来管理多个IO通道,避免为每个通道创建独立线程或进程的开销
- 常见的IO多路复用机制包括select、poll和epoll:
- select:最早的IO多路复用函数,可以监视多个文件描述符。但它有一些限制,如文件描述符数量上限为1024。
- poll:类似于select,但没有文件描述符数量的限制。
- epoll:Linux特有的IO多路复用机制,性能最好。它使用事件驱动的方式,只关注活跃的文件描述符。
- kqueue:BSD系统的IO多路复用机制,类似于epoll。
作者:青玉白露
链接:https://www.nowcoder.com/discuss/646089968237957120
来源:牛客网
4.2.2 I/O总线包括那几类?
- 数据总线
- 设备选择总线
- 状态总线
- 命令总线
4.2.3 优点
- 减少系统开销:不必创建过多的进程/线程
- 提高性能和可伸缩性:可以有效的处理大量并发请求,提高性能和可伸缩性
- 节省资源:减少内存和系统资源的消耗
- 支持非阻塞IO:允许在等待数据准备好继续执行其他任务
- 简化程序结构:不需要处理复杂的线程管理和同步问题
4.2.4 应用场景
- 在许多网络应用中,如web服务器、聊天应用、实时游戏等,需要同时处理大量连接请求或数据传输,IO多路复用技术可以显著提高这些应用的性能
- 在高性能服务器中,如redis、nginx等,IO多路复用技术被广泛应用,以支持更多的并发连接请求。
4.2.5 实现方式select/poll/epoll
select/poll/epoll如何获取网络事件
再获取事件时,先把所有连接传给内核,再由内核返回产生了事件的连接,然后在用户态中处理这些连接对应的请求即可。
select/poll
实现方式
- 将已连接的socket都放到一个文件描述符集合
- 调用select函数将文件描述符集合拷贝到内核里
- 让内核来检查是否由网络事件产生
- 检查方式很暴力:遍历文件描述符集合的方式,当检查到有事件产生后,将次socket标记为可读或可写
- 接着把整个文件描述符集合拷贝到用户态里面,然后用户态还需要再使用遍历的方法找到可读或可写的socket
特性
- 使用固定长度的bitsmap,表示文件描述符的集合,而且支持的文件描述符的个数时优先组织的,比如在linux中,默认最大值为1024;
- 与之对比的是poll:不在使用bitsmap来存储所关注的文件描述符,而使用·1动态数组,以链表的形式来组织,突破了select文件描述符个数的限制
- select和poll没有本质区别,都是使用线性结构存储进程关注的socket集合,因此都需要遍历文件描述符集合来找到可读或可写的socket,时间复杂度为0(n),而且也需要在用户态和内核态之间拷贝文件描述符集合,这种方式随着并发数上来,性能的损耗会呈指数级增长
epoll
用法
- 先用epoll_create 创建一个 epol l对象 epfd,再通过 epoll_ctl 将需要监视的 socket 添加到epfd中,最后调用 epoll_wait 等待数据
epoll 通过两个方面,很好解决了 select/poll 的问题
第一点:红黑树的引入
- epoll在内核中使用红黑树跟踪进程中所有待检测的文字描述符
- 把需要监控的socket通过**epoll_stl()**函数加入到内核的红黑树里(红黑树的增删改的时间复杂度为0(logn))
- 所以有了红黑树的维护,每次只需要传入一个待检测的socket,减少了内核和用户空间大量数据拷贝和内存分配
第二点:
4. epoll使用事件驱动机制,内核里维护了一个链表来记录就绪事件,当某个socket有事件发生时,通过回调函数内核会将其加入到就绪事件列表中
5. 当用户吊用**epoll_wait()**时,只会返回有事件发生的文件描述符的个数,不需要像select那样轮询扫描整个socket的集合。
边缘触发和水平触发
epoll支持两种事件触发方式,分别是边缘触发和水平触发
- 边缘触发模式,当被监控的socket描述符上有可读事件发生时,服务器端只会从epoll_wait中苏醒一次,即使进程没有调用read函数从内核读取数据,也依然只苏醒一次,因此我们程序要保证一次性将内核缓冲区的数据读取完。所以一般和非阻塞IO搭配使用
- 使用水平触发模式时,当被监控的socket上有可读事件发生时,服务器会不断的从epoll_wait中苏醒,知道内核缓冲区数据被read函数读完才结束,目的是告诉我们有数据要读取
4.3 中断
什么是中断?
- 计算机在执行程序过程中,当出现异常清空或特殊请求时,计算机停止现行程序的运行,转去处理
这些异常清空或特殊请求,处理结束后,再返回现行程序的间断处,继续执行原程序,即为中断。
中断流程包括
- 保护现场
- 中断服务
- 恢复现场
- 中断返回
CPU 什么时候响应中断?
- 当前指令执行完毕之后,CPU 会发出中断查询信号。也就是说中断一定是发生在每条指令结束之后,不可能在执行过程中进行中断
4.4 DMA
- 直接内存访问,在主存和 I/O 设备之间建立独立的总线连接
DMA 的工作
- 预处理
- 数据传输
- 后处理
4.5 说说都有哪些指令集,设计思想是什么
- RISC:精简指令集
- SISC:复杂指令集
4.6 双击一个程序的背后细节
程序运行的时候,是操作系统把它所需要的指令和数据从硬盘加载到内存中。进入内存之后,CPU按照冯诺依曼的思想,从内存里面按顺序去执行指令,直到这个程序所有的指令都执行完为止。
步骤如下:
找到并执行可执行文件
- 用户操作:
- 当用户双击桌面、开始菜单或文件浏览器中的一个可执行文件(如.exe文件)时,操作系统会捕捉到这一操作。
- 文件路径解析:
- 操作系统首先解析双击的快捷方式或文件路径,找到实际的可执行文件位置。
- 调用Explorer.exe:
- 通常情况下,Windows操作系统中的Explorer.exe进程负责处理这类用户操作。Explorer.exe会调用CreateProcess()函数来创建一个新的进程对象,用于执行被双击的可执行文件。
进程创建过程
- 映射exe文件到内存
- 操作系统为新的进程分配一块用户独享的内存空间(如10000到7FFEFFFF),并根据PE(Portable Executable)文件的ImageBase属性将其映射到这块内存的指定位置。
- 创建内核对象EPROCESS:
- 每一个进程都有一个对应的EPROCESS结构,该结构存放在共享的内核分区中。EPROCESS包含了进程的所有状态信息,如内存管理、句柄表、安全信息等。
- 初始化进程地址空间:
- 进程地址空间包括代码段、数据段、堆、栈等区域。操作系统会创建相应的页表项,以映射这些区域到进程的虚拟地址空间。
- 映射系统动态链接库(ntdll.dll):
- ntdll.dll是Windows操作系统提供的一个关键动态链接库,包含了操作系统内核提供的API。这个库会被映射到每个进程的地址空间中,以便进程能够调用操作系统的功能。
- 创建初始线程(EThread):
- 进程必须至少拥有一个线程才能执行。操作系统会为新进程创建一个初始线程,并为其分配栈空间和执行环境。
- 加载必要的DLL和库:
- 根据PE文件中的导入表,操作系统会加载并映射所有必需的DLL和库到进程的地址空间中。这些DLL和库可能包括用户自定义的库以及系统库。
- 开始执行初始线程:
一旦所有必要的资源都已准备就绪,初始线程开始执行。这通常意味着执行可执行文件中的入口点函数(如main或WinMain函数)。
后续操作
- 资源分配和调度:
- 操作系统会根据进程的优先级和需求为其分配CPU时间、内存等资源,并进行调度。
- 进程间通信:
- 如果需要,进程可以通过各种机制(如管道、消息队列、共享内存等)与其他进程进行通信。
- 进程终止:
- 当进程完成任务或用户请求终止时,操作系统会回收其占用的资源,并销毁相关的内核对象。
4.7 路由器和交换机的区别
路由器和交换机都是计算机网络中的设备,但是它们的功能不同。
- 路由器是连接因特网中各局域网和广域网的设备,用来做网间连接,也就是用来连接不同网络的。
- 而交换机是一个扩大网络的器材,能为子网络中提供更多的连接端口,以便连接更多的计算机。
层级 - 普通的交换机一般工作在OSI七层模型的第二层·数据链路层
- 而路由器则工作在第三层·网络层。