进程与线程

进程:

   进程是操作系统中的一个基本概念,是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。(比如:执行了qq.exe,qq.exe就是一进程)

有了进程的概念,就引出了多进程的概念:

多进程的多个进程的意思,多进程是指一个程序中有多个独立的进程在同时运行,每个进程都有自己的内存空间,可以独立运行,互不影响。多进程可以提高程序的运行效率,提高系统的吞吐量,提高程序的可靠性,提高程序的安全性。进程之间可以共享数据,这种共享数据的方式称为进程间通信(IPC)。IPC可以通过共享内存、消息队列、信号量、管道等方式实现。
        一个程序可以有多个进程,这取决于程序的需求。比如:你需要在网络上拿数据,并进行计算。每行程序是会依次往下执行,此时你就会发现,当你从网上拿数据的时候,计算就停了;计算的时候,不能从网上拿数据;需要等待从网上拿完数据后,才能进行计算。这样就很影响效率,为了提高效率,就可以使用多进程:

让cpu在计算时,去网上拿数据:

总体就是:拿数据和cpu计算这两件事互不干涉,就像两个程序一样。这就是多进程。

程序能否实现多进程取决于cpu的核心数:

        核心数其实就是cpu的个数,一个cpu只有一个控制单元、计算单元、数据单元。而上面说:两个进程同时进行计算,这肯定是不可能的因为只有一个计算单元,只能对一条指令进行计算。

        如果cpu是多核的,也就是多个cpu,那么多进程是肯定可以实现的。

        那么单核cpu能不能实现多进程呢?答案是:可以的。

                

单核CPU实现多进程的方法有:

1. 使用时间片轮转(Time Slice Round Robin):即把CPU的时间片分配给每个进程,每个进程执行完自己的时间片后,再分配给下一个进程,以此类推,实现多进程的调度。

2. 使用中断(Interrupt):当一个进程执行完毕后,发出一个中断信号,CPU接收到中断信号后,就会调度下一个进程。

3. 使用多级反馈队列(Multi-level Feedback Queue):多级反馈队列是一种比较复杂的调度算法,它将进程分为不同的优先级,每个优先级有一个队列,每个队列有一个时间片,当一个进程执行完毕后,就会被调度到下一个优先级的队列中,以此类推,实现多进程的调度。

但是,其中最普遍的还是使用时间片轮转的方式

        当然,多核cpu也可以使用时间片轮转的方式,提高了cpu地利用率,更好地利用cpu资源,这样就又提高了效率。(不一定使用时间片轮转的方式,也由很多的方式,这些方式都是操作系统通过分析程序的情况而定的)

进程的安全性:

        因为多个多个进程之间数据是共享的,所以可以通过一个进程访问到另一个进程,比如qq.exe就可以访问到mysql数据库的进程,从而拿到一些账号密码,或是对其造成伤害。搞死进程,可以让电脑死机或是蓝屏。

为了解决问题,出现了线程,有时可以把线程叫做:轻量进程.

线程:

线程是操作系统中的一个基本概念,是进程的一个实体,是被系统独立调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

 线程是一个进程内的可以单独执行的任务,任务就是就是一行指令代码,比如计算、函数调用、打印输出......

        一个进程必然有一个(主)线程,也可以有多个线程。

多线程:

多线程是指一个程序中可以同时运行多个线程,每个线程可以独立运行同时也可以共享程序中的其他资源,此时共享的就不再是计算机内存的数据了,而是共享进程内部的存储器的数据。

多线程可以提高程序的运行效率,使程序可以同时处理多个任务。比如:你的程序打印某组数据的时候,可以再打印另外一组数据。或是打印数据时,可以进行函数的调用。或是函数调用时,进行其他的任务。更好理解一点:

 一个程序就像是一个公司,公司内部如果只有一个人(一个线程)那么他就要完整地按照企业规定的日常计划进行(代码按照顺序运行)这些工作全部都得由拿一个人完成,如果公司内部多了一些人(多线程),那么这些工作就可以分配给其他人。如此这般,工作就可以高效率地完成了。

很重要地思想:一个程序内部想要实现多线程,那么内部各个任务一定是独立出来的,互不影响。如果有影响,多线程就毫无意义。比如:第一个任务进行计算,第二个任务你要打印一个数据,可是第二个任务要打印的数据,是第一个任务计算的结果。那么就需要等待第一个任务结束后,得到的结果,才能让第二个任务进行。而此时你让两个任务同时跑起来,将毫无意义。

