Linux 4:进程,主函数参数,计算机组成,内存管理,fork复制进程

本文详细介绍了Linux进程的概念、特点、状态及其管理,包括printf函数的输出机制。此外,还讲解了主函数参数的使用,如何打印参数个数和内容以及环境变量。深入探讨了计算机的基本组成,如运算器、控制器、存储器、输入输出设备以及系统总线。进一步,文章阐述了操作系统的内存管理和指令系统,并通过实例解析了fork函数在创建进程中的应用和父子进程的区分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1. 进程

1.1 进程概念

一个正在执行的程序

  • PCB:进程控制块,是进程存在的唯一标志,用来描述的进程的属性信息。
  • 操作系统:用来管理进程
  • 进程状态:就绪,执行,阻塞
  • 并行和并发:并行是一种特殊的并发
  • 简单分页:物理内存

在这里插入图片描述

1.2 进程特点

结构体:struct task_struct(此结构体用来描述进程的属性)

struct task_struct
{
	int pid;//唯一标识进程
	int status;//表示进程状态(就绪,运行,阻塞)
};
  • Pid(整数值)成员,进程的唯一标识符,当前进行Id 子进程
  • Ppid 父进程id
  • Kill+进程序号:结束一个进程
  • Kill -9 进程序号:可以强制结束一个进程
/usr/include存放头文件
/bin命令
/lib库文件

在这里插入图片描述

1.3 进程状态

就绪、运行、阻塞
在这里插入图片描述

1.4 printf 函数输出问题

printf 函数并不会直接将数据输出到屏幕,而是先放到缓冲区中,只有一下三种情况满足,才会输出到屏幕。

  • 1) 缓冲区满
  • 2) 强制刷新缓冲区 fflush
  • 3) 程序结束时

程序睡眠3秒钟后打印hello,因为缓冲区为了减少系统开销,会在进程结束之前才进行刷新打印

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 int main()
  5 {
  6     printf("hello");
  7     sleep(3);
  8     exit(0);
  9 }

Linux缓冲区打印数据

调用_exit(0)系统直接退出,不会打印数据,因为缓冲区未被刷新,直接结束程序
在这里插入图片描述
在这里插入图片描述

2. 主函数参数

2.1 打印参数个数和参数内容

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 int main(int argc,char*argv[],char*envp[])
  5 {
  6     int i=0;
  7     printf("argc=%d\n",argc);
  8 
  9     for(;i<argc;i++)
 10     {
 11         printf("argv[%d]=%s\n",i,argv[i]);
 12     }
 13     exit(0);
 14 }

在这里插入图片描述
在这里插入图片描述

2.2 打印环境变量

代码

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 int main(int argc,char*argv[],char*envp[])
  5 {
  6     int i=0;
  7     printf("argc=%d\n",argc);
  8 
  9     for(;i<argc;i++)
 10     {
 11         printf("argv[%d]=%s\n",i,argv[i]);
 12     }
 13 
 14     for(i=0;envp[i]!=NULL;i++)
 15     {
 16         printf("envp[%d]=%s\n",i,envp[i]);
 17     }
 18     exit(0);
 19 }

运行结果
在这里插入图片描述

3. 计算机基本组成

3.1 计算机组成五大部件

  • (1) 运算器 :也叫算数逻辑单元,完成对数据的各种常规运算,如加减乘除,也包括逻
    辑运算,移位,比较等。
  • (2) 控制器 :它是整个计算机系统的控制中心,它指挥计算机各部分协调地工作,保证
    计算机按照预先规定的目标和步骤有条不紊地进行操作及处理。
  • (3) 存储器 :存储程序和各种数据。
  • (4) 输入设备 :把人所熟悉的信息如,图片,声音,文字,转换为计算机能够识别的信
    息存储起来。
  • (5) 输出设备 : 把计算机机能识别的信息转换为人能识别的信息,进行呈现。

一台计算机可以抽象成下图: CPU 中包含控制器和运算器, 内存就是存储器。I/O 设
备就是输入设备和输出设备,如:键盘、显示器、鼠标、硬盘、网卡。
在这里插入图片描述

3.2 系统总线

(1) 数据总线 :用来在各个功能部件中间传输数据,是双向传输总线。
(2) 地址总线 : 用来指出数据总线上的源数据或目的数据在主存单元的地址或 io 设备的地址。
(3) 控制总线 :由于各个连接在数据总线和地址总线的部件都是共享这两类总线的,那么在某一时刻由谁来使用,就是控制总线负责完成的。

.c和.exe文件都在I/O设备中存储,当程序开始执行时候,才会在内存中(内存一旦掉电,就会失去数据)

3.3 指令

  • (1) 指令 :是指示计算机执行某种操作的命令。一条指令通常由两部分构成:地址码 和操作码。
  • (2) 程序 : 由一条一条的指令构成。
  • (3) 指令周期 :cpu 每取出并执行一条指令所需的全部时间称为指令周期。
  • (4) 指令系统 :计算机能够执行的全部指令的集合称为该计算机的指令系统。
  • (5) RISC :精简指令系统计算机。
  • (6) CISC :复杂指令系统计算机。
  • (7) 程序与指令:高级语言 汇编助记符 机器指令

3.4 操作系统

操作系统:管理计算机上的软硬件资源,为用户提供一个交互的接口

  • (1) 串行处理
  • (2) 批处理
  • (3) 多道程序设计
  • (4) 分时系统

3.4.1 内存管理

为了方便管理内存,操作系统把内存分为物理页面(通常大小为4k或者8k)

简单分页 逻辑页 物理页 页表

页表可以将逻辑地址转换为物理地址

在这里插入图片描述
内存结构
在这里插入图片描述

4. 复制进程 fork

4.1 fork进程

执行fork后子进程进行复制,从fork位置继续进行复制

4.2 如何区分父子进程?

父进程的fork的返回值是子进程的pid号,子进程的返回值为0

4.2.1 代码示例1

fork复制代码示例
在这里插入图片描述
运行结果
在这里插入图片描述

  • 两个进程同时执行结果

  • 每次运行结果有可能不一样,因为每次逻辑地址和物理地址不一样

4.2.2 代码示例2

代码示例
在这里插入图片描述
运行结果:6个A
在这里插入图片描述
在这里插入图片描述

4.2.3 代码示例3

代码示例
在这里插入图片描述
运行结果:8个A
在这里插入图片描述
在这里插入图片描述

4.2.4 代码示例4

代码示例
在这里插入图片描述
运行结果:3个A
在这里插入图片描述
在这里插入图片描述

  • Fork复制进程作用:多个进程共同完成,复制出来的子进程被替换,两次程序运行结果可以不同
  • Fork返回两次,分别在父子进程中返回,父进程返回值为子进程的pid号,子进程的返回值为0
  • Fork命令解释器:bash
  • 父进程的地址和子进程地址数值相同,不在同一块内存空间,不是真实物理地址,而是逻辑地址,逻辑地址相同。
  • 父进程可以处理子进程,父进程不能先于子进程结束,如果子进程先于父进程结束,父进程没有获取子进程的退出码,子进程先结束有可能会变为僵死进程。(父进程结束后,被1号进程接收)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值