操作系统基础

来源:互联网 发布:淘宝联盟api免费申请 编辑:程序博客网 时间:2024/06/07 19:03

1. 进程间的通信方式(IPC )?进程调度方法?

线程间通信的方式:
1. 共享内存
可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。
2. 消息队列
“消息队列”是在消息的传输过程中保存消息的容器。具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可
以从消息队列中读取信息。
3. 信号
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
4. 信号量
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段
5. 套接字
这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。
6. 普通管道
普通管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有父子关系的进程间使用。
7. 有名管道
有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

进程调度方法:
1.先来先服务调度算法。
2.短作业(进程)优先调度算法。
3.优先权调度算法。
4.高响应比优先调度算法。
5.基于时间片的轮转调度算法。
6.多级反馈队列调度算法。

2.锁机制:包括互斥锁、条件变量、读写锁

互斥锁:提供了以排他方式防止数据结构被并发修改的方法。
读写锁:允许多个线程同时读共享数据,而对写操作是互斥的。
条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

3.信号量机制(Semaphore)和信号机制(Signal)

信号量机制包括无名线程信号量和命名线程信号量。
信号机制则类似进程间的信号处理。

线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

4.线程同步机制

临界区(CriticalSection)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)
的区别。
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
2、互斥量:采用互斥对象机制。只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。
3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作。

5. 操作系统由哪些部分组成?

操作系统主要由进程管理,存储管理,设备管理,文件管理,程序接口,用户界面这几个部分组成。

6. 用户态和系统态在什么时候进行切换?平时用的都是 64 位系统,那它和 32 位系统相比,有什么区别和优点?

5.1以下三种情况会导致用户态到内核态的切换:
1.系统调用;
2.异常,比如缺页异常;
3.外围设备的中断,当外围设备完成用户请求的操作后,会向 CPU 发出相应的中断信号。

5.2系统32位和64位之间的区别
寻址能力不同、运算速度不同。

7. 选择一个你熟悉的磁盘调度算法进行简单描述。

1.先来先服务算法(FIFO)
假设当前磁道在某一位置,依次处理服务队列里的每一个磁道,这样做的优点是处理起来比较简单,但缺点是磁头移动的距离和平均移动距离会很大。

2.最短寻道时间优先(SSTF)
这种算法的本质是利用贪心算法来实现,假设当前磁道在某一位置,接下来处理的是距离当前磁道最近的磁道号,处理完成之后再处理离这个磁道号最近的磁道号,直到所有的磁道号都服务完了程序结束。这样做的优点是性能会优于FIFO算法,但是会产生距离当前磁道较远的磁道号长期得不到服务,也就是“饥饿”现象,因为要求访问的服务的序列号是动态产生的,即各个应用程序可能不断地提出访问不同的磁道号的请求。

3.电梯调度算法(SCAN)
先按照一个方向(比如从外向内扫描),扫描的过程中依次访问要求服务的序列。当扫描到最里层的一个服务序列时反向扫描,这里要注意,假设最里层为0号磁道,最里面的一个要求服务的序列是5号,访问完5号之后,就反向了,不需要再往里扫。结合电梯过程更好理解,在电梯往下接人的时候,明知道最下面一层是没有人的,它是不会再往下走的。

4.循环扫描算法(CSCAN)
仔细看一下SCAN算法,我们会发现,在扫描到最里面的要求服务的序列时,接着会反向,在接下来的很大一部分时间里,应该是没有要求服务的磁道号的,因为之前已经访问过了。什么意思,就是说从初始磁道号到最里层的一个磁道号之间的所有序列都已经访问过了,所以SCAN会增加等待的时间。为了解决这样的情况,CSCAN算法的思想是,访问完最里面一个要求服务的序列之后,从最外层的序号开始往里走。也就是始终保持一个方向。就像梳头发,从上往下梳,到了最下面之后,再一次的从上往下梳,这个顺序是不会变的。没有人会从下往上梳头发吧。。

5.份步电梯调度算法(分两个队列)
在扫描的过程中所有新产生的序列放在另外的一个队列中,当访问完当前队列之后,再访问新产生的一个队列。这种算法可以有效防止磁壁粘着现象。

8. 进程和线程的区别?

(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 。
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。
(3)拥有资源:进程是拥有资源的一个独立单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和
栈),但是它可以与同属一个进程的其他线程共享进程所拥有的全部资源。进程之间是不能共享地址空间的,而线程是共享着所在进程的地址空间的。
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

9. 操作系统的换页方法。

FIFO、LRU、OPT等。

10. 哲学家进餐问题的无死锁算法。

A.原理:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。
方法 1:利用 AND 型信号量机制实现:根据课程讲述,在一个原语中,将一段代码同时需要的多个临界资源,要么全部分配给它,要么一个都不分配,因此
不会出现死锁的情形。当某些资源不够时阻塞调用进程;由于等待队列的存在,使得对资源的请求满足FIFO的要求,因此不会出现饥饿的情形。
伪码:

semaphore chopstick[5]={11111};void philosopher(int I) {    while(true){    think();    Swait(chopstick[(I+1)]%5,chopstick[I]);    eat();    Ssignal(chopstick[(I+1)]%5,chopstick[I]);    }}

方法2:利用信号量的保护机制实现。通过信号量 mutex 对 eat()之前的取左
侧和右侧筷子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的
出现。
伪码:

semaphore mutex = 1 ;semaphore chopstick[5]={11111};void philosopher(int I){    while(true){        think();        wait(mutex);        wait(chopstick[(I+1)]%5);        wait(chopstick[I]);        signal(mutex);        eat();        signal(chopstick[(I+1)]%5);        signal(chopstick[I]);    }}

B.原理:规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;
而偶数号的哲学家则相反。按此规定,将是 1,4 号哲学家竞争 4 号筷子,2,3 号哲
学家竞争2号筷子.即五个哲学家都竞争偶数号筷子,获得后,再去竞争奇数号筷
子,最后总会有一个哲学家能获得两支筷子而进餐。而申请不到的哲学家进入阻
塞等待队列,根据 FIFO 原则,则先申请的哲学家会较先可以吃饭,因此不会出
现饿死的哲学家。伪码:

semaphore chopstick[5]={11111};void philosopher(int i) {    while(true){        think();        if(i%2 == 0) {            wait (chopstick[ i + 1 ] mod5) ;            wait (chopstick[ i]) ;            eat();            signal (chopstick[ i + 1 ] mod 5) ;            signal (chopstick[ i]) ;        }Else {//奇数哲学家,先左后右。            wait (chopstick[ i]) ;            wait (chopstick[ i + 1 ] mod5) ;            eat();            signal (chopstick[ i]) ;            signal (chopstick[ i + 1 ] mod 5) ;        }}

11. 操作系统的内存管理。

主要有如下的几种方式:
1 分区管理
2 分页管理
3 分段管理
4.段页式管理