AI提问
1.INIT程序
2.LOGIN进程
3.linux进程中用户模式与内核模式分别有什么作用
4.linux进程里的fork()
5.linux进程里的getppid()与getpid()
6.linux管道命令处理
学习笔记
1. 多任务处理:同时执行几项独立任务的能力。在单处理器(单CPU),一次只能执行一个任务,多任务处理是通过在不同任务之间多路复用CPU的执行时间来实现的,即将CPU执行操作从一个任务切换到另一个任务。不同任务之间执行切换的机制称为上下文切换,将一个任务的执行环境更改为另一个任务的执行环境,如果切换速度足够快,就会给人一种同时执行所有任务的错觉。在有多个CPU或处理内核的多处理系统中,可以在不同CPU上实时,并行执行多项任务。
2. 进程的概念:在操作系统中,任务称为进程,我们将执行映像定义为执行代码,数据,堆栈的存储区,进程正式定义为:
进程是对映像的执行。
3. 操作系统将一系列执行视为使用系统资源的单一实体,在操作系统内核中,每一个进程用一个独特的数据结构表示,称为PROC结构体,PROC结构体中包含某个进程的所有信息,下面是一个PROC结构体
1.next是指向下一个PROC结构体的指针,ksp是保存的堆栈指针,当某一进程放弃使用CPU时,它会执行上下文保存在堆栈中,并将堆栈指针保存于ksp。Status表示进程的当前状态,priority是进程调度优先级,kstack是进程操作时的堆栈,pid当前进程的编号。
4.Unix/linux中的进程:
(1)、进程来源,操作系统启动时,操作系统内核的启动代码会强行创建一个PID=0的初始化进程,即通过分配PROC结构体进行创建,初始化PROC内容,并让运行指向proc[0].之后系统执行初始进程,p0继续初始化系统,包含系统硬件与内核数据结构,之后他挂载一个根文件系统,使系统可以使用文件,在初始化系统之后,p0复刻一个子进程p1并把进程切换为用户模式运行p1.
(2)、INIT和守护进程,进程p1开始运行,它将执行映像3改为INIT程序,所以p1成为INIT进程,因为其执行映像为init程序,p1开始复刻出许多子进程,p1大多数子进程都是用来提供系统服务的,在后台运行,不与用户产生交互,这样的进程为守护进程。
(3)、登录进程,LOGIN进程用于用户登录,每一个LOGIN进程打开三个与自己终端相关联的文件流,这三个文件流用于标准输入stdin,标准输出stdout与标准错误信息stderr,每一个文件流都指向进程堆区中的FILE结构体的指针
(4)进程的执行模式、进程以两种模式执行,内核模式、用户模式。(Kmode、Umode)。内核模式下可以随意进入用户模式,但用户模式进入内核模式只有以下几种操作,
1.中断,中断是外部设备发送给CPU的信号,请求CPU服务,用户模式下的CPU会响应信号并中断进程,之后CPU进入内核模式处理中断。
2.陷阱,陷阱是错误条件,如无效地址,非法指令,除以0等,这些错误条件被cpu识别为异常,使得CPU进入内核模式处理错误
3.系统调用,系统调用是一种允许用户模式进入内核模式以执行内核函数的机制,当某进程执行完内核函数,将一个期望结果和一个返回值返回到用户模式,这个值通常为0或-1.
5.进程管理的系统调用
(1)、fork:int pid = fork():fork()创建子进程并返回子进程的pid失败返回-1.
(2)、进程执行顺序,在fork完成后,子进程与父进程和系统中所有其他进程竞争CPU运行时间,
(3)、进程终止1.正常终止,2.异常终止
6.I/O重定向
(1)、文件流与文件描述符
1. sh进程有三个用于终端I/O的文件流:
• stdin:标准输入,文件名描述符为0
• stdout:标准输出,文件描述符为1
• stderr:标准错误,文件描述符为2
2.重定向标准输入/输出
重定向标准输入(用一个新打开的文件来替换文件描述符0,则输入来自改文件而不是原始输入设备)
• #include <fcntl.h>
•
• close(0);
• int fd=open(“filename”,O_RDONLY);
• /*
• close()关闭文件描述符0,open()系统调用打开文件
• /
• / OR /
• int fd=open(“filename”,O_RDONLY);
• clode(0);
• dup(fd);
• /
• 系统调用dup(0)复制fd到数值最小的未使用文件描述符中
• /
• 重定向标准输出(一样用一个文件替换文件描述符1)
• printf(“filename=%s\n”,items);
• / 想要实现上述操作需要发出一个write系统调用: */
• close(1);
open("filen
7.管道
管道式用于进程交换数据的单向进程间通信信道,管道有读取端与写入端,
(1)、管道命令处理
Cmd1 | cmd2
例ls-l | grep .txt
(2)命名管道
又称FIFO,在文件系统中以特殊文件的形式存在,以下为一个例子:
1. 在sh中,通过mknod命令创建一个命名管道:
mknod mypipe p
2.或在c语言程序里,用mknod()系统调用
Int r =mknod(“mypipe”,S_IFIFO,0);
4. 输入:ls -l mypipe;显示:prw-r-r- 1 root 0 time mypipe文件类型p表示它是管道,连接数是1,大小为0。
5. 进程可像访问普通文件一样访问命名管道。
运行
1.fork
2.进程的执行顺序
3.管道操作
苏格拉底提问