1. 进程与程序的区别
1.程序:存放在外存中的一段代码的集合
2.进程:是一个程序动态执行的过程,包括创建、调度和消亡
2. 进程的创建(创建了一片虚拟内存空间,多个进程共用同一片虚拟内存空间,进程空间在实际的物理地址是独立的)
2.1 进程被执行后,操作系统开辟进程空间,并分为如下区域
1.文本段:
文本区
2.数据段:
数据区
3.系统数据段:
堆区、栈区
4.内核
2.2 内存映射
1.进程空间是独立的(物理地址),进程是操作系统资源分配的最小单元
2.所有进程所使用的虚拟地址空间都为同一空间(虚拟地址)
3.每个进程运行起来后,操作系统都会分配一个内存空间(虚拟地址)
3. 进程调度
3.1 运行方式
宏观并行,微观串行
1.宏观:大角度 用户
2.微观:小角度 CPU
3.2 进程状态(进程在调度过程中频繁保存现场恢复现场,使得进程拥有了一些不同的状态)
1.就绪态、运行态 R
2.可唤醒等待态 S(sleep、scanf) 睡眠态
3.不可唤醒等待态 D(加载驱动)
4.暂停态 T
5.僵尸态 Z(代码运行完了,空间还在,需要回收空间)
6.结束态 X(空间被回收的一瞬间)
3.3 进程调度算法(完成从一个进程切换到下一个进程去执行相应的任务)
1.先来先执行,后来后执行
2.高优先级调度算法
3.时间片轮转调度算法:CPU在一个任务中执行的一小段时间成为一个时间片
4.多级队列反馈调度算法
5.负载均衡调度算法
4. 进程命令
1.top(按CPU占用率查询进程实时信息)
PID:进程ID号
PPID:父进程ID号
q退出
2.ps -ef (按PID排序查询某一个时刻进程信息)
查看所有进程信息
3.pstree
查看进程关系(关系树)
4.ps -aux (ps -aux | less)
查看进程状态信息
5.kill
kill -9 进程PID(9强制关闭)
killall -9 进程名 (杀死所有与进程名相关的进程)
killall -9 bash(关闭所有)
5. 进程相关函数接口
5.1 fork
1. 定义
pid_t fork(void);
2. 功能
创建一个子进程
子进程先运行还是父进程先运行,顺序不确定。
变量不共享。
子进程的执行过程是从fork函数之后执行。
3. 参数
缺省
4. 返回值(一次调用,会返回两次)
成功
子进程中返回0
父进程中返回创建的子进程的PID>0
失败返回-1
5. 示例程序
#ifndef _HEAD_H_
#define _HEAD_H_
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#endif
#include "head.h"
int main(int argc, char const *argv[])
{
pid_t pid;
pid = fork();
if (-1 == pid)
{
perror("fail to fork!\n");
return -1;
}
if (0 == pid)
{
printf("Child Process! PID:%d PPID:%d\n", getpid(), getppid());
}else if (pid > 0)
{
printf("Parent Process! PID:%d ChildPID:%d\n", getpid(), pid);
}
printf("hello world!\n");
while (1)
{
}
return 0;
}
5.2 getpid
1. 定义
pid_t fork(void);
2. 功能
获得调用该函数(当前)进程的pid
3. 参数
缺省
4. 返回值
当前进程的pid
5.3 getppid
1. 定义
pid_t getppid(void);
2. 功能
获得调用该函数进程的父进程pid号
3. 参数
缺省
4. 返回值
返回父进程id号
5.4 exit
1. 定义
void exit(int status);
2. 功能
让进程结束(刷新缓冲区)
3. 参数
status:进程结束的值
4. 返回值
缺省
5. 注意
在主函数中调用exit和return作用等价
5.5 _exit
1. 定义
void _exit(int status);
2. 功能
立即结束调用该函数的进程(不刷新缓冲区)
3. 参数
status:进程结束的状态
4. 返回值
缺省
补充1
fprintf
1. 定义
int fprintf(FILE *stream, const char *format, ...);
2. 功能
向指定流中打印格式化字符串
3. 参数
stream:文件流指针
format:字符串格式
...:变量表达式
4. 返回值
成功返回打印字符的个数
失败返回负数
5. 示例程序
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
int num1 = 200;
int num2 = 300;
char tmpbuff[1024] = {0};
int year = 2022;
int mon = 8;
int day = 10;
int hour = 10;
int min = 16;
double pi = 3.1415926;
fp = fopen("file.txt", "w");
if (NULL == fp)
{
perror("fail to fopen");
return -1;
}
// fprintf(fp, "[%04d-%02d-%02d %02d:%02d]:%.2lf\n", year, mon, day, hour, min, pi);
#if 1
fprintf(fp, "hello world\n");
fprintf(fp, "num1 = %d, num2 = %d\n", num1, num2);
// sprintf(tmpbuff, "num1 = %d, num2 = %d\n", num1, num2);
// fputs(tmpbuff, fp);
#endif
fclose(fp);
return 0;
}
sprintf
char tmpbuff[1024] = {0};
sprintf(tmpbuff, "hello world");
补充2
fscanf
1. 定义
int fscanf(FILE *stream, const char *format, ...);
2. 功能
从流中接收格式化字符串
3. 参数
stream:文件流指针
format:格式化字符串
4. 返回值
成功返回匹配到输入控制符的个数
失败能返回EOF
读到文件末尾返回EOF
5. 示例程序
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
int num1 = 0;
int num2 = 0;
int ret = 0;
fp = fopen("file.txt", "r");
if (NULL == fp)
{
perror("fail to fopen");
return -1;
}
ret = fscanf(fp, "num1 = %d, num2 = %d", &num1, &num2);
printf("ret = %d\n", ret);
fclose(fp);
printf("num1 = %d\n", num1);
printf("num2 = %d\n", num2);
return 0;
}
补充3:malloc用例
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p = NULL;
p = malloc(4);
if (NULL == p)
{
printf("malloc failed!\n");
return -1;
}
*p = 100;
printf("*p = %d\n", *p);
free(p);
return 0;
}