1、操作系统的基本特征
并发性
并发性是指同一时间间隔内发生两个或多个事件。并行性是指同一时刻内发生两个或多个事件。
共享性
共享性指多个计算任务(或多道程序)对系统资源的共同使用。
虚拟性
即通过某种技术把一个物理实体变为若干个逻辑上的对应物。
异步性
只要环境相同,作业经过多次的运行,所获得的结果也应该是完全相同的
2、请分别简单说一说进程和线程以及它们的区别
3、进程间通信有哪些方式?
进程间通信是指在不同进程之间传播或交换信息,在Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间,进程之间不能相互访问。必须通过内核才能进行数据交换。如图:
管道pipe: 管道是一种半双工的通信方式,数据只能单向流动
(半双工:数据可以在一个信号载体的两个方向上传输,但是不能同时传输)
命名管道FIFO: 也是半双工的通信方式
消息队列MessageQueue: 消息队列是由消息组成的链表
共享内存: 这段共享内存由一个进程创建,但多个进程都可以访问
信号量Semaphore: 信号量是一个计数器,可用来控制多个进程对共享资源的访问。
信号Signal
套接字Socket
4、进程的状态,各个状态之间的切换是怎样的 ?
• 就绪状态
是指进程已经准备好运行的状态。
• 运行状态
指进程已经获取CPU,其进程处于正在执行的状态。
• 阻塞状态
是指正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态。
应该注意以下内容:
只有就绪态和运行态可以相互转换,其它的都是单向转换。就绪状态的进程通过调度算法从而获得 CPU 时间,
转为运行状态;而运行状态的进程,在分配给它的 CPU 时间片用完之后就会转为就绪状态,等待下一次调度。
5、说说进程调度算法有哪些?
不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。
• 批处理系统(批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量(单位时间内成功地传送数据的数量(以比特、字节等测量))和周转时间(从提交到终止的时间))
按照请求的顺序进行调度,谁先来,就先执行谁
按估计运行时间最短的顺序进行调度,谁用的时间少、就先执行谁(长作业有可能会饿死)
按估计剩余时间最短的顺序进行调度,谁剩余时间最少、就先执行谁
• 交互式系统(交互式系统有大量的用户交互操作,在该系统中调度算法的目标是快速地进行响应)
将所有就绪进程按 FCFS 原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。
当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,
同时继续把 CPU 时间分配给新队首的进程。
为每个进程分配一个优先级,按优先级进行调度。
设置多个就绪队列,分别赋予不同的优先级,例如 1,2,4,8,..。进程在第一个队列没执行完,就会被移到下一个队列。
这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。
6、线程同步的方式有哪些?
在Linux下,系统提供了很多种方式来实现线程同步,其中最常用的便是互斥锁、信号量和条件变量这三种方式。
:
只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,
所以可以保证公共资源不会被多个线程同时访问。
:
它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
:
条件变量用来自动阻塞一个线程,直到某特殊情况发生为止
7、什么是死锁?产生条件?如何避免或处理死锁
通俗地讲,就是两个个或多个进程被无限期地阻塞、相互等待的一种状态。
计算机系统产生死锁的根本原因就是“资源有限,且进程间推进顺序不当”
出现死锁的4个必要条件(只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁):
:
即某个资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占有
:
已经分配给一个进程的资源不能强制性地被抢占,该资源只能被占有它的进程显式地释放
:
一个线程(进程)因请求被占用资源而发生阻塞时,对已获得的资源保持不放;
:
有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源
(p0正在等待p1占用的资源,p1正在等待p2占用的资源...pn正在等待p0占用的资源。)
死锁处理方法主要有以下四种方法:
• 鸵鸟策略(对可能出现的死锁采取忽略的态度,不预防、不避免,称作鸵鸟算法)
• 死锁检测与死锁恢复(利用检测算法对信息检查,以判断是否存在死锁,
死锁检测算法主要是检查是否有循环等待,再进行修复)
• 死锁预防(产生死锁需要同时满足4个条件,如果我们把这4个条件中的任何一个去掉,也可以避免进入死锁)
• 死锁避免(在使用前进行判断,只允许不会出现死锁的进程请求资源,‘银行家算法’。
8、什么是缓冲区溢出?有什么危害?其原因是什么?
缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。
危害:
程序崩溃,破坏程序的堆栈,使程序转而执行其它指令导致拒绝额服务跳转并且执行一段恶意代码
造成缓冲区溢出的主要原因是程序中没有仔细检查用户输入
9、分页和分段有什么区别?
• 分页存储管理
用户程序的地址空间被划分成若干固定大小的区域,称为“页”
• 分段存储管理
将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。
区别:
页是信息的物理单位,是为了管理内存的方便而划分的,对用户是透明的;
段是信息的逻辑单位,它是根据用户的需要划分的,因此段对用户是可见的
页的大小固定,由系统确定;
而段的长度却不固定,决定于用户所编写的程序
页向用户提供的是一维地址空间;
段向用户提供二维地址空间