Linux进程
Linux是一个多进程多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机;多任务是指Linux可以同时执行几个任务,Linux系统的一个重要特点就是可以同时启动多个进程。根据操作系统的定义:进程简单地讲就是操作系统资源管理的最小单位。
进程的概念
进程是操作系统资源分配的基本单位。要了解进程就需要将其与程序的概念区分开,下面详细介绍:
**程序:二进制文件,在磁盘上,不占用系统资源(cpu,内存等支持操作系统运行的资源)
**进程:抽象概念,占用系统资源,是系统资源分配的最小单位
进程将程序从磁盘上加载到系统资源后cpu才开始执行
总之:程序在磁盘上,但不占用系统资源;进程占用系统资源,但不在磁盘上;进程是动态的,程序是静态的;进程是运行中的程序,程序是一些保存在磁盘上的可执行代码。
举例: 类比于剧本来看,一个剧本可以被导演成多种版本,那么一个程序也可以被加载为多个进程。进程标识
Linux操作系统中,每一个进程都是通过唯一的进程ID标识的。进程ID是一个非负数,每一个进程除了ID外还有其他的标识信息,他们可以通过相关的函数来获得。这些函数的在unistd.h头文件中。
获取进程各标识符的函数:
pid_t getpid(id) 获得进程ID
pid_t getppid(id) 获得进程父进程的ID
pid_t getuid() 获得进程的实际用户ID
pid_t geteuid() 获得进程的有效用户ID
pid_t getgid() 获得进程的实际组ID
pid_t getegid(id) 获得进程的有效组ID
**实际用户ID(uid): 标识运行该进程的用户。
**有效用户ID(euid): 标识以什么身份来运行进程。比如:某个普通用户A,运行了一个程序,而这个程序是以root的身份来运行的,这程序运行时就具有root权限。则实际用户ID就是A用户的ID,而有效用户ID是root用户ID。
**实际组ID(gid): 实际用户所属的组的ID。
**有效组ID(egid): 有效用户所属的组的ID。Linux进程的结构
Linux进程中一个进程由3个部分组成:代码段、数据段和堆栈段。
如下图所示:
代码段存放的是程序的可执行代码。数据段存放程序的全局变量、常量、静态变量。堆栈段中的堆用于存放动态分配的内存变量;堆栈段中的堆用于存放动态分配的内存变量;栈用于函数调用,它存放函数的参数、函数内部定义的局部变量。Linux进程状态
运行状态:进程正在运行或在运行队列中等待运行的状态
可中断等待状态: 进程正在等待某个事件完成,等待过程中可以被信号或者定时器唤醒
不可中断等待状态: 进程也在等待某个事件完成,在等待过程中不可被中断
僵死状态: 进程已经终止,但进程描述符依然存在,直到父进程调用wait()函数后释放。通俗来说就是子进程结束了但是父进程还没结束,父进程无法回收子进程的空间及信息。
孤儿进程: 父进程已经结束,子进程再继续。此时的子进程被init(1)进程托管。进程的并发
宏观并行 微观串行 (单处理机)
优点:
对于用户:可以同时做多个事情
对于电脑: 可以提高cpu的使用率- 进程控制
fork()函数 可以创建一个子进程
它的返回值为pid_t型 可以看做无符号整型 没有参数传入
调用fork()函数后创建的子进程会先将父进程的代码拷贝一份,然后从fork()函数的下一句代码开始执行,fork()函数将0返回给子进程,大于0的数返回给父进程,而-1表示失败。
下面补充一些琐碎的知识点:
1. Shell命令的本质是在特定目录下的可执行文件。
2. Linux的终端也叫命令解析器
3. Shell命令的执行流程:
a. 输入命令名
b. 根据命令名在/usr/bin、/sbin、/bin、/usr/sbin这四个目录里查找同名的可执行文件
c. 开始执行可执行文件
这个流程是未指定路径的情况,如果指定了路径上述过程的第二步将会在指定目录下查找。
4. ps aux 显示所有进程
ps ajx 显示进程组id
5. Linux的返回值一般情况下有两种功能:
1.判断是否失败
2.返回一个需要的值
6. sleep()函数
sleep(0): 作用之一是 该进程让出cpu; 其二才是 等待、
7. wait()函数
主要处理孤儿进程(缺点是只会回收第一个死亡的孤儿进程)
返回值是pid_t wait(int *status)
作用:
a.. 阻塞等待子进程退出
b.. 回收残留资源
c.. 获取子进程退出状态