进程的基本概念

来源:互联网 发布:java程序设计第二版 编辑:程序博客网 时间:2024/05/20 22:35

一、背景
1、操作系统(Operator System)的概念:
任何计算机都包含一个基本的程序集合,称为操作系统(简称OS)。笼统的理解,操作系统包括:
1)内核,其含有内核管理、进程管理、驱动管理和文件管理。
2)其他程序,例如:函数库、shell程序等等。

2、设计OS的目的:
1)与硬件交互,管理所有的软硬件资源;
2)为用户程序(应用程序)提供一个良好的执行环境。

3、定位
管理好软硬件资源。

4、系统调用和库函数概念:
1)系统调用:操作系统对外是一个整体,但是会露出几个接口,以供上层开发利用。这部分由操作系统提供的接口就叫做系统调用。
2)库函数:开发者对系统调用进行封装形成的集合,就叫做库函数。库有利于用户和开发者的使用。

5、总结:
计算机管理硬件
1)描述起来用结构体;
2)组织起来用链表或其他高效的数据结构。

二、进程
1、基本概念:
1)通俗的观念:程序的一个执行实例,或正在执行的程序。
2)内核的观点:担当分配系统资源(CPU时间和内存)的实体。

2、基本元素:
进程的两个基本元素是程序代码和数据集。
注意:程序代码可能被执行相同程序的其他进程共享。进程是一种动态描述,但是并不代表所有进程都在执行,因为进程在内存中因策略和调度需求会处于不同的状态。
3、进程控制块(PCB)
1)含义:
进程信息被放在一个进程控制块的数据结构中,可以理解为进程的属性的集合,称之为process control block ,简称PCB。

2)task_struct – PCB的一种
A、在Linux中描述进程的结构体叫做task_struct,
B、task_struct会被装载到RAM(内存)并且包含着进程的信息。

3)task_struct内容分类
A、标识符:用于区别其他进程。
B、状态:任务状态、退出信息和退出代码等。
C、优先级:进程执行的先后顺序。
D、程序计数器:程序中即将被执行的下一条指令的地址。
E、内存指针:包括程序代码和进程相关数据的指针,及其他进程共享内存块的指针。
F、上下文数据:进程执行时处理器的寄存器中的数据(学籍档案、寄存器)。
G、I/O的状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
H、记账信息:包括处理器的时间总和,时间限制,记账号等。

4、组织进程
在内核中可以找到进程,所有运行在系统里的进程都以task_struct链表的形式存在内核里。

注:进程控制块是操作系统能够支持多进程和多处理的关键工具。可以说:进程是由程序代码、相关数据和进程控制块组成的。

5、查看进程
1)进程的信息可以通过/proc系统文件夹查看。
【例】获取PID为1的进程信息。
这里写图片描述

注:大多数进程信息同样可以使用top和ps这些用户级工具来获取。
【例】
这里写图片描述

释:
A、UID:执行者的身份。
B、PID:本进程代号。
C、PPID:父进程代号。
D、PRI:本进程被执行的优先级,其值越小越早被执行。
E、NI:本进程的nice值。

2)通过系统调用获取进程标识符
A、进程id(PID)
B、父进程id(PPID)
【例】
这里写图片描述

其程序为:
这里写图片描述

3)通过系统调用创建进程-fork初识
A、可通过运行man fork,认识fork
B、fork有两个返回值
C、父进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)。
【例】
这里写图片描述
其程序如下:
这里写图片描述

注:fork之后通常用if进行分流
【例】
这里写图片描述

程序为:

#include<stdio.h>#include<unistd.h>#include<sys/types.h>int main(){    int ret = fork();    if(ret < 0){        perror("fork");        return 1;    }    else if(ret == 0){ //child         printf("I am child : %d!, ret: %d\n", getpid(), ret);    }else{//father    printf("I am father : %d!, ret: %d\n", getppid(), ret);    }    sleep(1);    return 0;}