Linux下的系统编程——进程(七)

news2025/1/13 3:32:26

前言:

程序是指储存在外部存储(如硬盘)的一个可执行文件, 而进程是指处于执行期间的程序, 进程包括 代码段(text section) 和 数据段(data section), 除了代码段和数据段外, 进程一般还包含打开的文件, 要处理的信号和CPU上下文等等.下面让我们开始对Linux进程的学习吧

一、进程的概念:

1.程序与进程区别:     

程序:死的。只占用磁盘空间。        ——剧本。

进程;活的。运行起来的程序。占用内存、cpu等系统资源。    ——戏。

2.并发:

        并发,在操作系统中,一个时间段中有多个进程都处于已启动运行到运行完毕之间的状态。但,任一个时刻点上仍只有一个进程在运行。
        例如,当下,我们使用计算机时可以边听音乐边聊天边上网。若笼统的将他们均看做一个进程的话,为什么可以同时运行呢,因为并发。

 3.单道程序设计:

        所有进程一个一个排对执行。若A阻塞,B只能等待,即使CPu处于空闲状态。而在人机交互时阻塞的出现时必然的。所有这种模型在系统资源利用上及其不合理,在计算机发展历史上存在不久,大部分便被淘汰了。

4.多道程序设计:

        在计算机内存中同时存放几道相互独立的程序,它们在管理程序控制之下,相互穿插的运行。多道程序设计必须有硬件基础作为保证。
        时钟中断即为多道程序设计模型的理论基础。并发时,任意进程在执行期间都不希望放弃cpu。因此系统需要一种强制让进程让出 cpu资源的手段。时钟中断有硬件基础作为保障,对进程而言不可抗拒。操作系统中的中断处理函数,来负责调度程序执行。
        在多道程序设计模型中,多个进程轮流使用CPU(分时复用CPu资源)。而当下常见CPu为纳秒级,1秒可以执行大约10亿条指令。由于人眼的反应速度是毫秒级,所以看似同时在运行。
        1s = 1000ms, 1ms = 100Ous,1us = 1000hs       1000000000 
实质上,并发是宏观并行,微观串行!         ----推动了计算机蓬勃发展,将人类引入了多媒体时代。

5.CPU和MMU:


虚拟内存与物理内存映射关系

6.进程控制块PCB:

        我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。
        /usr/src/linux-headers-3.16.0-30/include/linux/sched.h.文件中可以查看struct task_struct结构体定义。其内部成员有很多,我们重点掌握以下部分即可:·

    本质:结构体    

    进程id,系统中每个进程有唯一的id,在C语言类型中用pid_t类型表示,其实就是一个非负整数

    文件描述符表

    进程状态:  初始态、就绪态、运行态、挂起态、终止态。

    进程工作目录位置

    *umask掩码 (不是最重要的)

    信号相关信息资源。

    用户id和组id

7.进程状态:

        进程基本的状态有5种。分别为初始态,就绪态,运行态,挂起态与终止态。其中初始态为进程准备阶段,常与就绪态结合来看。

二、环境变量:

1.PATH:

        可执行文件的搜索路径。ls命令也是一个程序,执行它不需要提供完整的路径名/bin/ls,然而通常我们执行当前目录下的程序a.out却需要提供完整的路径名.l/a.out,这是因为PATH环境变量的值里面包含了ls命令所在的目录/bin,却不包含a.out所在的目录。PATH环境变量的值可以包含多个目录,用:号隔开。在shell 中用echo命令可以查看这个环境变量的值:

        $echo  $PATH

2.SHELL:

        当前Shell,它的值通常是:  /bin/bash

3.TERM:

        当前终端类型,在图形界面终端下的值通常是xterm。终端类型决定了一些程序的输出显示方式,比如图形界面终端可以显示汉字,而字符终端一般不行。

4.LANG.

         语言和 locale,决定了字符编码以及时间、货币等信息的显示格式。

5.HOME

        当前用户主目录的路径,很多程序需要在主目录下保存配置文件,使得每个用户在运行该程序时都有自己的一套配置。

三、进程控制

 1.fork(重点):

    pid_t fork(void)

    创建子进程。父子进程各自返回。父进程返回子进程pid。 子进程返回 0.

    getpid();getppid();

    循环创建N个子进程模型。 每个子进程标识自己的身份。
 

       (1) fork函数原理:

        (2)创建子进程

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{
		printf("before fork -1-\n");
		printf("before fork -2-\n");
		printf("before fork -3-\n");
		printf("before fork -4-\n");
		
		pid_t pid = fork();
		if(pid == -1){
			perror("fork error !\n");
			exit(1);
		}else if(pid == 0){
			printf("child is created\n");
		}else if(pid > 0){
			printf("parent process : my child is %d\n",pid);
		}

		printf("end of file\n");
		return 0;
}

  

        循环创建n个子进程

    一次fork函数调用可以创建一个子进程。那么创建N个子进程应该怎样实现呢?简单想

        for(i= 0; i< n; i++)fork()}即可。但这样创建的是N个子进程吗?
 

 

 

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{
	int i;
	pid_t pid;

	for(i = 0;i < 5;i++){
		if(fork() == 0)
			break;
	}

	if(i == 5)
		printf("I'm parent \n");
	else
		printf("I'm %dth child\n",i+1);

	return 0;
}

 

