操作系统相关总结

一、并发、并行、同步、异步、阻塞、非阻塞

并发:指一个时间段内,有几个程序在同一个CPU上运行,但是任意时刻只有一个程序在CPU上运行
并行:指任意时刻点上,有多个程序同时运行在多个CPU上
同步:指代码调用IO操作时,必须等待IO操作完成才能返回的调用方式。
异步:指代码调用IO操作时,不必等IO操作完成就返回的调用方式。
阻塞:指调用函数时候当前线程被挂起。
非阻塞:值调用函数时当前线程不会被挂起,而是立即返回。
阻塞非阻塞是对调用者而言,调用结果返回前进程的状态,是挂起还是继续处理其他任务。
同步异步是对被调用者,结果返回时通知进程的一种通知机制。

二、阻塞I/O(BIO)

BIO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了。
解决方案:
在服务器端使用多线程(或多进程)。多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接。
问题:开启多进程或多线程的方式,在遇到要同时响应成百上千路的连接请求,会严重占据系统资源,降低系统对外界响应效率。
改进:使用“线程池”或“连接池”。
“线程池”旨在减少创建和销毁线程的频率,使其维持一定合理数量的线程,并让空闲的线程重新承担新的执行任务。
“连接池”维持连接的缓存池,尽量重用已有的连接、减少创建和关闭连接的频率。
这两种技术都可以很好的降低系统开销,都被广泛应用很多大型系统,如websphere、tomcat和各种数据库等。
改进后方案的问题:
“线程池”和“连接池”也只是在一定程度上缓解了频繁调用I/O接口带来的资源占用。而且,“池”始终有其上限,当请求大大超过上限时,“池”构成的系统对外界的响应并不比没有池的时候效果好多少。所以使用“池”必须考虑其面临的响应规模,并根据响应规模调整“池”的大小。

三、非阻塞I/O(NIO)

当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。从用户进程角度讲 ,它发起一个read操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个error时,它就知道数据还没有准备好,于是用户就可以在本次到下次再发起read询问的时间间隔内做其他事情,或者直接再次发送read操作。一旦kernel中的数据准备好了,并且又再次收到了用户进程的询问,那么它马上就将数据拷贝到了用户内存(这一阶段仍然是阻塞的),然后返回。
在NIO中,用户进程其实是需要不断的主动询问kernel数据准备好了没有。

四、多路复用I/O(IO multiplexing)

一个线程,通过记录I/O流的状态来同时管理多个I/O,可以提高服务器的吞吐能力。select的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。
select、poll、epoll的区别
1、select==>时间复杂度O(n)
它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流,我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。
2、poll==>时间复杂度O(n)
poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的。
3、epoll==>时间复杂度O(1)
epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的。
select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

五、进程、线程和协程

进程:一个运行的程序就是一个进程。是系统资源分配的最小单位,拥有自己独立的内存空间。既不共享堆也不共享栈;由操作系统调度
线程:调度执行的最小单位,不能独立存在,共享内存。共享堆不共享栈;由操作系统调度
协程:是一种用户态的轻量级线程,调度完全由用户控制。和线程一样,共享堆不共享栈;由程序员调度
多进程适合在CPU密集型操作,如位数多的浮点运算
多线程适合在IO密集型操作,如爬虫

六、进程间通信方式

1、管道。管道是一种半双工的通信方式,数据只能单向流动,而且只能在有血缘关系的进程间使用,进程的血缘关系通常是指父子进程关系。
2、命名管道。也是半双工的通信方式,但是它允许无亲缘关系关系进程间通信。
3、信号。是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生。
4、信号量。信号量是一个计数器,可用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。
5、消息队列。消息队列是由消息组成的链表,存放在内核中,并由消息队列标识符标识。消息队列克服了信号传递消息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
6、共享内存。共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式
7、套接字。
管道:速度慢、容量有限
消息队列:容量收到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
信号量:不能传递复杂信息,只能用来同步。
共享内存:能够很容易控制容量,速度快,但要保持同步。

七、线程同步的方式

线程同步是指多个线程同时访问某资源时,采用一系列的机制以保证最多只能一个线程访问该资源。
线程同步的方式:
1、互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以可以保证公共资源不会同时被多个线程访问。
2、信号量:它允许多个线程同一时刻访问同一资源,但是需要限制同一时刻访问此资源的最大线程数目。
3、事件(信号):通过通知操作的方式来保持多线程的同步,还可以方便实现多线程的优先级比较操作。

