0%

问题 原因 封锁级别 解决方法 隔离级别
丢失修改 一个写操作被另一个写操作覆盖,第一个写操作丢失 一级封锁协议 写操作加X锁,且X锁不共存 未提交读
读脏数据 读操作读到数据后写操作回滚,则读操作读到脏数据 二级封锁协议 在一级的基础上,读操作加S锁,读完后立刻释放S锁 提交读
不可重复读 读操作读完数据后,写操作修改数据,读操作再次读取数据发现不一致 三级封锁协议 在二级的基础上,读操作加的S锁不立刻释放,直到事务结束之后再释放 可重复读
幻读 一般是在操作范围数据时,比如求和或者取平均值,有其它事务在区间内插入或者删除 / 加间隙锁 /

20220309223559

单道批处理系统

每次从一个IO缓存中,向内存读入一道程序并只有一道程序运行。只有该程序运行结束后才能读入下一道程序。

CPU有大量的时间在空闲等待I/O完成。

多道批处理系统

每次读入多道程序,并能并发执行(由操作系统控制,中断的概念),共享计算机资源,CPU和其他资源保持“忙碌”状态。

缺点:美没有人机交互。

分时操作系统

计算机以时间片为单位轮流为各个用户/作业服务(平均主义)。

优点:用户请求可以被即时响应,解决了人机交互问题。允许多个用户用时使用一台计算机,并且用户对计算机的操作相互独立。

缺点:不能有限处理一些紧急任务,操作系统对各个用户/作业都是完全公平的,循环地为每个用户/作业服务一个时间片,不区分任务地紧急性。

实时操作系统

在实时操作系统地控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格地时间内容处理完时间。

特点:及时性和可靠性

优点:能优先响应一些紧急任务,无需排队。

网络操作系统

使网络上各计算机能够方便、有效地共享网络资源并为网络用户提供所需的各种服务的软件与协议的集合。

分布式操作系统

简单来说就是有一堆计算机,各自物理硬件上是独立的,通过网络相连,互相通信,通过统一的“中间件”进行协调,共享资源,协同分工完成一件任务的计算机集群。

描述符表

  • Linux中一切都被抽象成文件,设备也是文件,socket、惯导、消息队列等都是文件。

  • 每个进程都有独立的描述符表。

  • 件描述符就是一个整形变量,表示文件在描述符表中的下标。

  • 每打开一个文件,就会将这个文件的描述符表中。每个进程都有三个默认文件描述符,分别是0(标准输入),1(标准输出),2(标准错误)。

  • 文件描述符一般是调用open()函数返回,调用close()函数会收回对应的文件描述符。

20220309205905

文件表

  • 所有进程共享同一个文件表。

  • 文件表记录了文件的一些信息,比如文件位置、引用计数以及指向v-node表的指针等。

  • 所有打开的文件都有一个文件位置,表示下一次读或写的起始位置。 seek, read, write 函数都可以修改该文件位置。

  • 所有进程共享同一个文件表。文件表中的一个表项可能会被多个描述符指向,引用计数用来表示当前有多少个描述符指向该文件表表项。当调用 close() 函数时,系统会将描述符对应的文件表表项的引用计数减1,然后如果引用计数已经为0,则系统会删除此文件表表项。

20220309211335

v-node表

  • 所有进程共享同一个 v-node 表。

  • 一个 v-node 表的表项对应于一个文件。它记录了文件的元数据信息。包括文件权限,文件大小,文件类型等信息。

  • 当对同一个文件调用多次 open() 函数,那么会产生多个文件表表项,但是只有一个 v-node 表表项。

20220309211619

20220309212229

阻塞I/O

程序发起一次IO操作后就会一直等待,直到IO成功或者失败才能返回,期间不能做其它事情。

非阻塞I/O

程序发起一次IO后,不断地进行轮询,直到获得数据。

I/O多路复用

也是阻塞型IO,但是不同的是IO多路复用可以同时阻塞多个IO,并对多个IO进行轮询监控,直到有一个IO的数据可用。

select时间复杂度O(n),有数量限制;poll时间复杂度O(n),没有数量限制,因为是用链表实现的;epoll时间复杂度O(1),是事件驱动的而不是轮询。

epoll使用回调机制而不是轮询,就是当文件描述符就绪后主动通知。

对回调函数调用:调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。

信号驱动I/O

利用系统的信号机制,由内核告诉进程哪一个IO已经完成。

异步I/O

异步IO是指程序发起IO操作之后就去干其它事情,而不需要等待IO结果。

跟信号驱动IO优点像,但区别是信号驱动IO在内核提醒IO完成之后还要程序完成数据从内核态到用户态的拷贝,而异步IO是在数据拷贝完成之后才通知的程序。

函数指针

函数指针就是指向函数的指针。

函数指针的作用

  1. 实现多态

    • 比如c++面向对象编程里的虚函数。

    • 以及面向过程编程的多态指的是,具体执行哪个函数不是在编译时决定的,而是在函数运行时根据函数指针的值来决定的。

  2. 回调函数

    函数指针作为某个函数的参数,通过函数参数调用的函数就是回调函数。