操作系统

三者都是io多路复用,epoll还是事件驱动io

 

综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特点。

1、表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。

select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。

2、select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善
————————————————
原文链接:https://blog.csdn.net/wteruiycbqqvwt/article/details/90299610

 

需要系统学习:文件管理、进程管理、内存管理

 

 

 

 

2 操作系统内存管理

CPU中有一个MMU(内存管理单元)存储了逻辑地址和物理地址的映射关系。

 

 ——看到P13

 

 

javaguide学习

僵尸进程和孤儿进程,以及二者的问题及危害

 

 

 

 

 

系统调用即应用程序主动发起的请求操作系统提供服务的请求。异常是应用程序发生的异常情况,由操作系统捕获并处理(可能直接杀掉应用程序,或者可能通过操作系统处理后重新运行应用程序)。中断IO是外设介入操作系统的手段。

可以看到需要操作系统来完成的系统调用就是需要学习的操作系统的模块。 

进程控制

PCB:process control block

 

 

 

 

 

 

 

 

 进程和线程的概念,联系及区别

(1)进程

进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间,至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。

(2)线程

线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

(3)联系

线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

线程和进程的区别总结:

根本区别:进程是资源分配最小单位,线程是处理机调度的基本单位。无论是进程还是线程,都是由操作系统所管理的。
地址空间:进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间(代码段、堆栈段和数据段);线程没有独立的地址空间,同一进程的线程共享本进程的地址空间。
资源:进程之间的资源是独立的;同一进程内的线程共享本进程的资源。
执行过程:每个独立的进程都有一个程序运行的入口。但是线程不能独立执行,必须依存在应用程序中。
系统开销:进程执行开销大,线程执行开销小。
 

协程

1、协程不是被操作系统内核所管理的,而是完全由程序所控制,也就是在用户态执行。

2、协程不是进程也不是线程,而是一个特殊的函数,这个函数可以在某个地方挂起,并且可以重新在挂起处外继续运行。所以说,协程与进程、线程相比并不是一个维度的概念。

3、一个进程可以包含多个线程,一个线程也可以包含多个协程。

4、线程是抢占式,而协程是非抢占式的。需要用户释放使用权切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。(多CPU,进程和线程可并行运行,但是单线程内一定是串行的,因此一个线程可以拥有多个协程但是也只能串行执行)

 

 

 

 

 

 

 

 

 

 

 

 

Round robin: 轮询调度。

分布式中的轮询调度:轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。

 

 

 

如何避免死锁:
1、破坏互斥条件
如果资源不需要互斥访问,就可以破坏互斥条件。
2、破坏请求和保持条件
在执行时不再提出资源请求
系统要求所有进程要一次性地申请在整个运行过程中所需的全部资源。若系统有足够资源则完全分配。在等待时不保持任何资源,只要有一个请求的资源不可用,就其它可用资源都不分配给它。
3、破坏不可剥夺条件
一个已拥有资源的进程,若它再提出新资源要求而不能立即得到满足时,它必须释放已经拥有的所有资源。以后需要时再重新申请。
4、破坏环路条件
系统将所有资源按类型进行线性排序,并赋予不同的序号,所有进程对资源的请求必须严格按照资源序号递增的次序提出。
银行家算法:当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,要看他本次申请的资源数是否超过了该资源所剩余的总量。若能满足则按当前的申请量分配资源,否则也要推迟分配。

内存管理

 段式管理

分段地址结构

      作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。例程序段、数据段等。每个段都从0开始编址,并采用一段连续的地址空间。段的长度由相应的逻辑信息组的长度决定,因而各段长度不等。整个作业的地址空间是二维的。

       在段式虚拟存储系统中,虚拟地址由段号和段内地址组成,虚拟地址到实存地址的变换通过段表来实现。每个程序设置一个段表,段表的每一个表项对应一个段,每个表项至少包括三个字段:有效位(指明该段是否已经调入主存)、段起址(该段在实存中的首地址)和段长(记录该段的实际长度)。