CPU抢夺现象:

如果出现3这种情况,说明子进程没有抢过bash进程,没有争过bash的CPU

避免父进程超越子进程的办法:

增加一个sleep进行延时打印父进程


#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{
	int i;
	pid_t pid;

	for(i = 0;i < 5;i++){
		if(fork() == 0)
			break;
	}

	if(i == 5){
		sleep(2);
		printf("I'm parent \n");
	}
	else{
        sheep(i);
		printf("I'm %dth child\n",i+1);
	}
	return 0;
}

2.getpid和getppid:

getpid():获取当前进程ID

​ pid_t getpid(void);

getppid 函数:获取当前进程的父进程 ID

​ pid_t getppid(void);

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{
		printf("before fork -1-\n");
		printf("before fork -2-\n");
		printf("before fork -3-\n");
		printf("before fork -4-\n");
		
		pid_t pid = fork();
		if(pid == -1){
			perror("fork error !\n");
			exit(1);
		}else if(pid == 0){
			printf("child is created,pid = %d,parent-pid:%d\n",getpid(),getppid());
		}else if(pid > 0){
			printf("parent process : my child is %d,my pid :%d,my parent_pid:%d\n",pid,getpid(),getppid());
		}

		printf("end of file\n");
		return 0;
}

四、进程共享 

        父子进程之间在 fork后。有哪些相同,那些相异之处呢?

        刚fork 之后: 
        父子相同处:全局变量、.data、.text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式...


        父子不同处:

        1.进程ID                        2.fork返回值              3.父进程ID             

        4.进程运行时间             5.闹钟(定时器)           6.未决信号集
l
      似乎,子进程复制了父进程 0-3G 用户空间内容,以及父进程的 PCB,但 pid 不同,真的每fork一个子进程都要将父进程的 0-3G 地址空间完全拷贝一份,然后在映射至物理内存吗?

      当然不是!  父子进程间遵循读时共享写时复制的原则。这样设计,无论子进程执行父进程的逻辑还是执行自己的逻辑都能节省内存开销。


重点注意!        躲避父子进程共享全局变量的知识误区
【重点】:父子进程共享:

        1.文件描述符(打开文件的结构体)

        2. mmap建立的映射(进程间通信详解)

特别的,fork之后父进程先执行还是子进程先执行不确定。取决于内核所使用的调度算
法。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/961296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring6详细讲解

Spring6 1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单…

粉丝经验分享:13:00 开始的面试,13:06 就结束了,问题真是变态

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

hdfs滚动升级(rollingUpgrade )

最近对hdfs的升级过程很感兴趣&#xff0c;所以准备研究下其升级的过程&#xff0c;本篇文章是依据官网文档进行的升级过程&#xff08;地址&#xff1a;Apache Hadoop 2.10.2 – HDFS Rolling Upgrade&#xff09;&#xff0c;该文章中还有关于降低的介绍&#xff0c;感兴趣的…

【快手小玩法-弹幕游戏】开发者功能测试报告提交模板

背景 快手有明确的要求&#xff0c;准入和准出更加严格&#xff0c;要求有明确的测试报告。格式如下&#xff1a; *本文参考字节wiki&#xff1a;CP侧测试报告模板(复制填写轻雀文档) 其他文章推荐&#xff1a;【抖音小玩法-弹幕游戏】开发者功能测试报告提交模板 一、前言…

Lesson03---类与对象(中篇)

lesson5: 一、类的6个默认成员函数&#xff08;2&#xff1a;29&#xff1a;10&#xff09; 1.什么是空类&#xff1f;&#xff08;2&#xff1a;29&#xff1a;40&#xff09; a.空类中真的什么都没有吗&#xff1f;&#xff08;2&#xff1a;29&#xff1a;50&#xff09;…

学习MATLAB

今日&#xff0c;在大学慕课上找了一门关于MATLAB学习的网课&#xff0c;MATLAB对于我们这种自动化的学生应该是很重要的&#xff0c;之前也是在大三的寒假做自控的课程设计时候用到过&#xff0c;画一些奈奎斯特图&#xff0c;根轨迹图以及伯德图&#xff0c;但那之后也就没怎…

网络协议三要素

计算机语言作为程序员控制一台计算机工作的协议&#xff0c;具备了协议的三要素。 语法&#xff0c;就是这一段内容要符合一定的规则和格式。例如&#xff0c;括号要成对&#xff0c;结束要使用分号等。语义&#xff0c;就是这一段内容要代表某种意义。例如数字减去数字是有意…

