进程 线程

简介:

不管Java,C++都有进程、线程相关的内容。在这里统一整理吧。

Python的线程,其实是伪线程,不能真正的并发。下面也有讲。

 

线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈)。

多个线程共享内存。

参考了这篇文章:http://www.cnblogs.com/qiaoconglovelife/p/5319779.html

Top

进程 线程

  • 进程与PCB

    进程:进程是程序的一次执行过程,是系统进行资源分配和调度的一个独立单位。

    进程实体(进程映像):由程序段、相关数据段和PCB三部分构成。进程是动态的,进程实体是静态的。

    PCB(进程控制块):系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程;所谓创建进程,实际上是创建进程映像中的PCB;PCB是进程存在的唯一标志。

 

进程有5种状态,其中前3种是基本状态:

运行态、就绪态、阻塞态(等待态)。另两种是新建态终止态。

 

  • 进程的创建过程

    (1)分配ID与PCB:为新进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的)。若PCB申请失败则创建失败。

    (2)分配资源:为新进程的程序和数据、以及用户栈分配必要的内存空间(在PCB 中体现)。注意:这里如果资源不足(比如内存空间),并不是创建失败,而是处于阻塞态。

    (3)初始化PCB:主要初始化(1)标志信息(2)处理机状态信息(3)处理机控制信息,以及(4)设置进程的优先级等。

    (4)调度:如果进程就绪队列能够接纳新进程,就将新进程插入到就绪队列,等待被调度运行。

    注意,进程的创建是一个原子操作,执行期间不允许中断,它是一个不可分割的基本单位。

 

  • 进程的终止

    引起进程终止的事件主要有:

    (1)正常结束

    (2)异常结束:如存储区越界、非法指令、I/O故障等

    (3)外界干预:如操作员或操作系统干预、父进程请求、父进程终止。

    操作系统终止进程的过程如下:

    (1)根据被终止进程的ID,检索PCB,从中读出该进程的状态

    (2)若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程

    (3)若该进程还有子进程,则应将其所有的子进程终止

    (4)将该进程所拥有的资源,或归还给其父进程或归还给操作系统

    (5)将该PCB从所在队列(链表)中删除。

 

  • 进程之间的切换

    (1)保存处理机上下文,包括程序计数器和其他寄存器。

    (2)更新PCB信息。

    (3)把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。

    (4)选择另一个进程执行,并更新其PCB。

    (5)更新内存管理的数据结构。

    (6)恢复处理机上下文。

    注意:“调度”和“切换”的区别:调度是指决定资源分配给哪个进程的行为,是一种决策行为;切换是指实际分配的行为,是执行行为。一般来说,等有资源的调度,再有进程的切换。

 

  • 线程

    线程是轻量化的进程,是程序执行流的最小单位;由线程ID、程序计数器、寄存器集合和堆栈组成;线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。

 

  • 进程与线程区别

    (1)一个程序至少有一个进程,一个进程至少有一个线程。线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位;

    (2)进程拥有独立的内存单元,而多个线程共享内存。从而线程效率更高;

    (3)进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮;

    (4)进程切换时,耗费资源较大,效率要差一些;

    (5)进程是系统资源分配的基本单位,线程是调度的基本单位。

 

线程独有的内容:

线程上下文,包括线程ID、栈、栈指针、PC(程序计数器)、通用目的寄存器、条件码。

线程共享的内容:

