首页 > 系统相关 >《Unix&Linux系统编程》第三章学习笔记

《Unix&Linux系统编程》第三章学习笔记

时间:2022-10-09 16:15:10浏览次数:50  
标签:int 编程 pid 终止 Unix Linux 进程 执行 PROC

第3章 Unix/Linux进程管理

3.1 多任务处理

多任务处理指同时执行几个独立的任务。在单CPU系统中一次只能执行一个任务。多任务处理是通过在不同任务之间多路复用CPU的执行时间来实现的,即将CPU执行操作从一个任务切换到另一个任务,这种切换机制称为上下文切换。如果切换速度足够快,就给人一种同时执行所有任务的错觉,这种逻辑并行性成为并发。多个CPU的多处理系统中,可在不同的CPU上实时、并行执行多项任务。

3.2 进程

在操作系统中,任务也成为进程。进程是对映像的执行。每个进程用一个独特的数据结构表示,叫做进程控制块(PCB)任务控制块(TCB),可直接称为PROC结构体,它包含某个进程的所有信息。

3.3 多任务处理系统

1.type.h文件
定义了系统常数和表示进程的简单PROC结构体。

2.ts.s文件
在32位GCC汇编 代码中可实现进程上下文切换。

3.queue.c文件
可实现队列和链表操作函数
enqueue()函数:按优先级将PROC输入队列
dequeue()函数:返回从队列或链表中删除的第一元素
printList()函数:打印链表元素

4.t.c文件
定义MT系统数据结构、系统初始化代码和进程管理函数。

3.4 进程同步

指控制和协调进程交互以确保其正确执行所需的各项规则和机制。

睡眠模式:
某进程需要某些当前没有的东西,如申请独占一个存储区域、等待用户输入字符等。
实现方法:在PROC结构体中添加event字段,实现ksleep(int event)函数

唤醒操作:
多个进程可能会进入休眠状态等待同一个事件,当某个等待时间发生时,另一执行实体(可能是进程或中断处理程序)会调用kwakeup(event)函数来唤醒处于休眠状态等待该事件值的所有程序。

3.5 进程终止

1、正常终止:进程调用exit(value),发出_exit(value)系统调用来执行在操作系统内核中的kexit(value)

2、异常终止:进程因某个信号而异常终止
(1)kexit()算法
在Unix/Linux中,进程只有非常松散的父子关系,,进程可能随时死亡。大多数大型操作系统内核通过维护进程家族树来跟踪进程关系。
(2)进程
进程家族树通过PROC结构中的一对子进程和兄弟进程指针以二叉树的形式实现,如:

PROC *child,*sibling,*parent;

(3)等待子进程终止
进程可调用内核函数来等待僵尸子进程:

pid = kwait(int *status) //成功则返回僵尸子进程的pid,没有子进程则返回-1

当进程终止时,将唤醒父进程:

kwakeup(running->parent);

3.6 MT系统中的进程管理

  • 用二叉树的形式实现进程家族树
  • 实现ksleep()和kwakeup()进程同步函数
  • 实现kexit()和kwait()进程管理函数
  • 添加“W”命令来测试和演示等待操作

3.7 Unix/Linux中的进程

1、进程来源
操作系统启动时,内核的启动代码会强行创建一个PID=0的初始进程,初始化PROC内容,初始化系统后,P0复刻出一个子进程P1。
2、INIT和守护进程
当进程P1开始运行时,它将执行映像更改为INIT程序,P1就是INIT进程
P1的大部分子进程都是用来提供系统服务,在后台运行,不与任何用户交互,被称为守护进程
3、登录进程
P1复刻了许多LOGIN进程,每个中断上一个用于用户登录。
4、sh进程
用户成功登录是,LOGIN进程获取用户的gid和uid,从而成为用户的进程,将目录更改为用户的主目录并执行列出的程序。
5、进程的执行模式
进程以内核模式(Kmode)用户模式(Umode)两种模式执行。

3.8 进程管理的系统调用

1、fork()

int pid = fork();

fork()创建子进程并返回子进程的pid,如果失败则返回-1。
2、进程执行顺序
fork()完成后,运行哪个进程取决于它们的优先级。
3、进程终止
正常终止:

pid = wait(int *status);

异常终止:

kill -s signal_number pid

4、等待子进程终止

