进程与线程的区别? 进程间通信与线程间通信

要理解进程与线程先来看多任务机制:

  1. 多任务处理机制是指用户可以在同一时间内运行多个应用程序,每个正在执行的应用程序被称为一个任务。多任务操作是系统使用某种调度(shedule)支持多个任务并发执行,多任务操作系统通常有三个基本概念:任务、进程和线程

  2. 进程的基本概念:进程是指一个具有独立功能的程序在某个数据集合上的动态执行过程,它是操作系统进行资源分配的基本单元。简单的说,进程是一个程序的一次执行过程。例如打开一个Windows资源管理器是在执行一次进程,运行一个浏览器阅读Web网页也是在执行一次进程。进程具有并发性、动态性、交互性和独立性等重要特性。
    进程和程序的区别程序是一段静态的代码,是一段指令和数据的有序集合,没有任何执行的概念,程序是永久的、静态的。进程是一个动态的概念,它是程序的一次执行过程(在RAM上执行),包括了动态创建、调度、执行和消亡的整个过程,它是程序执行和资源分配的最小单位,进程是暂时的、动态的。

  3. 线程的基本概念:通常线程是指共享相同地址空间的多个任务。线程最大的特点就是在同一个进程中创建的线程共享该进程的地址空间,线程和进程都参与统一调度。多线程的优点体现于:①大大提高任务切换的效率;②线程间通信方便,因为在同一块地址空间数据共享。缺点:因为共享地址空间,如果其中一个线程出错,整个线程都会崩溃。

  4. 概括进程与线程之间的区别
    根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。
    开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
    所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)。
    内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
    包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

进程间通信
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间交换数据要靠内核,在内核中开辟一块缓冲区,进程1把数据从用户空间复制到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(InterProcess Communication,IPC)。
使用较多的进程间通信的方式主要有以下几种:
管道(Pipe)及有名管道(Named Pipe)。管道可用于具有亲缘关系进程间的通信,有名管道,除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。
共享内存(Shared Memory)。可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。
消息队列(Message Queue)。消息队列是消息的链接表,包括Posix消息队列和SystemV消息队列。它克服了前两种通信方式中信息有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新的信息;对消息队列有读权限的进程可以从中读取消息。
信号(Signal)。信号是在权健层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某时间发生,一个进程接收到一个信号与处理器收到一个中断请求效果上可以说是一样的。
信号量(Semaphore)。其主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。
套接字(Socket)。这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

线程间通信:(线程间通信参考:https://blog.csdn.net/liubing8609/article/details/81700284)
线程间通信常用的方法有如下三种:
全局变量。由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量。对于标准类型的全局变量,我们建议使用volatile修饰符,它告诉编译器无需对该变量作任何的优化,即无需将它放到一个寄存器中,并且该值可被外部改变。
参数传递方式。该方式是线程通信的官方标准方法,多数情况下,主线程创建子线程并让其子线程为其完成特定的任务,主线程在创建子线程时,可以通过传给线程函数的参数和其通信。
Message消息机制。常用的Message通信的接口主要有两个:PostMessagePostThreadMessage。PostMessage为线程向主窗口发送消息,而PostThreadMessage是任意两个线程之间的通信接口。
线程同步法。还可以通过线程同步来实现线程间通信。例如有两个线程,线程A写入数据,线程B读出线程A准备好的数据并进行一些操作。这种情况下,只有当线程A写好数据后线程B才能读出,只有线程B读出数据后线程A才能继续写入数据,这两个线程之间需要同步进行通信。关于线程同步的方法和控制是编写多线程的核心和难点,方法也比较多。

你可能感兴趣的:(C学习笔记)