linux第7章(进程管理)
- 格式:ppt
- 大小:175.50 KB
- 文档页数:23
《Linux 操作系统设计实践》实验一:进程管理实验目的:(1) 加深对进程概念的理解,明确进程和程序的区别。
(2)进一步认识并发执行的实质.(3) 学习通过进程执行新的目标程序的方法。
(4) 了解Linux 系统中进程信号处理的基本原理.实验环境:Red Hat Linux实验内容:(1)进程的创建编写一段程序,使用系统调用fork()创建两个子进程,当此进程运行时,在系统中有一个父进程和两个子进程活动,让每一个进程在屏幕上显示一个字符,父进程显示字符“a";子进程分别显示字符“b”和字符“c”,试观察记录屏幕上的显示结果,并分析原因.程序代码:#include<stdio。
h〉int main(){int p1 ,p2 ;while((p1=fork())==-1);if(p1==0)putchar(’b');else{while((p2=fork())==—1);if(p2==0)putchar(’c');elseputchar(’a');}return 0;}运行结果:bca分析:第一个while里调用fork()函数一次,返回两次。
子进程P1得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来父进程和子进程P1两个分支运行,判断P1==0,子进程P1符合条件,输出“b”;接下来else里面的while里再调用fork()函数一次,子进程P2得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来判断P2==0,子进程P2符合条件,输出“c”,接下来父进程输出“a”,程序结束。
(2)进程的控制①修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。
程序代码:#include〈stdio。
h>int main(){int p1,p2;while((p1=fork())==-1);if(p1==0)printf("Child1 is running!\n”);else{while((p2=fork())==—1);if(p2==0)printf(”Child2 is running!\n”);elseprintf(”Fath er is running!\n”);}return 0;}运行结果:Child1 is running!Child2 is running!Father is running!分析:本实验和上一个实验一样,只是将每个进程输出一个字符改为每个进程输出一句话.第一个while里调用fork()函数一次,返回两次。
Linux系统编程之进程控制(进程创建、终⽌、等待及替换)进程创建在上⼀节讲解进程概念时,我们提到fork函数是从已经存在的进程中创建⼀个新进程。
那么,系统是如何创建⼀个新进程的呢?这就需要我们更深⼊的剖析fork 函数。
1.1 fork函数的返回值调⽤fork创建进程时,原进程为⽗进程,新进程为⼦进程。
运⾏man fork后,我们可以看到如下信息:#include <unistd.h>pid_t fork(void);fork函数有两个返回值,⼦进程中返回0,⽗进程返回⼦进程pid,如果创建失败则返回-1。
实际上,当我们调⽤fork后,系统内核将会做:分配新的内存块和内核数据结构(如task_struct)给⼦进程将⽗进程的部分数据结构内容拷贝⾄⼦进程添加⼦进程到系统进程列表中fork返回,开始调度1.2 写时拷贝在创建进程的过程中,默认情况下,⽗⼦进程共享代码,但是数据是各⾃私有⼀份的。
如果⽗⼦只需要对数据进⾏读取,那么⼤多数的数据是不需要私有的。
这⾥有三点需要注意:第⼀,为什么⼦进程也会从fork之后开始执⾏?因为⽗⼦进程是共享代码的,在给⼦进程创建PCB时,⼦进程PCB中的⼤多数数据是⽗进程的拷贝,这⾥⾯就包括了程序计数器(PC)。
由于PC中的数据是即将执⾏的下⼀条指令的地址,所以当fork返回之后,⼦进程会和⽗进程⼀样,都执⾏fork之后的代码。
第⼆,创建进程时,⼦进程需要拷贝⽗进程所有的数据吗?⽗进程的数据有很多,但并不是所有的数据都要⽴马使⽤,因此并不是所有的数据都进⾏拷贝。
⼀般情况下,只有当⽗进程或者⼦进程对某些数据进⾏写操作时,操作系统才会从内存中申请内存块,将新的数据拷写⼊申请的内存块中,并且更改页表对应的页表项,这就是写时拷贝。
原理如下图所⽰:第三,为什么数据要各⾃私有?这是因为进程具有独⽴性,每个进程的运⾏不能⼲扰彼此。
1.3 fork函数的⽤法及其调⽤失败的原因fork函数的⽤法:⼀个⽗进程希望复制⾃⼰,通过条件判断,使⽗⼦进程分流同时执⾏不同的代码段。
第七章习题解答一、填空1.一个操作系统的可扩展性,是指该系统能够跟上先进计算技术发展的能力。
2.在引入线程的操作系统中,线程是进程的一个实体,是进程中实施调度和处理机分派的基本单位。
3.一个线程除了有所属进程的基本优先级外,还有运行时的当前优先级。
4.在Windows 2000中,具有1~15优先级的线程称为可变型线程。
它的优先级随着时间配额的用完,会被强制降低。
5.Windows 2000在创建一个进程时,在内存里分配给它一定数量的页帧,用于存放运行时所需要的页面。
这些页面被称为是该进程的“工作集”。
6.Windows 2000采用的是请求调页法和集群法相结合的取页策略,把页面装入到内存的页帧里的。
7.分区是磁盘的基本组成部分,是一个能够被格式化和单独使用的逻辑单元。
8.MFT是一个数组,是一个以数组元素为记录构成的文件。
9.只要是存于NTFS卷上的文件,在MFT里都会有一个元素与之对应。
10.在Windows 2000的设备管理中,整个I/O处理过程都是通过I/O请求包(IRP)来驱动的。
二、选择1.在引入线程概念之后,一个进程至少要拥有D 个线程。
A. 4 B.3 C.2 D.12.在Windows 2000中,只有A 状态的线程才能成为被切换成运行状态,占用处理器执行。
A.备用B.就绪C.等待D.转换3.Windows 2000是采用C 来实现对线程的调度管理的。
A.线程调度器就绪队列表B.线程调度器就绪队列表、就绪位图C.线程调度器就绪队列表、就绪位图、空闲位图D.线程调度器就绪队列表、空闲位图4.在Windows 2000里,一个线程的优先级,会在A 时被系统降低。
A.时间配额用完B.请求I/O C.等待消息D.线程切换5.在单处理机系统,当要在进程工作集里替换一页时,Windows2000实施的是B 页面淘汰策略。
A. FIFO(先进先出)B.LRU(最近最久未用)C.LFU(最近最少用)D.OPT(最优)6.在页帧数据库里,处于下面所列A 状态下的页帧才可以变为有效状态。
Linux0.11的地址有3类地址需要区分清楚:1.程序(进程)的虚拟地址和逻辑地址虚拟地址(virtual address)指程序产生的有段选择符和段内偏移两部分组成的地址。
一个程序的虚拟地址空间有GDT映射的全地址空间和LDT映射的局部地址空间组成。
逻辑地址(logical address)指程序产生的段内偏移地址。
应用程序只与逻辑地址打交道,分段分页对应用程序来说是透明的。
也就是说C语言中的&,汇编语言中的符号地址,C中嵌入式汇编的”m”对应的都是逻辑地址。
2.CPU的线性地址线性地址(linear address)是逻辑地址到物理地址变换的中间层,是处理器可寻址空间的地址。
程序代码产生的逻辑地址加上段基地址就产生了线性地址。
3.实际物理内存地址物理地址(physical address)是CPU外部地址总线上的寻址信号,是地址变换的最终结果,一个物理地址始终对应实际内存中的一个存储单元。
对80386保护模式来说,如果开启分页机制,线性地址经过页变换产生物理地址。
如果没有开启分页机制,线性地址直接对应物理地址。
页目录表项、页表项对应都是物理地址。
Linux 0.11的内核数据段,内核代码段基地址都是0,所以对内核来说,逻辑地址就是线性地址。
又因为1个页目录表和4个页表完全映射16M物理内存,所以线性地址也就是物理地址。
故对linux0.11内核来说,逻辑地址,线性地址,物理地址重合。
个人总结:分段和分页的区别:分段可以给每个进程提供不同的线性地址分页可以把同一线性地址空间映射到不同的物理地址逻辑地址:线性地址:物理地址:逻辑地址-》分段单元-》线性地址-》分页单元-》物理地址Linux在使用的时候避开了Intel原先的设计意图,只是对段基址设置了0,这样逻辑地址和线性地址就一样了,再经过分页机制,就最后变成了物理地址了。
Linux2.4内核使用的空间中,虚拟地址和物理地址只是简单的相差了3G与80386段相关的宏定义set_seg_desc3123715/*****************************************************************************/ /* 功能: 设置存储段描述符,把指定属性的段描述符放入gate_addr 处 */ /* 参数: gate_addr 段描述符的目的地址 */ /* type 描述符中类型域,具体见80386基础一节中的表格 */ /* dpl 描述符中特权级 */ /* base 段基地址,这是线性地址 */ /* limit 段限长 */ /* 返回: (无) */ /*****************************************************************************/ #define _set_seg_desc(gate_addr,type,dpl,base,limit) {\ // 把段描述符的第4-7字节放入gate_addr 处 *((gate_addr)+1) = ((base) & 0xff000000) | \ // base 的31..24位放入gate_addr 的31..24位 (((base) & 0x00ff0000)>>16) | \ //base 的23..16位放入gate_addr 的7..0位 ((limit) & 0xf0000) | \ //limit 的19..16位放入gate_addr 的19..16位 ((dpl)<<13) | \ // dpl 放入gate_addr 的14..13位 (0x00408000) | \ // 把P 位和D 位设置位1,G 置为 0 ((type)<<8); \ // type 放入gate_addr 的11..8位 // 把段描述符的第0-3字节放入gate_addr+1处 *(gate_addr)= (((base) & 0x0000ffff)<<16) | \ //base 的15..0放入gate+1的31..15位 ((limit) & 0x0ffff); } //limit 的15..0位放入gate+1的15..0位set_tssldt_desc/*****************************************************************************/ /* 功能: 设置系统段描述符,把指定属性的段描述符放入GDT 中 */ /* 表项n 对应的地址处, */ /* 参数: n GDT 中表项n 对应的地址 */ /* addr 系统段的基地址,这是一个线性地址 */ /* type 描述符中类型域,具体见80386基础一节中的表格 */ /* 0x89表示386TSS 段描述符,0x82表示LDT 段 */ /* 这里8是为了设置P 位为1 */0 7 15 23 31/* 返回: (无) */ /*****************************************************************************/ // %0 寄存器eax addr// %1-%6 物理地址符号项n地址-n+7的地址#define _set_tssldt_desc(n,addr,type) \__asm__ ("movw $104,%1\n\t" \ // 把TSS的限长104字节放入n地址处,// 这样ldt的限长也定为104,这没有关系,因为linux0.11// 中一个任务的ldt只有3个表项"movw %%ax,%2\n\t" \ // 把addr的15..0位(在ax中)放入n+2处"rorl $16,%%eax\n\t" \ // 把addr的高16位(eax中)放入ax中"movb %%al,%3\n\t" \ //addr的23..16位放入n+4中"movb $" type ",%4\n\t" \ // 把type字段放入n+5中"movb $0x00,%5\n\t" \ // 把G置为0,说明粒度是字节。
第1章1、下列哪个选项不是LINUX 所支持的?()A 、多用户、多用户 B B B、超进程、超进程、超进程 C C C、可移植、可移植、可移植 D D D、多进程、多进程2、LINUX 就是所谓的“FREE SOFTWRAE”,这个“FREE”的含义是什么?()A 、LINUX 不需要付费不需要付费 B B B、、LINUX 发行商不能向用户收费C 、LINUX 可自由修改和发布可自由修改和发布D D D、只有、只有LINUX 的作者才能向用户收费3、以下关于LINUX 内核版本的说法,错误的是哪个?()A 、依次表示为主版本号,次版本号,修正次数的形式B 、1.2.2表示稳定的发行版C 、2.2.6表示对内核的第6次修正D 、1.3.2表示稳定的发行版4、以下哪个软件不是LINUX 的发行版本?()A 、红旗、红旗 server 4B server 4 B server 4 B、、solaris 10C solaris 10 C、、Red Hat 9D Red Hat 9 D、、Fedora 85、与Windows Windows 相比相比LINUX 哪个方面相对应用得较少?()A 、桌面、桌面 B B B、嵌入式系统、嵌入式系统、嵌入式系统 C C C、服务器、服务器、服务器 D D D、集群、集群6、Linux 系统各组成部分中哪一项是基础?()A 、内核、内核B B B、、X WindowsC X Windows C、、ShellD Shell D、、GNOME7、下面关于Shell 的说法,不正确的是哪个?()A 、操作系统的外壳、操作系统的外壳B B B、用户与、用户与Linux 内核之间的接口C 、一种和C 类似的高级程序设计语言类似的高级程序设计语言D D D、一个命令语言解释器、一个命令语言解释器8、在Linux 中把声卡当作何种设备?()A 、字符设备、字符设备B B B、输出设备、输出设备、输出设备C C C、块设备、块设备、块设备D D D、网络设备、网络设备9安装Linux 至少需要几个分区?至少需要几个分区? (( ))A 、2B 2 B、、3C 3 C、、4D 4 D、、51010 HEL Server 5 HEL Server 5 系统启动时默认由以下哪个系统引导程序实施系统加载?系统启动时默认由以下哪个系统引导程序实施系统加载?( ))A 、GRUB B GRUB B、、LILOC LILO C、、KDED KDE D、、GNOME 11 /dev/hda5在Linux 中表示什么?中表示什么? (( ))A 、IDEO 接口上从盘接口上从盘B B B、、IDEO 接口上主盘的逻辑分区接口上主盘的逻辑分区C 、IDEO 接口上主盘的第五个分区接口上主盘的第五个分区D D D、、IDEO 接口上从盘的扩展分区接口上从盘的扩展分区1212、、系统引导的过程一般包括如下几步:系统引导的过程一般包括如下几步:((1)MBR 中的引导装载程序启动;(2)用户登陆;(用户登陆;(33)Linux 内核运行;(内核运行;(44)BIOS 自检。
linux系统程序设计教程linux系统程序设计教程第⼀章:⽣成⼀个Process(进程)进程是什么?简单地说,进程就是在执⾏状态下的⼀个程序(包括CPU状态,所占内存的状态,等等)A进程⽣成了B进程,也就是说,A程序在执⾏的时候,⼜⽣成了另⼀个进程B。
这个时候,我们可以把A进程叫做⽗进程,把B进程叫做⼦进程。
例程序:// Usage : ./a.out 20#includeint main( int argc , char *argv[]){int dep_time;dep_time = atoi( argv[1] )*60 ; //将参数中给出的20(分钟)转换成整型的秒数if( fork()==0 ) //⽣成⼦进程,然后⽗进程中⽌{sleep( dep_time );fprintf( stderr , \n);}return 0;}上⾯的程序是⼀个闹钟程序。
当你执⾏之后。
程序不会显⽰什么,⽽是⼀下就回到UNIX的提⽰符下。
但是你在命令⾏中指定了20分钟后你有事,那么在你执⾏这个程序之后20分钟,他会提醒你到时间了。
本程序只是做⽰例⽤,没有检查参数是否正确,等等。
⽣成⼀个新的进程,可以使⽤ fork() 函数。
以下说说fork()函数。
头⽂件: #include形式 pid_t fork();参数⽆返回值成功时:⽗进程中:⼦进程的PID (Process ID)⼦进程中:0失败时:⽗进程中:-1由于失败,没有⽣成⼦进程;fork()刚执⾏完的时候,⼦进程和⽗进程是完全⼀模⼀样的两份进程(当然,PID是不⼀样的)。
他们的各个变量的值都是⼀样的,⽽且都认为⾃⼰已经执⾏完fork()了。
fork()后,区分⽗进程和⼦进程,只要看fork()的返回值就⾏了。
if( fork()==0 ) printf(这是⼦进程);else printf(这是⽗进程);同理:if( fork()==0 ){//接下来要⼦进程做的⼯作}else{//接下来要⽗进程做的⼯作}⼀般,我们会把fork()返回给⽗进程的值保存下来(其实就是⼦进程的PID),等到需要结束⼦进程的时候,我们关掉他,如下:pid_t child_pid ;child_pid=fork();if( child_pid==0 ){// ... ...}else{// ... ...}// ... ...需要结束⼦进程的时候kill( child_pid , SIGKILL ) // kill()函数是⽤来发给另⼀个进程⼀个消息的。
1、培训课程建议1)第二章获取帮助2.1搜索本地文档2.2搜索在线文档2.3查看man文档2.4查看pinfo文档第三章从命令行管理文件3.1 Linux下的文件系统架构3.2 如何操作绝对路径3.3 命令行下的文件管理3.4. 如何使用相对路径第四章创建、查看、编辑文本文件4.1重定向文本输出4.2编辑文本文件第五章文件权限5.1 理解Linux文件权限5.2 从命令行修改权限5.3 特殊权限位第六章管理用户和用户组6.1 理解用户和组6.2用户和用户组管理第七章进程管理7.1 进程概念7.2 监控进程7.3 管理进程第八章服务管理8.1 服务概述8.2 控制系统命令与网络服务第九章配置与加固OpenSSH服务9.1使用ssh登录远程服务器9.2 配置ssh免密码登录9.3 禁止root用户登录第十章分析和存储日志10.1 理解RHEL 7日志结构10.2 日志排错10.3 配置systemd-journald第十一章基础网络管理11.1 基本网络概念11.2 使用nmcli配置网络11.3 使用配置文件修改网络设置第十二章文件归档与压缩12.1 文件归档12.2 文件压缩12.3 在系统之间传输文件第十三章软件包管理13.1 RHN13.2 RPM相关概念13.3 使用YUM安装软件13.4 使用第三方YUM第十四章 Linux文件系统14.1 理解Linux文件系统层次化结果14.2 访问文件系统内容14.3 软连接与硬连接14.4 查找文件第十五章使用虚拟化系统15.1 安装虚拟化主机15.2 交互式安装虚拟机2)红帽系统管理II(RH135)5.1 优先级概念5.2 修改优先级第六章访问控制列表6.1 理解ACL6.2 管理ACL第七章 SELinux7.1 解释SELinux基本概念7.2 开启、关闭SELinux7.3 修改文件SELinux上下文第八章网络用户和组8.1 配置LDAP账号登录第九章磁盘管理9.1 管理简单分区9.2 管理交换分区第十章逻辑卷管理LVM10.1 逻辑卷组成10.2 管理逻辑卷10.3 扩展逻辑卷第十一章访问NFS11.1 挂载、访问、卸载NFS11.2 自动挂载第十二章访问SMB12.1挂载、访问、卸载SMB第十三章控制启动流程13.1 描述Linux启动流程13.2 修复常见启动故障13.3 修复启动引导故障第十四章使用firewalld控制网络访问 14.1 Firewalld14.2 Firewall-cmd14.3 Firewall-config 3)4.2 使用富规则配置更复杂的防火墙配置4.3 配置NAT4.4 网络端口SELinux安全第五章 DNS管理5.1 DNS相关概念5.2 配置只缓存DNS服务器第六章配置邮件服务器6.1 邮件系统组成6.2 配置只转发邮件服务器第七章存储管理7.1 提供远程访问的块存储7.2 访问远程块存储第八章配置基于文件的存储8.1 NFS配置8.2 基于kerberos的NFS配置8.3 SMB服务器配置8.4 SMB服务器多用户挂载第九章 NTP网络时间服务器配置9.1 配置NTP服务器9.2 NTP服务器的配置参数第十章配置MariaDB10.1 安装MariaDB10.2 配置与管理MariaDB10.3 配置用户和访问权限10.4 备份与恢复第十一章 Apache11.1 理解Apache配置文件、日志文件与内容目录 11.2 基于IP与域名的虚拟主机11.3 TLS加密的虚拟主机11.4 配置PHP与WSGI第十二章 bash脚本12.1 bash脚本基本内容12.2 写一个简单的bash脚本第十三章bash脚本的条件与控制结构13.1 条件结构13.2 控制结构第十四章配置Shell环境14.1 环境变量14.2 命令别名第十五章 Docker15.1 理解Linux容器的基本组成与角色 15.2 使用Docker管理Linux容器。
嵌入式linux进程管理机制的工作原理概述说明1. 引言1.1 概述进程管理是操作系统中的重要组成部分,它负责处理和控制系统中各个进程的创建、运行和销毁。
在嵌入式Linux系统中,进程管理机制对于实现系统资源合理利用、进程调度和协作等方面具有关键作用。
本文将介绍嵌入式Linux进程管理机制的工作原理,并从进程简介、进程创建与销毁、以及进程调度等角度进行阐述。
同时,还将概述该机制的基本原理、进程控制块(PCB)的结构与功能,以及进程调度算法的工作流程。
1.2 文章结构为了更好地描述嵌入式Linux进程管理机制的工作原理,本文分为五个主要部分。
第一部分为引言,介绍文章的目的和结构,并简要概述嵌入式Linux进程管理机制以及其重要性。
第二部分将详细介绍嵌入式Linux进程管理机制。
这包括对进程概念的简单介绍,以及如何创建、销毁和调度进程等方面知识。
第三部分将对工作原理进行概述。
具体涉及到进程管理机制的基本原理,PCB 数据结构的组成与功能,以及进程调度算法的工作流程。
第四部分将通过实例分析来加深对嵌入式Linux进程管理机制的理解。
这包括进程创建与销毁过程分析、进程调度策略比较分析,以及PCB数据结构设计优化思路的讨论。
最后一部分为结论与展望。
我们将总结本文内容并提炼出重点观点,并对嵌入式Linux进程管理机制进行未来发展展望和建议。
1.3 目的本文旨在深入了解嵌入式Linux下的进程管理机制,全面掌握其工作原理和相关概念,以及对实际应用中可能遇到的问题给出合理解决方案。
希望通过本文的阐述和讨论,读者能够更好地理解并应用嵌入式Linux进程管理机制,提高系统性能和资源利用效率。
同时,也为未来嵌入式Linux系统开发和优化提供参考和指导。
2. 嵌入式Linux进程管理机制2.1 进程简介在嵌入式系统中,进程是操作系统中最基本的执行单元。
进程代表了一个程序的执行过程,它拥有自己的代码空间、数据空间和执行状态等属性。