os基础--多线程进程面试题02

来源:互联网 发布:詹姆斯09年对魔术数据 编辑:程序博客网 时间:2024/06/14 13:50

参考:http://blog.csdn.net/wolenski/article/details/7969908

第四题:多线程同步和互斥有几种实现方法,都是什么?

线程间的同步方法大体可分为两类:用户模式和内核模式。顾名思义,内核模式就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换到内核态,只在用户态完成操作。
用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。内核模式下的方法有:事件,信号量,互斥量。

第五题:多线程同步和互斥有何异同,在什么情况下分别使用他们?举例说明。

线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。

线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步(下文统称为同步)。

--------------------------------------------------我是分割线----------------------------------------------

下表是一个多线程加锁的规律表
  操作的结果与初值无关 操作的结果与初值相关 写简单数据类型 不需要加锁① 需要加锁② 写复杂数据类型 需要加锁③ 需要加锁④ 读简单数据类型 不需要加锁⑤ 不需要加锁⑥ 读复杂数据类型 需要加锁⑦ 需要加锁⑧

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


2.多线程中栈与堆是公有的还是私有的

A:栈公有, 堆私有

B:栈公有,堆公有

C:栈私有, 堆公有

D:栈私有,堆私有

分析:概念上进程作为资源分配的最小单元,线程作为任务调度的最小单元。
如果这题从概念上进行测试的话,就要从任务调度来讲了。
任务调度需要记录线程状态,寄存器上下文还有任务的控制指令。

就是变量和对象的引用存储在栈区中,而对象在存储在堆中。
一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)―   由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) ―   一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区  ―常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区―存放函数体的二进制代码。 
栈和堆的地址是从两端相向增长的栈很小,一般只有几十k,vc6好像是64k堆很大,在win32的虚拟地址空间可以分配到2g的内存栈由程序自动操作,包括局部变量,参数传递,函数跳转时的返回地址等信息堆由程序员自行管理内存,优势,节省空间,不用时即释放,缺点,可能因使用不但造成内存泄露,野指针,造成程序错误。



0 0
原创粉丝点击