1.谈谈对进程的理解?

答:首先进程是指在系统中正在运行的一个应用程序;程序一旦运行就是进程,或者更专业化来说:进程是指程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位,进程有五方面的特点:第一:动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的。第二: 并发性:任何进程都可以同其他进程一起并发执行第三:独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;第四:异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进第五:结构特征:进程由程序、数据和进程控制块三部分组成。进程可以使用fork()函数来创建子进程也可以使用vfork()来实现进程,使用的时候注意不要产生僵尸进程和孤儿进程。

 

2.谈谈对线程的理解?

答:线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流,线程有四方面特点:第一,线程有独立的堆栈段,共享地址空间,开销较小,切换速度较快。第二,线程间的通信机制比较方便。第三,因为操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。线程使CPU系统更加有效。第四,线程改善了程序结构,避免了一些嵌套循环。使用pthread_create()函数来创建线程,使用线程的时候有两点注意事项:第一,当多线程访问同一全局变量的时候,一定要加互斥量,也就是上锁。当然最后不要忘记了解锁。第二:正确处理线程结束的问题:因为一个线程的终止,线程的资源不会随线程的终止释放,我们需要调用pthread_join() 来获得另一个线程的终止状态并且释放该线程所占的资源。

线程安全

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

概念:

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。

线程安全问题都是由全局变量及静态变量引起的。

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

安全性:

比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。那好,我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。安全性:

线程安全性不是一个非真即假的命题。 Vector 的方法都是同步的,并且 Vector 明确地设计为在多线程环境中工作。但是它的线程安全性是有限制的,即在某些方法之间有状态依赖(类似地,如果在迭代过程中 Vector 被其他线程修改,那么由 Vector.iterator() 返回的 iterator会抛出ConcurrentModifiicationException)。对于 Java 类中常见的线程安全性级别,没有一种分类系统可被广泛接受,不过重要的是在编写类时尽量记录下它们的线程安全行为。Bloch 给出了描述五类线程安全性的分类方法:不可变、线程安全、有条件线程安全、线程兼容和线程对立。只要明确地记录下线程安全特性,那么您是否使用这种系统都没关系。这种系统有其局限性 -- 各类之间的界线不是百分之百地明确,而且有些情况它没照顾到 -- 但是这套系统是一个很好的起点。这种分类系统的核心是调用者是否可以或者必须用外部同步包围操作(或者一系列操作)。下面几节分别描述了线程安全性的这五种类别。不可变不可变的对象一定是线程安全的,并且永远也不需要额外的同步[1] 。因为一个不可变的对象只要构建正确,其外部可见状态永远也不会改变,永远也不会看到它处于不一致的状态。Java 类库中大多数基本数值类如 Integer 、 String 和 BigInteger 都是不可变的。需要注意的是,对于Integer,该类不提供add方法,加法是使用+来直接操作。而+操作是不具线程安全的。这是提供原子操作类AtomicInteger的原。线程安全线程安全的对象具有在上面“线程安全”一节中描述的属性 -- 由类的规格说明所规定的约束在对象被多个线程访问时仍然有效,不管运行时环境如何排线程都不需要任何额外的同步。这种线程安全性保证是很严格的 -- 许多类,如 Hashtable 或者 Vector 都不能满足这种严格的定义。
有条件的有条件的线程安全类对于单独的操作可以是线程安全的,但是某些操作序列可能需要外部同步。条件线程安全的最常见的例子是遍历由 Hashtable 或者 Vector 或者返回的迭代器 -- 由这些类返回的 fail-fast 迭代器假定在迭代器进行遍历的时候底层集合不会有变化。为了保证其他线程不会在遍历的时候改变集合,进行迭代的线程应该确保它是独占性地访问集合以实现遍历的完整性。通常,独占性的访问是由对锁的同步保证的 -- 并且类的文档应该说明是哪个锁(通常是对象的内部监视器(intrinsicmonitor))。如果对一个有条件线程安全类进行记录,那么您应该不仅要记录它是有条件线程安全的,而且还要记录必须防止哪些操作序列的并发访问。用户可以合理地假设其他操作序列不需要任何额外的同步。线程兼容线程兼容类不是线程安全的,但是可以通过正确使用同步而在并发环境中安全地使用。这可能意味着用一个 synchronized 块包围每一个方法调用,或者创建一个包装器对象,其中每一个方法都是同步的(就像 Collections.synchronizedList() 一样)。也可能意味着用 synchronized 块包围某些操作序列。为了最大程度地利用线程兼容类,如果所有调用都使用同一个块,那么就不应该要求调用者对该块同步。这样做会使线程兼容的对象作为变量实例包含在其他线程安全的对象中,从而可以利用其所有者对象的同步。许多常见的类是线程兼容的,如集合类 ArrayList 和 HashMap 、 java.text.SimpleDateFormat 、或者 JDBC 类 Connection 和 ResultSet 。线程对立线程对立类是那些不管是否调用了外部同步都不能在并发使用时安全地呈现的类。线程对立很少见,当类修改静态数据,而静态数据会影响在其他线程中执行的其他类的行为,这时通常会出现线程对立。线程对立类的一个例子是调用 System.setOut() 的类。

