面试题错题解析3_多线程

                                     面试题错题解析3_多线程

时间片调度属于____,多线程分别绑定CPU属于____。
A.并发,并发
B.并发,并行
C.并行,并行
D.并行,并发
解析:B
在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)。而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)

Inter-process communication (IPC) is the transfer of data among processes. Which of the following is NOT a typical programming technique for IPC?
A.mutex
B.pipe
C.socket
D.message queue
解析:A
题目问哪一个不是进程间通信的方式。其中进程间通信的方式有管道(pipe)、共享存储器系统、消息传递系统(message queue)以及信号量。而mutex是互斥锁,在锁机制中通过原语保证资源状态的检查和修改作为一个整体来执行,以保证共享数据操作的完整性,并不能在两个进程间传递消息。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,也就是说socket也是两个进程间的通信方式。

在win32平台下,以下哪种方式无法实现进程同步?
A.Critical Section
B.Event
C.Mutex
D.Semaphore
解析:windows环境下,常用的实现进程同步有:

  • 信号量(Semaphore) 
  •  事件(Event)
  • 互斥锁(Mutex)

临界区(Critical Section):通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问;
虽然临界区同步速度很快,但却只能用来同步本进程内的线程,不能同步多个进程中的线程。

互斥锁(Mutex):为协调共同对一个共享资源的单独访问而设计的;
信号量:为控制一个具有有限数量用户资源而设计;
事件:用来通知线程有一些事件已经发生,从而启动后继任务的开始。

数据库以及线程发生死锁的必要条件是什么?

A.互斥条件:一个资源每次只能被一个进程使用
B.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
C.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
D.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

解析:abcd
答案:ABCD
产生死锁的原因主要是: 
(1) 因为系统资源不足。 
(2) 进程运行推进的顺序不合适。 
(3) 资源分配不当等。 
产生死锁的四个必要条件: 
(1)互斥条件:一个资源每次只能被一个进程使用。 
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 
(3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。


无锁化编程有哪些常见方法?
A.针对计数器,可以使用原子加
B.只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)
C.RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法
D.CAS(Compare-and-Swap),如无锁栈,无锁队列等待

解析:abcd
A 原子操作是汇编级别支持的指令lock xadd,如c++中的interlockIncrement,java中有AutomicInteger都是对其的封装。简单变量的线程同步用这种方式效率最高。

B 多个生产者和多个消费者,一样可以做到免锁访问,但要使用原子操作。这里的意思应该是不用原子操作级别的免锁,理由也很简单,生产者和消费者需要修改的位置是分开的(生产者加在尾部,消费者从头部消费),且只有一个读一个写,不会发生冲突。所以只有一点需要关注,就是尾部指针和头部指针每次需要比较以避免生产溢出或者过度消费,而简单变量的读操作都是原子的。

C 类似的一个概念叫CopyOnWrite,复制一份,修改完后,替换回去时只需替换一个指针或引用,锁住的粒度非常小。但有可能还有线程持有的是旧的指针,因此旧的副本需要延迟释放。

D 汇编级别支持的指令cmpxchg,锁定内存地址,比较地址中修改前的内容是否与修改时的值一致,如果不一致就说明有其他线程改动,需要重新做。如,内存地址0x123456中原来存放的是10101010,但CPU执行到cmpxchg指令时,发现内存中变成了11111111,那么就认为其他线程已经修改了这个地址的值,需要重新读取0x123456中的值11111111,再做一次cmpxchg,如果这次发现内存中仍然是11111111,那么cmpxchg就会把新的值写入到0x123456中去。这里面有个ABA问题,就是有线程改了2次从11111111 -> 10111111 -> 11111111,那么CAS操作是识别不了的,需要从业务层去避免,如果直接在0x123456再放一个地址值,而地址值如果不先释放再重新申请内存,就不会出现重复值。

关于进程和线程,下面说法正确的是
A.线程是资源分配和拥有的单位
B.线程和进程都可并发执行
C.在linux系统中,线程是处理器调度的基本单位
D.线程的粒度小于进程,通常多线程比多进程并发性更高
E.不同的线程共享相同的栈空间

解析:BCD

A 错误,进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
B 正确,二者均可并发执行。
C 正确,线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
D 正确, 线程的划分尺度小于进程,使得多线程程序的并发性高
E 错误,在同一进程中的各个线程,才可以共享该进程所拥有的资源

下列方法中哪个是线程执行的方法? ()
A.run()
B.start()
C.sleep()
D.suspend()

解析:A
1、run() 执行线程
2、start() 启动线程
3、sleep() 使线程睡眠(一段时间)
4、suspend() 使线程挂起,暂停执行
5、resume() 使线程恢复执行

