1操作系统几大模块
进程管理,进程调度,进程间通讯机制,内存管理,中断异常处理,文件系统,I/O系统,网网络部分。
2操作系统的目的
管理硬件设备,为上层应用程序提供良好的执行环境。
3linux系统基本结构
进程描述PCB
广义上,所有的进程信息被放在一一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。linux 下该结构伪task_struct
其中包含的基本信息
标示符 : 描述本进程的唯一一标示示符,用用来区别其他进程。
状态 :任务状态,退出代码,退出信号等。
优先级 :相对于其他进程的优先级。
程序计数器:程序中即将被执行行的下一一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
上下文文数据:进程执行行时处理器的寄存器中的数据。
I/O状态信息:包括显示示的I/O请求,分配给进程的I/O设备和被进程使用用的文文件列表。
记账信息:可能包括处理器时间总和,使用用的时钟数总和,时间限制,记账号等
保存进程信息的数据结构叫做 task_struct,并且可以在 include/linux/sched.h 里里找到它。所有运行行在系统里里的进程都以 task_struct 链表的形式存在内核里里。
进程的信息可以通过 /proc 系统文文件夹查看。要获取PID为400的进程信息,你需要查看 /proc/400 这个文文件夹。大大多数进程信息同样可以使用用top和ps这些用用户级工具来获取。
获取进程标识符
进程位置(进程地址空间)
测试
关于环境变量的获取与修改
这里:setenv第三个参数为0时,如果环境变量存在,则不修改,直接返回。为非0 时,则如果存在,那么修改
进程状态
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
其中的S 是可中断睡眠状态(interruptible sleep),可以被唤醒的,而D状态是不可终端睡眠(uninterruptible sleep),只有自己醒来或者关机动作终止睡眠。
僵死状态(Zombies)是一一个比比较特殊的状态。当进程退出并且父父进程(使用用wait()系统调
用用)没有读取到子子进程退出的返回代码时就会产生生僵死进程。僵死进程会以终止止状态保持
在进程表中,并且会一一直在等待父父进程读取退出状态代码。
进程状态之间基本切换规则
向进程发送信号改变状态
命令 kill,killall
kill -l 获取具体的命令编号以及信息
具体用法请自行man kill
另外查看进程状态的几个命令是 ps pstree top
进程优先级
在ps 的列中有
PRI :代表这个进程可被执行行的优先级,其值越小小越早被执行
NI :代表这个进程的nice值。
PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行行的先后顺序,此值越小小进程的优先级别越高。
nice值了,其表示进程可被执行的优先级的修正数值。
PRI(new)=PRI(old)+nice
注: 这里的nice值是对于运行中程序优先级的修正,所以参考点都是pri的预设值。而非当前值。
进程执行
进程内存布局分为四个不同的段:
• 文文本段,包含程序的源指令。
• 数据段,包含了静态变量。
• 堆,动态内存分区区域。
• 栈,动态增长与收缩的段,保存本地变量。
僵尸进程:一个子进程在其父进程没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。如果其父进程还存在而一直不调用wait,则该僵尸进程将无法回收,等到其父
进程退出后该进程将被init回收。
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
进程终止止
进程终止止的方方式有8种,前5种为正常终止止,后三种为异常终止止:
1 从main函数返回;
2 调用用exit函数;
3 调用用_exit或_Exit;
4 最后一一个线程从启动例程返回;
5 最后一一个线程调用用pthread_exit;
6 调用用abort函数;
7 接到一一个信号并终止止;
8 最后一一个线程对取消请求做出响应。
(1)exit函数
#include
void exit( int status );
void _Exit( int status );
#include
void _exit( int status );
exit()做相应的资源清理工作而后返回内核。其他两个直接返回内核。
exit()和return返回效果一样
2)atexit函数
#include
int atexit( void (*fun)( void ) );
用于注册程序结束时运行方法,类似与sethandler机制或者戏够函数机。
且,注册顺序与执行顺序相反。类似析构过程