主题
计算机操作系统面试题
1、简单说下你对并发和并行的理解?
- 并发:多个任务在同一个CPU核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务时同时执行。
- 并行:单位时间内,多个处理器或多核处理器同时处理多个任务,是真正意义上的"同时进行"
- 串行:有n个任务,由一个线程按顺序执行。由于任务、方法都在一个线程执行,所以不存在线程不安全情况,也就不存在临界区的问题。
2、同步、异步、阻塞、非阻塞的概念
3、进程和线程的基本概念
进程:
一个在内存中运行的应用程序。每个进程都有自己的独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。
线程:
进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可以共享数据。
4、进程与线程的区别?
线程具有许多个传统进程具有的特征,故又称为轻型进程或进程元;而把传统的进程称为重量级进程,它相当于只有一个线程任务。在引入线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。
根本区别:
进程是操作系统资源分配的最小单位;
线程是处理器任务调度和执行的基本单位
资源开销:
每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;
线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有独立的运行栈和程序计数器(PC),线程之间切换的开销小。
包含关系:
如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
内存分配:
同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的。
影响关系:
一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多个进程要比多线程健壮。
执行过程:
每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行。
5、为什么有了进程,还要有线程呢?
6、进程的状态转换
7、进程间的通信方式有哪些?
8、进程的调度算法有哪些?
9、什么是死锁?
10、产生死锁的原因?
11、怎么预防死锁?
12、怎么避免死锁?
我们只要破坏产生死锁的四个条件中的一个就可以了
破坏互斥条件
这个条件我们无法破坏,因为我们用的锁本来就是想让他们互斥的(临界资源需要互斥访问)。
破坏请求与保持条件
一次性申请所有资源
破坏不剥夺条件
占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
破坏循环等待条件
靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。
我们对线程 2 的代码修改成下面这样就不会产生死锁了。
java
new Thread(() ‐> {
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource2");
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
}
}
}, "线程 2").start();输出结果
java
Thread[线程 1,5,main]get resource1
Thread[线程 1,5,main]waiting get resource2
Thread[线程 1,5,main]get resource2
Thread[线程 2,5,main]get resource1
Thread[线程 2,5,main]waiting get resource2
Thread[线程 2,5,main]get resource2我们分析一下上面的代码为什么避免了死锁的发生?线程 1 首先获得到 resource1 的监视器锁,这时候线程 2 就获取不到了。然后线程 1 再去获取 resource2 的监视器锁,可以获取到。然后线程 1 释放了对resource1、resource2 的监视器锁的占用,线程 2 获取到就可以执行了。这样就破坏了破坏循环等待条件,因此避免了死锁