【LINUX】进程概述

一、进程概述

进程:是系统资源分配和任务调度的基本单元,是操作系统结构的基础。
1.1、 进程的产生过程:
逻辑电路->bootloader->系统启动->0号进程->1,2号进程。
系统启动产生0号进程(内核/系统进程),0号进程产生1号进程和2号进程。
1号进程跑出内核,继续产生其他进程(用户进程);2号进程则留在内核,继续管理内核中的进程(页守护进程)。
1.2 进程的状态: 就绪态、运行态、挂起态、睡眠态、僵尸态/孤儿态、死亡态、暂停态
1.3 进程的产生: 4G的空间(1G内核空间0x00000000-0xbfffffff、3G用户空间0x80480000-0xc0000000)  
系统预留  0x00000000 - 0x08048000
text段、data段、堆、栈、命令行参数、环境参数
        查询进程:ps   查看具体进程:ps -lA | grep 进程名
进程的调度算法:
1)先来先服务调度算法 
2)短作业(进程)优先调度算法 
3)时间片轮转法 
4)多级反馈队列调度算法 
5)优先权调度算法的类型 
6)高响应比优先调度算法


二、进程详述

2.1 进程环境
1)特殊的启动例程,程序的起始地址。 _start函数启动完成初始化操作,调用main函数
2) exit(执行清理动作后进入内核) _exit _Exit(立即进入内核)
3) int atexit(void (*func)(void))   一个进程可以登记32个函数,这些函数由exit自动调用,称为终止处理程序,调用atexit函数来登记这些函数
4)每个程序都接收到一张环境表,environ(环境指针)指向环境表,环境表存放着大量指针指向环境字符串
5) 正文段、初始化数据段、未初始化的数据段(BSS段 exec初始化为0)、堆、栈、命令行参数及环境变量
6) malloc  分配指定字节数的存储区,初始值不确定
    calloc  为指定数量指定长度的对象分配存储空间,初始化为0
realloc 增加或减少以前分配去的长度
一般申请内存区域会大一些,额外的空间记录管理信息:分配块的大小、指向下一个分配块的指针
7) 环境变量操作函数:
#include <stdlib.h>  
char *getenv(const char *name);
int putenv(char *str); //放入环境表
int setenv(const char *name, const char *vlaue, int rewrite);
int unsetenv(const char *name); //删除name的定义
环境变量修改,根据长度决定是否需要新增空间(堆上)存储字符串
环境变量新增,首次不仅需要申请空间存放字符串,同时需要在移动环境变量表,在尾部添加新增的环境指针。非首次直接在尾部添加。
8) 函数跳转,直接跨过函数栈
#include <setjmp.h>
int setjmp(jmp_buf env);
int longjmp(jmp_buf env, int val);
9) 进程的资源控制函数
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlptr);
int setrlimit(int resource, const struct rlimit *rlptr);
struct rlimit{
rlim_t rlim_cur; //soft limit
rlim_t rlim_max; //hard limit
};
2.2 进程控制
1)进程ID(getpid):进程唯一标识
   父进程:使用fork或vfork函数产生的进程
   进程实际用户ID、进程的实际组ID:我们实际上是谁
   进程有效用户ID、进程有效组ID:用于文件访问权限检查
2)执行fork函数后,需要注意的是如果父进程进行了输出重定向,则会出现父子进行同时操作相同的文件
3)fork失败的原因:
a:该实际用户ID的进程超过了系统限制
b:系统组有了太多的进程
4)fork常用的两种用法:
a:父进程与子进程执行不同的代码段
b:一个进程要执行一个不同的程序。
5)vfork创建一个新进程,但是新进程的目的是用于执行一个新的程序;
   vfork保证子进程先执行,在调用exec或exit之后父进程才可能被调度运行。
6)新建状态、就绪状态、执行状态、等待状态、终止状态
   僵尸进程:子进程已经终止,但是其父进程尚未对其进行善后处理的进程。仍占用资源    ps Z
   孤儿进程:父进程已经终止,子进程仍在运行。
7)wait、waitpid、waitid、wait3、wait4
8) #include <unistd.h>
int execl(const char *path, const char *arg, ...)  
int execv(const char *path, char *const argv[])  
int execle(const char *path, const char *arg, ..., char *const envp[])  
int execve(const char *path, char *const argv[], char *const envp[])  
int execlp(const char *file, const char *arg, ...)  
int execvp(const char *file, char *const argv[])  
p 文件名  v argv   l arg0...   e env[]
9) #include <unsitd.h>
int setuid(uid_t uid);
int setgid(gid_t gid);
int seteuid(uid_t uid);
int setegid(gid_t gid);
10) system依赖操作系统,相当于 for、exec、waitpid 的结合
11)任一进程可调用times函数获得它自己以及已终止子进程的用户CPU时间、系统CPU时间的值
#include <sys/times.h>
clock_t times(struct tms *buf);
sturct tms{
clock_t tms_utime;
clock_t tms_stime;
clock_t tms_cutime;
clock_t tms_cstime;
}
2.3 进程关系
1)程序是指的存储在存储设备上(如磁盘)包含了可执行机器指 令(二进制代码)和数据的静态实体;
   进程可以认为是已经被OS从磁盘加载到内存上的、动态的、可运行的指令与数据的集合,是在运行的动态实体。
2)进程组就是一个或多个进程的集合。进程组中的这些进程之间不是孤立的,他们彼此之间或者存在者父子、兄弟关系,或者在功能有相近的联系。
   只要在某个进程组中一个进程存在,则该进程组就存在,这与其组长进程是否终止无关
   进程必定属于一个进程组,也只能属于一个进程组
   sys_getpgrp()
3)会话:支持多个用户同时使用一个操作系统。当一个用户登录一次系统就形成一次会话 
   一个会话可包含多个进程组,但只能有一个前台进程组以及一个或多个后台进程组
   一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组。
4)控制终端
   同一会话中的进程通过该会话的控制进程(领头进程)和一个终端相连,该终端作为这个会话的控制终端。
5)守护进程
   守护进程也叫demon进程。是一类在后台运行的特殊进程,用于执行特定的系统任务,不受用户和终端,或者其他的变化而受到影响。
   创建守护进程的步骤:
   a:创建子进程,父进程退出(守护进程脱离控制终端)
   b:在子进程上创建新的会话,调用setsid()函数
   c:改变当前目录为根目录
   d:重设文件权限的掩码
   e:关闭文件描述符号
   守护进程分类:系统守护进程、网络守护进程、独立启动的守护进程、被动守护进程
2.4 进程通信方式
进程间通信的方式: 管道、消息队列、socket套接字、共享内存、信号、信号量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值