单目标追踪——【Transformer】Autoregressive Visual Tracking

目录 文章侧重点网络结构Encoder&#xff08;特征提取与融合得到Vision Features&#xff09;Decoder&#xff08;Vision FeatureMotion Feature 特征融合与输出&#xff09;运动特征生成特征融合与输出 消融实验N与VocabularyBins 论文链接&#xff1a;https://paperswithcode…

CocosCreator3.8研究笔记(三)CocosCreator 项目结构说明及编辑器的简单使用

我们通过Dashboard 创建一个2d项目&#xff0c;来演示CocosCreator 的项目结构。 等待创建完成后&#xff0c;会得到以下项目工程&#xff1a; 一、assets文件夹 assets文件夹&#xff1a;为资源目录&#xff0c;用来存储所有的本地资源&#xff0c;如各种图片&#xff0c;脚本…

一文快速了解代理https和sock5协议的区别

一、什么是https协议 HTTPS 协议全称&#xff1a;HyperText Transfer Protocol Secure&#xff08;超文本传输安全协议&#xff09;&#xff0c;是一种通过计算机网络进行安全通信的传输协议。 作用于应用层&#xff08;application layer&#xff09;中。 HTTPS 是在HTTP 的…

[C++]学习中的一个问题

#include<iostream> #include<string> #include<cstring> using namespace std;int main(){char str[31];cout << "----" << sizeof(str) << endl;// 给了memset(str, 0, sizeof(str));for (size_t i 0; i < 31; i){cout &l…

打造高权重店铺的秘密,详解Shopee平台权重评估机制(测评补单)

很多虾皮卖家经常提到的"权重"是指商品或店铺在Shopee平台上的重要性程度。权重评估了商品或店铺是否符合用户需求&#xff0c;并且能否促进订单转化率&#xff0c;为平台带来收益。说白了权重就是给商品和店铺打分的机制&#xff0c;得分越高&#xff0c;权重越高&a…

C语言——函数的使用

无参无返回值 语法格式如下&#xff1a; // 函数定义 void 函数名() {函数体 }// 函数调用 函数名();函数名是标识符的一种&#xff0c;需要遵循规则函数只需要定义一次&#xff0c;反复调用只定义函数, 不调用函数, 函数永远不会被执行案例需求&#xff1a; 编写一个函数&am…

python爬虫-Selenium

一、Selenium简介 Selenium是一个用于Web应用程序测试的工具&#xff0c;Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。模拟浏览器功能&#xff0c;自动执行网页中的js代码&#xff0c;实现动态加载。 二、环境配置 1、查看本机电脑谷歌浏览器的版…

Idea安装免注册版ChatGPT

文章目录 一、前期准备二、开始使用 一、前期准备 1.准备Idea开发软件并打开&#xff08;VS Code同理&#xff09;! 2.【CtrlAltS】快捷键调出Settings窗口&#xff0c;如图 3.找到NexChatGPT 此插件不需要注册&#xff0c;可以直接使用&#xff08;高级一些的需要会员收费限…

数据库-DML

DML&#xff1a;用来对数据库中表的数据记录进行增、删、改等操作。 添加数据&#xff08;INSERT&#xff09; insert语法&#xff1a; 指定字段添加数据&#xff1a;insert into 表单&#xff08;字段名1&#xff0c;字段名2&#xff09;values&#xff08;值1&#xff0c;值…

QT文件对话框,将标签内容保存至指定文件

一、主要步骤 首先&#xff0c;通过getSaveFileName过去想要保存的文件路径及文件名&#xff0c;其次&#xff0c;通过QFile类实例化一个文件对象&#xff0c;再读取文本框中的内容&#xff0c;最后将读取到的内容写入到文件中&#xff0c;最后关闭文件。 1.txt即为完成上述操作…

学习JAVA打卡第四十九天

Random类 尽管可以使用math类调用static方法random&#xff08;&#xff09;返回一个0~1之间的随机数。&#xff08;包括0.0但不包括0.1&#xff09;&#xff0c;即随机数的取值范围是[0.0&#xff0c;1.0]的左闭右开区间。 例如&#xff0c;下列代码得到1&#xff5e;100之间…

【数据分享】2006-2021年我国城市级别的燃气相关指标(免费获取\20多项指标)

《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况&#xff0c;在之前的文章中&#xff0c;我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国城市级别的市政设施水平相关指标、2006-2021年我国城市级别的各类建设用地面积数…

如何查一个期刊是不是EI检索

目录 如何查一个期刊是不是EI检索 一、什么是EI&#xff1f; 二、EI检索方法&#xff1a; 三、EI检索视频&#xff1a;(点击放大播放) 四、EI检索图文版 常见问题 如何查一个期刊是不是EI检索 1. 访问EI Compendex官方网站&#xff1a;访问EI Compendex的官方网站…