目录
1.基本常识及概念
1.1冯诺依曼体系结构
我们常见的计算机,如笔记本;不常见的计算机,如服务器;大部分都遵守冯诺依曼体系结构。如下图所示:
- 输入设备:磁盘,网卡,键盘,话筒,摄像头;
- 输出设备:磁盘,网卡,显示器,显卡,音响;
- 存储器:主要指内存,磁盘不属于存储器;
- 控制器&运算器:CPU;
1.2操作系统
任何计算机系统都包含了一个基本的程序集合,称为操作系统(OS);笼统的理解:OS包含了
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(库函数,shell程序)
2.进程
2.1什么是进程
进程=程序+操作系统维护进程的相关的数据结构。
在学校的教材中,进程被理解成是一个正在执行的程序,这种说法是错误的,程序只是进程中的一部分,他还包含了操作系统维护的进程的数据结构。
2.2描述进程--PCB
操作系统管理进程,把进程的信息放到进程控制快(PCB)的数据结构中,也就是说,PCB中存放的是进程属性的集合。
在Linux操作系统中,描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
2.3 task_struct中的内容
- 标识符:描述本进程的唯一标识符,用来区别其他的进程
- 状态:任务状态,退出代码,退出信号灯。
- 优先级:相对于其他的进程的优先级
- 程序计数器:程序中即将被执行的下一条指令的程序
- 内存指针:包括程序代码和进程相关数据的指针,还有其他的进程共享 的内存块的指针
- 上下文数据:进程执行时处理器的寄存器中的数据
- I/O状态信息:包括显示I/O请求,分配给进程的I/O设备和进程使用的文件列表
- 记账信息:可能包括处理器的时间总和,使用的时钟总和,时间限制
- 其他信息
可以在内核源代码里找到它,所有运行在系统里面的进程都以task_struct链表的形式存在内核中。
3.进程的相关操作
3.1查看进程
进程的相关信息可以通过在命令行输入 ls /proc 获取,比如要查看进程为的PID为 1 的进程的信息就输入 ls /proc/1,但是一般都是没有权限的,可以加上 sudo
3.2通过系统调用获取进程标识符(PID)
PID:当前进程的ID;
PPID:当前进程的父进程的ID
可以看出,通过函数getpid() 和 getppid() 可以得到子进程和父进程的标识符。 他们的头文件是sys/types 和 unistd;但是在虚拟机中,只需要一个stdio.h就可以调用这两个代码。
3.3通过函数调用创建进程 --- fork函数初始
通过调用 fork 函数,可以发现,原本只有一行输出,确在显示界面输出了两行,而这的根本原因就是 fork 创建了一个子进程。
通过 if 分流,代码和结果如下所示: 通过 if 的分流,可以清楚的说明:fork() 函数返回的是0 给子进程,返回给父进程的的值就是子进程的 PID。如果返回的值是小于 0 就是创建子进程失败了。
所以,创建子进程可以通过 if 分流进行分流,从而实现子进程和父进程实现不同的功能。要不然子进程和父进程只会执行一样的代码,因为父进程和子进程的代码是共享的,所以不进行分流就会导致子进程和父进程执行一样的代码。既让这样,
那么为什么子进程和父进程的返回值为什么不同?
父进程中,fork函数返回的是子进程的PID,而子进程中,fork返回的是0;虽然子进程和父进程共享数据和代码,但是这是在默认的情况下;一旦子进程或者父进程要写入数据,就会发什么“写时拷贝”,