作者 | 看,未来
责编 | 王晓曼
出品 | CSDN博客

初见进程,先查一下户口

1、进程环境

进程控制块PCB:就是进程在操作系统中的“户口”,具体实现是 task_struct数据结构:1.状态信息,例如这个进程处于可执行状态,休眠,挂起等。2.性质,由于unix有很多变种,进程有自己独特的性质。3.资源,资源的链接比如内存,还有资源的限制和权限等。4.组织,例如按照家族关系建立起来的树(父进程,子进程等)。

2、进程状态

运行状态R(TASK_RUNNING)可中断睡眠状态S(TASK_INTERRUPTIBLE)不可中断睡眠状态D(TASK_UNINTERRUPTIBLE)暂停状态T(TASK_STOPPED或TASK_TRACED)僵死状态Z(EXIT_ZOMBIE)退出状态X(EXIT_DEAD)
以上两部分,了解即可

3、进程原语

(1)fork

#include <unistd.h>pid_t fork(void);

功能:子进程复制父进程中的0~3G空间和PCB,但ID号不同。

Fork调用一次返回两次

父进程中返回子进程ID (就是大于0的意思)

子进程返回0

读时共享写时复制,可保高效

与之相关函数:

#include<sys/types.h>
#include<unistd.h>pid_t getpid(void); //获取进程ID
pid_t getppid(void); //获取父进程ID
#include <unistd.h>
#include <sys/types.h>uid_t getuid(void);//返回实际用户ID
uid_t geteuid(void);//返回有效用户ID

进程的产生方式:

进程的产生有多种方式,但是追本溯源是相通的。

(1)复制父进程的系统环境(放心,只要是你开的进程,肯定有父进程)
(2)在内核中建立进程结构
(3)将结构插入到进程列表,便于维护
(4)分配资源给该进程
(5)复制父进程的内存映射消息
(6)管理文件描述符和链接点
(7)通知父进程

下面是一张进程列表的图,命令:Pstree。

可以看到Init是所有进程的父进程,其他进程都是有Init进程直接或间接Fork出来的。

(2)Exec族

为什么需要Exec函数?

  • Fork子进程是为了执行新程序(Fork创建了子进程后,子进程和父进程同时被OS调度执行,因此子进程可以单独的执行一个程序,这个程序宏观上将会和父进程程序同时进行)。

  • 可以直接在子进程的IF中写入新程序打代码。但这样不够灵活,因为我们只能把子进程程序的源代码贴过来执行(必须知道源代码,而且源代码太长了也不好控制)使用Exec族函数运行新的可执行程序。Exec族函数可以直接把一个编译好的可执行程序直接加载运行。

  • 有了Exec族函数后,典型打父子进程程序是这样的:子进程需要运行的程序被单独编写、单独编译链接成一个可执行程序(Hello)。主进程为父进程,Fork创建了子进程后在子进程中Exec来执行Hello,达到父子进程分别做不同程序同时(宏观上)运行的效果。

代码贴这儿,看这里讲解Exec族:

#include<unistd.h>int execve(const char *path,char *const argv[],char *const envp[]);//这个是真正的系统调用
//以下的函数最后都是调用这个函数int execl(const char *path,char *const argv,···);
int execlp(const char *file,char *const argv,···);
int execle(const char *path,char *const argv,···· ,char *const envp[]);
int execv(const char *path,char *const argv[]);
int execvp(const char *file,char *const argv,);
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>int main(void)
{pid_t pid;if((pid = fork()) < 0){perror("fork");exit(1);}else if(pid == 0){/* child */execl("/bin/ls", "ls", "-l", "-a",NULL);}else{printf("parent, child id = %d.\n",pid);}return 0;
}

(3)Wait/Waitpid

这里几个概念:

  • 僵尸进程:子进程退出,父进程没有及时回收,子进程成为僵尸进程

  • 孤儿进程:父进程退出,而子进程没有退出,子进程成为孤儿进程

  • Init进程:1号进程,负责收留孤儿进程,成为他们的父进程

有5种方式终止进程:
(1)main返回
(2)调用exit
(3)调用_exit
(4)调用abort(给自己发送异常终止信号)
(5)由一个信号终止
#include<sys/types.h>
#include<sys/wait.h>pid_t wait(int *status);
//这里的status为一个整形指针,是该子进程的返回状态。若该指针不为空,则可以通过该指针获取子进程退出时的状态。pid_t waitpid(pid_t pid,int *status,int options);
// pid是进程号
/*<-1 回收指定进程组内的任意子进程-1 回收任意子进程0 回收和当前waitpid调用一个组的所有子进程>0 回收指定ID的子进程
*/
//options:
/*
WNOHANG:强制回收,不阻塞。
WUNTRANCED:一般用上面那个
*/

