赞
踩
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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。