学习笔记6
学习笔记6
自学教材第3章,提交学习笔记(10分)
知识点归纳以及自己最有收获的内容 (3分)
问题与解决思路(2分)
实践内容与截图,代码链接(3分)
...(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(2分)
第三章Unix/Linux进程管理:
进程与线程的发展演化的目标,是为了更快的创建进程/线程,更小的上下文切换开销,更好的支持SMP以及HMP架构的CPU。 线程上下文(例如各个寄存器状态,pc指针)的切换比进程开销要小得多。
系统需要运转起来,代码都是静态的,进程才具有生命力,进程是程序的动态执行过程 ,进程正是操作系统的心脏所在。何为进程?进程是处于执行状态的代码以及相关资源的集合,不仅仅是代码段(text section),还包括文件,信号,CPU状态,内存地址空间等。线程基本可以等同于进程般对待
本章讨论了Unix/Linux中的进程管理;阐述了多任务处理原则;介绍了进程概念;并
以一个编程示例来说明多任务处理、上下文切换和进程处理的各种原则和方法。多任务处理
系统支持动态进程创建、进程终止,以及通过休眠与唤醒实现进程同步、进程关系,以及以
二叉树的形式实现进程家族树,从而允许父进程等待子进程终止;提供了一个具体示例来阐
释进程管理函数在操作系统内核中是如何工作的;然后,解释了Unix/Linux中各进程的来
源,包括系统启动期间的初始进程、INIT进程、守护进程、登录进程以及可供用户执行命
令的sh进程;接着,对进程的执行模式进行了讲解,以及如何通过中断、异常和系统调用
从用户模式转换到内核模式;再接着,描述了用于进程管理的Unix/Linux系统调用,包括fork, wait, excc exit;闹明了父进程与子进程之间的关系,包括进程终止和父进程等待操作之间关系的详细描述;解释了如何通过INIT进程处理孤儿进程,包括当前Linux中的subreaper进程,并通过示例演示了subreaper进程;接着,详细介绍了如何通过exec更改进程执行映像,包括execve系统调用、命令行参数和环境变量;解释了10重定向和管道的原则及方法,并通过示例展示了管道编程的方法;读者可借助本章的编程项目整合进程管理的各种概念和方法,实现用于执行命令的sh模拟器。sh模拟器的功能与标准sh完全相同。
它支持简单命令、具有1O重定向的命令和通过管道连接的多个命令的执行。
3.1多任务处理
一般来说,多任务处理指的是同时进行几项独立活动的能力。比如,我们经常看到有人一边开车一边打电话。从某种意义上说,这些人正在进行多任务处理,尽管这样非常不好。
con) 系统
Linux是类Unix系统,借鉴了Unix的设计并实现相关接口,但并非Unix。Linux是由Linus Torvalds于1991年创造的开源免费系统,采用GNU GPL协议保护,下面列举Linux的一些主要特点:
Linux系统中万物皆为文件,这种抽象方便操作数据或设备,只需一套统一的系统接口open, read, write, close即可完成对文件的操作
Linux是单内核,支持动态加载内核模块,可在运行时根据需求动态加载和卸载部分内核代码;
Linux内核支持可抢占;
Linux内核创建进程,采用独特的fork()系统调用,创建进程较高效;
Linux内核并不区分进程和线程,对于内核而言,进程与线程无非是共享资源的区别,对CPU调度来说并没有显著差异。
Linux的进程管理命令:
(1)Who:查看当前用户 会出现root、tty1-tty6、tty7,root:当前用户。 tty1-tty6:文字终端。 tty7:界面终端
(2)Ps:查看进程 ps-a可查看当前操作系统下的所有用户信息。 ps au:在显示所有用户信息上做一个更加细节的信息展示。 Ps-aux:查看没有中断的应用程序。
(3)kill:杀死程序 kill-l查看信号 ,
(4)top:相当于windows下的任务管理器
(5)进程同步:是指控制和协调进程交互以确保其正常执行所需的各项规则和机制,最简单的进程工具是休眠和唤醒,即使用linux’单核操作的机制,当改变单核里的任何一项时,均不会造成影响。
进程管理调用:
进程控制
fork 创建一个新进程
clone 按指定条件创建子进程
execve 运行可执行文件
exit 中止进程
_exit 立即中止当前进程
getdtablesize 进程所能打开的最大文件数
getpgid 获取指定进程组标识号
setpgid 设置指定进程组标志号
getpgrp 获取当前进程组标识号
setpgrp 设置当前进程组标志号
getpid 获取进程标识号
getppid 获取父进程标识号
getpriority 获取调度优先级
setpriority 设置调度优先级
modify_ldt 读写进程的本地描述表
nanosleep 使进程睡眠指定的时间
nice 改变分时进程的优先级
pause 挂起进程,等待信号
personality 设置进程运行域
prctl 对进程进行特定操作
ptrace 进程跟踪
sched_get_priority_max 取得静态优先级的上限
sched_get_priority_min 取得静态优先级的下限
sched_getparam 取得进程的调度参数
sched_getscheduler 取得指定进程的调度策略
sched_rr_get_interval 取得按RR算法调度的实时进程的时间片长度
sched_setparam 设置进程的调度参数
sched_setscheduler 设置指定进程的调度策略和参数
sched_yield 进程主动让出处理器,并将自己等候调度队列队尾
vfork 创建一个子进程,以供执行新程序,常与execve等同时使用
wait 等待子进程终止
wait3 参见wait
waitpid 等待指定子进程终止
wait4 参见waitpid
capget 获取进程权限
capset 设置进程权限
getsid 获取会晤标识号
setsid 设置会晤标识号
在Linux中,创造新进程的方法只有一个,就是fork。其他一些库函数,如system(),看起来似乎它们也能创建新的进程,如果能看一下它们的源码就会明白,它们实际上也在内部调用了fork。包括我们在命令行下运行应用程序,新的进程也是由shell调用fork制造出来的。fork有一些很有意思的特征,下面就让我们通过一个小程序来对它有更多的了解。
/* fork_test.c */
#include
#inlcude
main()
{
pid_t pid;
/*此时仅有一个进程*/
pid=fork();
/*此时已经有两个进程在同时运行*/
if(pid<0)
printf("error in fork!");
else if(pid==0)
printf("I am the child process, my process ID is %d
",getpid());
else
printf(")
linux管道:
“管道可以根据一组命令按照数据流向的方式来进行操作。简单的说,第一个命令执行后,不回显结果,而是把结果通过管道传递给第二个命令,第二个命令处理后再传给第三个….直到没有管道符后才终止命令,并回显最终结果。
管道可以把不同的命令组合成强大的指令集合。比如,对文件夹下所有的txt结尾的文件重命名,就需要三个管道符号,四个命令完成。