• 《Java并发编程实战》读书笔记一 -- 简介


    《Java并发编程实战》读书笔记一 -- 简介

    并发的历史

    并发的历史,也是人类利用有限的资源去提高生产效率的一个的例子。

    设想现在有台计算机,这台计算机具有以下的资源:

    • 单核CPU一个
    • 内存
    • 磁盘
    • 打印机

    就跟下图所示:

    一台简要的计算机
    一台简要的计算机

    很久以前(也没多久,几十年前),计算机只能跑一个程序(可以回想下初学51时候的点灯程序)。这个时候程序是非常的自由的,因为他可以占用整个计算机的所有的资源。如下所示:

    点灯程序占用了所有的资源
    点灯程序占用了所有的资源

    往往有些程序很贱,明明占用着很多的资源,但是却不好好利用,上图的“点灯程序”就是这样一个例子,他只用偶尔用用IO。人们很快就发现了问题,资源浪费太严重了。用我们中国人的话说就是:占着茅坑不拉屎。

    所以,计算机学家们想了一个办法:我不能让一个程序占据了所有的计算机资源,为什么我不写一个程序管理所有的计算机资源,然后其他程序需要使用资源的时候,向这个程序申请资源呢?

    在这种思想的指引下,操作系统出现了。操作系统管理着计算机软件以及硬件的所有资源。这个时候,就跟下面一样了:

    操作系统分配系统资源
    操作系统分配系统资源

    程序需要使用什么资源,向操作系统提出申请,由操作系统统一的进行分配(具体怎么分配,这是个非常高深的学问了)。这样做的好处十分的明显:

    1. 提高了资源的利用率
      例如,程序A在执行的过程中需要等待用户的输入,那么操作系统可以分配一部分程序A不用的资源给程序B使用。

    2. 公平性
      所有的程序都能访问计算机的资源,并不会再次的出现上面的“点灯程序”占用了所有的资源不干活的情况了。

    3. 用户体验
      可以允许多个程序同时的运行,意味着用户体验的提升。以前你只能听完歌以后去浏览网页,现在你可以边听歌边浏览网页,这就是操作系统在底下帮你分配资源的结果。而“同时运行”(注意:这里其实不是同时运行,程序之间切换的时间极短,人类感觉不出来)多个程序,也就是所谓的“并发”。

    现在我们为“程序”这个概念换一个名字,因为实际上,程序是一个静态的概念,指的是我们编写的代码。但是跑在计算机里面的程序可不是静态的,称之为“进程”,接下来都会使用“进程”而不是“程序”了。

    万事大吉了吗?没有!

    假设程序C在某个时刻真的获取到了所有的资源,还是会存在上述的问题:虽然现在是分配资源的形式,不是独占资源的形式,但是每个任务要求的使用的资源还是不一样的,这就导致了资源还是会存在空闲的情况--资源利用率还是不够高(我们希望计算机尽量的忙起来,榨干他)!
    假设程序C有以下几个任务:

    • 任务A:需要使用CPU
    • 任务B:需要使用内存
    • 任务C:需要使用磁盘

    这个时候,一个进程只能执行一个子任务,那么在执行任务A的时候,除了CPU以外的资源又被浪费了。同理,任务B、任务C也是一样。

    聪明的计算机学家一样发现了这个问题,因此,线程出现了。每个线程都独立的运行,都共享着进程的资源(CPU、内存、磁盘等等)。这样,在某个时刻,计算机可能是这样的:

    执行进程C
    执行进程C

    线程A执行任务A的时候,线程B去执行任务B,而线程去执行任务C -- 这样在同一个时刻,系统的资源都得到了充分的利用。

    其实,操作系统分配的资源,也是一个个小小的冯诺依曼计算机,在这个角度上理解,是不是就好理解了呢~

    进程与线程

    概念定义

    进程

    In computing, a process is an instance of a computer program that is being executed. It contains the program code and its current activity. Depending on the operating system (OS), a process may be made up of multiple threads of execution that execute instructions concurrently.

    线程

    In computer science, a thread of execution is the smallest sequence of programmed instructions that can be managed independently by a scheduler, which is typically a part of the operating system.

    以上的定义均来自维基百科,其实按照我的理解:
    1、 进程是操作系统进行资源分配的最小单位;
    2、 线程是CPU最小的执行单元。

    区分进程以及线程概念的区别,只要记住一点就够了:进程是不共享内存的,线程是共享内存的。就是因为线程共享了内存,才会导致到多线程编程的复杂性。其余的区别,可以参考网上的其他资料,这里就不赘述了。

    线程

    线程的优点

    采用多线程的优点比较多,大致有以下几点:

    • 提高了资源的利用率
    • 更加简单的程序设计
    • 对用户更友好的响应

    但是最明显的优点就是:提高了资源的利用率

    一个十分简单的例子就是IO操作,在单线程中的读取文件如下所示:

      5 seconds reading file A
      2 seconds processing file A
      5 seconds reading file B
      2 seconds processing file B
    -----------------------
     14 seconds total
    

    在读取文件的这段时间里,CPU是空闲的,却没有使用CPU。但是,如果使用了多线程,就可以变成以下这个样子:

      5 seconds reading file A
      5 seconds reading file B + 2 seconds processing file A
      2 seconds processing file B
    -----------------------
     12 seconds total
    

    这样就可以在读取文件B的同时,CPU处理文件A了,提升了资源的利用率,节省了总的时间。

    线程的缺点

    个人认为,多线程的缺点十分的明显:由于存在了共享,那么如何使得共享的数据同步是一项非常复杂的工作(这也是我看这本书的原因)。
    接下来的时间里面,我会继续阅读这本书,但是说句实话,此书翻译确实不咋滴,还不如看原文。

    总结

    复习一下,本文主要讲了以下内容:

    • 进程、线程的发展历史
    • 操作系统
      • 系统资源分配的算法
    • 线程的优点、缺点
      每一块内容都可以深入的了解,读者可以挑自己感兴趣的内容自己去深入~
  • 相关阅读:
    eclipse中Preferences的一些设置
    eclipse中文乱码问题解决方案
    classpath、path、JAVA_HOME的作用
    java中抽象类与接口中方法访问修饰符问题 (
    Tomcat配置
    编译型语言和解释型语言
    强类型语言和弱类型语言
    javascript生成指定范围的随机整数
    java中int和Integer的区别
    红黑树入门
  • 原文地址:https://www.cnblogs.com/junhong1995/p/9335602.html
Copyright © 2020-2023  润新知