操作系统总结
目录
基础
入门
操作系统的各个核心组件(此外还包括设备管理)
进程、线程
在系统设计领域中,用户态与内核态的理解与区分是一个重要课题。用户态作为一种简洁高效的运行时机制,在资源管理和服务分配方面发挥着关键作用;而内核态则展现出更高的复杂性,在内存管理、进程调度以及虚拟化支持等方面承担着更为重要的职责。了解了这两种状态的区别后,在实际开发中能够更好地选择适合自身需求的运行时机制。
Linux内核同步(内含死锁)
线程间通信是指不同线程之间的数据传递与协调过程:当涉及同一进程中各线程之间的通信时,则主要采用全局变量配合使用同步与互斥机制实现;而当需要实现不同进程之间线程的通信时,则需要通过进程间通信机制进行处理
mmap映射区与shm共享内存的区别概述
分布式事务支持机制(Durable Transaction Support, DTS)是由以下博客提供的重要参考资料:博客1、[博客2](https://blog.csn...等等
msgrcv中的msgtype可以实现一种简单的接收优先级。
如果msgtype的值为0,就获取队列中的第一个可用消息。
如果它的值大于零,将获取具有相同消息类型的第一个信息。
如果它小于零,就获取类型等于或小于msgtype的绝对值的第一个消息。
该系统能够识别潜在的死锁风险并采取相应的措施。该系统能够规避已知的死锁模式并实施有效的防范策略。
{进程调度方案}:请访问以下链接获取详细信息:
别忽略一个细节:多级反馈队列算法中,最后一层采用时间片轮转算法,上面的其它层都使用先来先服务算法。

请具体说明进程下的环境状态设置要求,请问中断下的环境状态又是如何设置的?
在多线程编程环境中,在不同线程之间可以共享哪些资源?
守护进程:由博主博客1撰写的一篇文章深入探讨了守护进程的相关技术细节。守护进程:另一篇深入探讨的文章《深入理解守护进程》发布于博主博客的个人网站上。
一个会话包括多个进程组,一个进程组包括多个进程。
SID即会话id,PGID即进程组id,PID即进程id
每个进程都会有两个堆栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。
线程栈通常是通过mmap函数进行创建和初始化操作;据一些资料指出其通常会被分配到堆内存中。
缓冲区、零拷贝
中断
同步、异步
在并行模式下实现同步时,默认采用程序顺序执行策略;而在并行模式下实现异步时,默认由系统事件驱动来完成任务。例如,在Reactor模式下,默认情况下主线程是异步运行的;而工作线程默认为同步执行状态,则形成了典型的半同步/半异步工作模式。
网络编程中的阻塞IO操作会通过内核通知我们何时可以发起一个I/O操作(需要自行发起相应的IO操作请求)。而网络编程中的非阻塞IO模型则会在I/O操作完成之后才会向相关应用程序返回结果信息。
多进程、多线程
C++网络编程课程(四):基于多线程的服务器开发
C++网络编程(六):支持多线程并行服务的服务器系统
在线程层面实现高效同步机制的关键点在于参考优秀的开源方案,在线程层面实现高效同步机制的关键点在于参考优秀的开源方案
互斥锁的类型:普通锁、检错锁、递归锁(也叫嵌套锁)。
条件变量的优点:
相较于mutex而言,条件变量可以减少竞争。如果仅仅用mutex,那么,不管共享资源里有没数据,生产者及所有消费者都全一窝蜂的去抢锁,会造成资源的浪费。
如果直接使用mutex,除了生产者、消费者之间要竞争互斥量以外,消费者之间也需要竞争互斥量,但如果汇聚(链表)中没有数据,消费者之间竞争互斥锁是无意义的。
有了条件变量机制以后,只有生产者完成生产,才会引起消费者之间的竞争。提高了程序效率。
条件变量可以解决生产者消费者问题:
生产者-消费者问题,也称有限缓冲问题,是一个多进程/线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个进程/线程——即所谓的“生产者”和“消费者”,在实际运行时会发生的问题。
生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
要解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。
同样,也可以让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。
虚假唤醒:
可能原因1、操作系统抽风了,导致pthread_cond_wait()在不满足条件时,它也会返回,这就导致了虚假唤醒
可能原因2、你(消费线程)收到了其他线程(生产)传来的唤醒信号,但是你唤醒后发现别的消费线程处理的比你快,此时没有数据被可以用于操作,这种情况的发生是预期之外的,称之为虚假唤醒。
避免虚假唤醒:
使用while循环判断解决:
while (!(xxx条件) )
{
//虚假唤醒发生,由于while循环,再次检查条件是否满足,
//否则继续等待,解决虚假唤醒
pthread_cond_wait(&cond,&mutex);
}
可视化展示线程池工作原理及其C++开发实践
本节将阐述线程池的基本概念及其运行机制。通过深入探讨其核心逻辑与工作模式, 本文旨在为读者提供全面的理解。同时, 本节将详细阐述线程池在多任务处理中的实际应用, 并深入探讨其性能优化策略与设计原则。此外, 为了满足实际开发需求, 本文还将详细阐述基于C语言的具体实现方案, 包括资源管理、并发控制以及性能监控等方面的技术细节。
Boost's thread pool is comprehensively covered in several resources, including detailed documentation across two versions of the Boost.Asio library: 1.69.0 and 1.74.0
协程
内存管理
Linux 内存地址空间:博客
32位系统中有4G地址空间,其中低位3G为用户空间,高位的1G为内核空间。
排查潜在的内存泄漏问题:Linux系统中Valgrind的安装及应用
该文旨在探讨Linux虚拟内存系统的性能优化及其在现代计算机体系结构中的应用前景,并对其中的三种页面置换算法进行了深入分析
研究内容聚焦于虚拟内存系统的性能瓶颈及其优化策略,并结合实际案例分析了不同算法在资源管理方面的差异
具体而言文章将深入解析虚拟内存的基本原理以及其与进程管理之间的交互机制
同时对FCB分页、 aging算法以及LRU算法等三种具有代表性的页面置换策略进行了详细阐述并对比分析了它们的优缺点
通过理论推导和实验验证本文旨在为系统设计师提供参考以提升整体系统的运行效率
页框也叫块(物理块)
常驻内存: resident set size 表示进程占用的实际物理内存空间。值得注意的是,在计算时通常会排除共享内 存以及swap分区。常驻内存值往往会转换为相对于系统总可用内存量的比例数值。
设备管理
文件系统
扇区区域与磁盘块空间之间的关系涉及到存储管理机制中的关键组成部分
其中磁盘的块大小(Block Size)和扇区大小(Sector Size)是两个重要的磁盘参数
以下内容重要:
扇区:磁盘的最小存储单位;
块(磁盘块):文件系统读写数据的最小单位;
页:内存的最小存储单位;
扇区是硬件设备传输数据的最小单位,而块是操作系统传输数据的最小单位。
一个扇区占512字节,1个块是由连续的8个扇区组成,占4KB。
inode:
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。
这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
Linux 通过 inode 节点表将文件的逻辑结构和物理结构进行转换。
inode 节点是一个 64 字节长的表,表中包含了文件的相关信息,其中有文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息。
在 inode 节点表中最重要的内容是磁盘地址表。在磁盘地址表中有 13 个块号,文件将以块号在磁盘地址表中出现的顺序依次读取相应的块。
Linux 文件系统通过把 inode 节点和文件名进行连接,当需要读取该文件时,文件系统在当前目录表中查找该文件名对应的项,由此得到该文件相对应的 inode 节点号,通过该 inode 节点的磁盘地址表把分散存放的文件物理块连接成文件的逻辑结构。
在Linux系统中,文件引用机制通常采用的方式之一即为硬链接与软链接的结合应用。具体而言,在Linux系统中对特定文件进行引用时,默认状态下可选择建立两种不同的引用关系:一种为硬链接(hard link),另一种为软链接(soft link)。它们均属于同一类引用机制,并主要区别体现在其持久性和安全性等关键特性上。通过修改目标文件名属性即可实现硬链接功能,在这种情况下若目标文件被重命名为其他名称,则原有引用依然有效并指向新的名称位置;而当目标文件发生重命名操作时,则原有的所有引用都将随之失去原有的关联性。相较于硬链结而言, 其优点突出; 而软链结的主要优点则体现在安全性方面, 即删除原数据后仍可保留相应目录信息, 这种特性使得软链结在数据保护需求较强的场景中具有显著优势. 综上所述可知, 硬链结与软链结各有特点, 在实际应用中需根据具体需求做出合理选择.