文件描述符和整个用户虚拟地址空间,包括只读文本(代码)、静态变量、堆、所有的共享库代码和数据区域组成。

 

  • 相比进程,线程有什么好处

    (1)易于调度。

    (2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。

    (3)开销少。创建线程比创建进程要快,所需开销很少。。

    (4)利于充分发挥多处理器的功能。 

 

  • 相比进程,线程有什么缺点

    (1)线程之间的同步和加锁控制比较麻烦

    (2)一个线程的崩溃影响到整个程序的稳定性

    (3)线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU 

 

  • 分离线程

    • 线程可以是可结合的,或者是可分离的;
    • 可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回收之前,它的存储器资源(例如栈)是没有被释放的,相反一个分离的线程是不能被其他线程回收或杀死的。它的存储器资源在它终止时由系统自动释放;
    • 为避免存储器泄漏,每个可结合线程都应该被其他线程显式地收回,要么通过调用pthread_detach函数被分离;(对应于Java就是 Thread.join和Thread.detach )
    • 默认情况下,线程被创建成可结合的。(注意:可结合是一种状态,要调用join方法来进行结合/释放)

来一个例子:

复制代码
复制代码
package com.company;


import static java.lang.Thread.sleep;

class Solution {

}

class MyRunnable implements Runnable {

    int x = 5;
    @Override
    public void run() {
        synchronized(this) {
            for (int i = 0; i < 5; i++) {
                System.out.println("hi " + Thread.currentThread().getName() + ":" + x--);
            }
        }
        System.out.println("here to sleep");
        try {
            sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class Main {

    public static void main(String[] args) throws InterruptedException {

        MyRunnable mr = new MyRunnable();
        Thread t1 = new Thread(mr, "1");
        Thread t2 = new Thread(mr, "2");
        Thread t3 = new Thread(mr, "3");

        t1.start();
        t2.start();
        t3.start();

        System.out.println();

    }

}
复制代码
复制代码

打印结果:

复制代码
复制代码
hi 1:5
hi 1:4
hi 1:3
hi 1:2
hi 1:1
here to sleep
hi 3:0
hi 3:-1
hi 3:-2
hi 3:-3
hi 3:-4
here to sleep

hi 2:-5
hi 2:-6
hi 2:-7
hi 2:-8
hi 2:-9
here to sleep
复制代码
复制代码

三个线程,同时sleep了5秒钟,然后整个程序才结束。

如果synchronized加在函数上,那么是每个线程分别sleep 5秒钟,一共sleep 15秒钟。

 

  • IPC方式(进程间通信方式)

    (1)管道:半双工;用于父子、兄弟之间。

    (2)命名管道(FIFO)

    (2)消息队列:消息链表存于内核,每个消息队列由消息队列标识符标识;于管道不同的是,消息队列存放在内核中,只有在内核重启时才能删除一个消息队列;消息队列的大小受限制。

    (3)信号量(semophore):常用来处理临界资源的访问同步问题。临界资源:为某一时刻只能由一个进程或线程操作的资源。

    (4)共享内存:可以说是最有用的进程间通信方式,也是最快的IPC形式。

    (5)套接字:也可用于不同机器之间。

    (6)信号(Signal)

 

  • 线程同步方式

    (1)临界区:当多个线程访问一个独占性共享资源时,可以使用临界区对象。拥有临界区的线程可以访问被保护起来的资源或代码段,其他线程若想访问,则被挂起,直到拥有临界区的线程放弃临界区为止。

(注:Java的synchronized代码段,也勉强可以算作临界区,只是语言标记互斥的实现方式;要访问代码段,需要获得传给synchronized的Object这个对象的锁。注意,每个java对象都隐含有一把锁。 

Java GC需要的safe point,为了让多个线程都停下来,标记的区域-其他线程不进来,里面的线程出来了,就开始GC- 跟临界区的思想也有一点像)

    (2)互斥量-mutex:互斥对象和临界区对象非常相似,只是其允许在进程间使用,而临界区只限制与同一进程的各个线程之间使用。

    (3)条件变量:一个线程被挂起,直到某件事件发生。

    (4)信号量:当需要一个计数器来限制可以使用某共享资源的线程数目时,可以使用“信号量”对象。CSemaphore类对象保存了对当前访问某一个指定资源的线程的计数值,该计数值是当前还可以使用该资源的线程数目。如果这个计数达到了零,则所有对这个CSemaphore类对象所控制的资源的访问尝试都被放入到一个队列中等待,直到超时或计数值不为零为止。

    (5)事件:允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。

    (6)套接字










本文转自 jiu~ 博客园博客,原文链接:http://www.cnblogs.com/jiu0821/p/8628160.html,如需转载请自行联系原作者
目录
相关文章
|
24天前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
2月前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第16天】进程、线程和协程是计算机程序执行的三种基本形式。进程是操作系统资源分配和调度的基本单位,具有独立的内存空间,稳定性高但资源消耗大。线程是进程内的执行单元,共享内存,轻量级且并发性好,但同步复杂。协程是用户态的轻量级调度单位,适用于高并发和IO密集型任务,资源消耗最小,但不支持多核并行。
58 1
|
24天前
|
消息中间件 Unix Linux
【C语言】进程和线程详解
在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。
49 6
|
24天前
|
调度 开发者
深入理解:进程与线程的本质差异
在操作系统和计算机编程领域,进程和线程是两个核心概念。它们在程序执行和资源管理中扮演着至关重要的角色。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
51 5
|
22天前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
24天前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
44 4
|
1月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
1月前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
1月前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
29 1
|
1月前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
45 2