linux|linux c进程线程的面试问题,linux 多线程面试题_linux进程线程_linux 线程 pthread_create...

linux|linux c进程线程的面试问题,linux 多线程面试题_linux进程线程_linux 线程 pthread_create...
文章图片

你写了一个简单的mandelbrot set程序,也就是说用ps命令行是可以看见多个线程,win32里同一个进程里各个线程之间是共享数据段的,win32的进程管理方式与unix上有着很大区别。adobe flash socket 、 activex htmlfile (ie) 、 基于 multipart 编码发送 xhr 、 基于长轮询的 xhr线程与进程的区别一个程序至少有一个进程,一个进程至少有一个线程. 。一个进程可以包含若干线程(thread),线程可以帮助应用程序同时做几件事(比如一个线程向磁盘写入文件,另一个则接收用户的按键操作并及时做出反应,互相不干扰),在程序被运行后中,系统首先要做的就是为该程序进程建立一个默认线程,然后程序可以根据需要自行添加或删除相关的线程。
第一个问题很常规,但是要完全答对却不是那么容易,现在想来,第二个问题和第三个问题实际是一个问题,因为第三个问题是验证第二个问题是否说实话的最好的方式。另外,在今年4月6号微软的笔试中,也考到了这第一个个问题,那么,这么方面到底会有哪些问题呢?如果要复习从哪些方面着手呢?
首先,从面试问题的角度,经过网上搜集,我认为会被问到如下问题。
1.进程和线程有什么区别?
在学生回答后,教师要针对回答进行分析和总结,以使学生获得对问题的清晰表述。指导意见:无论我在上面怎么回答,都没有与人员详谈的好,请你进入我们页面详谈,按动(咨询专家)四个字,就是答案上方的长方形,你可以针对你的情形与我们的人员详谈,他可以为你做详细的解答,通过与他的详谈你可以跟他讲述你的病情的起因,后来的发展情形,以及想得到怎样的治疗,都会为你做详细的解答,希望她的回答可以让你早日认清症状,找到对应的治疗方法,早日远离的疾病的困扰,最后祝你早日康复。继上期的菜鸟医生系列之后,小编继续将为菜鸟医生整理、总结常见问题的解答,作为「防身技能」,同时也提高自己知识储备。
a.进程是资源分配的基本单位,线程是cpu调度,或者说是程序执行的最小单位。在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。
b.进程有独立的地址空间,比如在linux下面启动一个新的进程,系统必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种非常昂贵的多任务工作方式。而运行一个进程中的线程,它们之间共享大部分数据,使用相同的地址空间,因此启动一个线程,切换一个线程远比进程操作要快,花费也要小得多。当然,线程是拥有自己的局部变量和堆栈(注意不是堆)的,比如在windows中用_beginthreadex创建一个新进程就会在调用CreateThread的同时申请一个专属于线程的数据块(_tiddata)。
c.线程之间的通信比较方便。统一进程下的线程共享数据(比如全局变量,静态变量),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问的同步与互斥正是编写多线程程序的难点。而进程之间的通信只能通过进程通信的方式进行。
linux|linux c进程线程的面试问题,linux 多线程面试题_linux进程线程_linux 线程 pthread_create...
文章图片

d.由b,可以轻易地得到结论:多进程比多线程程序要健壮。一个线程死掉整个进程就死掉了,但是在保护模式下,一个进程死掉对另一个进程没有直接影响。
e.线程的执行与进程是有区别的。每个独立的线程有有自己的一个程序入口,顺序执行序列和程序的出口,但是线程不能独立执行,必须依附与程序之中,由应用程序提供多个线程的并发控制。
2. 什么是线程安全?(2012年5月百度实习生面试)
如果多线程的程序运行结果是可预期的,而且与单线程的程序运行结果一样,那么说明是“线程安全”的。
3.秒杀多线程中的题目解答
a.线程的概念、线程的基本状态及状态之间的关系
另外,这个网址里面讲操作系统的知识倒是挺详实的,还有另外一种解释线程概念
b.多线程的几种实现方法分别是什么?
linux|linux c进程线程的面试问题,linux 多线程面试题_linux进程线程_linux 线程 pthread_create...
文章图片

