
操作系统
文章平均质量分 94
OS
璨sou
哀莫大于心死
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
构造复杂的程序:将一个递归函数转成非递归函数的通用方法
这篇面试题探讨了在不支持递归的程序语言中如何实现递归程序,并通过分析for循环、条件控制程序和函数的底层实现,展示了如何将高级语言结构转换为底层指令。文章首先通过for循环的例子,解释了如何使用jump指令实现循环控制,接着讨论了if-else和switch-case的条件控制逻辑,最后深入探讨了函数的执行过程,特别是如何通过栈结构传递参数和返回值。通过这些例子,文章强调了理解底层指令和数据结构的重要性,展示了如何将复杂的高级语言功能分解为简单的底层操作,从而在不支持递归的语言中实现递归功能。原创 2025-05-16 00:34:00 · 816 阅读 · 0 评论 -
程序装载:“640K内存”真的不够用么?
文章探讨了计算机内存管理的发展历程,从比尔·盖茨在上世纪80年代提出的“640K内存足够”的预言出发,分析了当时与现在内存需求的巨大差异。文章详细介绍了程序装载的挑战,包括内存连续性和多程序同时运行的需求,并提出了虚拟内存和物理内存的概念。通过分段和分页技术,解决了内存碎片和内存交换效率低下的问题。特别是内存分页技术,通过将内存划分为固定大小的页,减少了内存碎片,并允许程序按需加载数据,从而提高了内存使用效率。文章最后指出,尽管640K内存在现代看来远远不足,但在当时的技术背景下,比尔·盖茨的观点并非完全无原创 2025-05-14 23:49:41 · 665 阅读 · 0 评论 -
虚拟内存 :一个程序最多能使用多少内存?
内存虚拟化技术是为了解决内存不足和进程间内存隔离的问题。随着程序复杂度的增加,内存需求也在膨胀,传统的Swap技术虽然能通过将不活跃的进程数据交换到磁盘来腾出内存空间,但存在碎片化和频繁切换的问题。虚拟内存技术通过将内存划分为页(Page),并利用页表(Page Table)管理虚拟地址到物理地址的映射,有效解决了这些问题。虚拟内存理论上可以无限大,实际受限于CPU的处理能力。操作系统通过页表管理虚拟内存和物理内存的映射,将高频使用的数据保留在内存中,低频使用的数据保存到磁盘上,从而优化内存使用效率。此外,原创 2025-05-11 01:51:48 · 965 阅读 · 0 评论 -
分析服务的特性:我的服务应该开多少个进程、多少个线程?
在设计服务时,合理分配资源(如容器数量、CPU、线程和进程)是关键。资源过多会导致浪费,过少则可能引发服务崩溃。服务类型分为计算密集型和I/O密集型,前者依赖CPU进行大量计算,后者则频繁进行设备读写。通过分析服务特性、目标并发量、吞吐量和用户可接受的延迟,可以优化资源分配。使用系统监控工具(如top、iotop、tsar等)可以帮助评估CPU、I/O、网络和磁盘的使用情况,从而决定合适的进程和线程数量。理论上,线程或进程数量应与CPU核数匹配,但实际应用中还需考虑I/O等待时间,以确保CPU的高效利用。原创 2025-05-09 23:27:52 · 577 阅读 · 0 评论 -
进程间通信: 进程间通信都有哪些方法?
进程间通信(IPC)是复杂系统架构的基石,涉及多种方法。单机模型下的IPC包括管道、内存共享和消息队列。管道设计非侵入,易于使用,适合组织复杂计算;内存共享性能高但编程复杂;消息队列则便于消息的收发和处理。分布式模型下的IPC涉及远程调用(RPC)、消息队列和网络请求。RPC通过封装远程服务请求实现本地调用,但可能增加系统耦合;消息队列则提供了一种低耦合、灵活的通信方式,适用于事件驱动架构和大数据传输。每种方法有其适用场景和优缺点,选择合适的IPC方法是设计高效、稳定系统的关键。原创 2025-05-09 23:25:49 · 681 阅读 · 0 评论 -
线程的调度:线程调度都有哪些方法?
线程调度是操作系统决定执行哪些线程的过程,主要考察候选人对知识的系统化理解和分类能力。常见的调度方法包括先到先服务(FCFS)和短作业优先(SJF)。FCFS通过队列实现公平性和高吞吐量,但可能导致长作业阻塞短作业。SJF则优先处理短作业,降低平均等待时间,但无法处理紧急任务和长作业的插队问题。为解决这些问题,引入了优先级队列和抢占机制。优先级队列通过堆结构实现高优先级任务优先执行,而抢占机制则通过时间片段分配确保任务轮流执行。多级队列模型进一步优化调度,通过不同优先级的队列和时间片段分配,实现紧急任务优先原创 2025-05-09 23:11:02 · 666 阅读 · 0 评论 -
乐观锁、区块链:除了上锁还有哪些并发控制方法?
文章探讨了并发控制方法,特别是锁以外的策略。首先提到悲观锁和乐观锁的区别,悲观锁通过互斥确保数据一致性,而乐观锁允许并发操作,通过版本控制解决冲突,如Git系统。接着,文章类比了购物车的并发处理,提出了基于版本号的解决方案。进一步讨论了去中心化方案,如区块链技术,通过分布式账本解决并发和欺诈问题。最后,提出了解决高并发问题的分布式策略,如分区域处理和定期合并,以降低单个节点的压力。这些方法展示了在不同场景下处理并发问题的多样性和灵活性。原创 2025-05-09 23:09:32 · 668 阅读 · 0 评论 -
锁、信号量和分布式锁:如何控制同一时间只有 2 个线程运行?
锁是多线程编程中的核心概念,用于解决竞争条件问题。常见的锁类型包括乐观锁、悲观锁、重入锁、公平锁和分布式锁。锁的实现依赖于原子操作,如i++这种非原子操作在多线程环境下会产生竞争条件。解决竞争条件的方法包括互斥、cas指令和自旋锁等。cas指令通过比较并交换实现原子操作,而自旋锁则通过不断尝试获取锁来避免线程切换。语言级锁(如Java的synchronized)和信号量则进一步简化了锁的使用,提供了更高级的线程同步机制。理解这些锁的原理和实现方式,有助于设计高并发数据结构。原创 2025-05-09 23:07:13 · 525 阅读 · 0 评论 -
中断和中断向量:Javajs 等语言为什么可以捕获到键盘输入?
这节课我们通过探索式学习讨论了中断的设计。通过一个问题,Java/JS 如何响应键盘按键,引出了 7 个问题的思考。通过探索这些问题,我们最终找到 了答案,完成了一次从硬件、内核到应用的完整设计。我想说的是,学习不是最终目的,长远来看我更希望你在学习的过程中得到成长,通过学习技能锻炼自己解决问题的能力。那么通过这节课的学习,你现在可以来回答本节关联的面试题目:Java/Js 等语言为什么可以捕获到键盘输入?老规矩,请你先在脑海里构思下给面试官的表述,并把你的思考写在留言区,然后再来看我接下来的分析。原创 2025-05-09 23:05:15 · 876 阅读 · 0 评论 -
WinMacUnixLinux 的区别和联系:为什么 Debian 漏洞排名第一还这么多人用?
本课时我主要给你介绍了操作系统的历史。IBM 靠一次豪赌,抓住了大型机的市场,至今仍在盈利。苹果靠个人电脑起家,通过智能手机成为商业巨头。微软靠 IBM 的扶持起家,在个人电脑兴起的浪潮中抓住了机会,成为最大的 PC 操作系统厂商。最后 Google 开源 Android,成为移动端操作系统的王者。在这几十年的浪潮中,商业竞争风起云涌,但是学术界和黑客们也创造了以自由软件运动为核心的社区文化,操作系统经历了百家争鸣的时代和残酷的淘汰,大浪淘沙,剩下了 Windows 和 Unix 系。原创 2025-05-09 01:47:00 · 898 阅读 · 0 评论 -
哲学家就餐问题:什么情况下会触发饥饿和死锁?
哲学家就餐问题是一个经典的并发编程问题,描述了五个哲学家围坐在圆桌旁,每人需要两把叉子才能就餐。该问题常被用来讨论死锁和饥饿现象。死锁发生在所有哲学家同时拿起左边的叉子并等待右边的叉子时,导致循环等待,无法继续。死锁的四个基本条件是:互斥、持有等待、禁止抢占和循环等待。饥饿则是线程长期无法获取所需资源。解决死锁的方法包括引入超时机制(如tryLock),但这可能导致活锁,即哲学家反复拿起和放下叉子。为了避免这些问题,可以通过全局锁或资源排序等策略来设计并发控制算法,确保哲学家能够有序地获取资源并避免死锁和饥原创 2025-05-09 00:56:22 · 559 阅读 · 0 评论 -
进程和线程:进程的开销比线程大在了哪里?
本讲我们学习了进程和线程的基本概念。了解了操作系统如何调度进程(线程)和分时算法的基本概念,然后了解进程(线程)的 3 种基本状态。线程也被称作轻量级进程,由操作系统直接调度的,是内核级线程。我们还学习了线程切换保存、恢复状态的过程。我们发现进程和线程是操作系统为了分配资源设计的两个概念,进程承接存储资源,线程承接计算资源。而进程包含线程,这样就可以做到进程间内存隔离。这是一个非常巧妙的设计,概念清晰,思路明确,你以后做架构的时候可以多参考这样的设计。原创 2025-05-09 00:44:58 · 584 阅读 · 0 评论 -
11 高级技巧之日志分析:利用 Linux 指令分析 Web 日志
今天我们结合一个简单的实战场景——Web 日志分析与统计练习了之前学过的指令,提高熟练程度。此外,我们还一起学习了新知识——功能强大的awk文本处理语言。在实战中,我们对一个nginx的access_log进行了简单的数据分析,直观地获得了这个网站的访问情况。我们在日常的工作中会遇到各种各样的日志,除了 nginx 的日志,还有应用日志、前端日志、监控日志等等。你都可以利用今天学习的方法,去做数据分析,然后从中得出结论。原创 2025-05-06 14:06:30 · 969 阅读 · 0 评论 -
14 用户态和内核态:用户态线程和内核态线程有什么区别?
Kernel 运行在超级权限模式(Supervisor Mode)下,所以拥有很高的权限。按照权限管理的原则,多数应用程序应该运行在最小权限下。内核空间(Kernal Space),这个空间只有内核程序可以访问;用户空间(User Space),这部分内存专门给应用程序使用。这节课我们学习了用户态和内核态,然后我们简单学习了进程和线程的基础知识。这部分知识会在“模块四:进程和线程”中以更细粒度进行详细讲解。等你完成模块四的学习后,可以再返回来看这一节的内容,相信会有更深入的理解。原创 2025-05-06 13:54:59 · 1128 阅读 · 0 评论 -
13 操作系统内核:Linux 内核和 Windows 内核有什么区别?
说到操作系统,就必须说内核。内核是操作系统中应用连接硬件设备的桥梁。这一讲我们学习了内核的基础知识,包括内核的作用、整体架构以及 3 种内核类型(宏内核、微内核和混合类型内核)。内核很小(微内核)方便移植,因为体积小、安装快;内核大(宏内核),方便优化性能,毕竟内核更了解计算机中的资源。我们还学习了操作系统对执行文件的抽象,但是没有很深入讨论,内核部分有很多知识是需要在后面的几个模块中体现的,比如进程、文件、内存相关的能力等。原创 2025-05-06 13:53:40 · 1084 阅读 · 0 评论 -
如何为秒杀系统设计缓存体系?
互联网电商为了吸引人气,经常会对一些商品进行低价秒杀售卖活动。比如几年前小米的不定期新品发售,又如当前每年定期举行双11、双12中的特价商品售卖。秒杀售卖时,大量消费者蜂拥而至,给电商带来了极大的人气,也给电商背后的服务系统带来了超高的并发访问负荷。在不同电商、不同的秒杀活动,秒杀系统售卖的商品、销售策略大不相同,但秒杀背后的秒杀系统却有很大的相似性,基本都有以下这些共同特点。首先,秒杀业务简单,每个秒杀活动售卖的商品是事先定义好的,这些商品有明确的类型和数量,卖完即止。其次,秒杀活动定时上架,而且会提供一原创 2025-05-05 10:54:44 · 609 阅读 · 0 评论 -
存储器分级:L1 Cache 比内存和 SSD 快多少倍?
这节课我们讲到了存储器分级策略,讨论了 L1/L2/L3 缓存的工作原理。本课时学习的内容,是所有缓存知识的源头。所有缓存系统的设计,都是存储资源的分级。我们在设计缓存的时候,除了要关心整体架构外,还需要注意细节,比如: 条目怎么设计?算法怎么设计?命中率怎么统计?缓存怎么置换等?现在我们来说一下课前提出的问题:SSD、内存和 L1 Cache 相比速度差多少倍?【解析】因为内存比 SSD 快 10~ 1000 倍,L1 Cache 比内存快 100 倍左右。原创 2025-04-20 00:13:33 · 717 阅读 · 0 评论