网络编程之 进程

简介: 多进程服务器端

多进程服务器端

  首先博主在这里先告诉大家博主学习的书籍是由
   [韩]韩圣雨 著 金国哲 译 的 TCP/IP网络编程,把网络变成写的通俗易懂。
   下面是百度云链接,大家感兴趣的也可以看一看

链接:

https://pan.baidu.com/s/12wRc7uH95z6kR3XCqitEag&shfl=sharepset

提取码:q1mx


也许会有读者问道,你的博客不是讲网络编程的吗?为什么讲起进程来了?? 主要原因是这本书关于socket套接字部分写的已经很棒了,但是在线程和进程方面知识略略带过如果大家希望掌握线程和进程的话,那么这本书数远远不够的。当然了博主对这些也不是很熟悉,后面的博客也就是聊一聊博主自己对进程和线程的看法。


那么我们就开始吧!!!!


我们就直接从本书的第十章开始讲起。

大家应该知道以前的服务器端只能实现一对一的服务,尽管一个服务器服务一个客户端的速度很快,但是假如有1万个客户端要连接到一个服务器端那么这种模式就显得不够看了(这种一对一的方式被称为 单道程序设计)。

所以我们不得不找别的方式来解决这个问题。于是多道程序设计模型应运而生。那么我们来看一下什么是多道程序设计模型。下面请看图片。下面会给出大家相应的解释。

20191022181602667.png

时钟中断:在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。可以把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。(百度百科)


我们就能利用时钟中断让各个程序来占用CPU的一部分从而完成并发(由于人的视觉间隔较大,所以在我们看来这就是一起运行的,但是在计算机内部不是这样的,计算及内部是各个程序抢占CPU然后由时钟中断中断连接,再让CPU处于被争夺状态。)

大家不必纠结单道程序设计和多道程序设计,目前我们所接触到的都是多道程序设计。

给大家介绍一下 fork函数(创建进程。)

20191022183425550.gif

的GIF动画一样,当我们的程序运行到了 fork 函数的时候就会创建一个子进程。这个子进程和父进程是一样的。这个是时候就想相当于最后那一条线一样,调用了frok函数,父进程就多了一个分支。


注意!!!!!

子进程(右边的图)的优先级并不比父进程(左边的图)的优先级要低,也就是他们可以一起抢夺CPU,谁先抢到CPU就先运行谁。

现在到了给大家解决疑惑的时候了。

大家看那一本书上面的代码(博主在这里接直接给大家截取出来)。

20191022184317100.png

20191022184317100.png

20191022184121514.png

第一次在书上看到这个代码你是不是会感到疑惑呢??

frok函数居然会返回两个值???这已经与我们之前学到的函数的知识相违背了啊,之前如果想要让函数返回两个这就必须要指针进行会带,这个fork居然能返回两个值????


其实并没有与我们之前的认知相违背,请大家仔细看看我们之前演示的GIF动画,在调用fork之后又会出现一个新的进程。那么我们就能知道了吧


(父进程哪里返回的值其实就是 子进程的ID,子进程返回的值为0!!!)


所以就会有上面的if else语句的存在了。


也许会有人问到如下问题(给出图片):

20191022184955230.png

2019102218500424.png

我们能通过返回值查看到子进程ID那么应该如何获得父进程ID呢???


这本书上确实漏掉这一部分下面博主给大家介绍两个函数,这两个函数就是用来获取进程ID的函数。


#include<stdio.h> //所属头文件
printf("child ID: %u,  parent ID %u",getpid(),getppid());
pid_t getpid(void)  //获取子进程ID
pid_t getppid(void) //获取父进程ID(如果在父进程调用这个函数会发现父进程的父进程ID就是 1171(也就是bash!!!))


下面给出博主的代码:

可以看出我们成功获得了父进程的ID。(这是我们那本书上没有的,希望大家多多理解。)

20191022200639714.png

20191022192940912.png

那么bash是啥?

       20191022193121658.png                        

