-
1、操作系统
操作系统 = 内核 + 应用
功能:操作计算机
操作系统的定位:计算机管理员;对上提供良好的执行环境,对下管理软硬件资源
库函数和系统调用接口的关系:库函数封装了系统调用接口。上下级的调用关系
-
2、进程
- 1>初识
对于用户来说,进程就是运行中的程序。在对于操作系统而言,其实是先描述再组织的实例,所谓描述,在Linux下指的是操作系统以一个PCB的结构体进行描述,在Linux下叫做task_struct,其中有进程id,状态,优先级,上下文数据等,而组织则是说在系统内核中有一个结构体链表将这些结构体组织起来。
标识符(PID) | 进程状态 |
优先级 | 对内存的优先分配权 |
内存指针 | 找到代码段,即运行的程序 |
上下文数据,程序计数器 | 保存程序运行时间点 |
io状态信息 | 对文件状态的描述 |
记账信息 | 进程在CPU的运行时间 |
- 2>查看进程
ps -ef e:f:树状显示
- 3>进程创建
fork() 操作系统创建进程的接口
fork通过对复制父进程创建一个新的的子进程
复制:复制的是父进程的pcb,意味着子进程和父进程代码和数据指向的是同一块内存区域(数据和代码运行的完全一样),并且子进程拷贝了程序计数器,上下文数据所以当前的子进程是从子进程创建成功到的下一步指令开始运行的
父进程代码共享,数据独有
返回值:父进程返回的是子进程的pid,子进程返回的是0,通过返回值的不同,进行代码分流
- 4>进程状态
运行 R
可中断睡眠 S
不可中断睡眠 D
停止 T
僵尸 Z
孤儿 父进程先于子进程退出。孤儿进程的父进程是pid为1的init进程.孤儿进程退出不会产生僵尸进程
僵尸进程
- 危害:资源泄露
- 产生:子进程先于父进程退出。操纵系统通知父进程,父进程未处理,且操作系统未释放资源。
- 处理:退出父进程
- 预防:进程等待
- 5>进程优先级
功能:决定CPU资源有限分配权 priority 优先级 PRI nice renice NI
nice:程序运行时设置:nice -n x + 文件 renice -n x -p + 进程号
查看:ps -l
设置:PRI = PRI + NI PRI值越小优先级越高 nice -n x +文件
nice取值范围:-20 ~ 19
- 6>相关概念
竞争性:进程竞争CPU资源,优先级产生
独立性:各个进程相互独立
并发/并行:CPU资源足够,同时运行则并行,不够切换运行,则并发
- 7>环境变量
功能:用于设置系统运行环境参数的变量
查看:env echo $ ($表示后面的字符串是变量,不是字符串)
声明:export export str=1000
删除:unset unset str
作用:让程序运行更加高效
特性:全局特性
获取:getenv() char** environ main的第三个参数
- 8>进程地址空间
这是个彩蛋
-
3、进程控制
(下面内容请了解,看下篇博文)
- 进程创建:
- fork():
- 复制:复制的是pcb。和父进程相同的上下文数据和代码段(只读性);代码共享,数据独有
- 返回值:父进程的返回值是子进程的PID,子进程的返回值是0。
- 进程终止:
- 终止类型
正常终止:结果符合预期
正常终止:结果不符合预期
异常终止:崩溃
终止方式:
main中的return exit()库函数:做完收尾工作释放资源 _exit()系统调用:直接释放系统资源才退出进程
进程等待:等待子进程的退出;避免产生僵尸进程
等待接口:
wait(int* status)
waitpid(pid_t pid, int* status, int options)
status:获取子进程的返回值
pid:-1等待人意子进程退出
0等待指定子进程退出
options:
0 默认等待子进程退出
WNOHANG 如果没与子进程退出,立即返回
阻塞:为了完成操作发起的调用,但是当前如果不具备完成条件,则一直等待,直到完成操作。
非阻塞:为了完成操作发起的调用,但是当前如果不具备完成条件,则立即报错返回
进程替换:替换进程所运行的程序
将代码段虚拟地址经过页表所映射的物理地址区域替换成另一块内存中的代码的位置
新的程序有自己运行的数据。意味着虚拟地址空间中不仅代码段映射位置改变了,并且数据段也需要重新初始化,映射到新程序数据段的位置
接口:exec函数族
execl exclp execle
execv execvp execve
l和v的区别:命令行参数传递不同,l-参数平铺,以NULL结尾 v-字符串指针数组
l:需要传递可执行程序文件全路径名
le:传递全路径名,并且可以自定义进程的环境变量
lp :只需要传递文件名