文章目录
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号进程接收)