`
virtual_function
  • 浏览: 129361 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

1、线程与进程的区别联系

2、进程通信方式有哪些?

3、同步的方式有哪些?

4、ThreadLocal与其它同步机制的比较

5、进程死锁的条件


第一题见:http://289972458.iteye.com/blog/1325189


第二题:


进程间通讯的方式:

  • 管道中还有命名管道和非命名管道之分,非命名管道只能用于父子进程通讯,命名管道可用于非父子进程,命名管道就是FIFO,管道是先进先出的通讯方式。FIFO是一种先进先出的队列。它类似于一个管道,只允许数据的单向流动。每个FIFO都有一个名字,允许不相关的进程访问同一个FIFO,因此也成为命名管。
  • 消息队列:是用于两个进程之间的通讯,首先在一个进程中创建一个消息队列,然后再往消息队列中写数据,而另一个进程则从那个消息队列中取数据。需要注意的是,消息队列是用创建文件的方式建立的,如果一个进程向某个消息队列中写入了数据之后,另一个进程并没有取出数据,即使向消息队列中写数据的进程已经结束,保存在消息队列中的数据并没有消失,也就是说下次再从这个消息队列读数据的时候,就是上次的数据!!!
  • 信号量, 不能传递复杂消息,只能用来同步
  • 共享内存,只要首先创建一个共享内存区,其它进程按照一定的步骤就能访问到这个共享内存区中的数据,当然可读可写;

几种方式的比较:

  • 管道:速度慢,容量有限
  • 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
  • 信号量:不能传递复杂消息,只能用来同步
  • 共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了一块内存的。


第三题:

线程同步指多个线程同时访问某资源时,采用一系列的机制以保证同时最多只能一个线程访问该资源。线程同步是多线程中必须考虑和解决的问题,因为很可能发生多个线程同时访问(主要是写操作)同一资源,如果不进行线程同步,很可能会引起数据混乱,造成线程死锁等问题;


线程同步的方式:

  • 临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问
  • 互斥量:为协调共同对一个共享资源的单独访问而设计的
  • 信号量:为控制一个具有有限数量用户资源而设计
  • 事件:用来通知线程有一些事件已发生,从而启动后继任务的开始

总结比较:

  • 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
  • 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。
  • 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。


第四题:


ThreadLocal和其它所有的同步机制都是为了解决多线程中的对同一变量的访问冲突,在普通的同步机制中,是通过对象加锁来实现多个线程对同一变量的安全访问的。这时该变量是多个线程共享的,使用这种同步机制需要很细致地分析在什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放该对象的锁等等很多。所有这些都是因为多个线程共享了资源造成的。ThreadLocal就从另一个角度来解决多线程的并发访问,ThreadLocal会为每一个线程维护一个和该线程绑定的变量的副本,从而隔离了多个线程的数据,每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的整个变量封装进ThreadLocal,或者把该对象的特定于线程的状态封装进ThreadLocal。由于ThreadLocal中可以持有任何类型的对象,所以使用ThreadLocal get当前线程的值是需要进行强制类型转换。但随着新的Java版本(1.5)将模版的引入,新的支持模版参数的ThreadLocal<T>类将从中受益。也可以减少强制类型转换,并将一些错误检查提前到了编译期,将一定程度地简化ThreadLocal的使用。


总结:当然ThreadLocal并不能替代同步机制,两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通信的有效方式;而ThreadLocal是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源(变量),这样当然不需要对多个线程进行同步了。所以,如果你需要进行多个线程之间进行通信,则使用同步机制;如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal,这将极大地简化你的程序,使程序更加易读、简洁。



第五题:


什么是死锁?如果一个进程集合里面的每个进程都在等待只能由这个集合中的其他一个进程(包括他自身)才能引发的事件,这种情况就是死锁;


这个定义可能有点拗口,一个最简单的例子就是有资源A和资源B,都是不可剥夺资源,现在进程C已经申请了资源A,进程D也申请了资源B,进程C接下来的操作需要用到资源B,而进程D恰好也在申请资源A,那么就引发了死锁。这个肯定每个人都看过了。然后套用回去定义:如果一个进程集合里面(进程C和进程D)的每个进程(进程C和进程D)都在等待只能由这个集合中的其他一个进程(对于进程C,他在等进程D;对于进程D,他在等进程C)才能引发的事件(释放相应资源);


这里的资源包括了软的资源(代码块)和硬的资源(例如扫描仪)。资源一般可以分两种:可剥夺资源(Preemptable)和不可剥夺资源(Nonpreemptable)。一般来说对于由可剥夺资源引起的死锁可以由系统的重新分配资源来解决,所以一般来说大家说的死锁都是由于不可剥夺资源所引起的;


死锁的四个必要条件:

  • 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
  • 请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
  • 非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
  • 循环等待条件(Circular wait):系统中若干进程组成环路,改环路中每个进程都在等待相邻进程正占用的资源。

处理死锁的策略:

  • 忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像;
  • 检测死锁并且恢复;
  • 仔细地对资源进行动态分配,以避免死锁;
  • 通过破除死锁四个必要条件之一,来防止死锁产生;

 

分享到:
评论

相关推荐

    操作系统常见面试题及答案

    ### 操作系统常见面试题及答案深度解析 #### 进程与线程的理解与区分 在探讨操作系统原理时,进程(Process)与线程(Thread)的概念及其差异是基础而关键的知识点。进程是系统中运行中的程序实例,是资源分配和...

    操作系统常见面试题.docx

    面试中,关于操作系统的常见问题涵盖了多个关键概念,以下是一些重点知识点的详细解释: 1. **进程状态及转换**: - 进程通常有三种基本状态:就绪、运行和阻塞。在某些操作系统中,还有创建和终止状态。 - **...

    操作系统常见面试题总结.pdf

    操作系统是计算机系统的核心组成部分,负责管理和控制系统的硬件和软件资源,提供用户接口和...操作系统面试题涵盖了从基础概念到高级特性的广泛内容,理解并掌握这些知识点对于理解和解决实际操作系统问题至关重要。

    操作系统常见面试题总结.docx

    操作系统面试中常见的问题涵盖了进程与线程、进程状态转换、同步与互斥、进程间通信以及调度算法等多个核心概念。下面将详细解释这些知识点。 **进程与线程的区别** 1. **粒度性分析**:线程是操作系统调度的基本...

    2021面试题总结操作系统篇.pdf

    2021面试题总结操作系统篇 操作系统是计算机科学中最重要的组成部分之一,负责管理计算机的硬件资源,并提供公共服务来方便用户使用计算机。操作系统的面试题涵盖了进程管理、线程管理、进程同步、线程同步、缓冲区...

    操作系统面试常见题.pdf

    "操作系统面试常见题" 操作系统是计算机科学中非常重要的一部分,它管理着计算机的硬件资源,并提供了一个平台让应用程序可以运行。操作系统面试常见题涵盖了操作系统的基本概念、进程管理、线程管理、同步和异步、...

    操作系统常见笔试面试题

    操作系统是计算机系统的核心...以上就是针对操作系统常见笔试面试题的详细解答,涵盖了进程与线程、进程通信、线程同步、进程调度、死锁处理、内存管理等多个核心概念,对理解操作系统原理和应对相关面试有很大帮助。

    Oracle常见面试题

    以下是一些关于Oracle常见面试题的知识点,这些知识点对于理解Oracle数据库的核心概念、功能和最佳实践至关重要。 1. **Oracle数据库版本与组件**:了解Oracle的不同版本(如Standard Edition、Enterprise Edition...

    c++和操作系统面试题

    本文旨在总结和解释 C++ 和操作系统的常见面试题,帮助读者更好地理解和掌握相关知识点。 C++ 知识点 1. inline 函数的使用限制:inline 函数只能用于简单的函数体代码,不能包含复杂的结构控制语句,如 while 和 ...

    日志系统常见面试题总结

    本文将深入探讨日志系统常见面试题,帮助求职者掌握关键知识点,以便在面试中脱颖而出。 1. **日志的分类与级别** - **系统日志**:记录操作系统级别的事件,如系统启动、用户登录、硬件故障等。 - **应用日志**...

    华为校招笔试面试题合集.zip

    整理了一下华为往届笔试面试题,希望对大家有帮助。超级有用的面试题:Java常见面试题 常见算法面试题 数据库常见面试题 操作系统常见面试题 C/C++常见面试题 大数据常见面试 python常见面试。

    2023年java工程师面试宝典(附BAT大厂真题)

    2.设计模式的常见面试题汇总 3.消息队列常见面试题 4.RockMQ从入门到实战 5.图解操作系统 6.分布式相关的面试题 7.BAT大厂真题汇总 1. Java基础知识的汇总 2.设计模式的常见面试题汇总 3.消息队列常见面试题 4....

    iOS一些常见面试题word

    在iOS开发领域,面试题是评估候选人技能的关键工具。这些题目通常涵盖Objective-C或Swift语言的基础,UIKit框架的使用,内存管理,多线程,网络编程,数据持久化,设计模式等多个方面。以下是一些iOS面试中常见的...

    C_CPP面试题大全

    包含 C面试题(整理).pdf、C++面试题集(最全的CC++试题集和答案).doc、C语言面试题大全.pdf、操作系统常见面试题及答案.pdf、程序员面试宝典(C语言).pdf、面试题的整理.pdf、全面的c++题库.pdf,有兴趣可以瞧瞧奥~

    操作系统常见笔试题.rar

    本压缩包“操作系统常见笔试题.rar”包含了与操作系统相关的常见笔试题目,旨在帮助备考者全面理解和掌握操作系统的核心概念、原理以及实际应用。以下是基于这些笔试题目的知识点详细说明: 1. **进程与线程** - ...

    zookeeper常见面试题

    下面是关于 ZooKeeper 的一些常见面试题和知识点。 ZooKeeper 的使用场景 1. 分布式协调:ZooKeeper 可以实现分布式系统之间的协调工作,例如,在分布式系统中,A 系统发送请求到消息队列,然后 B 系统消费消息...

    (保研面试总结资料)408等专业课+常见面试题集锦+其他.zip

    “常见面试题”是指在保研面试过程中可能会遇到的问题,通常包括但不限于基础理论知识、项目经验、编程能力、问题解决能力和研究潜力等方面。例如,面试官可能会询问考生对计算机网络协议的理解,数据结构的设计与...

    大数据常见面试题(2019版)

    这份2019版的大数据常见面试题集涵盖了Java在大数据环境中的关键知识点,旨在帮助求职者准备相关的面试。以下是一些可能的面试问题及其详细解答: 1. **Java内存模型与垃圾回收** - Java内存分为堆内存和栈内存。...

    arm常见面试题

    ### ARM常见面试题知识点解析 #### 一、ARM工作模式 **知识点1:ARM的七种基本工作模式** - **用户模式(User)**: 正常应用程序运行的模式。 - **快速中断模式(FIQ)**: 用于处理高速中断,如DMA传输。 - **...

    android常见面试题总结

    以下是对"android常见面试题总结"的详尽解析,涵盖了核心概念、系统架构、UI设计、性能优化等多个方面。 一、Android基础知识 Android是一个开源的操作系统,基于Linux内核,主要用于移动设备。面试中常问的基础...

Global site tag (gtag.js) - Google Analytics