关于并发编程的疑问解析


1.同一进程中的线程共用什么?
   各个程序之间共享程序的内存空间(包括代码段,数据段,堆等)及一些进程级的资源(如打开文件和信号)。一个经典的线程与进程的关系图如下所示:
2.多线程与单线程的进程相比有那些优势呢?为什么要使用多线程呢?
  • 某个操作可能会陷入长时间等待,等待的线程会进入睡眠状态,无法继续执行。多线程执行可以有效利用等待的时间。典型的例子是等待网络向应,这可能要花费数秒甚至数十秒。
  • 某个操作(常常是计算)会消耗大量的时间,如果只有一个线程,程序和用户之间的交互会中断。多线程可以让一个线程负责交互,另一个线程负责计算。
  • 程序逻辑本身就要求并发操作,例如一个多端下载软件(例如Bittorrent)
  • 多CPU或多核计算机(基本就是未来的主流计算机),本身具备同时执行多个线程的能力,因此单线程无法全面地发挥计算机的全部计算能力。
  • 相对于多进程应用,多线程在数据共享方面效率要高很多。
3.从C程序员的角度来看,数据在线程中是私有还是共享的呢?
4.线程与处理器的关系是如何的?
    不论是在多处理器的计算机上还是单处理器的计算机上,线程总是并发执行的。当线程数量小于等于处理器数量时(并且操作系统支持多处理器),线程的并发是真正的并发,不同的线程允许在不同的处理器上,彼此之间互不相干。但对于线程数量大于处理器数量的情况,线程的并发会受到一些阻碍,因为至少有一个处理器会运行多个线程。
    在但处理器对应多线程的情况下,并发是一种模拟出来的状态。操作系统会让这些多线程程序轮流执行,每次仅执行一小段时间(通常是几十到几百毫秒),这样每个线程就“看起来”在同时执行。这样的一个不断在处理器上切换不同的线程的行为称之为线程调度。
5.在线程调度中,线程是怎样一个状态?
  • 运行(Runing):此时线程正在执行。
  • 就绪(Ready):此时线程可以立刻运行,但CPU已经被占用。
  • 等待(Waiting):此时线程正在等待某一事件(通常是I/O或同步)发送,无法执行。
   处于运行中线程拥有一段可以执行的时间,这段时间成为时间片(Time Slice),当时间片用尽的时候,该进程将进入就绪状态。如果在时间片用尽之前进程就开始等待某事件,那么它将进入等待状态。每当一个线程离开允许状态时,调度系统就会选择一个其他的就绪线程继续执行。在一个处于等待状态的线程所等待的事件发生之后,该线程将进入就绪状态。
6.在线程调度中,线程的优先级改变的方式?
  • 用户指定优先级。
  • 根据进入状态的频繁程度提升或降低优先级。
  • 长时间得不到执行而被提升优先级。  
 7.同步与锁的关系? 
    同步:是一个线程访问数据未结束的时候,其他线程不得对同一个数据进行访问。如此对数据的访问被原子化了。
    同步的最常见方法是使用锁(Lock)。锁是一种非常强机制,每一个线程在访问数据或资源之前首先试图获取(Acquire)锁,并在访问结束之后释放(Release)锁。在锁已经占用的时候试图获取锁时,线程等待,直到锁重新可用。
8.常见那些方式可以使线程同步?
    1》二元信号量(Bianry Semaphore):它只有两种状态,占用与非占用。它适合只能被唯一一个线程独占访问的资源。
    2》互斥量(Mutex):和二元信号很类似,资源仅同时允许一个线程访问,但和信号量不同的是,信号量在整个系统可以被任意线程获取并释放,也就是说,同一个信号量可以被系统中的一个线程获取之后由另一个线程释放。而互斥量则要求那个线程获取了互斥量,那个线程就要负责释放这个锁,其它线程要释放互斥量是无效的。
    3》临界区(Cirtical Section):是比互斥量更加严格的同步手段。把临界区的锁的获取称为进入临界区,而吧锁的释放称为离开临界区。临界区和互斥量与信号量的区别在于,互斥量和信号量在系统的任何进程里都是可见的,也就是说,一个进程创建了一个互斥量或信号量,另一个进程试图去获取改锁是合法的。然而,临界区的作用范围仅限于本进程,其他的进程无法获取改锁。除此之外,临界区具有和互斥量相同的性质。
     4》读写锁(Read-Write Lock):致力于一种更加特定的场合的同步,对于一段数据,多个线程同时读取总是没有问题的,但假设操作都不是原子型,只要有任何一个线程试图对这个数据进行修改,就必须使用同步手段来避免出错。如果使用上述信号量,互斥量或临界区中的热河一种来进行同步,尽管可以保证程序正确,但对于读取频繁,而仅仅偶尔写入的情况,会显得非常低效率。读写锁可以避免这个问题。对于同一个锁,读写锁有两种获取方式,共享的(Shared)或独占的(Exclusive)。当锁处于自由的状态时,试图以任何一种方式获取锁都能成功,并将锁置于对应的状态。如果锁处于共享状态,其他线程以共享的方式获取锁仍然成功,此时这个锁分配给了多个线程。然而,如果其他线程试图以独占的方式获取已经处于共享状态的锁,那么它将必须等待锁被所有的线程释放。相应地,处于独占状态的锁将阻止任何其他线程获取锁,不论它们试图以哪种方式获取,读写锁的行为可以总结如下:
5》条件变量(condition Variable):作为一种同步手段,作用类似于一个栅栏。对于条件变量,线程可以有两种操作,首先线程可以等待条件变量,一个条件变量可以被多个线程等待。其次,线程可以唤醒条件变量,此时某个或所有等待此条件变量的线程都会被唤醒并继续支持。也就是说,使用条件变量可以让许多线程一起等待某个事件的发生,当事件发生时(条件变量被唤醒),所有的线程可以一起恢复执行。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值