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

news2024/10/3 8:18:00

前言:

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

目录

一、进程的概念:

1.程序与进程区别:     

2.并发:

 3.单道程序设计:

4.多道程序设计:

5.CPU和MMU:

6.进程控制块PCB:

7.进程状态:

二、环境变量:

1.PATH:

2.SHELL:

3.TERM:

4.LANG.

5.HOME

三、进程控制

 1.fork(重点):

       (1) fork函数原理:

        (2)创建子进程

2.getpid和getppid:

四、进程共享 


一、进程的概念:

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之后父进程先执行还是子进程先执行不确定。取决于内核所使用的调度算
法。

五、父子进程gdb调试

gdb调试:

    设置父进程调试路径:set follow-fork-mode parent (默认)

    设置子进程调试路径:set follow-fork-mode child

遇到gdb运行时No symbol table is loaded. Use the “file“ command.的解决方法

  1. 首先,GDB已经报错file找不到了,那可以运行file test检测一下
(gdb) file test
Reading symbols from test...(no debugging symbols found)...done.

        2.发现找不到可执行文件,所以问题应该在于编译时候没有加上ggdb3,重新编译一下

ty@ubuntu:~$ gcc -ggdb3 -o main main.c

         3.编译完成再次执行就没有问题了,问题解决

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

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

相关文章

数学建模篇---2022国赛C题(二)(全程python,完整论文和代码可取!)

接着上回我们继续第三题 问题 3 对附件表单 3 中未知类别玻璃文物的化学成分进行分析&#xff0c;鉴别其所属类型&#xff0c;并对 分类结果的敏感性进行分析。 我们的分析&#xff1a; 基于问题二的分类模型&#xff0c;计算出每个待测样本点与簇中心的平方欧式距离&#xff0…

Windows 10以后的版本默认不会启用SMBv1

文章目录 SMBv1的历史故事SMBv1 仍然可以在未预装的版本重新安装检查计算机是否启用SMBv11&#xff0c;Server端检测SMBv1是否启用2&#xff0c;客户端检测SMBv1是否启用 Windows 如何禁用SMBv11&#xff0c;Server端用powershell禁用&#xff1a;2&#xff0c;客户端禁用方法&…

链条输送机如何润滑

润滑是使用机械设备过程中不可或缺的保养工作&#xff0c;链条输送机也不例外&#xff0c;但对于第一次使用链条机的用户来讲&#xff0c;对于哪个部位需要润和以及如何润滑都是一头雾水&#xff0c;今天艾讯就从专业的角度来和您分享一下链条输送机如何润滑的问题。 1、应切断…

vue3 自动导入图片配置

