1.进程的通信方式
- 管道(pipe)
管道包括三种:
普通管道PIPE:通常有两种限制,一是单工,只能单向传输;二是只能在父子或者兄弟进程间使用.
流管道s_pipe:去除了第一种限制,为半双工,只能在父子或兄弟进程间使用,可以双向传输.
命名管道:name_pipe:去除了第二种限制,可以在许多并不相关的进程之间进行通讯. - 信号量(semophore)
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 - 消息队列(message queue)
消息队列是消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 - 信号 (sinal)
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 - 共享内存(shared memory)
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。 - 套接字(socket)
它可用于不同机器间的进程通信。
- 进程与线程的区别
进程是资源分配的最小单位,线程是资源调度的最小单位
进程有自己的独立地址空间
,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据
的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。- 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以进程通信的方式进行。
- 但是多进程程序更健壮,
多线程程序只要有一个线程死掉,整个进程也死掉了
,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
会问到多线程多进程,线程锁,进程锁,死锁
2 线程之间的锁有:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,锁的功能越强大,性能就会越低。
- 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说是
为了避免多个线程在某一时刻同时操作一个共享资源
。例如线程池中的有多个空闲线程和一个任务队列。任何是一个线程都要使用互斥锁互斥访问任务队列,以避免多个线程同时访问任务队列以发生错乱。 - 条件锁就是所谓的条件变量,某一个线程因为某个条件为满足时可以使用条件变量使该程序处于阻塞状态。一旦条件满足以“信号量”的方式唤醒一个因为该条件而被阻塞的线程。
最为常见就是在线程池中,起初没有任务时任务队列为空,此时线程池中的线程因为“任务队列为空”这个条件处于阻塞状态。一旦有任务进来,就会以信号量的方式唤醒一个线程来处理这个任务
。这个过程中就使用到了条件变量pthread_cond_t。
3 进程锁
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
死锁的原因包括系统资源不足、进程运行推进顺序不合适、资源分配不当等。
4 进程共享资源
- 包括软件资源和硬件资源。
- 软件资源有
变量、表格、队列;
- 硬件资源有物理设备,例如:
打印机,输入设备
等。 - 进程共享资源有一个重要内容就是,
共享CPU和内存
。共享CPU采用进程方法实现,共享内存采用进程有独立的内存空间,相互之间不能互相访问。而软件方面的共享内存空间则是共享内存,因此共享内存是进程共享操作系统空间资源。