并发重点题、错题

1.关于进程和线程,下面说法正确的是

线程是资源分配和拥有的单位
线程和进程都可并发执行
在linux系统中,线程是处理器调度的基本单位
线程的粒度小于进程,通常多线程比多进程并发性更高
不同的线程共享相同的栈空间

2.轮询任务调度与抢占式任务调度的区别?

抢占式调度优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度
轮记录当询调度优点是其简洁性,它无需前所有连接的状态,所以它是一种无状态调度
轮询调度实现相对较复杂
抢占式调度实现相对较复杂

原理:

轮询调度:每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。只有在当前任务主动放弃CPU控制权的情况下(比如任务挂起),才允许其他任务(包括高优先级的任务)控制CPU。其优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。但不利于后面的请求及时得到响应。

抢占式调度:允许高优先级的任务打断当前执行的任务,抢占CPU的控制权。这有利于后面的高优先级的任务也能及时得到响应。但实现相对较复杂且可能出现低优先级的任务长期得不到调度。

3.无锁化编程有哪些常见方法?

针对计数器,可以使用原子加

只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)
RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法
CAS(Compare-and-Swap),如无锁栈,无锁队列等待

4.有两个线程,最初 n=0,一个线程执行 n++; n++; 另一个执行 n+=2; 问,最后可能的 n 值?

第一种可能:假设两个线程没有并行顺序,执行结果:4

第二种可能:假设第一个n++执行完了,但是结果没写回内存,这个时候你+=2已结全部执行完,2写会了内存 结束

回到n++的写回操作,这个时候内存就从2被改回1,再来一次n++,结果就为2。

第三种可能:n += 2 先读取到的值到寄存器 即0入寄存器,这个时候被中断 第一个n++开始执行,直到结束后,内存改为1,然后n += 2继续执行 结束后内存变为2 第二个n++再执行 结果为3。

5.一个容器类数据结构,读写平均,使用锁机制保证线程安全。如果要综合提高该数据结构的访问性能,最好的办法是

只对写操作加锁,不对读操作加锁(脏数据)
读操作不加锁,采用copyOnWrite的方式实现写操作
分区段加锁(只在影响读写的地方加锁,锁可以用读写锁,可以提高效率
无法做到

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

子进程获得父进程的数据空间,堆和栈的复制品
线程可以与同进程的其他线程共享数据,但是它拥有自己的栈空间且拥有独立的执行序列
线程执行开销小,但是不利于资源管理和保护
进程适合在SMP机器上进行,而线程则可以跨机器迁移

7.某系统中有 3 个并发进程,都需要同类资源 4 个,试问该系统不会发生死锁的最少资源数是:

n*(m-1)+1=3*3+1=10

8.java中Hashtable, Vector, TreeSet, LinkedList哪些线程是安全的?

线程安全概念:

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

 

线程安全问题都是由全局变量静态变量引起的。

 

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

 

 

LinkedList 和 ArrayList 都是不同步的,线程不安全;
Vector 和 Stack 都是同步的,线程安全;
Set是线程不安全的;

Hashtable的方法是同步的,线程安全;
HashMap的方法不是同步的,线程不安全;

9.下面有关共享内存,说法不正确的是?

共享内存和使用信号量一样,属于进程间通信的一种方式。
使用shmget函数来创建共享内存
尽管每个进程都有自己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的
共享内存并未提供同步机制,当某一个进程对共享内存提供写操作时,并未自动的阻止另一个进程对它进行读取;

10.以下关于多线程的叙述错误的是

线程同步的方法包括使用临界区,互斥量,信号量等
两个线程同时对简单类型全局变量进行写操作也需要互斥
实现可重入函数时,对自动变量也要用互斥量加以保护(自动变量外部不可见,不需要互斥量保护)
可重入函数不可以调用不可重入函数

11.针对并发控制一般采用 封锁、时间戳、乐观控制法。但是商用的DBMS一般采用的是封锁

12.Bernstein条件是指两个过程如果有数据冲突,那么就没法并行执行。

13.Event、Semaphore、Mutex是内核对象,能够跨进程使用,Critical Section不能跨进程,只能实现线程内互斥

14.并发操作会带来哪些数据不一致性?

丢失修改、不可重复读、脏读

15.

在并行程度中,当两个并行的线程,在没有任何约束的情况下,访问一个共享变量或者共享对象的一个域,而且至少要有一个操作是写操作,就可能发生数据竞争错误。
原语Compare-and-swap(CAS)是实现无锁数据结构的通用原语。
获得内部锁的唯一途径是:进入这个内部锁保护的同步块或方法。
volatile变量具有synchronized的可见性特性,但是不具备原子特性。
减小竞争发生可能性的有效方式是尽可能缩短把持锁的时间

版权声明:本文为qq_40657585原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。