我发现线程、进程这个知识点总是特别容易忘记,大三上,上操作系统课那会儿弄懂了,等到大四听到这个知识点又好像没学过那样。现在准备春招了看见这两个字眼有觉得很陌生了,可能是因为没有自己好好地总结所以就忘得很快,希望写完这篇博客可以一劳永逸罢(懒狗的美梦),想要讲清楚进程和线程需要先对操作系统的发展以及特性进行必要的介绍。

操作系统的发展

在早期未配置OS的系统和单道批处理系统中,程序的执行方式是顺序执行,即在内存中仅装入一道用户程序,由它独占系统中的所有资源,只有在一个用户程序执行完成之后,才允许装入另一个程序并执行。可见,这种方式浪费资源、系统运行效率低等缺点。而在多道程序系统中,由于内存中可以同时装入多个程序,使他们共享系统资源,并发执行,显然可以克服上述缺点。程序的这两种执行方式之间有着显著的不同,尤其是考虑到程序并发执行的特征,才导致了在操作系统中映入进程的概念。因此,这里有必要先对程序的顺序和并发执行方式做简单的描述。

顺序执行:(图一)

并发执行:(图二)

其中I代表输入操作,C代表计算操作,P代表输出操作。
顺序执行时存在着这样的前趋关系:I1➡C1➡P1➡I2➡C2➡P2
并发执行时存在着前趋关系:Ii➡Ci、Ci➡Pi、Ii➡Ii+1、Pi➡Pi+1;而Ii+1和Ci和Pi-1是重叠的,即存在Pi-1和Ci及Ii+1之间,不存在前驱关系,可以并发执行。(例:I3、C2、P1三个程序之间不存在前去关系,可以并发执行)

顺序执行和并发执行的特征

顺序执行:

  1. 顺序性(字面意思)
  2. 封闭性:指程序在封闭的环境下运行,即程序运行时独占全部的资源,资源的状态(除初始状态外)值有本程序可能改变他,程序一旦开始执行,其执行结果不受外界因素影响;
  3. 可在现性:指只要程序执行时的环境和初始条件相同,当程序重复执行时,不论它是从头到尾不停顿地执行,还是“停停走走”地执行,都可获得相同的结果。

顺序执行虽然可以给程序员带来方便,但资源的利用率却很低。

并发执行:

  1. 间断性:程序在并发执行时,由于它们共享系统资源,以及为完成同意向任务而互相合作,致使在这些并发执行的程序之间形成了相互制约的关系。例如:图二,中I、C、P是三个相互合作的程序,当计算程序完成C1的计算后,如果输入程序I2尚未完成数据的输入,则计算程序C2就无法进行数据处理,必须暂停运算。只有当使程序暂停的因素小时候(如I2已经完成数据输入),计算程序C2便可恢复执行。由此可见,相互制约将导致并发执行具有“执行——暂停——执行”这种间断性的活动规律。
  2. 失去封闭性:当系统中存在着多个可以并发执行的程序时,系统中的各种资源将为他们所共享,而这些资源的状态也由这些程序来改变,致使其中任一程序在运行时,其环境都必然会受其他程序的影响。例如,当处理机已被分匹配给某个进程运行时,其它进程必须等待。显然,程序的运行已失去了封闭性。
  3. 不可再现性。程序在并发执行时,由于失去了封闭性,也将导致其又失去可在现性。例如,有两个循环程序A和B,他们共享一个变量N。程序A每执行一次时,都要做N=N+1操作:程序B每执行一次时,都要执行Print(N)操作,然后将N置成“0”。程序A和B以不同的速度运行。这样可能出现下述三种情况(假定某时刻变量N的值为1):①N=N+1在Print(N)和N=0之前,此时得到的N值分别为2,2,0。②N=N+1在Print(N)和N=0之后,此时得到的N值分别为1,0,1。③N=N+1在Print(N)和N=0之间,此时得到的N值分别为,1,2,0。

操作系统的基本特征

多道批处理系统、分时操作系统、实时操作系统、等不同的操作系统有着不同的特性,然而并发、共享、虚拟和异步是他们所共有的基本特征。

并发性与并行性的区别:并行性是指两个或多个事件在同一时刻发生。而并发性是指两个或多个事件在同一时间间隔交替运行。(多个事件并发时,倘若每个时间运行的时间片够短,那么在宏观上看,多个事件就可以看起来在同时运行)