八、进程和线程各有哪几种状态

进程
1、就绪:进程已获得除处理机以外的所需资源,等待分配处理机资源。
2、运行:占用处理机资源运行,处于此状态的进程数小于等于CPU数
3、阻塞:进程等待某种条件,在条件满足之前无法执行
线程:创建、就绪、运行、阻塞、等待、时间等待、消亡

九、堆和栈都保存什么

堆区:全局变量、静态变量、new对象
栈区:函数的参数值、局部变量

十、临界区及如何解决冲突

临界区:每个进程中访问临界资源的那段程序。每次只准许一个进程进入临界区,进入后不允许其他进程进入。
任何时候,处于临界区的进程不可多于一个。如已有进程进入自己的临界区,则其他试图进入临界区的进程必须等待。
进入临界区的进程要在有限时间内退出,以便其他进程能及时进入自己的临界区。
如果不能进入自己的临界区,就应该让出CPU,避免进程出现忙等等现象。

十一、进程的调度策略

1、先来先服务(FCFS):按照作业到达后备作业队列(或进程进入就绪队列)的先后次序选择作业(或进程)。
2、短作业优先(SJF):主要用于作业调度,它从作业后备序列中挑选所需运行时间最短的作业进入主存运行。
3、时间片轮转调度算法:当某个进程执行的时间片用完时,调度程序便终止该进程的执行,并将它送到就绪队列的末尾,等待分配下一时间片再执行。然后把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
4、高响应比优先:按照高响应比(已等待时间+要求运行时间)/要求运行时间 优先的原则,在每次选择作业投入运行时,先计算此时后备作业队列中每个作业的响应比RP。选择最大的作业投入运行。
5、优先权调度算法:按照进程的优先权大小来调度。使高优先权进程得到优先处理的调度策略称为优先权调度算法。注意:优先数越多,优先权越小。
6、多级队列调度算法:多队列调度是根据作业的性质和类型的不同,将就绪队列再分为若干个队列,所有的作业(进程)按其性质排入相应的队列中,而不同的就绪队列采用不同的调度算法。

十二、什么是死锁?产生条件?如何避免?

死锁:在2个或多个并发进程中,如果每个进程持有某有资源而又都等待别的进程释放它或他们现在保持的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。
产生死锁的必要条件:
1、互斥条件:一个资源每次只能被一个进程使用。
2、不可剥夺条件:进程已获得资源,在未使用完之前,不能被强行剥夺。
3、请求和保持条件:进程请求资源而阻塞时,对已获得的资源保持不放。
4、循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系。
只要上述一个条件不成立,就不会发生死锁。
解决死锁的方法有:预防死锁、避免死锁、检测死锁、解除死锁
死锁的处理策略:鸵鸟策略、预防策略、避免策略、检测与解除死锁

十三、什么是虚拟内存

虚拟内存允许执行进程不必完全在内存中。虚拟内存的基本思想是:每个进程拥有独立的地址空间,这个空间被分为大小相等的多个块,称为页(Page),每个页都是一段连续的地址。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻进行必要的映射;当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的命令。这样,对于进程而言,逻辑上似乎有很大的内存空间,实际上其中一部分对应物理内存上的一块,还有一些加载在内存中的对应在硬盘上。
注意,请求分页系统、请求分段系统和请求段页式系统都是针对虚拟内存的,通过请求实现内存与外存的信息置换。

十四、分段和分页的区别

1、段是信息的逻辑单位,它是根据用户的需要划分的,因此段对用户是可见的 ;页是信息的物理单位,是为了管理主存的方便而划分的,对用户是透明的。
2、段的大小不固定,有它所完成的功能决定;页大大小固定,由系统决定
3、段向用户提供二维地址空间;页向用户提供的是一维地址空间
4、段是信息的逻辑单位,便于存储保护和信息的共享,页的保护和共享受到限制。

十五、缓冲区溢出,危害

缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。
危害有以下两点:
(1)程序崩溃,导致拒绝服务
(2)跳转并且执行一段恶意代码
造成缓冲区溢出的主要原因是程序中没有仔细检查用户输入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值