1.什么是进程,什么是线程,进程和线程的区别
进程是资源申请、调度和独立运行的单元,进程有两部分组成,一是操作系统用来管理进程的内核对象,一是进程所有的独立的地址空间。
线程是程序执行流的最小单元,负责执行包含在进程地址空间中的代码。也有两部分组成,一是操作系统管理线程的内核对象,一是线程栈,用于维护线程在执行代码时所需要的所有函数参数和局部变量。
区别:(1)进程是资源分配的基本单位,线程是cpu调度,或者说是程序执行的最小单位
(2)地址空间:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见;
(3)线程之间的通信比较方便。统一进程下的线程共享数据(比如全局变量,静态变量),通过这些数据来通信不仅快捷而且方便,但需要某些手段比如互斥量,临界区等保证数据的一致性;而进程之间的通信只能通过进程通信(管道,剪切板,消息队列,共享内存等)的方式进行;
(4)调度和切换:线程上下文切换比进程上下文切换要快得多;
(5)线程的执行与进程是有区别的。每个独立的线程有有自己的一个程序入口,顺序执行序列和程序的出口,但是线程不能独立执行,必须依附与程序之中, 由应用程序提供多个线程的并发控制
2.线程同步和互斥实现方法?
临界区(CS:critical section)、事件(Event)、互斥量(Mutex)、信号量(semaphores),需要注意的是,临界区是效率最高的,因为基本不需要其他的开销,其它方法都利用内核对象,需要进行用户态和内合态的转化,开销较大。
3.多线程同步和互斥有何异同,在什么情况下分别使用他们?举例说明
线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。
线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步
举个例子,设有一个全局变量global,为了保证线程安全,我们规定只有当主线程修改了global之后下一个子线程才能访问global,这就需要同步主线程与子 线程,可用关键段实现。当一个子线程访问global的时候另一个线程不能访问global,那么就需要互斥。
4.什么是线程安全
如果多线程的程序运行结果是可预期的,而且与单线程的程序运行结果一样,那么说明是“线程安全”的。
一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题时,那么线程就是安全的。