- 博客(129)
- 收藏
- 关注

原创 船新版本-知识星球!你值得拥有!
应粉丝朋友的要求,在经过不懈努力的情况下,博主联合其他几名高级java开发工程师一起创建了一个知识星球。在这里,你可以随时问问题,获取想获取的资料,明确未来学习的路线......只有你想不到,没有我们做不到!由于该星球处于初步建设时期,相关资料并不完整,所以我们设置了一个优惠的价格。后续会相应调整价格噢!终于来啦,终于来啦!知识星球名字叫---感兴趣的uu们快来!
2024-12-21 10:46:49
235
原创 操作系统 4.4-从生磁盘到文件
操作系统中对磁盘使用的第三层抽象——文件。这一层抽象建立在使得用户可以以更直观和易于理解的方式与磁盘交互,而无需直接处理磁盘的物理细节如扇区(sector)、柱面(cylinder)和磁头(head)。在用户眼中,文件是字符序列或字符流的集合。用户通常通过文件名和路径来访问文件,而不是直接操作磁盘的物理地址。在磁盘上,文件被存储为一系列的盘块集合。这些盘块在物理上可能不是连续的,但文件系统通过来跟踪这些盘块。这种抽象隐藏了磁盘的物理细节,使得用户可以透明地读写文件。
2025-04-11 22:50:29
704
原创 操作系统 4.3-生磁盘的使用
本文深入探讨了设备驱动,尤其是磁盘管理在操作系统中的核心角色与工作机制。磁盘操作的基本过程,如磁头移动、磁盘旋转、数据传输,以及通过磁盘控制器指令实现的读写操作被详细讲解。此外,磁盘访问优化策略,如采用“盘块”而非“扇区”作为访问单位,以及磁盘调度算法,如FCFS、SSTF、电梯算法,旨在提高读写速度并减少寻道时间。通过操作系统抽象和管理,复杂的磁盘操作被简化,使应用程序能通过磁盘块号等更简便的方式访问磁盘,从而提高了效率和程序设计的便利性。
2025-04-11 22:50:19
625
原创 操作系统 4.2-键盘
中断初始化键盘作为控制台(console)的一部分,其中断通过con_init函数进行初始化,设置中断门(trap gate)以响应键盘事件。中断处理当用户敲击键盘时,产生中断信号,操作系统通过中断处理程序来响应这个中断。中断处理程序从键盘的端口(通常是0x60)读取扫描码。扫描码转换根据读取到的扫描码,调用key_table函数数组来查找对应的处理函数或映射表。扫描码对应键盘上的不同按键,如02对应数字键101对应ESC键等。字符映射对于显示字符,使用key_map。
2025-04-11 22:50:10
821
原创 操作系统 4.1-I/O与显示器
printf库函数(printf)用户程序调用标准库中的printf函数来输出格式化的文本。系统调用(write)printf函数处理完格式化字符串后,通过系统调用write将数据写入文件描述符指向的设备。字符设备接口(crw_table[])系统调用write通过字符设备接口数组找到对应的设备处理函数。tty设备写(tty_write)对于终端设备,tty_write函数负责将数据写入write_q队列。write_q队列write_q队列用于暂存要写入设备的数据,直到设备准备好接收数据。
2025-04-11 22:50:02
894
原创 操作系统 3.5-内存换入-请求调页
内存访问合法性检查确认触发页缺失中断的内存访问是否合法,例如检查访问的地址是否在程序的地址空间内。页面置换如果当前进程的物理内存不足以加载所需的页面,则可能需要从物理内存中移除(置换)某个页面,以便为新页面腾出空间。页面分配为缺失的页面分配物理内存(页框)。页面调入从磁盘上的交换区或文件系统中将缺失的页面内容读入到分配的物理内存中。页表更新更新页表以反映新的虚拟地址到物理地址的映射关系。内存保护确保进程只能访问其地址空间内的合法内存区域,防止进程间内存非法访问。错误处理。
2025-04-11 22:49:50
752
原创 操作系统 3.4-段页结合的实际内存管理
获取旧数据基址在copy_mem函数中,首先获取当前进程的数据段基址(,这通常是通过读取当前进程的段表(LDT)来实现的。调用复制页表函数然后调用函数,传入旧数据基址、新数据基址()和数据段的大小(data_limit),以复制页表。计算目录基址在函数中,计算源目录(from_dir)和目标目录(to_dir)的基址。这是通过将虚拟地址右移20位(即页目录的索引)并取低12位(页目录项的偏移)来实现的。计算页表项数量计算需要复制的页表项数量(size。
2025-04-11 22:49:30
619
原创 操作系统 3.3-多级页表和快表
这张幻灯片讨论了操作系统中内存管理的一个核心问题:页大小与页表大小之间的权衡。是内存管理中的一个基本概念,指的是将虚拟内存分割成固定大小的块,以便于管理和访问。页的大小直接影响内存空间的利用率和页表的大小。:可以更精细地管理内存,减少内存浪费(例如,当一个进程只需要使用一小部分内存时,不需要分配一大块内存)。因为每个页都需要在页表中有一个条目。页表的大小直接影响内存管理和查找的效率总结来说,为了提高内存空间利用率,从而影响内存管理和查找的效率。操作系统设计者需要在这两者之间找到一个平衡点。
2025-04-11 22:49:21
799
原创 操作系统 3.1-内存使用和分段
创建进程和PCB为了执行程序,操作系统需要创建一个进程,并为该进程创建一个进程控制块(PCB)。PCB中存储了进程的状态信息,包括程序的基地址。在内存中找到空闲区域操作系统在内存中寻找一个足够大的空闲区域来加载程序。找到的空闲区域的起始地址被设置为程序的基地址。加载程序程序被加载到内存中找到的空闲区域。程序中的逻辑地址需要根据基地址进行调整,以确保程序可以正确执行。执行程序程序开始执行,每次执行指令时,都需要进行地址翻译,将逻辑地址转换为物理地址。地址翻译涉及到基地址和偏移量的计算。
2025-04-11 22:49:13
1026
原创 前端-Vue2使用脚手架
Vue CLI 的全称是 Vue Command Line Interface,即 Vue 命令行界面。它是一个强大的工具,用于帮助开发者快速搭建、配置和管理 Vue.js 项目。项目创建:Vue CLI 提供了一个图形化界面和命令行工具,可以快速创建新的 Vue.js 项目,并且可以选择不同的配置和功能预设。项目配置:允许开发者自定义项目的构建配置,例如配置 Babel、PostCSS、Webpack 等工具,以及添加额外的插件和功能。插件生态系统:Vue CLI 拥有一个丰富的插件生态系统,开发者可以通
2025-04-11 19:52:21
1060
原创 前端-Vue3
setup是Vue3中一个新的配置项,值是一个函数,它是“表演的舞台,组件中所用到的:数据、方法、计算属性、监视......等等,均配置在setup中。setup函数返回的对象中的内容,可直接在模板中使用。setup中访问this是undefined。所以不能用thissetup函数会在之前调用,它是“领先”所有钩子执行的。<template><h2>姓名:{{name}}</h2><h2>年龄:{{age}}</h2>
2025-04-11 19:52:14
796
原创 前端-Vue2组件化编程
一、定义组件(创建组件)二、注册组件三、使用组件(写组件标签)一、如何定义一个组件?使用创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别;1.el不要写,为什么?——— 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个2.data必须写成函数,为什么?———— 避免组件被复用时,数据存在引用关系。备注:使用template可以配置组件结构。二、如何注册组件?1.局部注册:靠new Vue的时候传入components选项。
2025-04-10 22:15:38
1097
原创 操作系统 4.5-文件使用磁盘的实现
这段代码实现了文件系统中磁盘块的分配和映射机制。通过和_bmap函数,系统可以根据文件的inode和块号动态分配和映射磁盘块。这种机制支持文件的动态增长和高效的磁盘空间管理。通过间接块表(如一重间接和二重间接块表),文件系统还可以支持非常大的文件,即使单个文件的数据量超过了直接块表所能表示的范围。这段代码展示了如何使用m_inode结构体来表示设备文件的inode,并演示了如何通过sys_open函数打开设备文件。
2025-04-05 10:01:17
905
原创 虚拟机第十三章-垃圾回收
也称作“存储渗漏”。严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。但实际情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周期变得很长甚至导致OOM,也可以叫做宽泛意义上的“内存泄漏”。尽管内存泄漏并不会立刻引起程序崩溃,但是一旦发生内存泄漏,程序中的可用内存就会被逐步蚕食,直至耗尽所有内存,最终出现OutOfMemory异常,导致程序崩溃。注意,这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。
2025-04-05 10:00:01
886
原创 虚拟机第十二章-执行引擎
解释器:当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。对应橙色之后绿色的部分JIT(Just In Time Compiler)编译器:就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言。对应橙色之后蓝色的部分。这个速度更加快。效率更高。
2025-03-30 09:32:15
884
原创 虚拟机第十章-对象的实例化、内存布局与访问定位
首先,虚拟机需要检查对象对应的类是否已经被加载、链接和初始化。如果没有,虚拟机需要先进行类的加载和初始化。:如果内存是规整的,即内存中没有碎片,可以使用指针碰撞(Bump-the-Pointer)技术来分配内存。:如果内存不规整,即内存中存在碎片,虚拟机需要维护一个列表来记录哪些内存块是空闲的,然后从这个列表中分配内存。:为了保证内存分配的原子性,虚拟机会采用CAS配上失败重试的机制。CAS是一种原子操作,用于在多线程环境中安全地更新变量。
2025-03-30 09:32:07
979
原创 虚拟机第九章-方法区
假设有一个Java类Person,在程序中创建一个Person对象:Person类的结构信息(如字段、方法等)存储在方法区。创建的Person对象的实例数据存储在堆中。变量person是一个引用,存储在栈中,指向堆中Person对象的实例数据。通过这种方式,栈、堆、方法区在Java程序中协同工作,确保程序的正常运行。
2025-03-28 18:35:17
1851
原创 虚拟机第八章-堆
现代垃圾收集器大部分都基于分代收集理论设计,堆空间细分为:Java 7及之前堆内存逻辑上分为三部分:新生区+养老区+永久区Young Generation Space 新生区 Young/NewTenure generation space 养老区 Old/TenurePermanent Space 永久区 PermJava 8及之后堆内存逻辑上分为三部分:新生区+养老区+元空间Young Generation Space 新生区 Young/New。
2025-03-28 18:34:20
691
原创 虚拟机第六章-本地方法接口
简单地讲,一个Native Method就是。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。在定义一个native method时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的。本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序。
2025-03-26 16:03:02
217
原创 虚拟机第三章-运行时数据区概述及线程
前面三章我们介绍了类加载器子系统,接下来我们介绍运行时数据区。内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,一个虚拟机对应一个运行时数据区其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。
2025-03-26 16:02:50
668
原创 操作系统 3.2-内存分区与分页
在操作系统中,内存管理是一个非常重要的功能。当需要为程序分配内存时,。内存被预先划分为固定大小的分区。每个分区大小相同,适用于需求已知且固定的程序。这种方法简单,但可能导致内存利用率低,因为分区可能不适合所有程序的大小。内存被划分为大小可变的分区。可以根据程序的大小动态分配内存。这种方法更灵活,但需要更复杂的管理机制来跟踪空闲和已分配的内存区域。
2025-03-24 22:27:01
858
原创 操作系统 2.12-死锁处理
安全状态:如果系统能够找到一个进程执行序列P1, P2, ..., Pn,使得每个进程Pi在执行时,其需要的资源都能得到满足,那么系统处于安全状态。安全序列:上述的进程执行序列P1, P2, ..., Pn就是安全序列。银行家算法的核心思想是维护一个工作向量(Work),表示当前系统中可用的资源数量。算法开始时,工作向量等于系统中所有资源的总量。然后,算法尝试为每个进程分配资源,直到所有进程都能完成。
2025-03-24 22:26:38
893
原创 虚拟机第二章-类加载子系统
从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生。
2025-03-23 21:56:30
1139
原创 虚拟机第一章-JVM与JAVA体系
所谓虚拟机(Virtual Machine),就是一台虚拟的计算机,它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为大名鼎鼎的Visual Box,,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。程序虚拟机的典型代表就是,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。
2025-03-23 21:55:58
438
原创 操作系统 2.11-信号量代码的实现
int value;name:信号量的名称。value:信号量的值。queue:等待该信号量的任务队列。首先,定义一个信号量结构体,用于存储信号量的值和等待该信号量的进程队列。int value;Linux 0.11内核通过一组特定的函数和数据结构实现了信号量机制,用于控制对共享资源的访问和管理等待这些资源的进程队列。这种方法在多处理器系统中特别有用,因为它可以确保在多个CPU或核心上对共享资源的互斥访问。然而,它也需要硬件支持,并且在某些情况下可能会影响系统性能。
2025-03-11 20:45:36
731
原创 java打包并部署到云服务器
可以通过parent父模块模块对所有模块进行打包,使用生命周期package指令。打包成功的界面如果你想安装到maven仓库中可以使用install指令。打包前注意检查子模块中,如果是spring-boot项目,是否正确,配置示。
2025-03-11 20:45:09
1060
原创 操作系统 2.10-信号量临界区保护
定义:临界区是指一次只允许一个进程进入的该进程的那一段代码。在这段代码中,多个进程不能同时执行,以避免数据不一致或竞争条件。识别临界区:一个非常重要的工作是找出进程中的临界区代码。例如,在生产者-消费者问题中,读写信号量的代码一定是临界区。用临界区保护信号量用信号量实现同步!
2025-03-07 20:06:55
743
原创 操作系统 2.9-进程同步和信号量
这个生产者-消费者实例展示了如何在多进程环境中共享数据,并确保数据的正确同步。通过使用循环缓冲区和计数器,生产者和消费者可以有效地协作,同时避免了缓冲区溢出和空读的问题。这个时候的计数器就是信号。信号量是由荷兰学者Dijkstra在1965年提出的一种特殊整型变量,用来记录系统中某种资源的数量,以及控制对这种资源的访问。信号量主要用于进程间的同步和互斥,它可以解决生产者-消费者问题、读者-写者问题等典型的并发问题。P操作(Proberen,测试)也称为wait操作,用于请求资源。
2025-03-07 20:05:56
555
原创 操作系统 2.8-一个实际的schedule函数
保证响应时间counter机制确保了系统的响应时间是有界的。这是通过动态调整counter值来实现的,其中表示在每个时间单位tcounter值会减半然后加上一个优先级常数p。最大的counter小于2pIO操作后counter增大当进程完成IO操作后,其counter值会变大。这是因为IO操作通常与前台进程相关,这些进程需要更快的响应时间。counter值的增大确保了这些进程在再次变为就绪状态时能够获得更高的优先级。前台和后台进程的调度前台进程(通常是与用户交互的进程)在完成IO操作后会获得更高的。
2025-03-07 20:05:11
1005
原创 操作系统 2.7-CPU调度策略
任务信息图中列出了五个任务(P1到P5)。每个任务都有一个到达时间和所需的CPU时间。任务调度任务按照到达时间排序,并依次执行。P1在时间0到达,需要10ms的CPU时间。P2在时间10到达,需要29ms的CPU时间。P3在时间13到达,需要3ms的CPU时间。P4在时间39到达,需要7ms的CPU时间。P5在时间42到达,需要12ms的CPU时间。Gantt图上方的Gantt图显示了任务的执行顺序和时间线。下方的Gantt图考虑了任务的到达时间,显示了任务的实际开始执行时间。
2025-03-07 20:04:35
607
原创 操作系统 2.5-内核级线程实现代码
申请内存空间:为新进程的PCB分配一页内存。创建TCB:初始化进程控制块(PCB),包括设置进程状态、优先级等信息。创建内核栈和用户栈:为新进程创建内核栈和用户栈,内核栈用于内核模式下的执行,用户栈用于用户模式下的执行。关联栈和TCB:将创建的栈与新进程的PCB关联起来,确保在任务切换时能够正确地恢复进程的执行上下文。通过这些步骤,操作系统为新进程准备好了执行所需的基础设施,使得新进程能够被调度并开始执行。
2025-03-07 20:02:08
963
原创 操作系统 2.4-内核级线程基本实现原理
核心级线程与用户级线程的主要区别在于它们所在的执行环境和资源管理层面。用户级线程运行在用户态,每个线程有自己的栈和TCB,在切换时。
2025-03-07 20:01:18
982
原创 操作系统 2.3-用户级线程
通过函数,操作系统可以在用户态下创建新的线程,每个线程有自己的TCB和栈。这种用户级线程的实现方式不需要内核支持,可以提高程序的并发性和响应性。
2025-03-07 19:59:56
1017
原创 操作系统 2.2-多进程总体实现
通过让程序执行起来来使用CPU。通过启动多个程序,交替执行来充分利用CPU。操作系统需要记录这些进程,并按照合理的次序推进它们(分配资源、进行调度)。这就是多进程图像的概念。一个CPU(灯泡图标)负责调度多个进程(PID:1, PID:2, PID:3)。每个进程有一个进程控制块(PCB),图中展示了PCB1,其中包含了进程的状态信息,例如“算出ax=1,启动磁盘写,正在等待完成...”。
2025-03-07 19:54:55
688
原创 操作系统 2.1-cpu管理的初步了解
在并发执行中,CPU需要在多个进程之间切换。切换时,不仅要修改程序计数器(PC),还需要保存和恢复进程的上下文(如寄存器的值)。这种切换机制是操作系统管理CPU的核心功能之一。进程的概念当程序开始执行时,它就变成了一个“进程”。进程是运行中的程序,与静态的程序不同,它需要记录当前的执行状态(如寄存器的值、程序计数器的值等)。这些状态信息存储在进程控制块(PCB)中。进程的概念用于描述运行中的程序,并支持并发执行。
2025-03-07 19:52:34
945
原创 操作系统 1.6-操作系统历史
操作系统的历史是一部不断进化的过程。从最初的简单批处理系统到如今的多任务、多进程、高度并发、虚拟化和分布式计算支持的现代操作系统,背后的核心思想始终围绕着“如何高效管理和调度计算资源”这一主题。尽管操作系统的技术和复杂度不断提升,但它们的基本设计理念——多任务处理、进程调度和资源管理——始终没有改变,甚至成了现代操作系统的基石。通过了解操作系统的历史,我们不仅能够更好地理解操作系统的设计思路,还能为今后操作系统的创新和优化提供灵感。
2025-03-07 19:38:10
922
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人