地址变换

      针对每一个虚拟地址,存储管理部件首先以段号S为索引访问段表的第S个表项。若该表项的有效位为1,则将虚拟地址的段内地址D与该表项的段长字段比较;若段内地址较大则说明地址越界,将产生地址越界中断;否则,将该表项的段起址与段内地址相加,求得主存实地址并访存。如果该表项的有效位为0,则产生缺页中断,从辅存中调入该页,并修改段表。段式虚拟存储器虚实地址变换过程如图所示。

绝对地址=根据段号找到段表中的起始地址+段内地址 (如果段内地址超过限长则产生“地址越界”程序性中断事件达到存储保护)

 

 

 

 

4. 分段存储方式的优缺点

     分页对程序员而言是不可见的,而分段通常对程序员而言是可见的,因而分段为组织程序和数据提供了方便。

与页式虚拟存储器相比,段式虚拟存储器有许多优点:

(1)    段的逻辑独立性使其易于编译、管理、修改和保护,也便于多道程序共享。

(2)    段长可以根据需要动态改变,允许自由调度,以便有效利用主存空间。

(3)    方便编程,分段共享,分段保护,动态链接,动态增长

 因为段的长度不固定,段式虚拟存储器也有一些缺点:

(1)    主存空间分配比较麻烦。

(2)    容易在段间留下许多碎片,造成存储空间利用率降低。

(3)    由于段长不一定是2的整数次幂,因而不能简单地像分页方式那样用虚拟地址和实存地址的最低若干二进制位作为段内地址,并与段号进行直接拼接,必须用加法操作通过段起址与段内地址的求和运算得到物理地址。因此,段式存储管理比页式存储管理方式需要更多的硬件支持。

页式管理

一半用12bit作为页内偏移量,前面用来做虚拟页到物理页的映射。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 虚拟内存

局部性原理:

 

 

 

 

 

 

 

 

 

 

 

 

 

多级页表:

 

 

 

 

 

 

 

CPU中含有一个被称为内存管理单元(Memory Management Unit, MMU)的硬件,它的功能是将虚拟地址转换为物理地址。MMU需要借助存放在内存中的页表来动态翻译虚拟地址,该页表由操作系统管理。

地址翻译过程

 

 

 

 

 

 

 

 

 

 

 

 

文件管理

卷控制块(文件系统一个)->目录控制块(每个目录一个)›文件控制块(每个文件一个)

 

 

 操作系统inode是如何分配的?(微软面试)

 

 

 

 

 

 unix使用的文件分配方式:多级索引分配。

inode即index node,索引节点,根据inode就可以通过多级索引寻找大文件。

文件比较小的时候支持前十个索引直接使用数据块。当给大文件分配时可以使用多级索引,一般三级索引足够了。

 

 

 软连接只是创建了一个内容是指向目标文件的文件,硬链接相当于复制了目标文件并与目标文件同步更新

 

 

 操作系统管理空闲块的方式:

管理空闲空间两种方式:

1.位图即bit数组,0表示空闲,1表示占用,会产生数据不一致的问题。比如分配空间后没有把位图置1,可以先置1再分配,可以保证数据不丢失。(会浪费一个空闲块)

2.链式列表

3.分组列表

 

 

inode类似于文件头,包含了文件元数据。 

 

 

  • inode :记录文件的属性信息,可以使用 stat 命令查看 inode 信息。

 

  • block :实际文件的内容,如果一个文件大于一个块时候,那么将占用多个 block,但是一个块只能存放一个文件。(因为数据是由 inode 指向的,如果有两个文件的数据存放在同一个块中,就会乱套了)

 

 

  

同步异步指消息通信机制,可以理解为服务器接收到调用如何处理,同步是处理

得到结果后才返回,异步是直接返回调用成功,然后通知回调。

阻塞非阻塞可以理解为客户端调用后阻塞会一直等待返回后再继续,非阻塞是调用后

继续运行,但是会过段时间查看有无返回

 shell编程基础语法参考:https://javaguide.cn/cs-basics/operating-system/shell-intro/

 

整理自www.javaguide.cn

 https://www.jianshu.com/p/354066717f78

posted on 2021-12-23 21:07  nisico  阅读(55)  评论(0)    收藏  举报

导航