异步性:在多道程序环境下,系统允许多个进程并发执行。在单处理机环境下,由于系统中只有一台处理机,因而每次只允许给一个进程执行,其余进程只能等待。当正在执行的进程提出某种资源要求时,如打印请求,而此时打印机正在为其他进程打印,由于打印机属于临界资源(tip:一次仅允许一个进程访问的资源),一次正在执行的进程必须等待,并释放处理机,直到打印机空闲,并再次获得处理机时,该进程方能继续执行。可见,由于资源等因素的限制,使进程的执行通常都不可能“一气呵成”,而是以“停停走走”的方式运行。 对于内存中的每个进程,何时能获得处理机运行,何时又因提出某种资源请求而暂停,以及进程以这样的速度推进,每道程序总共需要多少时间才能完成等等,都是不可预知的由于各用户程序性能的不同,比如,有的侧重于计算而较少需要I/O;而有的进程其计算少而I/O多,这样,很可能是先进入内存的作业后完成,而后进入内存的作业先完成。或者说,进程是以人们不可预知的速度向前推进的,此即进程的异步性。

因操作系统的并发性和异步性导致了传统多道程序设计中程序的不可再现特性(tip:不可再现性即程序每次运行都会产生不同的结果。此时程序的意义便不复存在,你想想如果一个程序每次的运行结果都不一样的话,那还有啥用。),因此引入“进程”的概念,并通过“进程控制块”(又称:PCB,记录进程的基本情况和活动过程)来控制和管理进程,实现进程同步以解决上述不可再现性问题。

引入进程的目的:

在多道程序环境下,程序的执行属于并发执行,此时它们将失去其封闭性,并具有间断性,以及其运行结果不可再现的特征。由此,决定了通常的程序是不能参与并发执行的程序加以描述和控制,人们映引入了“进程”的概念。

进程的定义(从不同的角度可以有不同的定义,较典型的定义):

  1. 进程是程序的一次执行。
  2. 进程是一个程序及数据在处理机上顺序执行时所发生的活动。
  3. 进程是具有独立功能的程序在一个数据集合上运行的过程,它是进行资源分配和调度的基本单位。

进程与程序的区别:

程序存储在硬盘当中是一个静态的概念,由代码段组成。而进程是个动态的概念,

进程有进程控制块(PCB)、程序段、相关的数据段组成

进程和程序不是一一对应的:一个程序可以对应多个进程(例:程序多开)、一个进程也可对应多个程序(例如显卡驱动的进程,但凡需要用到显卡渲染的程序都需要这个进程来服务。)

引入线程前进程的作用:

20世纪60年代中期,人们在设计多道程序OS是,引入了进程的概念,从而解决了在单处理机环境下的程序并发执行问题。此后在长达20年的时间里,在多道程序OS中一直是以进程作为资源分配和调度(运行)的基本单位的。

引入线程后进程的作用:

引入线程后,进程是资源分配的基本单位,线程是调度的基本单位。
线程几乎不占有资源,并且同一个进程的线程可以共享该进程的资源。

引入线程的目的:

如果说在OS中引入进程的目的是为了使多个程序能并发执行,以提高资源利用率和吞吐量,那么,在操作系统中再引入线程,则使为了减少程序再并发执行时所付出的时空开销,使OS具更好的并发性。

传统的进程间并发,需要切换进程的运行环境,由于进程是一个资源的拥有者,因而再创建、撤销和切换中,系统必须为之付出较大的时空开销系统开销。

而在引入了线程后,线程间也可以并发,线程间并发时如果是再统一进程内的线程切换,则不需要切换进程环境,系统开销小。

为什么文件的大小很大,但是当程序运行的时候他的进程占用操作系统内存却要小的多呢

这里要介绍操作系统内存管理的覆盖和交换技术(tip:覆盖技术运用于同一进程,而交换技术用于不同进程,操作系统会动态地把处于阻塞态(又称等待态)的进程换出内存减少占用)同时还要取决于程序本身的设计。
比如:运行绝地求生时,你降落到了机场程序所创建的进程只会把机场的资源加载进入内存,而不是加载整个地图,而当你苟到决赛圈后,此时进程早已把一开始加载进内存的机场的资源换出了内存。

