理解进程、线程的含义及区别

什么是进程?

     概念:进程是操作系统动态执行的基本单元,进程就可以说是运行的一段程序(程序:存储在磁盘的可执行文件,当我们有很多程序同时执行时,就有了一种类似于排队的模式,就比如说我去银行柜台取钱,为了同时进行,我们可以规定让每一个人一次性只能取500块钱,取完之后,下一个人接着取,如此循环,先取完钱就相当于程序执行完了,然后慢的就继续刚刚的排队

       进程是指一个内存中运行中的应用程序。每个进程都有自己独立的一块内存空间,一个应用程序可以同时启动多个进程。比如在Windows系统中,一个运行的abc.exe 就是一个进程事例。

    组成: 进程是一个实体。每一个进程都有它的地址空间,一般情况下,包括文本区域(.text)、数据区域(.data)、堆栈(stack、queue)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态内部分配的内存;堆栈区域存储着活动区域调用的指令和本地变量。

   结构: 进程是由 程序、数据、进程控制块三部分组成。

   基本状态转换图:

     运行:CPU在执行进程的命令

     就绪:等待CPU执行的进程

     就绪:等待I/O 事件发生

进程描述符PCB:

     为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为 进程控制块PCB,他是进程实体的一部分是操作系统中重要的记录性数据结构。是进程管理和控制的最重要的数据结构。

     每一个进程都有一个PCB,在创建进程的时候,建立PCB,伴随进程运行的全过程,直到进程撤销而撤销,PCB记录了操作系统所需的,用于描述进程的当前情况和控制进程运行的全部信息(如打开的文件,挂起的信号、进程状态、地址空间等等)

    在linux中每一个进程都由task_struct数据结构定义。task_struct就是我们常说的PCB。它是对进程控制的唯一手段也是最有效的手段。当我们调用fork()时,系统会为我们产生一个task_struct结构,然后从父进程那里继承一些数据,并把新的进程插入到进程树中,以待进程管理。因此了解task_struct的结构对于我们理解进程调度的关键。

    进程新产生时,必须先分配PCB结构,后生成进程主体。

    进程结束时,先释放主体,然后才会释放PCB结构。

    一个进程大概1.7K。

什么是线程?

     概念:线程是操作系统动态执行的最小单元,为什么要引入线程,因为比如你取完钱还有比较重要的事情去做,所以你希望快点把钱取出来,然后你就可以让你的朋友过来和你一块排队,这样取钱的速度就会变快,你叫的朋友就可以理解为 多个线程。我们通常把进程作为分配资源的基本,而线程基本不用资源,所以系统对它的调度开销会小一些,能够更高效的提高多个程序同时执行的效率

     线程是进程中的一个执行任务(控制单元),是进程中的一个实体,是被系统独立调度和分派的基本单元,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它和同属一个进程的其他线程共享进程所拥有的全部资源。

一个进程可以同时并发运行多个线程,如上述例子中,我可以叫来很多个我的朋友同时帮我取钱,每一个朋友在排队帮我去取钱的过程都可以理解为一个线程,而这整个取钱过程为进程。

线程之间的关系:

一个线程可以创建和撤销另一个线程,同一进程中的多个进程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现间断性,线程也有堵塞、运行、就绪三种状态。

特点:

      1.轻型实体(线程的实体包括程序、数据和TCB。TCB用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈)

      2.独立调度和分配的基本单元

      3. 可并发执行

      4. 共享进程资源(所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程间的线程共享内存和文件,所以线程之间互相通信不必调用内核。)

多进程:操作系统中同时运行的多个程序。

多线程:在同一个进程中同时运行的多个任务。

 

进程和线程有什么区别?

 1.进程是资源分配的基本单位,线程是CPU调度,或者说是程序执行的最小单位。

 2.进程有独立的地址空间,启动一个新的进程,系统必须为分配给它独立的地址空间,建立众多的数据表来维护它的代码段、数据段和堆栈段。而运行一个进程中的线程,它们之间共享大部分数据,使用相同的地址空间(堆空间是共享的,栈空间是独立的,线程消耗的资源比较小,相互之间可以影响),当然,线程是拥有自己的局部变量和堆栈。

3.线程之间的通信比较方便。统一进程下的线程共享数据(比如全局变量,静态变量),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问的同步和互斥正是编写多线程的难点。而进程之间的通信只能通过进程通信的方式进行;

4.线程的执行与进程是有区别的。每个独立的线程有自己的一个程序入口,顺序执行序列和程序的出口,但是线程不能独立执行,必须依附在程序之中由应用程序提供多个线程的并发控制。

5.一个进程中的多个线程是并发运行的,那么从微观角度上考虑也是有优先顺序的,那么哪个线程执行完全取决于CPU调度器(JVM来调度),程序员是控制不了的。

 

我们可以把多线程并发性看成是多个线程在瞬间抢夺CPU资源,谁抢到资源谁就运行,这也造就了多线程的随机性。

多线程是通过提高系统资源的利用率来提高我们的运行效率,多线程之间是资源共享的。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值