int pid = wait(int *status);
int pid = waitpid(int pid,int *status,int options);

5、subreaper进程

prct1(PR_SET_CHILD_SUBREAPER);

这样,init进程P1将不再是孤儿进程的父进程。
6、exec()
更改进程执行映像:

int execve(const char *filename,char *const argv[],char *const envp[]);

7、环境变量

  • SHELL:指定将解释任何用户命令的sh
  • TERM:指定运行sh时要模拟的终端类型
  • USER:当前登录用户
  • PATH:系统在查找命令时将检查的目录列表
  • HOME:用户的主目录

3.9 I/O重定向

  • stdin:标准输入
    重定向:
int fd = open("filename",O_RDOMLY);
close(0);
dup(fd);
  • stdout:标准输出
    重定向:
close(1);
open("filename",O_WRONLY|O_CREAT,0644);
  • stderr:标准错误

3.10 管道

管道是用于进程交换数据的单向进程间通信通道,有一个读取端和一个写入端。
1、管道编程

int pd[2];
int r = pipe(pd);

2、管道命令处理

ps x |grep "httpd"
cat filename | more

3、命名管道—FIFO
sh中:

mknod mypipe p

C程序中:

int r = mknod("mypipe",S_IFIFO,0);

实践:

1、fork函数:

2、进程执行顺序

3、等待子进程终止

标签:int,编程,pid,终止,Unix,Linux,进程,执行,PROC
From: https://www.cnblogs.com/weihehahaha/p/16772464.html

相关文章

  • 第1天 从计算机结构到汇编程序入门
    helloOS.imgCPU只能识别二进制数字,我们可以通过使用二进制编辑器来写如二进制代码使得计算机识别这些代码并输出指定字符。书中使用的Bz162软件,根据书中的内容将二进制......
  • Linux之新增银盘,分区,挂载
     1.新增硬盘后,查看当前磁盘信息fdisk-l  可以看到除了当前的第一块硬盘(sda)外还有一块sdb的第二块硬盘(sdb),然后用命令:fdisk/dev/sdb 给第二块硬盘进行分......
  • linux环境变量配置错误后命令无法使用解决方案
    环境变量配置时多复制了一个空格,导致执行source/etc/profile后提示错误,无法编辑和查看文件解决方案: 查看当前系统变量:echo$PATH临时修改:exportPATH=/usr/local/sbi......
  • linux的重定向、管道与环境变量PATH
    (文章目录)一、重定向1.输出重定向:>1.写入指定文件[root@VM-8-8-centoslesson5]#catfile.txt[root@VM-8-8-centoslesson5]#echo"helloworld">file.txt[root......
  • Linux文件操作命令touch
    touchtouch[filename]创建文件,参数可以跟多个如果要创建50个有规律的文件,例如text1-text50利用参数扩展touchtest{1..50}touchtest{a..e}touchtest{a..e}_{......
  • node_exporter到prometheus到grafana,监控linux机器,监控搭建
    搭建架构:Linux被监控机:node_exporterLinux监控机:prometheus&grafanamacos图形化展示监控结果:远程访问 prometheus&grafana 一、Linux被监控机的配置下载node_e......
  • linux磁盘已满,查看哪个文件占用多
    1.使用df-h查看磁盘空间占用情况2.使用sudodu-s-h/*|sort-nr命令查看那个目录占用空间大3.然后那个目录占用多再通过sudodu-s-h/var/*|sort-nr一层层......
  • LINUX系统同步网络时间
    安装了一个ntp缩减版的工具,然后同步时间的master是一个所有人都可以用的master安装工具yum -yinstallntpntpdate同步网络时间ntpdatecn.pool.ntp.org......
  • 可编程 USB 转串口适配器开发板 常见问题及注意事项
    可编程USB转串口适配器开发板常见问题及注意事项 可编程USB转UART/I2C/SMBusS/SPI/CAN/1-Wire适配器USB2S 常见问题及注意事项 (1)外接引线长度 当使用导线连接......
  • Linux中安装使用rsync
    获取 rsync-3.1.0 我的网盘里放了一个。地址:​​http://pan.baidu.com/s/1dDs4lSt​​安装rsync-3.1.0.tar.gz #tarzxvfrsync-3.1.0.tar.gz#cdrsync-3.1.0#./config......