线程切换:

        线程切换是指在多线程环境下,当一个线程正在执行某个任务时,另一个线程可以抢占CPU的执行权,从而把CPU从一个线程转移到另一个线程,这种过程就叫做线程切换。

        线程切换的目的是为了提高系统的效率,使得多个线程可以同时执行,从而提高系统的吞吐量。另外,线程切换还可以让系统更加灵活,可以更好地利用CPU的资源,提高系统的效率。

其实线程切换就是单核cpu实现多线程的方法,与单核cpu实现多进程相似。同样地,也和多核cpu运行多线程程序时一样,为了提高了cpu地利用率,更好地利用cpu资源,这样就又提高了效率。(不一定使用时间片轮转的方式,也由很多的方式,这些方式都是操作系统通过分析程序的情况而定的)

是不是线程越多(都是可以单独执行的指令(任务)),执行效率越高?

        (这里可能会疑问?为什么会问这么nt的问题,指令越多,效率肯定慢啊?其实这里说的是相比于正常按照顺序依次执行的程序,而这样的程序拥有的指令都是单独执行的,此时如果把他变成多线程程序,那么是不是会效率更高呢?(其实问题是这样的)---希望可能帮到各位)

并不是的,当有10000个线程(任务)时,操作系统需要保证这10000个线程(任务)有都能被执行并且都有时间(需要分配每个线程执行的时间)来执行,而操作系统这一举动就已经消耗量大量计算资源了,从而就会降低效率。

单核cpu对于多线程有没有意义?

有意义,因为单核cpu也可以实现多线程,采用的方式也是时间片轮转的原理。从而实现多线程的效果。

对于一个程序,设置线程的个数的计算公式。

总结进程和线程的区别:

1、进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)。

2、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

3、线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

4、但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

多进程和多线程程序执行的流程:

1.多进程程序执行的流程是:操作系统创建多个进程,每个进程都有自己的独立的内存空间,每个进程可以独立运行。

2.多线程程序执行的流程是:操作系统创建多个线程(其实就是操作系统把你的代码翻译成操作系统的语言,然后因为你的语言创建了多线程,所以操作系统也会创建多线程,这样才能控制cpu),每个线程共享同一个进程的内存空间,每个线程可以同时运行。

下面是扩展了解:

1.多线程和多进程的程序是被操作系统控制的,操作系统通过进程调度和线程调度来实现多进程和多线程,进程调度是指操作系统根据进程的优先级、状态等信息,决定哪个进程先执行;线程调度是指操作系统根据线程的优先级、状态等信息,决定哪个线程先执行。

2.一个进程会被分配到多个CPU内核,操作系统会根据系统资源情况,调度多个进程,把多个进程放到多个CPU内核上,以实现最优的资源利用。

3.现代,所说的cpu几核几线程,几核指的是几个核心 也就是几个cpu处理器包括了:控制单元,数据单元,计算单元。几线程就是比普通cpu多了程序计数器、寄存器、栈等组件,这些组件组合起来叫做:线程硬件。

4.CPU的核心数对应了线程数,CPU是8核的,那么他就可以同时执行8个线程,相当于一个核心执行一个线程,这也可以从构造上看出(一个线程的构成是需要程序计数器,而cpu核心就是一个cpu,而cpu里只有一个程序计数器),但是现在发明了一种技术叫做:超线程技术。

        

超线程技术:

超线程技术是一种技术,它可以让一个CPU核心同时执行多个线程,从而提高CPU的效率。它的原理是,在一个CPU核心内部,把一个核心分成两个虚拟核心,每个虚拟核心可以同时执行一个线程,从而实现一个CPU核心同时执行多个线程的效果。

超线程技术原理:

解释:

       如上图: 其实是再一个cpu核心内部有两套数据单元,即:2寄存器和2程序计数器,然后通过时间片轮转或其他方式,让ALU(逻辑运算单元)一会计算一边的数据单元,一会再计算另一遍地数据单元,从而实现一个cpu核心计算两线程.

5.一个程序最多可以有多少进程取决于操作系统的内存限制和计算机的性能。因为运算的事情是由线程完成的,进程其实就是从内存拿空间,给线程运算的,一旦内存被占用完,进程就没办继续执行(拿空间)了。

6.进程最多有65535个,这是因为每个进程都有一个唯一的进程ID,而进程ID是一个16位无符号整数,最大值为65535,因此不考虑内存和cpu,则最多可以有65535个进程。