下面有关共享内存,说法不正确的是?
A.共享内存和使用信号量一样,属于进程间通信的一种方式。
B.使用shmget函数来创建共享内存
C.尽管每个进程都有自己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的
D.共享内存提供了同步机制,在第一个进程结束对共享内存的写操作之前,会有自动机制可以阻止第二个进程开始对它进行读取

解析:D
共享内存并未提供同步机制,当某一个进程对共享内存提供写操作时,并未自动的阻止另一个进程对它进行读取;
共享内存:就是允许多个进程访问同一内存空间,进程间传递和共享数据非常有效信号量:为了防止多个进程访问共享资源而造成冲突,设置临界区域每次只让一个进程访问,信号量提供了这样一种机制,用来控制对临界区域的访问

以下关于多线程的叙述错误的是:
A.线程同步的方法包括使用临界区,互斥量,信号量等
B.两个线程同时对简单类型全局变量进行写操作也需要互斥
C.实现可重入函数时,对自动变量也要用互斥量加以保护
D.可重入函数不可以调用不可重入函数
解析:C
可重入函数可认为是可以被中断的函数,自动变量定义的时候才被创建,函数返回时,系统回收空间,他是的是局部作用域变量,不需要互斥量。可重入函数对全局变量才需要互斥量保护。


同步机制应该遵循哪些基本准则?
A.空闲让进
B.忙则等待
C.有限等待
D.让权等待
解析:abcd
同步机制应该遵循的基本准则 
空闲让进:当无进程处于临界区时,表明临界资源处于空闲状态,允许一个请求进入临界区的进程立即进入临界区,以有效利用临界资源
忙则等待:当已有进程处于临界区时,表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问
有限等待:对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态
让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态

产生系统死锁的原因是由于()
A.进程释放资源
B.一个进程进入死循环
C.多个进程竞争,资源出现循环等待
D.多个进程竞争共享型设备
解析:C

产生死锁的原因主要是:

(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
一不满足,就不会发生死锁。
D选项:共享型设备是指在一段时间内允许多个进程同时访问的设备

实时操作系统的基本特性有?
A.提供高可靠性
B.提供及时响应性
C.提供多路性:即众多联机用户可以同时使用同一台计算机
D.提供独占性:各终端用户感觉到自己独占了计算机
解析:AB
提供及时响应和高可靠性是实时操作系统主要特点。实时操作系统有硬实时和软实时之分,硬实时要求在规定的时间内必须完成操作,这是在操作系统设计时保证的;软实时则只要按照任务的优先级,尽可能快地完成操作即可。


有三个线程T1,T2,T3,下面方法可以确保它们按顺序执行的有()该线程继续执行
A.先启动最后一个(T3调用T2,T2调用T1)
B.可以用线程类的join()方法在一个线程中启动另一个线程,另一个线程完成
C.先启动第一个(T3调用T2,T2调用T1)
D.以上选项说法都不正确
解析:abc
实际上先启动三个线程中哪一个都行,因为在每个线程的run方法中用join方法限定了三个线程的执行顺序。
即便是第二个线程先启动执行了,由于t1.join()方法,
使得线程2
需要等待线程1运行结束后才能继续运行。
所以三个线程的启动顺序无关紧要!!!


 

链接:https://www.nowcoder.com/questionTerminal/d8a288fc416c4d638dfb042e1be239fc
来源:牛客网

public class JoinTest2 {
 
    // 1.现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行
 
    public static void main(String[] args) {
 
        final Thread t1 = new Thread(new Runnable() {
 
            @Override
            public void run() {
                System.out.println("t1");
            }
        });
        final Thread t2 = new Thread(new Runnable() {
 
            @Override
            public void run() {
                try {
                    // 引用t1线程,等待t1线程执行完
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("t2");
            }
        });
        Thread t3 = new Thread(new Runnable() {
 
            @Override
            public void run() {
                try {
                    // 引用t2线程,等待t2线程执行完
                    t2.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("t3");
            }
        });
        t3.start();//这里三个线程的启动顺序可以任意,大家可以试下!
        t2.start();
        t1.start();
    }
}


​​​​​​​有关多线程,多进程的描述错误的是

A.子进程获得父进程的数据空间,堆和栈的复制品
B.线程可以与同进程的其他线程共享数据,但是它拥有自己的栈空间且拥有独立的执行序列
C.线程执行开销小,但是不利于资源管理和保护
D.进程适合在SMP机器上进行,而线程则可以跨机器迁移
解析:D
SMP:Symmetrical Multi-Processing,对称性多核处理器,多进程可以在不同的核上运行,但是线程不可以跨机器迁移,因为线程是存在于单一的进程之中,只能在一个核上运行
 

猜你喜欢

转载自blog.csdn.net/xiao__jia__jia/article/details/81188597