近期写代码又开始重新接触了一点控台应用,接触到的项目年代久远,所有的权限管理用起来感觉不是很得心应手。
于是想着自己能否从零设计一个,梳理一下思路,当然实际用不用也无所谓。
权限管理主要是为了安全,项目中的权限管理是全部放在前端控制的,感觉这一点非常不安全。
前端防君子,不防小人。
当然本次造轮子主要也是为了打造一款自己满意的权限控制框架,所以设计采用 MVP 模式,采用渐进式的方式开发。
大家可以一起学习一下权限控制的设计和实现思路。
如果生产想直接使用,也有比较成熟的框架:
近期写代码又开始重新接触了一点控台应用,接触到的项目年代久远,所有的权限管理用起来感觉不是很得心应手。
于是想着自己能否从零设计一个,梳理一下思路,当然实际用不用也无所谓。
权限管理主要是为了安全,项目中的权限管理是全部放在前端控制的,感觉这一点非常不安全。
前端防君子,不防小人。
当然本次造轮子主要也是为了打造一款自己满意的权限控制框架,所以设计采用 MVP 模式,采用渐进式的方式开发。
大家可以一起学习一下权限控制的设计和实现思路。
如果生产想直接使用,也有比较成熟的框架:
【Exchange sorts】
【Selection sorts】
Selection sort
Heapsort
【Insertion sorts】
Insertion sort
Shellsort
Tree sort
【Merge sorts】
Merge sort
【Distribution sorts】
为什么学习操作系统?
希望可以系统的学习一遍相关知识,从操作系统层面理解 java 等技术的相关特性。
希望自己可以实现一个简易版本的操作系统。
高并发:进程+线程+死锁+通信+互斥
任务-调度
缓存-淘汰策略
磁盘分配-分页+分段+first fit
文件-索引 + 权限控制
在信息化时代,软件被称为计算机系统的灵魂。
而作为软件核心的操作系统,已经与现代计算机系统密不可分、融为一体。
我们在学习 Java 的时候,听过太多的多线程,然后大部分开发(比如我自己)可能没有弄清楚进程和线程的根本区别。
本系列就来学习下进程和线程。
在多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现性的特征。
为此引入了进程(Process)的概念,以便更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性。
为了使参与并发执行的程序(含数据)能独立地运行,必须为之配置一个专门的数据结构,称为进程控制块(Process Control Block, PCB)。
引入进程的目的,是为了使多道程序并发执行,以提高资源利用率和系统吞吐量;
而引入线程,则是为了减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。
线程最直接的理解就是“轻量级进程”,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。
一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。
在多道程序系统中,进程的数量往往多于处理机的个数,进程争用处理机的情况就在所难免。
处理机调度是对处理机进行分配,就是从就绪队列中,按照一定的算法(公平、髙效)选择一个进程并将处理机分配给它运行,以实现进程并发地执行。
处理机调度是多道程序操作系统的基础,它是操作系统设计的核心问题。
一个作业从提交开始直到完成,往往要经历以下三级调度,如图2-4所示。
又称高级调度。其主要任务是按一定的原则从外存上处于后备状态的作业中挑选一个(或多个)作业,给它(们)分配内存、输入/输出设备等必要的资源,并建立相应的进程,以使它(们)获得竞争处理机的权利。简言之,就是内存与辅存之间的调度。对于每个作业只调入一次、调出一次。
在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。
为了协调进程之间的相互制约关系,引入了进程同步的概念。
虽然多个进程可以共享系统中的各种资源,但其中许多资源一次只能为一个进程所使用,我们把一次仅允许一个进程使用的资源称为临界资源。
许多物理设备都属于临界资源,如打印机等。此外,还有许多变量、数据等都可以被若干进程共享,也属于临界资源。
对临界资源的访问,必须互斥地进行,在每个进程中,访问临界资源的那段代码称为临界区。
为了保证临界资源的正确使用,可以把临界资源的访问过程分成四个部分:
信号量机构是一种功能较强的机制,可用来解决互斥与同步的问题,它只能被两个标准的原语wait(S)和signal(S)来访问,也可以记为“P操作”和“V操作”。
原语是指完成某种功能且不被分割不被中断执行的操作序列,通常可由硬件来实现完成不被分割执行特性的功能。
如前述的“Test-and-Set”和“Swap”指令,就是由硬件实现的原子操作。原语功能的不被中断执行特性在单处理机时可由软件通过屏蔽中断方法实现。
原语之所以不能被中断执行,是因为原语对变量的操作过程如果被打断,可能会去运行另一个对同一变量的操作过程,从而出现临界段问题。
如果能够找到一种解决临界段问题的元方法,就可以实现对共享变量操作的原子性。
在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高了系统的处理能力。
然而,多个进程的并发执行也带来了新的问题——死锁。
所谓死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
下面我们通过一些实例来说明死锁现象。
先看生活中的一个实例,在一条河上有一座桥,桥面很窄,只能容纳一辆汽车通行。
如果有两辆汽车分别从桥的左右两端驶上该桥,则会出现下述的冲突情况。
此时,左边的汽车 占有了桥面左边的一段,要想过桥还需等待右边的汽车让出桥面右边的一段;右边的汽车占 有了桥面右边的一段,要想过桥还需等待左边的汽车让出桥面左边的一段。此时,若左右两 边的汽车都只能向前行驶,则两辆汽车都无法过桥。
本章主要讲解内存管理和虚拟内存管理。
内存管理包括内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(分页管理方式、分段管理方式、段页式管理方式)。
虚拟内存管理包括虚拟内存概念、请求分页管理方式、页面置换算法、页面分配策略、工作集和抖动。
内存管理(Memory Management)是操作系统设计中最重要和最复杂的内容之一。
虽然计算机硬件一直在飞速发展,内存容量也在不断增长,但是仍然不可能将所有用户进程和系统所需要的全部程序和数据放入主存中,所以操作系统必须将内存空间进行合理地划分和有效地动态分配。