操作系统知识

进程和线程

一、概念
进程:程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
线程:系统独立调度和分派的基本单位,线程自己不拥有操作系统资源,但是该线程可与同属进程的其它线程共享该进程所拥有的全部资源。

二、关系
(1)一个进程可以有多个线程,这些线程能够并发执行;进程至少有一个线程。
(2)进程是资源分配的最小单位,线程是CPU调度的最小单位;进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。
(3)进程执行的系统开销远大于线程执行的开销。

进程间通信

Linux:管道、消息队列、共享内存、信号、socket。
Windows:管道、共享内存、socket。

一、管道
通过创建一个数据缓冲区来存储数据,通过系统API实现。
匿名管道:单向通信、字节流通信、有大小限制、先进先出、用于具有血缘关系的进程间通信(通常是父子进程间使用)。
命名管道:双向通信、字节流通信、有大小限制、先进先出、不同进程间使用、同一网络的不同电脑上的进程间使用。

二、消息队列
消息队列的本质就是存放在内存中的消息的链表,而消息本质上是用户自定义的数据结构。如果进程从消息队列中读取了某个消息,这个消息就会被从消息队列中删除。
双向通信、自定义数据通信、有大小限制、随机读取;消息队列的生命周期随内核需要主动释放。

三、共享内存
将不同进程的虚拟内存地址映射到相同的物理内存地址,Windows通过FileMapping文件映射实现,Linux通过tmpfs共享内存文件实现。
通信效率高、没有提供同步机制(需要结合信号量使用)。

四、信号
Linux系统中,一个进程可以在任何时候发送信号给另一进程,一旦有信号产生对信号的处理方式有几种:执行默认操作(例如终止进程)、处理信号、忽略信号。

五、socket
利用网络通信进行进程间通信,支持不同电脑间通信。

六、其他
(1)Windows界面程序还可以通过WM_COPYDATA进行进程间通信。

进程间/线程间同步

Linux:互斥量、信号量、条件变量。
Windows:互斥量、信号量、事件、临界区。

一、互斥量
采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程/进程同时访问。适用上比较简单,通过加锁、解锁就能实现同步。Windows通过Mutex系列接口实现,Linux通过pthread_mutex系列接口实现。

二、信号量
信号量就是⼀个计数器,使用系统提供的一系列接口,可以实现不同进程对计数器变换的信号触发和等待,实现进程间同步。
Windows通过Semaphore系列接口实现,Linux通过sem系列接口实现。

三、事件/条件变量
事件本质上是一个系统信号,发生了某件事情后,发一个信号给其它关心这件事情的线程。从事件的本质上来看,事件不是为了资源保护的,而是为了线程间通知用的。事件不会对共享资源加锁,但也会使线程阻塞,没有触发事件线程就会进入阻塞状态直到事件触发。
事件是Windows下的概念,通过Event系列接口实现;Linux下的条件变量和事件的机制相同,通过pthread_cond系列接口实现。

四、临界区(关键代码段)
一段独占对某些共享资源访问的代码,在任意时刻只允许一个线程对共享资源进行访问,其他所有试图访问此临界区的线程将被挂起,一直持续到进入临界区的线程离开。同一个线程可以多次进入临界区,但是进入几次就要离开几次。
不适用于进程间同步,由于不涉及系统内核对象,速度快,通过CriticalSection系列接口实现。

你可能感兴趣的:(面试八股文,操作系统,进程,线程)