长沙专业做网站的公司,网站建设方案意见,网站的基本要素,沈阳网势科技有限公司怎么样目录
一、进程的含义
二、进程和程序的区别
三、进程的作用
四、进程的状态
五、进程的调度与上下文切换
六、查询进程相关命令
七、fork()函数
八、getpid()和getppid()函数
九、面试题解析#xff1a;
十、应用场合及测试 一、进程的含义
进程指正在运行的程序
十、应用场合及测试 一、进程的含义
进程指正在运行的程序它是一个程序执行的过程会分配内存资源和接受 CPU 的调度。系统通过 PCB 块进程控制块如 task_struct 结构体来控制进程其中包含 PID进程标识符、cwd当前工作路径、用户 ID、组 ID 等信息还记录了进程打开的文件列表、信号相关设置以及进程资源的上限等。
二、进程和程序的区别
1. 程序是静态的存储在硬盘中代码和数据的集合进程是动态的是程序执行的过程包括进程的创建、调度、消亡。 ◦ 例如一个编译好的可执行文件就是程序而运行这个可执行文件产生的活动就是进程。 2. 程序是永存的进程是暂时的。 ◦ 程序可以长期保存在存储介质中而进程会随着任务的完成或异常终止而结束。 3. 进程有程序状态的变化程序没有。 ◦ 进程在运行过程中其状态会在就绪、执行、阻塞等之间切换而程序不存在这种状态变化。 4. 进程可以并发程序无并发。 ◦ 多个进程可以在同一时间内同时执行不同的任务而程序本身不具备并发执行的能力。 5. 进程与进程会存在竞争计算机的资源一个程序可以运行多次变成多个进程一个进程也可以运行一个或多个程序。
三、进程的作用
进程的主要作用是实现多任务提高系统效率。通过并发同一时刻同时完成多个任务和并行真正同时执行多个任务来充分利用系统资源提高系统的处理能力。 例如在一个多任务操作系统中用户可以同时运行浏览器浏览网页、听音乐和处理文档这就是进程并发的体现。
四、进程的状态
基本操作系统中进程有 3 个状态就绪态、执行态、阻塞态。 在 Linux 中进程的状态有运行态、睡眠态、僵死状态特有、暂停状态。
五、进程的调度与上下文切换
内核的主要功能之一是完成进程调度涉及硬件、BIOS、IO、文件系统、驱动等。调度算法包括 RR轮转调度、FIFO先进先出调度等。 进程调度在宏观上看起来是并行的但在微观上是串行的。
六、查询进程相关命令
1. ps aux不会动态刷新可查看进程的相关信息包括进程状态如就绪态、运行态用 R 表示可唤醒等待态用 S 表示不可唤醒等待态用 D 表示停止态用 T 表示僵尸态用 Z 表示等。 2. top类似任务管理器可以动态刷新能根据 CPU 占用率查看进程相关信息。 3. kill和killall用于发送信号来控制进程。 ◦ 例如kill -2 PID发送特定信号给指定 PID 的进程killall -9 进程名发送信号给指定进程名对应的所有进程。
七、fork()函数
1.fork()是一个系统调用函数一次调用会在父进程和子进程中分别返回。子进程和父进程的执行顺序不确定且变量不共享。子进程复制父进程的 0 到 3G 空间和父进程内核中的 PCB但进程 ID 号不同。 2. 功能是从当前进程克隆一个新进程新进程称为子进程原有进程为父进程。子进程是父进程的完全拷贝从 fork 函数之后开始执行与父进程具有相同的代码逻辑。 3. 返回值为 int 类型在父进程中成功返回子进程的 pid 号大于 0失败返回 -1在子进程中成功返回值是 0失败无返回
#include stdio.h
#include unistd.h
#include sys/types.h// 定义全局变量 a 并初始化为 20
int a 20;int main(int argc, char *argv[])
{// 调用 fork 函数创建子进程返回值存储在 ret 中pid_t ret fork();if (ret 0){//father父进程执行的代码块sleep(3);// 输出父进程中的变量 a 的值、父进程的 PID 和父进程的父进程 PID即启动这个程序的终端进程 IDprintf(father is %d pid %d,ppid:%d \n, a, getpid(), getppid());}else if (0 ret){//child子进程执行的代码块// 输出子进程中变量 a 的初始值printf(child a is %d\n, a);a 10;// 输出子进程中变量 a 自增后的结果、子进程的 PID 和子进程的父进程 PID即主进程的 PIDprintf(child a is %d pid:%d ppid:%d\n, a, getpid(), getppid());}else{perror(fork error\n);return 1;}// 输出当前进程中的变量 a 的值和当前进程的 PIDprintf(a is %d pid:%d\n, a, getpid());return 0;
}
八、getpid()和getppid()函数
1. getpid()函数用于获得当前进程的 ID 号码无参数返回值为进程的 pid。 2. getppid()函数用于获得当前进程的父进程 pid 号无参数返回值为父进程 id 号。目前没有直接获取子进程号的函数。
九、面试题解析
1、一次fork生成几个进程他们之间的关系是什么样的
一次 fork 生成两个进程即父进程和子进程它们是父子关系。
2、如果两次fork同时前后执行会生成几个进程他们之间的关系如何表示有多少个子进程有没有孙进程
两次 fork 同时前后执行会生成四个进程。第一次 fork 产生父子两个进程这两个进程再分别进行第二次 fork又各自产生一个子进程所以一共四个进程。关系可以表示为最初的进程是根节点第一次 fork 产生的父子进程是父子关系第二次 fork 产生的进程对于第一次 fork 产生的父进程来说是父子关系对于第一次 fork 产生的子进程来说也是父子关系所以存在孙进程。
十、应用场合及测试
1. 应用场合 ◦ 一个进程希望复制自己使父子进程同时执行相同的代码段在网络服务中比较多见。 ◦ 一个进程需要执行一个不同的程序时可以使用 fork exec 组合。 2. 使用变量测试可以验证父子进程位于不同的地址空间文件的写入测试也可以进一步验证父子进程的独立性。 例如在变量测试中父进程和子进程分别修改同一个变量不会相互影响说明它们位于不同的地址空间。在文件写入测试中父子进程同时向同一个文件写入内容可以观察到写入的顺序和内容的独立性进一步证明它们的独立性。