操作系统知识点

260 阅读4分钟

IO多路复用机制:

IO多路复用是一种同步的IO模型。利用IO多路复用模型,可以实现一个线程监视多个文件句柄;一旦某个文件句柄就绪,就能够通知到对应应用程序进行相应的读写操作;没有文件句柄就绪时就会阻塞应用程序,从而释放出CPU资源 实现IO多路复用的模型有三种,分别是Select、poll 和 epoll。

select模型

select使用轮询⽅式的监控多个fd,效率可能随着监视的⽂件描述符数量的增加⽽降低,最大限制是1024.首先,select将fd集合拷贝到内核态检查更新,如果有将socket标记为可读/可写,将数据拷贝到用户态进行处理 select会阻塞监视事件流,当有数据时都遍历fd数组,找到就绪的fd进行返回.
因此,每次调用select()方法,都需要把FD集合从用户态拷贝到内核态,并进行遍历。而操作系统对单个进程打开的FD数量是有限制的,一般默认是1024个。

poll

poll 模型的原理与select模型基本一致,也是采用轮询加遍历,唯一的区别就是 poll 采用链表的方式来存储FD。
所以,它的优点点是没有最大FD的数量限制。

epoll

epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是**事件驱动(每个事件关联上fd)**的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))
epoll 通过红黑树和就绪列表的组合,实现了对大量文件描述符的高效管理。红黑树用于快速查找和管理所有的监控对象,而就绪列表则用于管理那些已经触发事件的对象,使得 epoll 在处理高并发 I/O 时具有极高的性能和可扩展性。

事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪fd放到readyList里面,最后通知对应服务

epoll动态召唤

select/poll:监听的fd集合和事件,每次调用时都要把所有的fd集合传递给内核,是静态的,全部重传。 epoll:只需一次性通过epoll_ctl注册,事件变化了才通知内核,“只关注现在需要处理的”,是动态的,可以随时修改监听对象和事件。

进程、线程与协程

进程

进程是系统进行资源分配和调度的基本单位,它代表了一个运行中的程序的实例. 每个进程都有自己独立的地址空间,包含文本区域、数据区域、堆栈
进程中包括一个以上的线程

线程

线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。
所有线程共享进程的地址空间

协程

协程(Coroutine)可以被认为是轻量级的线程,也称为用户空间的线程。

进程切换

  1. 切换新的页表,然后使用新的虚拟地址空间
  2. 切换内核栈,载入PCB控制块,硬件上下文切换

PCB代表进程控制块(Process Control Block),它是操作系统中用于存储有关进程的重要信息的数据结构。每当一个进程被创建,操作系统都会为其分配一个PCB,以跟踪进程的状态、优先级、程序计数器、寄存器、内存管理信息、进程账号信息等。

线程切换

cpu上下文与线程栈的切换需要操作系统调度

协程切换

仅需要cpu上下文切换由程序在用户态自行调度

并发与并行

并发(Concurrency) :并发是指一个时间段内执行多个任务的能力。这并不意味着这些任务是同时执行的(尽管在某些情况下,它们可能是同时执行的)。

并行(Parallelism) :并行是指同时执行多个任务的能力。这需要多个CPU核心或者其他并行处理设备(如GPU)。在一个并行系统中,多个任务可以在同一时间点真正地同时执行。 并发与并行的区别