进程间通信

3.管道通信

半世苍凉 提交于 2020-03-10 10:40:39
1.无名管道   pipe  没有实际的文件,只是在内核区域分配一段内存空间来模拟管道,pipe创建无名管道会得到两个文件描述符,一个用来读,一个用来写。   int pipe(int pipefd[2]);//创建管道文件   int fds[2];   int ret=pipe(fds);//fds[0]---读文件描述符  fds[1]---写文件描述符,读取管道文件的时候如果管道中没有数据,则read会阻塞,无名管道只适用于父子进程。 #include <stdio.h> #include <unistd.h> int main() { //创建管道文件 int fds[2]; int ret = pipe(fds); //创建进程 pid_t pid=fork(); if(pid==0){ //关闭读文件描述符 close(fds[0]); //子进程写数据 write(fds[1],"hello world",12); close(fds[1]); } if(pid>0){ //关闭写文件描述符 close(fds[1]); //父进程读取数据 char buf[128]; read(fds[0],buffer,sizeof(buffer)); printf("%s\n",buffer); close(fds[0]); } return 0; } 2.有名管道  

进程、线程、协程之概念理解+线程和进程各自有什么区别和优劣

给你一囗甜甜゛ 提交于 2020-03-10 06:09:31
一、概念 首先,根据图了解一下串行,并行和并发的基本概念:   1、进程    资源分配的基本单位 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 Linux系统函数fork()可在父进程中创建一个子进程,在父进程接到新请求时,复制出一个子进程来处理,即父进程监控请求,子进程处理,实现并发处理。注意:必须是Linux系统,windows不能用fork。 组成 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 特征 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。 并发性:任何进程都可以同其他进程一起并发执行 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位; 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的

操作系统面试常常问到的问题

拥有回忆 提交于 2020-03-09 23:50:56
什么是操作系统?它的功能和特征? 操作系统就是管理和控制计算机硬件和软件资源的程序,它的管理功能有: 进程管理 内存管理 文件管理 I/O管理 操作系统是用户与硬件之间的接口,也是硬件和软件之间的接口。 操作系统的四大特征: 并发:两个或多个进程在同一时间间隔内发生,注意和并行的区别。 共享:系统中的资源可供多个并发执行的进程使用。 虚拟:把一个物理实体,变为若干个逻辑上的对应物,如虚拟处理器、虚拟内存、虚拟外部设备。 异步:由于多个程序并发执行和资源有限,进程执行是走走停停的。 什么是管态和目态?为什么要区分管态和目态? 管态:特权态/系统态/核心态,处于管态的程序可以访问计算机任何资源,访问权限不受限制。通常操作系统在管态运行。 目态:常态/用户态,处于目态的程序只能执行非特权指令,不能直接使用系统资源,不能改变CPU工作状态,且只能访问本程序的存储空间。 区分管态和目态的目的:出于安全考虑,保护操作系统程序。内核程序是用户程序的管理者,需要执行一些特权指令,如I/O指令,中断指令等,特权指令不允许用户直接使用。 如何从目态切换到管态 系统调用:使用中断机制,用户态的进程通过系统调用申请使用操作系统提供的服务程序,主动要求切换到内核态。 异常:CPU运行用户态进程时,发生异常,例如缺页,则会切换到处理当前异常的内核程序中。 I/O中断:I/O设备完成用户请求的操作后

linux进程间的那些事儿

