面试总结-进程、线程与多线程

线程、进程和多线程是面试过程中很容易遇到的问题,去年百度三面的时候就遇到这个问题,当时百度hr问到:线程和进程的区别是什么?你写过多进程或者多线程的程序吗?在你看来多线程和多进程程序那种程序比较难写?

第一个问题很常规,但是要完全答对却不是那么容易,现在想来,第二个问题和第三个问题实际是一个问题,因为第三个问题是验证第二个问题是否说实话的最好的方式。另外,在今年4月6号微软的笔试中,也考到了这第一个个问题,那么,这么方面到底会有哪些问题呢?如果要复习从哪些方面着手呢?

 

首先,从面试问题的角度,经过网上搜集,我认为会被问到如下问题。

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

这个一个最常见,却最不好回答的问题,csdn上面一位博主给出的解答和另一位cnblog博主的解答稍微清晰些一些,总结起来,就是一下的几个区别:

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

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

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

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

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

 

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

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

 

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取值范围。 

inttally = 0;//global

 

voidThreadProc()

 

{

 

       for(inti = 1; i <= 50; i++)

 

            tally += 1;

 

}

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

   

时间: 2024-09-11 23:38:24

面试总结-进程、线程与多线程的相关文章

并发性-Web服务器的最大并发数和进程线程的关系疑问

问题描述 Web服务器的最大并发数和进程线程的关系疑问 刚才看了一篇关于进程线程的文章,一个进程会分配2G可用内存,一个线程默认会分配1M内存.那么一个进程最多能产生2000左右的线程数.那么一个web服务器(Tomcat)中一个请求过来,就会创建一个线程来处理,理论上不是只能最多处理2000并发请求了?而nginx好像可以处理更大并发(上万个).这是怎么实现的(不是每个请求生成一个线程?)?另外一个进程会分配2G可用内存是不是绝对的?还是只针对32位系统,64位是不是不止这个大小. 请高手指点

php与python实现的线程池多线程爬虫功能示例_php技巧

本文实例讲述了php与python实现的线程池多线程爬虫功能.分享给大家供大家参考,具体如下: 多线程爬虫可以用于抓取内容了这个可以提升性能了,这里我们来看php与python 线程池多线程爬虫的例子,代码如下: php例子 <?php class Connect extends Worker //worker模式 { public function __construct() { } public function getConnection() { if (!self::$ch) { sel

java 线程创建多线程详解_java

Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类. 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: Tread thread = new Thread(); thread.start(); 在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了. 编写线程运行时执行的代码有两种方式:一种是创建 Thread 子类的一个实例并重写 run 方法,第二种是创建类的时候实现 Run

12篇学通C#网络编程——第一篇 基础之进程线程

       在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下. 一:概念           首先我们要知道什么是"进程",什么是"线程",好,查一下baike.   进程:是一个具有一定独立功能的程序关于某个数据集合的一次活动.它是操作系统动态执行的基本单元,            在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元.   线程:是"进程"中某个单一顺序的控制流.    关

Java多线程编程基础之线程和多线程

[写在前面] 随着计算机技术的发展,编程模型也越来越复杂多样化.但多线程编程模型 是目前计算机系统架构的最终模型.随着CPU主频的不断攀升,X86架构的硬件已 经成为瓶,在这种架构的CPU主频最高为4G.事实上目前3.6G主频的CPU已经接近了顶峰. 如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能),那么 继续提高CPU性能的方法就是超线程CPU模式.那么,作业系统.应用程序要发挥 CPU的最大性能,就是要改变到以多线程编程模型为主的并行处理系统和并发式 应用程序. 所以,掌握

线程池-多线程同步数据且等多线程同时完成后再走主线程

问题描述 多线程同步数据且等多线程同时完成后再走主线程 用线程池管理,开10条线程去读取和更新几十万数据,但是主线程直接跑下去了,这个不能允许,但是线程池又不能用join来.自己建Thread join,这10条线程又是一条条运行,不合要求.应该如何做,谢谢 解决方案 子进程睡眠不同的时间,父进程wait但是忽略子进程死信号,这样父进程会是最后退出的

DB2的进程/线程解析

今天看到一个名词,数据库实例用户和实例隔离用户,那么什么是实例隔离用户呢,于是搜索以下,就涉及到了进程. 援引DB2中国上面的回答:   要理解DB2的fenced user, 需要先理解db2的fenced process.   DB2在V95之后从多进程模式改为多线程模式,也就是说绝大部分数据库核心程序都运行在db2sysc这个进程中.这种单进程多线程的架构改善了性能,但是同时增加了运行"不安全代码"带来的风险.因为大家都运行在一个进程里,任何一段不安全的代码出现问题会导致整个DB

进程 线程-进程与线程的区别????

问题描述 进程与线程的区别???? 进程与线程的区别??????????????????????????????????? 解决方案 一个进程可以开辟多个线程,线程是进程的子集 解决方案二: 操作系统将内存资源分配给进程,操作系统在进程下执行线程,一个进程下可以有多个线程.

php与python 线程池多线程爬虫的例子

php例子 <?php   class Connect extends Worker  //worker模式 {   public function __construct() {   }   public function getConnection() { if (!self::$ch) { self::$ch = curl_init(); curl_setopt(self::$ch, CURLOPT_TIMEOUT, 2); curl_setopt(self::$ch, CURLOPT_R