笔记14

-----------------3.26--------------
进程控制
***1.什么是进程:***进程是可并发执行的程序,是一个在数据集合上的运行过程
当一个程序开始执行后,在开始执行到执行结束的这段时间里,它内存中的部分被称为进程。
通俗讲:程序:在硬盘上的可执行文件
进程:在执行中的程序
2.什么是并发:多进程同时运行,多个任务同时执行

3.虚拟内存:
linux虚拟内存管理技术:
物理内存:实际在处理器中的内存模块 几百M
将硬盘中的一部分存储单元拿来当内存使用 4G(大多数人)(受操作系统的寻址范围的影响)
0x000000 - 0xffffffff
操作系统:内核空间 和 用户空间
高地址(1G) 低地址(3G)
好处:1.有效防止内核空间被破坏
2.防止被恶意窥探(不一定是连续的)
虚=物+偏移量
3.扩展内存空间

4.进程的分类
(1).守护进程
(2).批处理进程
(3).交互进程

5.进程的属性
(1).进程ID(PID):是唯一的数值,用来区分进程
(2).父进程的ID(PPID)
(3).启动进程的用户ID(UID)
(4).进程的状态:运行:R 休眠:S 僵尸进程:Z 死掉进程:X 进程领导者:s
(5).进程的优先级
(6).进程占用资源的大小(内存,cpu)

6.进程控制模块(PCB)(一种数据结构)
(1).进程号 ps命令查看Linux系统中的进程
(2).参数:
l:长格式输出
u:按照用户名和启动时间的顺序来显示进程
f:用树状格式来显示进程
a:显示所有用户的所有进程
x:显示无控制终端进程 (aux(通常))

注:
%CPU %MEM (进程占用CPU的百分比 占用内存的百分比)
TTY :终端ID
VSZ 占用虚拟内存的大小
STAT进程状态
START 启动进程的时间
TIME 进程消耗CPU的时间
COMMAND 参数和名称
“+”:位于后台的进程组

注:
kill:kill+进程号 -9:代表强制终止
pkill :pkill+程序名
xkill:在桌面上杀死图像化界面
renice:改变进程的优先级,通过改变进程ID(PID)来改变谦让度,进而达到改变进程的优先级
renice 谦让度 PID

7.进程的状态状态
(1)就绪:当进程已分配到出cpu以外的所有必要资源,只要获得处理器就可以立即执行
(2)执行:已经获取处理器,其程序正在处理器上执行
(3)阻塞:正在执行的进程,由于等待某个事件的发生而无法执行时,便放弃处理机会而处于阻塞状态

注:
并发的本质:时间片轮询

8.Linux进程调度
(1).FCFS也叫FIFO,先来先处理
缺点:对于短的任务可能变得非常缓慢
(2).时间片轮询算法:周期性切换总体时长比FIFO短
(3).STCF:短任务优先算法
抢占式和非抢占式
(4).银行家算法:

9.创建一个进程
1.
fork()函数:它是有两个返回值(0:子进程 -1:失败 >0:父进程)

getpid():获取当前进程号
getppid():获取当前父进程号

父进程与子进程跑在不同的内存空间中:父进程与子进程有自己独立的内存空间
早期:fork函数运行后,子进程会复制父进程的堆栈数据空间
优化:读时不管,写时复制
fork函数创建的父子进程关系是竞争关系,不能判断是谁先动

vfork():创建一个进程(与fork的不同)
(1).保证子进程先动
(2).当子进程调用exit()函数后,父进程往下进行
(3).不会继承父进程的页面

-----------------3.26--------------
进程控制
1.什么是进程:进程是可并发执行的程序,是一个在数据集合上的运行过程
当一个程序开始执行后,在开始执行到执行结束的这段时间里,它内存中的部分被称为进程。
通俗讲:程序:在硬盘上的可执行文件
进程:在执行中的程序
2.什么是并发:多进程同时运行,多个任务同时执行

3.虚拟内存:
linux虚拟内存管理技术:
物理内存:实际在处理器中的内存模块 几百M
将硬盘中的一部分存储单元拿来当内存使用 4G(大多数人)(受操作系统的寻址范围的影响)
0x000000 - 0xffffffff
操作系统:内核空间 和 用户空间
高地址(1G) 低地址(3G)
好处:1.有效防止内核空间被破坏
2.防止被恶意窥探(不一定是连续的)
虚=物+偏移量
3.扩展内存空间

4.进程的分类
(1).守护进程
(2).批处理进程
(3).交互进程

5.进程的属性
(1).进程ID(PID):是唯一的数值,用来区分进程
(2).父进程的ID(PPID)
(3).启动进程的用户ID(UID)
(4).进程的状态:运行:R 休眠:S 僵尸进程:Z 死掉进程:X 进程领导者:s
(5).进程的优先级
(6).进程占用资源的大小(内存,cpu)

6.进程控制模块(PCB)(一种数据结构)
(1).进程号 ps命令查看Linux系统中的进程
(2).参数:
l:长格式输出
u:按照用户名和启动时间的顺序来显示进程
f:用树状格式来显示进程
a:显示所有用户的所有进程
x:显示无控制终端进程 (aux(通常))

注:%CPU %MEM (进程占用CPU的百分比 占用内存的百分比)
TTY :终端ID
VSZ 占用虚拟内存的大小
STAT进程状态
START 启动进程的时间
TIME 进程消耗CPU的时间
COMMAND 参数和名称
“+”:位于后台的进程组

