Linux网络编程

Linux网络环境

僵尸进程、孤儿进程、守护进程、进程组、会话、前台进程组、后台进程组

Linux下进程通信的八种方法

Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量(semaphore),信号(signal),套接字(Socket)
    (1) 管道(pipe):管道允许一个进程和另一个与它有共同祖先的进程之间进行通信;
    (2) 命名管道(FIFO):类似于管道,但是它可以用于任何两个进程之间的通信,命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建;
    (3) 信号(signal):信号是比较复杂的通信方式,用于通知接收进程有某种事情发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持UNIX早期信号语义函数signal外,还支持语义符合POSIX.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD即能实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数的功能);
    (4) 内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它;
    (5) 消息队列(message queue):消息队列是消息的连接表,包括POSIX消息对和System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能成该无格式字节流以及缓冲区大小受限等缺点;
    (6) 信号量(semaphore):信号量主要作为进程间以及同进程不同线程之间的同步手段;
    (7) 共享内存 (shared memory):它使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。这是针对其他通信机制运行效率较低而设计的。它往往与其他通信机制,如信号量结合使用,以达到进程间的同步及互斥;
    (8) 套接字(Socket):它是更为通用的进程间通信机制,可用于不同机器之间的进程间通信。起初是由UNIX系统的BSD分支开发出来的,但现在一般可以移植到其他类UNIX系统上:Linux和System V的变种都支持套接字。

 

Linux 下并发模型:多进程、多线程、线程池

多进程优点:

  • 每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
  • 通过增加CPU,就可以容易扩充性能;
  • 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
  • 每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大

多进程缺点:

  • 逻辑控制复杂,需要和主程序交互;
  • 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算 
  • 多进程调度开销比较大;

多线程模型

多线程的优点

  • 无需跨进程边界; 
  • 程序逻辑和控制方式简单; 
  • 所有线程可以直接共享内存和变量等; 
  • 线程方式消耗的总资源比进程方式好; 

多线程缺点

  • 每个线程与主程序共用地址空间,受限于2GB地址空间; 
  • 线程之间的同步和加锁控制比较麻烦; 
  • 一个线程的崩溃可能影响到整个程序的稳定性; 
  • 到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数; 
  • 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU 

线程池

服务端的线程使用方式一般分为三种:

(1)按需求生成(来一个连接生成一个线程)

(2)线程池(先储备生成很多线程)

参考链接:

【1】https://www.cnblogs.com/sooner/archive/2013/05/16/3082758.html

【2】https://www.cnblogs.com/dingxiaoqiang/p/7543146.html

【3】https://blog.csdn.net/qq_40273354/article/details/78494504

posted @ 2019-11-02 14:26  啦啦啦天啦噜  阅读(481)  评论(0编辑  收藏  举报