网络编程之 进程

9 篇文章 0 订阅
5 篇文章 2 订阅

多进程服务器端

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

感谢bingo大佬的提供的书籍
链接:
https://pan.baidu.com/s/12wRc7uH95z6kR3XCqitEag&shfl=sharepset
提取码:q1mx

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

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

我们就直接从本书的第十章开始讲起。
大家应该知道以前的服务器端只能实现一对一的服务,尽管一个服务器服务一个客户端的速度很快,但是假如有1万个客户端要连接到一个服务器端那么这种模式就显得不够看了(这种一对一的方式被称为 单道程序设计)。
所以我们不得不找别的方式来解决这个问题。于是多道程序设计模型应运而生。那么我们来看一下什么是多道程序设计模型。下面请看图片。下面会给出大家相应的解释。
在这里插入图片描述
时钟中断:在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。可以把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。(百度百科)

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

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

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

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

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

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

在这里插入图片描述
在这里插入图片描述
第一次在书上看到这个代码你是不是会感到疑惑呢??
frok函数居然会返回两个值???这已经与我们之前学到的函数的知识相违背了啊,之前如果想要让函数返回两个这就必须要指针进行会带,这个fork居然能返回两个值????

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

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

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

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

在这里插入图片描述
在这里插入图片描述
我们能通过返回值查看到子进程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。(这是我们那本书上没有的,希望大家多多理解。)
在这里插入图片描述在这里插入图片描述
那么bash是啥?
在这里插入图片描述
简言之bash就是你的父进程的父进程。但是他不是第一个进程哦,千万不要搞混了。博主在这里也就把第一个进程的概念给大家吧(这些更详细的大家可以自行百度)。

在这里插入图片描述
init 的有一个作用就是回收 孤儿进程。

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

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

孤儿进程就是(自己的理解): 
     父进程如果结束的比子进程早(即父进程先抢到CPU然后结束),那么此时的子进程就是孤儿进程了。
僵尸进程:
      子进程结束的比父进程早,但是父进程没有回收子进程,而操作系统也不会去销毁子进程。所以就称之为僵尸进程。

	一个子进程如果变成了孤儿进程就不会再变成僵尸进程了(虽然孤儿进程也没有父进程给他回收进程)。他会由我们的第一进程 init来回收掉。

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

孤儿进程(百度百科):
在这里插入图片描述

僵尸进程(百度百科):
在这里插入图片描述
当然了博主认为 bingo 大佬所推荐的电子书对僵尸进程的描述更好下面也给大家展示一下:
在这里插入图片描述
如果想要消灭僵尸进程就需要用到我们的系统函数
wait(阻塞)
waitpid(可设置为阻塞或非阻塞。)

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

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

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

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

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

3.两个新函数 getpid()(获取子进程ID)、getppid(获取父进程ID).父进程的父进程是bash init是第一进程
3.孤儿进程和僵尸进程的概念(孤儿进程由init回收)。

由于本篇博客篇幅已经过长了。所以接下来的内容下一篇博客再分享
下一篇博主打算给大家介绍如何生成多个进程(大家也可以多试一试!!!)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值