北城以北 提交于 2020-03-09 16:25:23
写这篇文章之前,我对linux的进程间通讯还是有些畏惧的,不过看了一些其它文章之后,觉得linux进程间远比我学到的要难得多,首先来说,linux下线程的概念被淡化了,线程又名轻量级进程。线程机制是现代编程技术中常用的一种抽象,提供了在同一程序中共享内存地址控件的一组线程。这些线程可以共享打开的文件和其它资源。线程机制支持并发程序涉及技术,可以保证真正并行处理。linux实现线程的机制非常独特,从内核的角度来说,没有线程这个概念,把所有线程当成进程来实现,内核并没有准备特别的数据结构来表示线程。相反,线程仅仅被视为一个与其它进程共享某些资源的进程,每个线程都拥有唯一率属于自己的task_struct,所以在内核中,看起来像一个普通的进程(只是该级才能哼和其它一些进程共享某些资源,如地址空间). 在windows或是sun solaris等操作系统中,提供了专门支持线程的机制,线程被抽象成一种耗费较少资源,执行迅速的单元。而对于linux来说,它只是一种进程间共享资源的手段。linux线程的创建和普通进程创建类似,只不过在调用clone的时候需要传递一些参数来指明需要共享的资源 clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND,0); 而一个普通的fork实现 clone(SIGCHLD,0) 而vfork的实现是 clone

Linux系统结构详解(转)

試著忘記壹切 提交于 2020-03-09 12:58:37
Linux系统一般有4个主要部分: 内核、shell、文件系统和应用程序 。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所示。 1. linux内核 Linux内核是世界上最大的开源项目之一,内核是与计算机硬件接口的易替换软件的最低级别。它负责将所有以“用户模式”运行的应用程序连接到物理硬件,并允许称为服务器的进程使用进程间通信(IPC)彼此获取信息。 内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。 Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。如图: 系统调用接口:SCI 层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。 1. 内存管理 对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”

操作系统CPU调度知识点

橙三吉。 提交于 2020-03-08 16:06:14
1、 进程基本概念 :进程是程序的一次运行。 是系统进程资源分配和调度的基本单位。 2、进程三态:运行状态、就绪状态、堵塞状态。三态转换规则, 就绪状态 的进程因为调度进程 运行状态 , 运行状态 因为时间片用完而进入 就绪状态 ,因为I/O请求而进入 堵塞状态 。I/O完毕后进入 就绪状态。 创建完毕直接进入 就绪状态 。等待处理机调度。 3、 挂起状态引入原因 :1)终端用户请求。2)父进程请求,3)负荷调节须要,4)操作系统须要。 原三态进一步能够分为:运行状态、活动就绪状态、精巧就绪状态、活动堵塞状态、精巧堵塞状态;处于活动态的进程因为挂起请求而进行精巧状态。 进程创建完毕可直接进入活动就绪状态和精巧就绪状态。程序运行结束就可以进入终止状态。 4、 进程控制块(PCB) :进程标识符、处理机状态、进程调度信息、进程控制信息(程序、数据、资源清单等)。PCB是进程存在的唯一标志。 5、创建进程 创建进程的可能原因:用户登录、作业调度、提供服务、应用请求等。 创建进程过程:1)申请空白PCB,2)为进程分配资源,3)初始化PCB。4)将新进程插入到就绪队列。 6、终止进程 终止进程原因:正常结束、异常结束、外界干预等。 终止进程过程:1)依据进程标识符。在PCB集合中找到目标进程,2)终止该进程的运行,3)撤销其子进程,4)归还系统资源。5)撤销PCB。 7、进程同步概念

多进程多线程简单说明,System V IPC 简介(本机IPC)【linux】(zz)

会有一股神秘感。 提交于 2020-03-08 10:04:16
多进程多线程简单说明 涉及管道通信的多进程和多线程说明 对比多进程和多线程各自使用的场合 线程 进程 System V IPC(本机IPC) 有关System V IPC System V IPC的特点 管道(原始IPC) System V IPC 使用System V IPC时,不存在亲缘进程的说法 System V IPC标识符 怎么才能得到这个“标识符” System V IPC标识符的作用? 多进程多线程简单说明 涉及管道通信的多进程和多线程说明 在使用有名管道实现双向通信时,由于读管道是阻塞读的,为了不让“读操作”阻塞“写操作”,使用了父子进 程来多线操作, 1)父进程这条线:读管道1 2)子进程这条线:写管道2 实际上我们后面在线程以后,凡是涉及到多线操作的,基本都使用多线程来实现 ,比如 1)主线程:读管道1 2)次线程:写管道2 我们这里通过进程间通信的管道方法实现,还会有线程实现的博客说明。 也就是说上面的管道通信, 我们完全可以把父进程改为主线程,把子进程改为次线程 。 对比多进程和多线程各自使用的场合 线程和进程都是并发运行的 ,但是线程和进程各自的使用的场合有所不同。 线程 凡是涉及多线时,我们使用线程来并发实现,比如我们上面实现的“有名管道”双向通信的例子,这个多线操作理论上就应该使用多线程来实现。 因为多线使用线程更省计算机cpu和内存的开销。