线程和进程总结(无坑版)相关推荐

  1. 使用k8s搭建一个https的wordpress无坑版

    没有想到用k8s搭https版的wordpress能耗时这么久,还搭上了我的基友slash先生,既然这么费事,就记录下来吧.欢迎转载,转载请注明出处,谢谢.至于为什么我们的网站已经隐藏了server的 ...

  2. Retrofit使用SimpleXmlConverterFactory解析xml之无坑版(无坑有效期:暂定17年底)

    假设服务器端的xml文件是这样的 <?xml version="1.0" encoding="UTF-8"?><oschina>< ...

  3. centos7 单机安装ELK7收集nginx日志 无坑版,肯定出图

    系统:centos7 ELK版本:7.8.0 java环境:11 1. 配置JDK #配置JDK11 mkdir /root/source/cd /root/sourcewget https://re ...

  4. 中山大学编译原理实验——实现PL0语言的编译程序(无坑有缩进版)

    PL0-Compiler 代码传送门 ps:吐槽一下,老师给的代码实在是太烂了.又没缩进又多编译错误,除此之外还有很多细节漏掉关键字,总之就很多坑,所以这里发一个无坑带缩进版,方便大家学习. 中山大学 ...

  5. ELK实战,Linux版docker安装ElasticSearch、ES-head、Logstash、Kiabana入门,无坑详细图解

    项目需要,记录一次ELK日志分析系统无坑初始安装过程,并给大家整理出了操作elasticsearch的主要命令,elasticsearch!伙伴们都懂得哦!别的不多说,看过内容概览,直接开整!!! 一 ...

  6. IDEA配置使用mvnd打包的采坑记录(无废话版)

    IDEA配置使用mvnd打包的采坑记录(无废话版) 此处不赘述mvnd的作用了,比maven打包快很多 可参考 https://blog.csdn.net/m4330187/article/detai ...

  7. Python 09--多线程、进程

    本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...

  8. Python开发【Part 11】:线程与进程

    本节内容 操作系统发展史 进程与线程 Python GIL全局解释器锁 Python线程 Python进程 一.操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中 ...

  9. python的进程线程和协程_python成长之路 :线程、进程和协程

    python线程 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分 ...

最新文章

  1. MySQL常用性能分析方法-profile,explain,索引
  2. datasnap的客户端回传机制
  3. xsd的unique验证
  4. SPOJ - LIS2 Another Longest Increasing Subsequence Problem
  5. linux之写C代码出现warning: format not a string literal and no format arguments [-Wformat-security]
  6. (转)mysql基础命令
  7. LeetCode 2196. 根据描述创建二叉树(哈希)
  8. 用友服务器显示禁用,包头用友 U6 运行时提示端口4630 被禁用 或者 1433端口不通...
  9. lambert(兰伯特)投影 应用工具_全息投影技术,在哪些场地可以用到
  10. Linux下安装Apache Maven安装
  11. 单例模式(七种实现方法)
  12. Arbor Networks Spectrum新安全平台发布:高级威胁平台通过内部企业网络连接互联网上的攻击...
  13. 范德蒙行列式、克拉默法则、雅可比矩阵
  14. ElementUI Cascader 级联选择器实现点击文本选中
  15. winform高仿腾讯QQ2013,几十个界面哦!!
  16. APP系列,学院专题讲座图像记录软件推荐
  17. Oracle 11g如何清理数据库的历史日志详解
  18. Java游戏脚本实现
  19. 手机在线提取视频中的音频方法
  20. 快速入门:Slurm资源管理与作业调度系统

热门文章

  1. 软件测试需求分析步骤
  2. 从自媒体人到服务商 职业信鸽主播的快手商业之路
  3. PaddleClas高效实现口红检测识别
  4. 这本记述40年前历史的游戏书,预言的却是当下的事
  5. Uni-app fly 接口封装
  6. Cloud一分钟 |互联网之冬;华为停招,BAT裁员;苹果下线拼多多应用;意媒谈DG风波:中国人记性差...
  7. 深度学习笔记~感受野(receptive field)的计算
  8. LINQ SelectMany cannot be inferred from the usage. Try specifying the type arguments explicitly.
  9. 黑客张福:互联网是黑暗的森林
  10. html字体名称有哪些,css有哪些字体系列?