网络编程之 进程

简介: 多进程服务器端

多进程服务器端

  首先博主在这里先告诉大家博主学习的书籍是由
   [韩]韩圣雨 著 金国哲 译 的 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回收)。


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

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


目录
相关文章
|
28天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
4月前
|
Linux
网络编程之信号(处理僵尸进程的终极办法)之初识信号捕捉器
接着我们之前的管道所提出来的问题() 在创建子进程之后,子进程究竟何时终止????调用waitpid函数后还要无休止的等待子进程终止吗???”,这显然会是一个问题。因为父进程往往与子进程一样繁忙,因此我们不能只调用waitpid函数来等待子进程终止。那么我们应该怎么办呢??? 信号闪亮登场!!!!!
30 0
|
4月前
网络编程之 创建多个子进程,避免踩坑。
创建多个子进程 那我们就接着上一篇的博客来讲吧。 如果有朋友提前做过实验的话应该回踩到一点坑吧??比如说我只想要创建5个子进程然后让每个进程打印自己的ID号,但是结果却创建出来了多个进程。博主之前也遇到过这些坑,所以博主现在再这里给大家讲解一下,大家所遇到的情况是如何产生的。 下面请朋友们先看一下博主的演示过程(错误示范)。
27 0
|
5月前
|
存储 网络协议 Java
深入理解Linux网络——内核与用户进程协作之同步阻塞方案(BIO)
在上一部分中讲述了网络包是如何从网卡送到协议栈的(详见深入理解Linux网络——内核是如何接收到网络包的),接下来内核还有一项重要的工作,就是在协议栈接收处理完输入包后要通知到用户进程,如何用户进程接收到并处理这些数据。
|
9天前
|
安全 算法 网络安全
构筑网络长城:网络安全漏洞解析与防御策略深入理解操作系统:进程管理与调度策略
【4月更文挑战第30天】 在数字化时代,网络安全已成为维护信息完整性、确保数据流通安全和保障用户隐私的关键。本文将深入探讨网络安全的核心问题——安全漏洞,并分享关于加密技术的最新进展以及提升个人和企业安全意识的有效方法。通过对常见网络威胁的剖析,我们旨在提供一套综合性的网络防御策略,以助力读者构建更为坚固的信息安全防线。 【4月更文挑战第30天】 在现代操作系统的核心,进程管理是维持多任务环境稳定的关键。本文将深入探讨操作系统中的进程概念、进程状态转换及进程调度策略。通过分析不同的调度算法,我们将了解操作系统如何平衡各进程的执行,确保系统资源的高效利用和响应时间的最优化。文中不仅剖析了先来先
|
4月前
|
存储 JSON 运维
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
53 0
|
4月前
|
消息中间件 Linux
网络编程之 进程间的通信之管道的使用
如何使用管道是进程间通信的关键 博主先声明一下,关于处理进程创建以及销毁的方法。 “子进程究竟何时终止????调用waitpid函数后还要无休止的等待子进程终止吗???”,这显然会是一个问题。因为父进程往往与子进程一样繁忙,因此我们不能只调用waitpid函数来等待子进程终止。那么我们应该怎么办呢???
23 0
 网络编程之 进程间的通信之管道的使用
|
5月前
|
存储 网络协议 NoSQL
深入理解Linux网络——内核与用户进程协作之多路复用方案(epoll)
在上一部分的阻塞模式中(详见深入理解Linux内核网络——内核与用户进程协作之同步阻塞方案(BIO)),用户进程为了等待一个socket就得被阻塞掉,如果想要同时为多个用户提供服务要么就得创建对应数量的进程处理,要么就使用非阻塞的方式。进程不说创建,单论上下文切换就需要很大的耗时,而如果非阻塞的模式,就得轮询遍历,会导致CPU空转,并且每次轮询都需要进行一次系统调用,所以Linux提供了多路复用的机制来实现一个进程同时高效地处理多个连接。
|
5月前
|
Linux
百度搜索:蓝易云【Linux系统下获取系统、BIOS、进程、网络等相关信息的方法和工具。】
综上所述,通过使用命令行工具和图形化工具,可以在Linux系统下获取系统、BIOS、进程和网络等相关信息。根据具体的需求和使用场景,选择合适的工具和命令可以帮助你更好地了解和管理Linux系统。
65 2
|
5月前
|
网络协议 Linux 调度
百度搜索:蓝易云【Linux网络、进程详解。】
综上所述,Linux网络提供了强大的网络配置和通信功能,支持TCP/IP协议栈和各种网络服务。Linux进程管理涉及进程的创建、状态管理和资源管理,以实现任务执行和进程间通信。这些概念和机制是Linux操作系统的核心组成部分,为系统的正常运行和应用程序的开发提供了基础。
64 0