操作系统-1

在复试时,很少问及计算题,大多数都是的问题都是和概念直接相关,所以要深刻理解操作系统各个组成部分的概念。 本篇主要归纳操作系统的基本概念以及进程相关概念和算法 操作系统基本概念 首先需要知道操作系统在整个计算机系统中的定位: ​ 计算机系统大致可以分为四个部分(自底向上):计算机硬件 -> 操作系统 -> 应用程序软件 -> 用户。 从上述结构可以轻易看到,操作系统管理着计算机的各个硬件,具体表现为对资源的合理调度,分配等,同时也为上层应用程序软件提供抽象出来的硬件功能。 综上所述,操作系统可以定义为控制和管理整个计算机的硬件和软件资源,并合理地组织,分配资源、调度工作,进而为用户和其它软件提供方便接口与环境的程序集合。 提炼一下,操作系统就是一系列程序的集合,不过这些程序有着上述管理功能。 特征(四大特征) 并发 => 注意并发和并行的区别。 共享 (两种共享方式,也对应着后续会提到的资源共享形式) 互斥共享 同时访问 虚拟 => 用逻辑的对应物去映射实际的物理设备,让用户在使用时感觉是在真正使用物理设备。 经典例子: 请求分页系统,SPOOLing技术 异步 => 进程以不可预知的速度向前执行(进程的异步性) 异步也是操作系统中需要进程控制的原因之一,因为要保证怎么个异步法,各个进程的最终结果都一样。 其中,**并发和共享是其它特性的基础,**它们两也相互依存。 管理的计算机资源(包括硬件和软件)分类 处理机管理 => 进程的调度与分配 存储器管理 => 内存管理 文件管理 => 文件的存储形式:逻辑存储和物理存储 I/O设备管理 => 外存相关概念以及相关管理 运行环境 CPU的状态分为两类:用户态(目态)和核心态(管态) 用户的程序运行在目态,而操作系统的内核运行在管态。有一些特殊的特权指令,只有在CPU处于管态时才能调用。 特权指令 -> 操作系统不允许用户直接调用的指令,比如I/O指令,置中断指令等等。 如果说用户程序必须使用特权指令的功能,则需要通过中断或异常操作来达到目的,即发生中断或异常时,CPU状态会从用户态转向核心态。 中断和异常 操作系统的发展过程大体上就是一个想法设法不断提高资源利用率的过程,而提高资源利用率就需要在程序并未使用某种资源时,把它对那种资源释放,而这一行为就需要通过中断来实现。 中断(外中断):CPU执行指令以外的事情发生而引起的中断,即外中断不是由指令本身引起的(比如访问数组越界等),而是外界因素导致的(比如I/O中断,时间片中断),它和当前处理机正在运行的程序有关。 异常(内中断,陷入trap):CPU执行指令时发生的错误异常事件。比如地址越界,请求分页系统的缺页以及专门的陷入指令(这个也是上述用户能够主动进入核心态的办法,也称为系统调用)。 ​ 系统调用的本质是用户把CPU的使用权交给了操作系统内核的程序,然后让内核程序去执行对应的特权指令,等执行完毕后,再把使用权返回。即关键指令的调用实质还是内核调用而不是用户直接调用。 进程管理 基本概念 在多道程序运行的系统中,由于程序直接“暴露在内存里”,所以导致程序没有封闭性,它们能够彼此看见对方内部的结构,甚至调用,这显然是不行的。于是为了方便描述程序和控制程序的并发,体现操作系统的并发性和共享性,所以引入了进程的概念。 进程(动态的):是程序的一次执行过程(进程实体的运行过程),是CPU资源分配和调度的基本单位(引入线程之前) PCB(Process Control Block) 程序段 相关数据段 状态 创建态 就绪态 运行态 终止态 阻塞态 它们各自的定义这里不再描述。 需要说明的是,当进程从运行态变换到阻塞态时,是一个主动的行为(即自己需要去请求某个外设资源或等待某一事件发生而引起的阻塞),这是一种特殊的,由运行的用户态程序去调用操作系统内核过程的形式。 而从阻塞态转移到就绪态,这是一个被动过程,因为它需要外界信号进行触发。例如请求的外设已经完成了对应的任务,或是请求的某个资源已经空闲出来等。 进程通信 共享存储空间通信 -> 多个进程共享内存中的某块空间,当需要通信时,在内存中进行读写即可。 消息传递 -> 调用操作系统提供的消息传递方法进行进程通信,即通过发送消息和接受消息两个原语进行通信。 直接通信,即发送进程直接把消息发送给接收消息进程。 间接通信,即发送进程把消息发送给某个中间实体,使其成为一个信箱,而接受进程直接从实体中取消息即可,反之亦然。 管道通信 -> 由pipe文件来连接发消息进程和接受消息进程从而达到通信的目的。(消息查看2022王道考研操作系统P35) 线程 由于进程的切换会有较大的时空开销,于是考虑引入线程,从而提高系统的并发性能(因为线程切换所引起的时空开销要远远小于进程)。...

September 8, 2021 · 2 min · 214 words · Runtus

npm发包相关的packagejson配置说明 将自己的项目上传至npm上时,需要正确设置packagejson中的相关字段,否则会导致上传的项目无法正确在其他地方引用,甚至无法上传至npm官网。 1. name name是整个项目的名称,也是在npm仓库中的唯一索引,当别人下载自己上传的npm包时,其关键字索引便是项目名称。 yarn add axios # axios 便是项目名称 2. version version是版本号,它是一个字符串,每次发版时都要更新该字段。 版本号的编写遵循语义化版本 2.0.0 规范,即**「主版本号. 次版本号. 修订号」** 3. main 指定加载的入口文件,node端和web端都可以使用,当外部使用require来引入npm包时,main指定的文件将以module.export的形式对外暴露。 所以一般情况下,main文件都会指向commonjs规范的文件,如下所示。 mjs文件代表commonjs规范的js文件。 { "main": "dist/index.cjs" } 4. module 与main不同的是,module指定的是ESM规范的文件入口,web端和node端都可以使用,如果npm包导出的是ESM规范的包,则需要该字段来指定入口文件。 mjs代表是ESM规范的js文件。 { "module": "dist/index.mjs" } 5. type type用于指定该node项目遵循ESM规范还是Commonjs规范,默认为commonjs项目,若要设置项目为ESM规范,则需要赋值module。 { "type": "module" } 同时当项目是ESM规范时,需要指定入口文件,即设置module字段。 6. types 指定声明文件位置,即d.ts文件。 7. files files字段接收一个数组,用来指明在发布npm包时,哪些文件需要上传至npm服务器上。或者说,用来描述当把 npm 包作为依赖包安装时需要说明的文件列表。 需要说明的是,如果有文件不想上传到npm服务器上,可以用.npmignore来说明哪些文件不需要上传(和.gitignore类似)

1 min · 53 words · Runtus