第十二章 并发编程

心已入冬 提交于 2020-03-08 09:38:10
第十二章 并发编程 1、并发:逻辑控制流在时间上重叠 2、并发程序:使用应用级并发的应用程序称为并发程序。 3、三种基本的构造并发程序的方法: 进程,用内核来调用和维护,有独立的虚拟地址空间,显式的进程间通信机制。 I/O多路复用,应用程序在一个进程的上下文中显式的调度控制流。逻辑流被模型化为状态机。 线程,运行在一个单一进程上下文中的逻辑流。由内核进行调度,共享同一个虚拟地址空间。 12.1 基于进程的并发编程 构造并发服务器的自然方法就是,在父进程中接受客户端连接请求,然后创建一个 新的子进程 来为每个新客户端提供服务。 基于进程的并发echo服务器的重点内容 (1)需要一个SIGCHLD处理程序,来 回收 僵死子进程的资源。 (2)父子进程 必须关闭 各自的connfd拷贝。对父进程尤为重要,以 避免存储器泄露 。 (3)套接字的文件表表项中的引用计数,直到父子进程的connfd都关闭了,到客户端的连接才会终止。 注意:进程的模型: 共享文件表 ,但不是共享用户地址空间。 优点:一个进程不可能不小心覆盖两个进程的虚拟存储器。 缺点:独立的地址空间使得进程共享状态信息变得更加困难。进程控制和IPC的开销很高。 Unix IPC 是指所有允许进程和同一台主机上其他进程 进行通信 的技术,包括管道、先进先出(FIFO)、系统V共享存储器,以及系统V信号量。 12.2 基于I

Python—进程间通信

◇◆丶佛笑我妖孽 提交于 2020-03-07 11:14:33
from multiprocessing import Process,Pipe import os,time # fd1只能recv,fd2只能send # fd1,fd2 = Pipe(False) # 创建一个双向管道 fd1,fd2 = Pipe() # fd1.close() def fun(name): time.sleep(1) # 子进程发送字符串到管道 fd2.send("hello "+str(name)) print(os.getppid(),"...",os.getpid()) jobs = [] for i in range(5): p = Process(target = fun,args = (i,)) jobs.append(p) p.start() # 父进程从管道接受子进程发送来的消息,发送与接受的都是字符串 for i in range(5): data = fd1.recv() print(data) for i in jobs: i.join()    来源: https://www.cnblogs.com/liuhaidon/p/12432901.html

进程间通信(管道、共享内存、消息队列、信号量)

随声附和 提交于 2020-03-07 04:59:20
进程间通信 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间考到内核缓存区,进程2再内核缓存区把数据读走,内核提供这种机制称为进程间通信。通信方式有:管道、共享内存、消息对列、信号量等 管道 什么是管道呢? 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”, 管道的本质是内核中的一块缓冲区。 管道的特性 ① 半双工通信 :半双工通信(Half-duplex Communication)可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。在这种工作方式下,发送端可以转变为接收端;相应地,接收端也可以转变为发送端。但是在同一个时刻,信息只能在一个方向上传输。因此,也可以将半双工通信理解为一种切换方向的单工通信。 ②: 管道的生命周期随进程 ,进程关闭,对应的管道端口关闭,两个进程都关闭,则管道关闭。 ③: 管道自带同步与互斥 :管道为空时读取,read 阻塞;管道满时写入,write 阻塞。 ④: 管道提供字节流传输服务 管道的分类 ①:匿名管道 ②:命名管道 匿名管道 什么是匿名管道? 匿名管道之所以可以通信的本质在于,父进程frok子进程,父子进程各自拥有一个文件描述符表