进程、线程与多线程

1.进程和线程有什么区别?html

总结起来,就是一下的几个区别:java

    a.进程是资源分配的基本单位,线程是cpu调度,或者说是程序执行的最小单位。在Mac、Windows NT等采用微内核结构的操做系统中,进程的功能发生了变化:它只是资源分配的单位,而再也不是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。所以,实现并发功能的单位是线程。linux

    b.进程有独立的地址空间,好比在linux下面启动一个新的进程,系统必须分配给它独立的地址空间,创建众多的数据表来维护它的代码段、堆栈段和数据段,这是一种很是昂贵的多任务工做方式。而运行一个进程中的线程,它们之间共享大部分数据,使用相同的地址空间,所以启动一个线程,切换一个线程远比进程操做要快,花费也要小得多。固然,线程是拥有本身的局部变量和堆栈(注意不是堆)的,好比在windows中用_beginthreadex建立一个新进程就会在调用CreateThread的同时申请一个专属于线程的数据块(_tiddata)。c++

    c.线程之间的通讯比较方便。统一进程下的线程共享数据(好比全局变量,静态变量),经过这些数据来通讯不只快捷并且方便,固然如何处理好这些访问的同步与互斥正是编写多线程程序的难点。而进程之间的通讯只能经过进程通讯的方式进行。程序员

    d.由b,能够轻易地获得结论:多进程比多线程程序要健壮。一个线程死掉整个进程就死掉了,可是在保护模式下,一个进程死掉对另外一个进程没有直接影响。面试

    e.线程的执行与进程是有区别的。每一个独立的线程有有本身的一个程序入口,顺序执行序列和程序的出口,可是线程不能独立执行,必须依附与程序之中,由应用程序提供多个线程的并发控制。编程

 

2. 什么是线程安全?(2012年5月百度实习生面试)windows

  若是多线程的程序运行结果是可预期的,并且与单线程的程序运行结果同样,那么说明是“线程安全”的。安全

 

3. 秒杀多线程中的题目 解答多线程

  a.线程的概念、线程的基本状态及状态之间的关系

    另外,这个网址里面讲操做系统的知识却是挺详实的,还有另一种解释线程概念

  b.多线程的几种实现方法分别是什么?

    这个貌似在java面试中会出现,我是专一于c++的,无视掉,可是不得不说,秒杀多线程面试题系列真心是个好总结

  c.多线程同步与互斥有几种实现方法?都是什么?(C++)

   临界区(CS:critical section)、事件(Event)、互斥量(Mutex)、信号量(semaphores),须要注意的是,临界区是效率最高的,由于基本不须要其余的开销,二内核对象涉及到用户态和内核态的切换,开销较大,另外,关键段、互斥量具备线程全部权的概念,所以只能够用于线程之间互斥,而不能用到同步中。只有互斥量能完美解决进程意外终止所形成的“遗弃问题”。

  d.多线程同步和互斥有何异同,在什么状况下分别使用他们?举例说明

   所谓同步,表示有先有后,比较正式的解释是“线程同步是指线程之间所具备的一种制约关系,一个线程的执行依赖另外一个线程的消息,当它没有获得另外一个线程的消息时应等待,直到消息到达时才被唤醒。”所谓互斥,比较正式的说明是“线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任什么时候刻最多只容许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥能够当作是一种特殊的线程同步。”表示不能同时访问,也是个顺序问题,因此互斥是一种特殊的同步操做。

   举个例子,设有一个全局变量global,为了保证线程安全,咱们规定只有当主线程修改了global以后下一个子线程才能访问global,这就须要同步主线程与子线程,可用关键段实现。当一个子线程访问global的时候另外一个线程不能访问global,那么就须要互斥。

   e.如下多线程对int型变量x的操做,哪几个须要进行同步: 
    A. x=y;      B. x++;    C. ++x;    D. x=1;

           答案是ABC,显然,y的写入与x读y要同步,x++和++x都要知道x以前的值,因此也要同步。

   f.多线程中栈与堆是公有的仍是私有的

    A:栈公有, 堆私有

    B:栈公有,堆公有

    C:栈私有, 堆公有

    D:栈私有,堆私有

    答案是C,栈通常存放局部变量,而程序员通常本身申请和释放堆中的数据(详见堆与栈的区别)。

   g.在Windows编程中互斥量与临界区比较相似,请分析一下两者的主要区别。

     临界区、互斥量、信号灯、事件的区别总结

     针对这个题目的话,答案主要有如下几点:

      1)互斥量是内核对象,因此它比临界区更加耗费资源,可是它能够命名,所以能够被其它进程访问

      2)从目的是来讲,临界区是经过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 
            互斥量是为协调共同对一个共享资源的单独访问而设计的。 

   h.一个全局变量tally,两个线程并发执行(代码段都是ThreadProc),问两个线程都结束后,tally取值范围。 

    int tally = 0; //global
  
    void ThreadProc()
  
    {
  
             for (inti = 1; i <= 50; i++)
  
                 tally += 1;
  
    }

    当两线程串行时,结果最大为100,当某个线程运行结束,而此时另一个线程刚取出0,还未计算时,结果最小为50。