- 1. 进程
- 1.1 进程概念
- 1.2 进程特点
- 1.3 进程状态
- 1.4 printf 函数输出问题
- 2. 主函数参数
- 2.1 打印参数个数和参数内容
- 2.2 打印环境变量
- 3. 计算机基本组成
- 3.1 计算机组成五大部件
- 3.2 系统总线
- 3.3 指令
- 3.4 操作系统
- 3.4.1 内存管理
- 4. 复制进程 fork
- 4.1 fork进程
- 4.2 如何区分父子进程?
- 4.2.1 代码示例1
- 4.2.2 代码示例2
- 4.2.3 代码示例3
- 4.2.4 代码示例4
1. 进程 1.1 进程概念
一个正在执行的程序
- PCB:进程控制块,是进程存在的唯一标志,用来描述的进程的属性信息。
- 操作系统:用来管理进程
- 进程状态:就绪,执行,阻塞
- 并行和并发:并行是一种特殊的并发
- 简单分页:物理内存
结构体:struct task_struct(此结构体用来描述进程的属性)
struct task_struct
{
int pid;//唯一标识进程
int status;//表示进程状态(就绪,运行,阻塞)
};
- Pid(整数值)成员,进程的唯一标识符,当前进行Id 子进程
- Ppid 父进程id
- Kill+进程序号:结束一个进程
- Kill -9 进程序号:可以强制结束一个进程
| /usr/include | 存放头文件 |
|---|---|
| /bin | 命令 |
| /lib | 库文件 |
就绪、运行、阻塞
printf 函数并不会直接将数据输出到屏幕,而是先放到缓冲区中,只有一下三种情况满足,才会输出到屏幕。
- 1) 缓冲区满
- 2) 强制刷新缓冲区 fflush
- 3) 程序结束时
程序睡眠3秒钟后打印hello,因为缓冲区为了减少系统开销,会在进程结束之前才进行刷新打印
1 #include2 #include 3 #include 4 int main() 5 { 6 printf("hello"); 7 sleep(3); 8 exit(0); 9 }
Linux缓冲区打印数据
调用_exit(0)系统直接退出,不会打印数据,因为缓冲区未被刷新,直接结束程序
1 #include2 #include 3 #include 4 int main(int argc,char*argv[],char*envp[]) 5 { 6 int i=0; 7 printf("argc=%dn",argc); 8 9 for(;i 11 printf("argv[%d]=%sn",i,argv[i]); 12 } 13 exit(0); 14 }
代码
1 #include2 #include 3 #include 4 int main(int argc,char*argv[],char*envp[]) 5 { 6 int i=0; 7 printf("argc=%dn",argc); 8 9 for(;i 11 printf("argv[%d]=%sn",i,argv[i]); 12 } 13 14 for(i=0;envp[i]!=NULL;i++) 15 { 16 printf("envp[%d]=%sn",i,envp[i]); 17 } 18 exit(0); 19 }
运行结果
- (1) 运算器 :也叫算数逻辑单元,完成对数据的各种常规运算,如加减乘除,也包括逻
辑运算,移位,比较等。 - (2) 控制器 :它是整个计算机系统的控制中心,它指挥计算机各部分协调地工作,保证
计算机按照预先规定的目标和步骤有条不紊地进行操作及处理。 - (3) 存储器 :存储程序和各种数据。
- (4) 输入设备 :把人所熟悉的信息如,图片,声音,文字,转换为计算机能够识别的信
息存储起来。 - (5) 输出设备 : 把计算机机能识别的信息转换为人能识别的信息,进行呈现。
一台计算机可以抽象成下图: CPU 中包含控制器和运算器, 内存就是存储器。I/O 设
备就是输入设备和输出设备,如:键盘、显示器、鼠标、硬盘、网卡。
(1) 数据总线 :用来在各个功能部件中间传输数据,是双向传输总线。
(2) 地址总线 : 用来指出数据总线上的源数据或目的数据在主存单元的地址或 io 设备的地址。
(3) 控制总线 :由于各个连接在数据总线和地址总线的部件都是共享这两类总线的,那么在某一时刻由谁来使用,就是控制总线负责完成的。
.c和.exe文件都在I/O设备中存储,当程序开始执行时候,才会在内存中(内存一旦掉电,就会失去数据)
3.3 指令- (1) 指令 :是指示计算机执行某种操作的命令。一条指令通常由两部分构成:地址码 和操作码。
- (2) 程序 : 由一条一条的指令构成。
- (3) 指令周期 :cpu 每取出并执行一条指令所需的全部时间称为指令周期。
- (4) 指令系统 :计算机能够执行的全部指令的集合称为该计算机的指令系统。
- (5) RISC :精简指令系统计算机。
- (6) CISC :复杂指令系统计算机。
- (7) 程序与指令:高级语言 汇编助记符 机器指令
操作系统:管理计算机上的软硬件资源,为用户提供一个交互的接口
- (1) 串行处理
- (2) 批处理
- (3) 多道程序设计
- (4) 分时系统
为了方便管理内存,操作系统把内存分为物理页面(通常大小为4k或者8k)
简单分页 逻辑页 物理页 页表
页表可以将逻辑地址转换为物理地址
内存结构
执行fork后子进程进行复制,从fork位置继续进行复制
4.2 如何区分父子进程?父进程的fork的返回值是子进程的pid号,子进程的返回值为0
4.2.1 代码示例1fork复制代码示例
运行结果
-
两个进程同时执行结果
-
每次运行结果有可能不一样,因为每次逻辑地址和物理地址不一样
代码示例
运行结果:6个A
代码示例
运行结果:8个A
代码示例
运行结果:3个A
-
Fork复制进程作用:多个进程共同完成,复制出来的子进程被替换,两次程序运行结果可以不同
-
Fork返回两次,分别在父子进程中返回
-
Fork命令解释器:bash
-
父进程的地址和子进程地址数值相同,不在同一块内存空间,不是真实物理地址,而是逻辑地址,逻辑地址相同。
-
父进程可以处理子进程,父进程不能先于子进程结束,如果子进程先于父进程结束,父进程没有获取子进程的退出码,子进程先结束有可能会变为僵死进程。(父进程结束后,被1号进程接收)