简言之bash就是你的父进程的父进程。但是他不是第一个进程哦,千万不要搞混了。博主在这里也就把第一个进程的概念给大家吧(这些更详细的大家可以自行百度)。

       20191022193313779.png                        


init 的有一个作用就是回收 孤儿进程。


大家看过书应该就会知道“僵尸进程吧”,那么怎么又会有孤儿进程呢??


这就是书上没有提到的概念了。


孤儿进程就是(自己的理解): 
     父进程如果结束的比子进程早(即父进程先抢到CPU然后结束),那么此时的子进程就是孤儿进程了。
僵尸进程:
      子进程结束的比父进程早,但是父进程没有回收子进程,而操作系统也不会去销毁子进程。所以就称之为僵尸进程。
  一个子进程如果变成了孤儿进程就不会再变成僵尸进程了(虽然孤儿进程也没有父进程给他回收进程)。他会由我们的第一进程 init来回收掉。


博主的理解可能不是很准确下面就给出标准定义

孤儿进程(百度百科):


20191022194605254.png

僵尸进程(百度百科):

20191022194534749.png

当然了博主认为 bingo 大佬所推荐的电子书对僵尸进程的描述更好下面也给大家展示一下:

20191022194856537.png

如果想要消灭僵尸进程就需要用到我们的系统函数

wait(阻塞)

waitpid(可设置为阻塞或非阻塞。)


这两个函数介绍起来相对复杂,博主就在之后博客再为大家讲解了。


接下来给大家总结一下本篇博客到底讲了什么??


1.并发的概念(就是多道程序设计)


2.fork函数创建子进程(注意观看博主的gif动画。)

 返回值有2个:  一个进程(通过调用frok函数)生成--> 2个进程 ---> 各自对fork做返回.
  1. 返回子进程的pid (非负整数 > 0)  (父进程)
  2. 返回0         (子进程)

3.两个新函数 getpid()(获取子进程ID)、getppid(获取父进程ID).父进程的父进程是bash init是第一进程

3.孤儿进程和僵尸进程的概念(孤儿进程由init回收)。


由于本篇博客篇幅已经过长了。所以接下来的内容下一篇博客再分享

下一篇博主打算给大家介绍如何生成多个进程(大家也可以多试一试!!!)


目录
相关文章
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
Linux
网络编程之信号(处理僵尸进程的终极办法)之初识信号捕捉器
接着我们之前的管道所提出来的问题() 在创建子进程之后,子进程究竟何时终止????调用waitpid函数后还要无休止的等待子进程终止吗???”,这显然会是一个问题。因为父进程往往与子进程一样繁忙,因此我们不能只调用waitpid函数来等待子进程终止。那么我们应该怎么办呢??? 信号闪亮登场!!!!!
157 0
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
187 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
212 1
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
C语言
C语言 网络编程(八)并发的UDP服务端 以进程完成功能
这段代码展示了如何使用多进程处理 UDP 客户端和服务端通信。客户端通过发送登录请求与服务端建立连接,并与服务端新建的子进程进行数据交换。服务端则负责接收请求,验证登录信息,并创建子进程处理客户端的具体请求。子进程会创建一个新的套接字与客户端通信,实现数据收发功能。此方案有效利用了多进程的优势,提高了系统的并发处理能力。
|
缓存 运维 NoSQL
使用 psutil 获取硬件、网络以及进程信息
使用 psutil 获取硬件、网络以及进程信息
251 0
|
缓存 安全 Web App开发
Chrome插件实现问题之网络进程接收到URL请求后会如何解决
Chrome插件实现问题之网络进程接收到URL请求后会如何解决
|
安全 网络安全 调度
云计算与网络安全:云服务、网络安全、信息安全等技术领域深入理解操作系统:进程调度的奥秘
【8月更文挑战第27天】本文将探讨云计算与网络安全之间的关联,包括云服务、网络安全、信息安全等技术领域。我们将通过代码示例来展示如何保护云计算环境中的数据和应用程序。最后,我们将讨论如何应对云计算环境中的网络安全挑战,以保护数据和应用程序免受攻击。

热门文章

最新文章