操作系统(os)
OS存在的目的
- 与硬件交互,管理所有的软硬件资源
- 为用户程序(应用程序)提供一个良好的执行环境
OS含义图
要使用操作系统,必须经过系统调用
计算机管理本质
- 先描述:用struct结构体描述属性
- 在组织:用链表或其他的结构
进程
基本概念
程序的一个执行实例,正在执行的程序
本质:进程是由内核数据结构(PCB)和可执行程序构成的
描述进程-PCB
- 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
- 课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
PCB里有什么
- 标示符:描述本进程的唯一标志pid,用来区分其他进程
- 状态:任务状态
- 优先级:相对于其他进程的优先级
- 程序计数器:程序中即将被执行的下一条指令的地址
- 内存指针
- 上下文数据
- I/O状态信息
- 其他信息等
如何获取pid(用 man getpid获取头文件)
Linux创建进程的方式
- 命令行中直接启动进程 启动进程,本质就是创建进程, 也就是操作系统中新增一个进程,一般是有父进程创建,进程间具有父子关系
- 通过代码创建进程
系统调用创建进程
- fork有两个返回值,给子进程返回0,给父进程返回子进程的pid
- fork之前,只有父进程执行代码,fork之后,父子进程都要执行后续代码,因此也会执行return命令,就会有两个不同的返回值;子进程能看见fork之前的代码,只是子进程继承了父进程的代码,也就继承了父进程的eip,eip指向fork后面的代码,因此不能从头开始执行代码
- fork之后,以父进程为模板创建子进程的pid
- 父子进程代码共享,数据各自开辟空间,私有一份(采用写实拷贝)
- 父子进程一旦创建,就拥有了各自的PCB,因此可以执行不同的作业,两个进程之间互不影响,进程具有独立性,进程运行之间相互独立,因此杀死父进程并不影响子进程的运行
- 父子进程谁先执行是看操作系统的调度算法的
一个进程,是能找到自己的可执行程序
每一个进程,都有自己的工作目录
- cwd:当前工作目录
- 当前目录默认情况下是进程启动的目录
- 使用chdir()能够改变当前工作目录
怎么查看进程
1.使用系统系统调用
获取自己的pid:getpid()
获取父进程的pid:getppid()
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("pid: %d\n", getpid());
printf("ppid: %d\n", getppid());
return 0;
}
2.通过 /proc 系统文件夹查看