计算机底层:进程与线程。相关推荐

  1. [转]从根上理解高性能、高并发:深入计算机底层,理解线程与线程池

    系列 <从根上理解高性能.高并发(一):深入计算机底层,理解线程与线程池> <从根上理解高性能.高并发(二):深入操作系统,理解I/O与零拷贝技术> <从根上理解高性能. ...

  2. 从根上理解高性能、高并发(一):深入计算机底层,理解线程与线程池

    本文原题"聊聊TCP连接耗时的那些事儿",本次收录已征得作者同意,转载请联系作者.有少许改动. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关 ...

  3. Interview:算法岗位面试—BAT公司问题面试之计算机基础(进程与线程的区别)、经典概率问题等集锦

    Interview:算法岗位面试-BAT公司问题面试之计算机基础(进程与线程的区别).经典概率问题等集锦 目录 计算机基础问题 1.进程与线程的区别 概率问题 1.貂蝉与西施回头率比美问题 计算机基础 ...

  4. 计算机操作系统“进程”与“线程”的通俗解析

    进程:进程是系统进行资源分配和调度的一个独立单位. 线程:线程是进程的一个实体,是CPU调度和分派的基本单位,线程自己基本上不拥有系统资源,只拥有一点在系统运行中必不可少的资源,但是它可与同属一个进程 ...

  5. 计算机组成原理进程与线程,计算机组成原理--GPU

    算是读书笔记吧 GPU 的历史进程 GPU 是随着我们开始在计算机里面需要渲染三维图形的出现,而发展起来的设备 90 年代中期,随着个人电脑的性能越来越好,PC 游戏玩家们开始有了"3D 显 ...

  6. 从根上理解高性能、高并发(七):深入操作系统,一文读懂进程、线程、协程

    本文引用了"一文读懂什么是进程.线程.协程"一文的主要内容,感谢原作者的无私分享. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早 ...

  7. Java程序员需要掌握的计算机底层知识(三):进程、线程、纤程、中断

    面试高频问题 问:进程和线程有什么区别? 答:进程是一个程序运行起来的状态(运行态),线程是一个进程中不同的执行路径(线程只是其中一个). 更为专业的回答:进程是操作系统用来分配资源的基本单位,线程是 ...

  8. 文件读取 linux_Linux 进程、线程、文件描述符的底层原理

    说到进程,恐怕面试中最常见的问题就是线程和进程的关系了,那么先说一下答案:在 Linux 系统中,进程和线程几乎没有区别. Linux 中的进程其实就是一个数据结构,顺带可以理解文件描述符.重定向.管 ...

  9. 计算机工作原理及进程和线程的区别

    课前导读: 本篇是关于计算机工作原理和多线程编程的解读,主要包括计算机发展背景.图灵大佬生平.冯诺依曼体系结构.cpu与Gpu.电路门.CPU具体的特点.编程语言.Java的前世今生.操作系统.进程的 ...

最新文章

  1. 如何应用Java的BigDecimal类
  2. html百度蜘蛛跳转代码,php搜索引擎劫持,百度蜘蛛劫持,搜索引擎蜘蛛劫持原理及代码分享...
  3. Google Chrome Frame
  4. 2015第29周五AOP
  5. Codeforces Round #694 (Div. 2) D. Strange Definition 质因子分解 + 平方数
  6. 认识CUBA平台的CLI
  7. hive或mysql报错Too many connections
  8. awk java_Linux三剑客之awk
  9. Django应用部署 - 上线指南
  10. linux下创造进程指令,Linux系统创建一个新进程(下)
  11. 虚拟机XP系统突然变卡顿解决办法
  12. Jmeter脚本录制 badboy的下载安装教程
  13. 克转换成千克怎么算python_斤公斤千克的换算(克和公斤怎么转换)
  14. win32asm写的红警2的修改器
  15. bps和pps各自是什么意思?
  16. Linux进程中的RSS和VSZ
  17. HDU 5441并查集 by cyl
  18. 山海演武传·黄道·第一卷 雏龙惊蛰 第二章 修闵本饰邪
  19. ASEMI代理AD9833BRMZ-REEL原装ADI车规级AD9833BRMZ-REEL
  20. 编写一个C程序,输入a,b,c三个值,输出其中最大者

热门文章

  1. 今日简报 每日精选12条新闻简报 每天一分钟 知晓天下事 4月23日
  2. Adobe Acrobat Professional 7.0
  3. 智能建筑弱电工程基本的一些施工项目
  4. QT 5.7 for iOS Xcode 8 Project ERROR: Xcode not set up properly. You may need to confirm the license
  5. 数据线三合一充电线方案(苹果安卓Type-c充电线) LDR6020
  6. Mybatis下传入时间条件,查询慢的优化方法
  7. Mysq数据量不大查询速度却很慢,记录一次left join查询优化
  8. 毛球科技论述区块链之符号理论(上)
  9. PHPUnit袖珍指南 第六章 装置器
  10. LC1665. 完成所有任务的最少初始能量(推公式贪心)