随笔分类 - 课程
摘要:在多线程编程中,我们为了防止多线程竞争共享资源而导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。 那么,当两个线程为了保护两个不同的共享资源而使用了两个互斥锁,那么这两个互斥锁应用不当的时候,可能会造成两个线程都在等
        阅读全文
                
摘要:一、哲学家就餐问题 先来看看哲学家就餐的问题描述: 5 个老大哥哲学家,闲着没事做,围绕着一张圆桌吃面; 巧就巧在,这个桌子只有 5 支叉子,每两个哲学家之间放一支叉子; 哲学家围在一起先思考,思考中途饿了就会想进餐; 奇葩的是,这些哲学家要两支叉子才愿意吃面,也就是需要拿到左右两边的叉子才进餐; 
        阅读全文
                
摘要:在进程/线程并发执行的过程中,进程/线程之间存在协作的关系,例如有互斥、同步的关系。 为了实现进程/线程间正确的协作,操作系统必须提供实现进程协作的措施和方法,主要的方法有两种: 锁:加锁、解锁操作; 信号量:P、V 操作; 这两个都可以方便地实现进程/线程互斥,而信号量比锁的功能更强一些,它还可以
        阅读全文
                
摘要:一、概念 观察者模式(Observer Pattern)又称为发布/订阅(Publish/Subscribe)模式,在对象之间定义了一对多的依赖关系,当一个对象改变状态,依赖它的对象会收到通知并自动更新. 观察者模式无外乎2个操作,观察者订阅自己关心的主题(Subject)和主题有数据变化后通知观察
        阅读全文
                
摘要:在单核 CPU 系统里,为了实现多个程序同时运行的假象,操作系统通常以时间片调度的方式,让每个进程执行每次执行一个时间片,时间片用完了,就切换下一个进程运行,由于这个时间片的时间很短,于是就造成了「并发」的现象。 另外,操作系统也为每个进程创建巨大、私有的虚拟内存的假象,这种地址空间的抽象让每个程序
        阅读全文
                
摘要:直接开讲! 每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。 Linux 内核提供了不少进程间通信的机制,我们来一起瞧瞧有哪些? 一、管道 如果你学过 Linux 命令,那你肯定很熟悉「|」这个竖线。 $ ps auxf | 
        阅读全文
                
摘要:一、概念 模板模式(Template Pattern)也叫模板方法模式,指在抽象类中将业务逻辑划分为多个方法,通过模板方法中调用这些方法后,组成完整的业务处理流程。子类只需重写相关方法实现,即可实现同一流程的不同处理方式 核心思想:定义一个抽象模板类,提供子类实现。 模式动机:许多业务有着相同的执行
        阅读全文
                
摘要:进程都希望自己能够占用 CPU 进行工作,那么这涉及到前面说过的进程上下文切换。 一旦操作系统把进程切换到运行状态,也就意味着该进程占用着 CPU 在执行,但是当操作系统把进程切换到其他状态时,那就不能在 CPU 中执行了,于是操作系统会选择下一个要运行的进程。 选择一个进程运行这一功能是在操作系统
        阅读全文
                
摘要:一、题目 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。 二、思路 考虑从顶至底递归,判断每对节点是否对称,从而判断树是否为对称二叉树。 三、代码 class Solution: def isSymmetric(self, root: TreeNode
        阅读全文
                
摘要:一、概念 享元模式(Flyweight Pattern)是 "资源池技术"实现方式,主要用于减少创建对象的数量,以减少内存占用和提高性能。 模式动机:在创建大量对象时,有可能会造成内存溢出,享元模式把其中共同的部分抽象出来,保存在内存中,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建
        阅读全文
                
摘要:在 TCP/IP 网络通信时,为了保证能正常通信,每个设备都需要配置正确的 IP 地址,否则无法实现正常的通信。 IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。 而人类为了方便记忆采用了点分十进制的标记方式,也就是将 32 位 IP 地址以每 8 位
        阅读全文
                
摘要:在早期的操作系统中都是以进程作为独立运行的基本单位,直到后面,计算机科学家们又提出了更小的能独立运行的基本单位,也就是线程。 一、为什么使用线程? 我们举个例子,假设你要编写一个视频播放器软件,那么该软件功能的核心模块有三个: 从视频文件当中读取数据; 对读取的数据进行解压缩; 把解压缩后的视频数据
        阅读全文
                
摘要:一、概念 组合模式(Composite Pattern)也称之为整体-部分(Part-Whole)模式。核心是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,组合成树形结构,使得单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性。 它将对象以树形结构表示,最顶层的节
        阅读全文
                
摘要:IP 在 TCP/IP 参考模型中处于第三层,也就是网络层。 网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(end to end)通信。 1.网络层与数据链路层有什么关系呢? 有的小伙伴分不清 IP(网络层) 和 MAC (数据链路层)之间的区别和关系。 其实很容易区分,在上面我们知道 
        阅读全文
                
摘要:我们编写的代码只是一个存储在硬盘的静态文件,通过编译后就会生成二进制可执行文件,当我们运行这个可执行文件后,它会被装载到内存中,接着 CPU 会执行程序中的每一条指令,那么这个运行中的程序,就被称为「进程」(Process)。 现在我们考虑有一个会读取硬盘文件数据的程序被执行了,那么当运行到读取文件
        阅读全文
                
摘要:一、题目 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 二、思路 根据二叉树镜像的定义,考虑递归遍历(dfs)二叉树,交换每个节点的左 / 右子节点,即可生成二叉树的镜像。 三、代码 class Solution: def mirrorTree(self, root: TreeNode) -
        阅读全文
                
摘要:1.为什么要有拥塞控制呀,不是有流量控制了吗? 前面的流量控制是避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么。 一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。 在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢
        阅读全文
                
摘要:本篇跟大家说说内存管理,内存管理还是比较重要的一个环节,理解了它,至少对整个操作系统的工作会有一个初步的轮廓,这也难怪面试的时候常问内存管理。 干就完事,本文的提纲: 一、虚拟内存 如果你是电子相关专业的,肯定在大学里捣鼓过单片机。 单片机是没有操作系统的,所以每次写完代码,都需要借助工具把程序烧录
        阅读全文
                
摘要:什么是内核呢? 计算机是由各种外部硬件设备组成的,比如内存、cpu、硬盘等,如果每个应用都要和这些硬件设备对接通信协议,那这样太累了,所以这个中间人就由内核来负责,让内核作为应用连接硬件设备的桥梁,应用程序只需关心与内核交互,不用关心硬件的细节。 内核有哪些能力呢? 现代操作系统,内核一般会提供 4
        阅读全文
                
摘要:前面我们也提到了,中断请求的处理程序应该要短且快,这样才能减少对正常进程运行调度地影响,而且中断处理程序可能会暂时关闭中断,这时如果中断处理程序执行时间过长,可能在还未执行完中断处理程序前,会丢失当前其他设备的中断请求。 那 Linux 系统为了解决中断处理程序执行过长和中断丢失的问题,将中断过程分
        阅读全文
                

 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号