来个联系方式吧,进程间通信

常用的通信方式有:管道、消息队列、共享内存、文件空间映射

1、管道:两个进程间通信,最古老的通信方式了。

2、消息队列:在内核中建立一个链表,发送方按照一定标识将数据发送到内核中,内核将其放入链表。

()接收方发送请求后,内核按照标识取出消息。

()消息队列是一种完全异步的通信方式。

3、共享内存:共享内存是将内存中的一段地址,在多个进程间共享。多个进程通过挂载在自己名下的地址直接对共享内存进行操作。

4、文件空间映射:Mmap函数用来将文件或设备空间映射到内存中,可以通过对映射后的内存空间操作来获得与操作文件一致的效果。

进程间同步

进程间同步的方法主要有system信号量和进程间锁。

家庭关系如何?(进程间关系)

1、进程组

一个或多个进程组成的集合,进程组的组ID是一个正整数。

//获取当前进程组组IDpid_t getpgid(pid_t pid);
pid_t getpgrp(void);

几个概念:

  • 组长进程:进程ID号等于组ID。

  • 组长进程可以创建一个进程组,创建该进程组中的进程。

  • 只要进程中有一个进程存在,进程组就存在,与组长进程是否终止无关。

  • 进程组生存期:进程组创建到最后一个进程离开(终止或转移到另一个进程组)

//一个进程可以为自己或子进程设置进程组IDint setpgid(pid_t pid,pid_t pgid);//非root进程只能改变自己创建的子进程,或有权限操作的进程

2、会话

pid_t setsid(void);
  • 调用进程不能是进程组组长,该进程变成新会话的首进程。

  • 该进程成为一个新进程组的组长进程。

  • 需要有Root权限(Ubunt不需要)

  • 新会话丢弃原有控制终端,该会话没有控制终端。

  • 建立新会话时,先用Fork,然后父进程终止,子进程调用。

pid_t getsid(pid_t pid);

用于查看当前进程的会话ID。

注意点:组长进程不能成为新会话首进程,新会话首进程必定成为组长进程。

