首页 > 编程知识 正文

Linux编程期末大作业,进程线程协程的区别

时间:2023-05-05 03:56:57 阅读:61997 作者:1463

进程通信和线程通信:1.进程间通信:管道

管道的传输数据是单向的,如果想相互通信,必须创建两条管道。 半双工。

1 .匿名管道

用完扔掉。 intpipe(intFD[2]

个是管道的写入侧描述符fd[0],另一个是管道的写入侧描述符fd[1]。 请注意,此匿名管道是一个特殊文件,只存在于内存中,不存在于文件系统中。通信的数据是无格式的流并且大小受限

2 .命名管道:

因为数据是先进先出的传输方式。

管道这种通信方式效率低,不适合进程间频繁地交换数据

管道是内核中的字符串缓存。 从管段写入的数据实际上缓存在内核中,并从另一端读取。 也就是说,它是从内核读取的。

最后:

发现对于匿名管道,其通信范围为父子关系的进程。 因为管道没有实体,也就是说没有管道文件,所以只能通过fork复制父进程的fd文件描述符来达到通信的目的。 另外,关于命名管道,无关的进程之间也可以相互通信。 为了命令管道,预先创建了管道类型的设备文件,在流程中只需使用此设备文件即可相互通信。消息队列:

基本原理: a进程向b进程发送消息。 a进程可以将数据放在相应的消息队列中,然后返回正常。 b进程在需要时读取数据就可以了。

特点:

消息队列是存储在内核中的消息链表,每个消息体都是一个固定大小的存储块。 如果进程从消息队列中检索消息主体,内核将删除该消息主体。 如果消息队列未释放,或者操作系统未关闭,则消息队列存在。 缺点:

来不及通信,附件也有尺寸限制。 消息队列不适合传输比较大数据。 每个消息主体都有最大长度限制,所有队列中所有消息主体的总长度也有上限。 消息队列通信期间,用户状态和内核状态之间的http://www.Sina.com/http://www.Sina.com /

共享内存解决了读取和写入消息队列的过程中出现用户状态和内核状态之间的消息复制的问题。

是检索块虚拟地址空间并将其映射到同一物理内存。 此共享内存由一个进程创建,但可以由多个进程访问。 这样一来,这个过程写的东、别的过程很快就能看到,不需要全部复制,提高了过程之间通信的速度。

数据拷贝开销

为了防止多进程竞争共享资源和数据错乱,必须有一种机制来保护共享资源在任何时间只能由各个进程访问。 信号量将实现这一保护机制。 信号实际上是整数计数器,主要用于实现进程之间的互斥和同步,而不是用于缓存进程之间通信的数据。共享内存:

信号是进程间通信机制中唯一的信号量:

关于异常时的动作模式,需要用信号通知进程。

Ctrl C产 SIGINT信号,表明结束该过程; Ctrl Z产 SIGTSTP信号指示该过程已停止但尚未结束;

1 .执行默认操作。 在Linux上,每个信号都规定了默认操作。 例如,SIGTERM信号意味着终止进程。

2 .捕捉信号。 可以定义信号的信号处理函数。 发送时,执行适当的信号处理函数。

3 .无视信号。 当我们不想处理特定的信号时,可以无视那个信号什么都不做。 两个信号(SIGKILL和SEGSTOP )根据工艺方法被捕获和忽略。 这些信号随时会中断或终止进程。

信号:

异步通信机制

intsocket(intdomain、int type、int protocal ) )根据套接字类型:

实现TCP字节流通信:套接字类型为AF_INET和SOCK_STREAM;

实现UDP数据报通信:套接字类型为AF_INET和SOCK_DGRAM;

2、线程间通信:Socket:

由于同一进程的不同线程共享同一内存空间,因此可以在线程之间轻松快速地共享信息。 只需将数据复制到共享(全局或堆)变量中。那要想跨网络与不同主机上的进程之间通信,就需要 Socket 通信了。还可以在同主机上进程间通信

1、排他锁定在访问共享资源前进行锁定,访问完成后解除排他锁定。 锁定后,希望访问此资源的其他线程将进入块中,直到当前线程解除互斥锁定。 注意防止死锁。

2、读写锁定一次只能有一个线程占用写入模式的读写锁定,但多个线程可以同时占用线程间的通信目的主要是用于线程同步。所以线程没有像进程通信中的用于数据交换的通信机制。的读写锁定。

读写锁定

写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞。当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权,但是任何希望以写模式对此锁进行加锁的线程都会阻塞,直到所有的线程释放它们的读锁为止。 3、条件变量

互斥量用于上锁,条件变量则用于等待,并且条件变量总是需要与互斥锁一起使用,运行线程以无竞争的方式等待特定的条件发生。

条件变量本身是由互斥量保护的,线程在改变条件变量之前必须首先加互斥锁。(某共享数据达到某值的时候,唤醒等待这个共享数据的线程)

4、信号量

使用线程的信号量可以高效地完成基于线程的资源计数。信号量实际上是一个非负的整数计数器,用来实现对公共资源的控制。

在公共资源增加的时候,信号量就增加;公共资源减少的时候,信号量就减少;只有当信号量的值大于0的时候,才能访问信号量所代表的公共资源。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。