这个貌似在java面试中会出现,我是专注于c++的,无视掉,但是不得不说,秒杀多线程面试题系列真心是个好总结
c.多线程同步与互斥有几种实现方法?都是什么?(C++)
1.通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非常相似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换。两个子线程在运行过程中,通过调用waitforsingleobject等待该互斥量,如果此时互斥量处于无信号态,则在等待线程被系统挂起,一直等到互斥量变为信号态才继续运行,waitforsingleobject返回的同时,将使互斥量再次变为无信号态。(2) 线程从用户态进进内核的时间,相干的存放器和用户态代码段的eip已保留了一次,所以,正在所说的内核态线程切换时,需要保留和恢复的内容其真不多。
d.多线程同步和互斥有何异同,在什么情况下分别使用他们?举例说明
互斥量比临界区复杂linux 多线程面试题,因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。2、间接制约关系,即两个线程需要访问同一资源,该资源在同一时刻只能被一个线程访问,这种关系称之为线程间对资源的互斥访问,某种意义上说互斥是一种制约关系更小的同步。互斥与临界区很相似,但是使用时相对复杂一些(互斥量为内核对象),不仅可以在同一应用程序的线程间实现同步,还可以在不同的进程间实现同步,从而实现资源的安全共享。
在linux中,常用的线程同步方法有互斥量( mutex )、读写锁和条件变量,合理使用这三种方法可以保证数据的一致性,但值得的注意的是,在设计应用程序时,所有的线程都必须遵守相同的数据访问规则为前提,才能保证这些同步方法有效,如果允许某个线程在没有得到访问权限(比如锁)的情况下访问共享资源,那么其他线程在使用共享资源前都获得了锁,也会出现数据不一致的问题。线程同步简单的说就是当多个线程共享相同的内存时,当某个线程可以修改变量,而其他线程也可以读取或修改这个变量的时候,就需要对这些线程进行同步,以确保他们在访问变量的存储内容时不会访问到无效的数值。不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成,线程、主内存和工作内存的交互关系如下图所示,和上图很类似。
e.以下多线程对int型变量x的操作,哪几个需要进行同步:
A. x=y; B. x++; C. ++x; D. x=1;
linux|linux c进程线程的面试问题,linux 多线程面试题_linux进程线程_linux 线程 pthread_create...
文章图片

答案是ABC,显然,y的写入与x读y要同步,x++和++x都要知道x之前的值,所以也要同步。
f.多线程中栈与堆是公有的还是私有的
A:栈公有, 堆私有
B:栈公有linux 多线程面试题,堆公有
C:栈私有, 堆公有
D:栈私有,堆私有
答案是C,栈一般存放局部变量,而程序员一般自己申请和释放堆中的数据(详见堆与栈的区别)。
g.在Windows编程中互斥量与临界区比较类似,请分析一下二者的主要区别。
linux|linux c进程线程的面试问题,linux 多线程面试题_linux进程线程_linux 线程 pthread_create...
文章图片

临界区、互斥量、信号灯、事件的区别总结
针对这个题目的话,答案主要有以下几点:
1)互斥量是内核对象,所以它比临界区更加耗费资源,但是它可以命名,因此可以被其它进程访问
2)从目的是来说,临界区是通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
互斥量是为协调共同对一个共享资源的单独访问而设计的。
讨论到这里,其实怎么做到多线程安全也比较明朗了,关键字是atomicity(原子性),只要做到原子性,小到一个primitive type变量的访问,大到一长段代码逻辑的执行,原子性能保证代码串行的执行,能保证代码执行到一半的时候,不会有另一个线程介入。解决问题的关键就是要容易出现问题的代码的原子性,所谓原子性就是指:当a线程在执行某段代码的时候,别的线程必须等到a线程将该段代码执行完毕后,才能执行该代码。为了实现这个需求,我们需要首先拿到全局并发队列(或自己开启一个子线程)来执行耗时的操作,然后在其完成block中拿到全局串行队列来执行ui刷新的任务。
inttally = 0; //global
voidThreadProc()
for(inti = 1; i <= 50; i++)
tally += 1;
但当线程的数量大于处理器的数量时,线程的并发会受到一些妨碍,此时并不是真正的并发,因为此时至少有一个处理器会运行多个线程。1.采用mpi与openmp编译提高计算集群的streambenchmark测试性能的方法,其特征是具体步骤为: 在计算集群中部署mpi环境,将openmp分别部署于计算集群中的各个计算机节点,运行计算集群,在mpi环境中可多线程并发运行程序,线程分配由人为操作来决定每个计算机节点上运行的线程数。更新:放到串行队列的任务,gcd 也会 fifo的取出来,但不同的是,它取出来一个就会放到别的线程,然后再取出来一个又放到另一个的线程。
本文来自电脑杂谈,转载请注明本文网址:
【linux|linux c进程线程的面试问题,linux 多线程面试题_linux进程线程_linux 线程 pthread_create...】http://www.pc-fly.com/a/jisuanjixue/article-114183-1.html

    推荐阅读