来串伪代码:

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>int main()
{pid_t pid;pid = fork();if(pid == 0){//打印:getpid();//进程IDgetpgid(0);//组IDgetsid(0);//会话IDsleep(10);setsid();//子进程设为会话组长//子进程非组长进程,故其成为新会话首进程,且成为组长进程。//该进程ID即为会话进程ID//再打印一遍getpid();//进程IDgetpgid(0);//组IDgetsid(0);//会话ID}
}

程序、进程与线程的区分

这个问题老师问过我,当时我没答上来。

1、进程是动态的,程序是静态的。

2、一个进程只能对应一个程序,而一个程序可以对应多个进程。

从操作系统方面来看,进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序准备的运行环境。

版权声明:本文为CSDN博主「看,未来」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/qq_43762191/article/details/106024446

【End】

更多精彩推荐
☞国产数据库 OceanBase 二次刷榜 TPC-C,7 亿 tpmC
☞平安科技王健宗:所有 AI 前沿技术,都可以在联邦学习中大展身手
☞踢翻这碗狗粮:程序员花 7 个月敲出 eBay,只因女票喜欢糖果盒
☞我佛了!用KNN实现验证码识别,又 Get 到一招
☞如何使用 SQL Server FILESTREAM 存储非结构化数据?这篇文章告诉你
☞加密价格更新周期:看似杂乱无章,实际内藏玄机
你点的每个“在看”,我都认真当成了喜欢

进程全家桶,看这一篇就够了 | 原力计划相关推荐

  1. 子进程中获取父进程id_进程全家桶,看这一篇就够了 | 原力计划

    作者 | 看,未来 责编 | 王晓曼 出品 | CSDN博客 初见进程,先查一下户口 1.进程环境 进程控制块PCB:就是进程在操作系统中的"户口",具体实现是 task_stru ...

  2. Docker-Compose 基础与实战,看这一篇就够了 | 原力计划

    作者 | 飘渺Jam 责编 | 屠敏 出品 | CSDN 博客 what & why Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排.使用前 ...

  3. 整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划

    作者 | IronmanJay 责编 | 王晓曼 出品 | CSDN博客 Docker 基础介绍 下图为 Docker 图标(是一个鲸鱼上面是集装箱). 1.我们为什么要使用Docker 当我们在工作 ...

  4. docker停止容器后配置_整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划...

    作者 | IronmanJay 责编 | 王晓曼 出品 | CSDN博客 Docker 基础介绍 下图为 Docker 图标(是一个鲸鱼上面是集装箱). 1.我们为什么要使用Docker 当我们在工作 ...

  5. 字节跳动武汉招聘 2000 人,距离大厂 Offer,你还差这篇 Java 干货!| 原力计划...

    [CSDN编者按]金三银四的招聘季,并不会因为疫情而影响太多.据字节调动官宣,该司决定扩大今年在武汉的招聘规模,提供近2000个工作岗位,促进当地人才就业.网上也出现远程入职的字节跳动员工,还没去公司 ...

  6. python详细安装教程-超详细Python与PyCharm安装教程,看这一篇就够了

    原标题:超详细Python与PyCharm安装教程,看这一篇就够了 学习了三天的python, 之前测试一直用课程自带的网页版玩玩, 为了学习 然后就下载了一个python和pycharm 现在分享下 ...

  7. 面试被问到 ConcurrentHashMap答不出 ,看这一篇就够了!

    本文汇总了常考的 ConcurrentHashMap 面试题,面试 ConcurrentHashMap,看这一篇就够了!为帮助大家高效复习,专门用"★ "表示面试中出现的频率,&q ...

  8. Docker的降维打击是怎么利用天时地利人和的?看这一篇就够了

    Docker的降维打击是怎么利用天时地利人和的?看这一篇就够了 容器的诞生 容器技术的奠基 容器生态的奠基 docker的出现 什么是容器 集装箱 容器 容器编排 容器的诞生 容器技术的奠基 2000 ...

  9. 如何应对大数据分析工程师面试Spark考察,看这一篇就够了

    作者丨斌迪.HappyMint 来源丨大数据与人工智能(ID:ai-big-data) [导读]本篇文章为大家带来spark面试指南,文内会有两种题型,问答题和代码题,题目大部分来自于网络上,有小部分 ...

最新文章

  1. keil4怎么移植其他人的程序_裸机程序如何驱动硬件?
  2. android工作注意事项
  3. java类体_计算机二级考试Java类之类声明以及类体
  4. jzoj4224-食物【多重背包】
  5. 精讲23种设计模式-基于观察者模式~设计异步多渠道群发框架
  6. Qt6 在线安装图文步骤
  7. 【转】XSD (xml Schema Definition)
  8. windows查看linux文件工具,「实用工具」介绍几款Windows系统与Linux服务器传递文件的工具...
  9. Android设计模式(1)----单例模式
  10. FishC笔记—14 讲 字符串:各种奇葩的内置方法
  11. 怎么把PDF转换成jpg图片?这两种方法快来get
  12. Google-Spyder:Google搜索引擎关键词检索结果抓取
  13. object与reflect
  14. 在EXCEL电子表格中怎么把页面调成横向的
  15. AMD Software Adrenalin Edition 23.5.1驱动发布,快速获取驱动
  16. 全国计算机一级ms office考试题型,全国计算机考试一级MS Office考试大纲(2017年)
  17. 北大青鸟消防控制器组网_北大青鸟JBF-61S20防火门监控报警主机使用说明书
  18. 华为18级工程师耗时三年才总结出这份Java亿级高并发核心编程手册
  19. Queue、Deque、LinkedList学习
  20. 20221227英语学习

热门文章

  1. 浅谈localStorage、sessionStorage 与cookie
  2. caffe+vs2013+window10+GPU(CPU)配置
  3. JS 仿淘宝幻灯片 非完整版 小案例
  4. 【Demo 0003】Java基础-数组
  5. 我修改的IP地址掩码 呵呵~~开心
  6. [Ubuntu] 软链接
  7. redis mysql qps_14_redis如何通过读写分离来承载读请求QPS超过10万+?
  8. 聚类算法 距离矩阵_论文阅读9——AP聚类算法
  9. 计算机辅助设计简称为才,计算机辅助设计知识分享.ppt
  10. 【图像处理】MATLAB:几何变换与图像配准