摘自:https://www.cnblogs.com/Forever-Kenlen-Ja/p/5297068.html

线程,进程,线程安全的理解相关推荐

  1. python是如何实现进程池和线程池的_进程、线程、线程池和协程如何理解?

    1.进程.线程.线程池的概念 进程是一个动态的过程,是一个活动的实体.简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者.可以说,进程中包含了多个可以同时运行的线程 ...

  2. python的进程和线程定位_Python | 进程 线程的理解拾遗

    进程和线程的理解 线程是操作系统能够进行预算调度的最小单位,它包含在进程中是进程中的实际运作单位. Linux 进程有父进程和子进程,window 系统的进程是平等关系 一个标准的线程有线程 ID , ...

  3. 进程 线程 协程_进程 线程 协程 管程 纤程 概念对比理解

    不知道是不是我自己本身就有那么一丝丝的密集恐惧,把这么一大堆看起来很相似很相关的概念放在一起,看起来是有点麻,捋一捋感觉舒服多了. 相关概念 任务.作业(Job,Task,Schedule) 在进程的 ...

  4. Python_进程/线程/多线程理解

    目录 进程.线程.多线程: 1.进程与线程区别 (1)进程与线程区别 (2)多进程与多线程区别 (3)更多区别 2. 进程简单理解 3. 线程简单理解 进程.线程.多线程: 进程:资源分配的最小单位. ...

  5. CPU核心数线程数、程序进程线程、并发并行的简单理解

    CPU核心数线程数.程序进程线程.并发并行.简单理解和区分 这篇文章是对上述感念的简单理解,想深入研究可以看看<计算机组成原理> CPU的核心数 线程数 当我们买电脑的时候,会看到CPU的 ...

  6. 进程、线程和协程的理解

    转自: http://blog.csdn.net/guyan0319 https://blog.csdn.net/guyan0319/article/details/79411626 一.进程  进程 ...

  7. 打开线程 | 进程 | 协程的大门

    不知从几何起,可能是大三那年的操作系统考试,也可能是刚经历完的秋招,这些概念总是迷迷糊糊,可能自己回答的和其他人的答复也差不多,并没有什么亮点,通常都会以:「我们换个题」的方式结束,有时候也挺尴尬的. ...

  8. 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!

    作者:Martin cnblogs.com/mhq-martin/p/9035640.html 基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运 ...

  9. php linux fork进程 多个进程/线程共享一个 socket连接 出现多个进程响应串联

    简单说来就是:因为fork,父子进程共享了一个redis连接.然后父子进程在发送了各自的redis请求分别获取到了对方的响应体. 复现示例代码: testFork.php <?php requi ...

  10. linux 线程 进程经典文章

    进程是程 序在计算机上的一次执行活动.当你运行一个程序,你就启动了一个进程.显然,程序是 死的(静态的),进程是活的(动态的).进程可以分为系统进程和用户进程.凡是用于完成操作系统的各种功能的进程就是 ...

最新文章

  1. unity加载ab后,场景shader不起效问题(物件表现黑色)
  2. 与有利集团总公司,同携手•共辉煌
  3. 基于visual Studio2013解决C语言竞赛题之1027 YN
  4. 零基础转行学习python是否还在纠结?这里告诉你答案!
  5. 即插即打!教你快速上手数码复合机USB打印
  6. (转载)Stackoverflow让我们变懒了?
  7. Java小项目 屏幕自定义尺寸GIF生成器V1.0
  8. 用c语言编写的迷宫游戏代码,C语言编写的迷宫小游戏 源代码
  9. 计算机网络第七版答案
  10. 第十三届“华中杯”大学生数学建模挑战赛题目 A 题 马赛克瓷砖选色问题
  11. 轻松掌握计算机视觉三维重建的几何基础:坐标系与关键矩阵(基础矩阵、本质矩阵、单应矩阵)
  12. 20155313 杨瀚 《网络对抗技术》实验六 信息搜集与漏洞扫描
  13. linux chsh命令参数及用法详解(linux设置系统shell命令) 详细出处参考:http://www.jb51.net/LINUXjishu/57945.html
  14. 锐捷睿易:配置SSH登录
  15. idea导入子工程module
  16. Prometheus 配置钉钉告警
  17. 有1000个瓶子,其中有999瓶是水,1瓶是毒药
  18. Photo Album: Wicresoft
  19. 生日悖论 python程序
  20. 软件管理的“七个女妖”-不要相信她们

热门文章

  1. ArduPilot之开源代码Sensor Drivers设计
  2. Rockland 艾美捷丨TrueBlot链霉亲和素磁珠
  3. eclipse SVN A conflict in the working copy obstructs the current operation
  4. linux添加javahome
  5. HBase配置AES加密
  6. SSH框架面试题(自己+别人的试题)
  7. 微信小程序--操作微信自带的返回按钮使上个页面刷新列表或刷新数据
  8. 把object强制转换成int
  9. redis的可视化RDM操作批量删除key
  10. 一心多用多线程-阻塞队列(5)-CountDownLatch