1 npm i vite-plugin-vue-images -D 2 vite.configts.ts 文件中配置 import { defineConfig } from vite import ViteImages from vite-plugin-vue-images export default defineConfig({ //插件中导入指定图片存放的目录 plugins: [ ViteImages({ dirs: [src/assets] }) ] …

霍尔效应的本质

霍尔效应是电磁效应的一种&#xff0c;这一现象是美国物理学家霍尔&#xff08;E.H.Hall&#xff0c;1855—1938&#xff09;于1879年在研究金属的导电机制时发现的。 当电流垂直于外磁场通过半导体时&#xff0c;载流子发生偏转&#xff0c;垂直于电流和磁场的方向会产生一附加…

网络编程套接字 | UDP套接字

前面的文章中我们叙述了网络编程套接字的一些预备知识点&#xff0c;从本文开始我们就将开始UDP套接字的编写。本文中的服务端与客户端都是在阿里云的云服务器进行编写与测试的。 udp_v1 在v1的版本中我们先来使用一下前面讲过得一些接口&#xff0c;简单的构建一个udp服务器…

Oracle数据库环境变量配置以及可能遇到的问题解决

一、如何配置Oracle数据库环境变量&#xff08;以win10为例&#xff09; 1、找到此电脑&#xff0c;鼠标右键&#xff0c;点击属性。 2、点击属性成功后&#xff0c;进入如下页面&#xff0c;找到“高级系统设置”&#xff0c;点击进入。 3、找到环境变量&#xff0c;点击进入…

深眸科技自研轻辙视觉引擎,以AI机器视觉赋能杆号牌识别与分拣

电线杆号牌作为电力行业标识的一种&#xff0c;相当于电线杆的“身份证”&#xff0c;担负着宣传电力知识、安全警示的作用&#xff0c;用于户外使用标记输电线路电压等级、线路名称、杆塔编号等&#xff0c;能够清晰地记录电力线路杆的信息&#xff0c;并为电力线路的更改以及…

小红书下一个爆款趋势锁定 | 秋冬种草指南

今夏「多巴胺」风靡全网&#xff0c;现秋日又捎来一股名为「美拉德」的风……俨然一副“新晋顶流”的架势。 如何抓住这一新趋势&#xff1f;本期千瓜将锁定小红书下一个爆款内容——「美拉德」&#xff0c;剖析笔记与底层逻辑&#xff0c;助力品牌洞见先机&#xff0c;运筹布…

虚拟数字人直播软件实现带货功能,成为新一代直播风口!

随着短视频带货市场的不断发展&#xff0c;虚拟数字人直播技术逐渐成为热门话题。而在现如今的市场趋势下直播带货则成为了一种火热的营销方式。那么&#xff0c;虚拟数字人直播软件是否可以结合起来&#xff0c;实现无人直播带货的效果呢&#xff1f;让我们来了解一下。 灰豚数…

VSCode md绘制图形mermaid记录

官网&#xff1a;Mindmap | Mermaid 测试还是不错&#xff1a;

【Day-31慢就是快】代码随想录-二叉树-中序和后序遍历构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 思路 首先知道怎么画&#xff0c;然后写代码流程。 以 后序数组的最后一个元素为切割点&#xff0c;先切中序数组&#xff0c;根据中序数组&#xff0c;反过来再切后序数组。一层一层切下去…

最佳策略app平台传出的绝密理财法,这是给散户们的好机会

昨天&#xff0c;记者在走访各大超市的时候发现一个奇怪的现象&#xff1a;普遍的市民朋友在选购商品的时候基本上都会选择那些打折促销的&#xff0c;有些促销的商品甚至是很久之后才会用的&#xff0c;他们也会给带上。而对于那些不打折或者价格高昂的商品&#xff0c;基本上…

入耳耳机对耳朵有损害吗?入耳耳机和骨传导耳机哪个好?

先说结论&#xff0c;入耳式耳机对耳朵是有伤害的&#xff0c;骨传导耳机相比于入耳式耳机可以保护更好的保护耳朵健康。 在日常中&#xff0c;经常会看到有佩戴耳机的时尚青年&#xff0c;他们戴着耳机刷视频、听音乐&#xff0c;陶醉在自己的小世界中&#xff0c;但是长时间…

项目经理常用的6种工具,让项目管理变得更高效

项目管理是一个复杂的过程&#xff0c;因为不仅要管人管事&#xff0c;会遇到各种问题&#xff0c;因此用什么工具管理项目&#xff0c;对项目管理是一个很好地辅助&#xff0c;让项目管理变得更有效、更高效。 1、甘特图 甘特图将一个大型项目划分为几个阶段&#xff0c;并…

飞凌嵌入式受邀亮相2023中国国际数字经济博览会

9月6日&#xff0c;由工信部、国家发改委和河北省人民政府共同主办的2023中国国际数字经济博览会在石家庄国际会展中心&#xff08;正定&#xff09;开幕&#xff0c;近500家参展企业携自家的“黑科技”展品集中亮相&#xff0c;赋能智慧应用新场景&#xff0c;为观众带来了一场…

【1】DDR---容量计算

1、容量计算 density&#xff1a;芯片容量&#xff0c;bit为单位 depth&#xff1a;地址空间&#xff0c; width&#xff1a;数据位宽 densitydepth*width 2、三星DDR 4Gbit&#xff08;总容量&#xff09;256M&#xff08;地址空间&#xff09;*16&#xff08;位宽&#xff…

GOOGLE SRE 运维模式解读

一、SRE核心是什么 我总结下来是&#xff1a;通过软件工程的方式开发&#xff08;GOOGLE规定SRE团队必须将50%的精力花在真实的开发工作上&#xff09;一些自动化的工具系统来解放传统运维工程师大量重复和手工操作&#xff0c;从而让新生代的SRE工程师有更多的时间&#xff1…

用户促活留存新方式——在APP中嵌入小游戏

随着APP同类产品的不断出现&#xff0c;APP开发者们面临着激烈的竞争&#xff0c;很多APP下载后被新的APP取代&#xff0c;获客成本越来越高。同时开发者还会面临用户粘性差、忠诚度低、用完即走、留存困难&#xff0c;商业化价值被大大缩减。 在APP中植入小游戏来提高用户活跃…

无涯教程-JavaScript - BESSELJ函数

描述 BESSELJ函数返回贝塞尔函数Jn(x)。 语法 BESSELJ(X, N)争论 Argument描述Required/OptionalXThe value at which to evaluate the function.RequiredNThe order of the Bessel function. If n is not an integer, it is truncated.Required Notes 如果x为非数值,则B…