注:

kill:kill+进程号 -9:代表强制终止
pkill :pkill+程序名
xkill:在桌面上杀死图像化界面
renice:改变进程的优先级,通过改变进程ID(PID)来改变谦让度,进而达到改变进程的优先级
renice 谦让度 PID

7.进程的状态状态
(1)就绪:当进程已分配到出cpu以外的所有必要资源,只要获得处理器就可以立即执行
(2)执行:已经获取处理器,其程序正在处理器上执行
(3)阻塞:正在执行的进程,由于等待某个事件的发生而无法执行时,便放弃处理机会而处于阻塞状态

注:
并发的本质:时间片轮询

8.Linux进程调度
(1).FCFS也叫FIFO,先来先处理
缺点:对于短的任务可能变得非常缓慢
(2).时间片轮询算法:周期性切换总体时长比FIFO短

(3).STCF:短任务优先算法
抢占式和非抢占式

(4).银行家算法:

9.创建一个进程
fork()函数:它是有两个返回值(0:子进程 -1:失败 >0:父进程)
getpid():获取当前进程号
getppid():获取当前父进程号
父进程与子进程跑在不同的内存空间中:父进程与子进程有自己独立的内存空间
早期:fork函数运行后,子进程会复制父进程的堆栈数据空间
优化:读时不管,写时复制
fork()函数创建的父子进程关系是竞争关系,不能判断是谁先动

vfork():创建一个进程(与fork的不同)
(1).保证子进程先动
(2).当子进程调用exit()函数后,父进程往下进行
(3).不会继承父进程的页面

1.fork()函数创建的父子进程关系是竞争关系,不能判断是谁先动

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

int main(){
    int i=0;
    pid_t pid  = fork();
    
    if(-1 == pid){
	perror("fork error!");
	exit(1);
    }
    
    if (0 == pid){//子进程
	for(i=0;i<5;i++){
	printf("child\n");
	sleep(2);
    }
    }
    else//父进程
    {
	for(i=0;i<5;i++){
	printf("father\n");
	sleep(2);
	}
   }
    return 0;
}

在这里插入图片描述
2.getpid():获取当前进程号
getppid():获取当前父进程号

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

int main(){
    pid_t pid  = fork();
    if(-1 == pid){
	perror("fork error!");
	exit(1);
    }

    if (0 == pid){
	printf("this is child : pid:%d  ppid:%d\n",getpid(),getppid());
    }
    else printf("this is father : pid:%d\n",getpid());
    return 0;
}

在这里插入图片描述

3.父进程与子进程跑在不同的内存空间中:父进程与子进程有自己独立的内存空间

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

int a=5;
int main(){
    pid_t pid  = fork();
    if(-1 == pid){
	perror("fork error!");
	exit(1);
    }

    if (0 == pid){
	a = a*2;
	printf("this is child : pid:%d  ppid:%d a = %d\n",getpid(),getppid(),a);
    }
    else{
	int b=a-1;
	printf("this is father : pid:%d b= %d\n",getpid(),b);
    }
    return 0;
}

在这里插入图片描述
4.父进程 子进程中 a b地址一样

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

int main(){
    int a=5;
    int b=100;
    pid_t pid  = fork();
    if(-1 == pid){
	perror("fork error!");
	exit(1);
    }

    if (0 == pid){
	a = a*2;
	printf("this is child : pid:%d  ppid:%d a = %d a addr:%x b=%d b addr:%x\n",getpid(),getppid(),a,&a,b,&b);
    }
    else{
	int a=a-1;
	printf("this is father : pid:%d a= %d a addr:%x b=%d b addr:%x\n",getpid(),a,&a,b,&b);

    }
    return 0;
}

在这里插入图片描述
5.写两个进程,一个输出A,一个输出B,两个进程交叉输出ABABABAB.(使用vfork()函数)
第一种写法:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char *argv){
    pid_t pid = vfork();
    for (int i = 0; i < 10; i++)
    {
        if (0 == pid)
        {
            printf("A\n");
            pid = 1;
        }
        else 
        {
            printf("B\n");
            pid = 0;
        }
    }
    exit(1);
    return 0;
}

在这里插入图片描述
第二种写法:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

int main(){
    int i=0;
    for(i=0;i<10;i++){
	pid_t pid = vfork();

	if(-1 == pid){
	    perror("fprk error");
	    exit(1);
	    }

	if(0 == pid){
	    printf("A\n");
	    exit(1);
	}
	else{
	    printf("B\n");
	}
    }
    return 0;
}

在这里插入图片描述

6.vfork():创建一个进程(与fork的不同)
(1).保证子进程先动
(2).当子进程调用exit()函数后,父进程往下进行
(3).不会继承父进程的页面

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

int main(){
    int i=0;
    pid_t pid  = vfork();
    if(-1 == pid){
	perror("vfork error!");
	exit(1);
    }
    
    if (0 == pid){
	for(i=0;i<5;i++){
	printf("child\n");
    }
	exit(1);
    }
    else
    {
	for(i=0;i<5;i++){
	printf("father\n");
	}
	exit(1);
    }
    return 0;
}

在这里插入图片描述

注:
在这里插入图片描述
1.分段错误
2.通常因为指针变量没有初始化导致。(在本题中加入exit(1)退出就可以解决)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值