进程与线程

任务管理:进程的过程,线程
进程:process
1、进程的概念:
(1)ps aux
①User
②pid 大于0的正整数
③Stat 状态: 运行 休眠 僵尸进程 子进程
④Time 运行的时间:
⑤COMMAND 用什么命令产生的。
(2)进程的动态过程 申请空间,释放空间
(3)程序执行的单元 任务调度和资源分配的最小单元
①进程是一个独立的可调动的活动
②进程是一个抽象的实体,当它执行某个任务时,要分配和释放各种资源
③进程是可以并行执行的计算单位
本质:进程是程序的一次执行的过程,进程是程序执行和资源管理的最小单元。在Linux环境下,每个正在运行的程序都称为进程。
(4)为了实现多任务—>进程是并行执行过程(宏观)
(5)进程和程序的区别:
①程序:指令的集合 是静态的
②进程:程序执行的一次过程 是动态的
(6)进程的特点:
①结构特性(完全的复制)
②动态性(通过pid来观看,不连续)
③并发性(同时,宏观)
④异步性(先后顺序不同步)(微观)
⑤独立性(分离空间)
2、进程的状态转换过程:
(1)新建 -->就绪(cpu调度) --> 运行(正常|非正常) -->终止
(2)新建 -->就绪–>运行(IO的输入输出)–>阻塞 -->(IO结束)就绪
(3)新建 -->就绪–>运行–>(CPU的时间片)就绪
3、进程的创建 -->创建新的进程 -->多任务

函数
(1)Fork ()
①完全复制:子进程完全复制父进程内容
②分离空间:子进程和父进程运行在不同的分离空间中

头文件 #include <unistd.h>
#include <sys/types.h>
功能:创建子进程
参数说明:无
返回值:success:
父进程返回子进程pid
子进程中返回0
Error:
父进程中返回-1
(2)getpid()
①当前进程的进程编号
②无参数
③返回值:正整数(ID号)
(3)Getppid()
①父进程的进程ID号
②无参数
③返回值:父进程的进程编号
(4)exit() ======== _exit()
①进程的退出函数
②返回值:父进程的进程编号
(5)Wait(int wstatus);
①参数:接受子进程退出的状态值
②返回值:成功:子进程的id号 失败:-1
③父进程等待子进程的退出,保证进程的正常运行
④通过参数获取子进程的退出的状态值
(6)Waitpid(pit_t pid,int
status,int option);
①Pid
1)0(组id)
2)>0(子进程的pid)
3)-1(任意子进程)
4)<-1(绝对值pid的进程)
②子进程退出的状态值(4种)
③标志位 0(父进程状态:阻塞 非阻塞)
④返回值:
1)success pid >0
2)error-1
多进程编程:
1、概念:为了解决多任务的问题
2、多进程的创建:
(1)
3、多进程的控制:
(1)

进程间通信
进程间通信:
概念:进程间空间是独立的,进行数据的通信,ipc
分类:管道(无名官道,fifo)、共享内存、消息队列、信号量、信号
目的:数据传输、共享内存、进程间的控制
机制使用的范围:linux内核中

无名管道:pipe
1、管道概念:
(1)Pipe(无名管道)类似于水管 通过字节流的方式传递数据
(2)特点:
①单向性,
②没有偏移量
③Fd【1】 ---->fd[0]
④从应用层 -----> 内核 ------->应用层
⑤先进先出
⑥写之前,读被阻塞
⑦通过无结构的字节流的方式传递数据
⑧子进程完全继承父进程的一对文件描述符(读 写)
2、管道创建和使用:
Pipe(int fd[2])
头文件:#include
参数:一对文件描述符fd[0]读端 fd[1]写端
返回值:success — 0 error ------ -1
3、优缺点:
(1)缺点:
①管道具有装满的时候:无名管道默认情况下只有64kb,大小的限制
②管道不能存放数据:进程的终止
(2)优点:
①可以进行进程之间数据的交互(无名管道:父子之间)
命名管道FIFO
1、概念:具有特定的路径和名字的管道,进行子进程之间的数据交互
2、特点:
(1)具有文件的属性(读,写,打开,关闭,权限)
(2)遵循先进先出的原则(FIFO)
(3)不能存放数据(长时间保存数据)(在进程终止时数据消失)
3、创建和使用
(1)Mkfifo(char *pathname,mod_t mode)创建一个命名管道
①参数:名字,路径 管道的权限
②返回值:0 success -1 error
(2)进程的写入数据
①Write(fd,buf,sizeof(buf))
(3)进程的读取数据
①Read(fd,buf,sizeof(buf))
(4)注意:在进程写的过程,读进程被阻塞
总结:
1、管道不能存放数据
2、效率低:应用层 -->文件系统—>应用层
3、大部分数据的拷贝工作,浪费资源
4、对于数据的通讯大小也有限制64kb

标准流管道
1.概念:执行shell命令 通过读写的方式操作管道、配合标准IO使用
2.创建和使用
(1)FILE *fp = popen(“ls”,”r”);
①参数:shell命令 自动添加-c /sbin/sh
②读写的方式
③返回值:管道流 error NULL
(2)Pclose(fp)
(3)IO的函数 fread fwrite fscanf fprintf
3.应用场景
(1)软件执行的shell命令
(2)配置文件 shell编程 go脚本 Python脚本

共享内存
1、概念:解决进程间数据通信,提供共享内存的方式,让两个进程访问同一片空间达到的数据交互
ipcs -m
键 shmid 拥有者 权限 大小 连接数 状态
键:唯一标识共享内存的方式
Shmid:共享内存的标识,编号,大于0的正整数,系统自动分配的
权限:拥有者的权限,一般是600、700
大小:内核中分配空间的大小
连接数:进程正在通信的个数
状态:是一种标志
2、创建和使用:
(1)创建共享内存
①Key_t key = ftok(“/home/axl”,23)
1)返回值:键值(16进制数)
2)工程号:大于0
②Shmget(key,size,IPC_CREAT|0700)
1)返回值:shmid error-1
2)Size 申请内核空间的大小

(2)映射共享内存
①Shmat(shmid,NULL,0)
1)参数:NULL 让内核给一片合适的空间
2)0 可读可写 SHE_RDONLY
3)返回值 char buf error (void)-1
(3)使用共享内存
Strcpy() memcpy() memset() bzero()
(4)断开共享内存
①Shmdt(buf)
1)0 success error -1
(5)回收共享资源
①Shmctl(shmid,IPC_RMID,NULL)
1)IPC_STAT IPC_INFO IPC_SET
2)Shmid_ds *buf
3、优点和缺点:
(1)共享内存的过程会出现资源的竞争关系,内容会重写
(2)内核中的内存大小限制
(3)相对于管道数据可以保存
(4)效率相对比较高,直接操作内存,进行数据的交互。

消息队列:为了解决资源的竞争的关系:消息队列
1、消息队列的概念:消息队列就是一个消息的链表,提供了一种由一个进程向另一个进程发送块数据的方法。
(1)ipcs -q
①键 msqid 拥有者 权限 已用字节数 消息
2、消息队列的使用
(1)获得唯一键值:key_t key = fotk(“/home/axl”,100);
(2)创建消息队列:产生msqid 标识符
①int msqid = msgget(key,IPC_CREATE|IPC_EXCL|0700);
②参数:权限
③返回值:标识符 msqid 失败返回 -1
(3)发送消息:添加消息到队列中:
①Msgsnd(msqid,struct msgbuf *buf,mtext,0)
②注意 Struct msgbuf{long mtype; char mtext[size];}
③Mtext 消息的大小
④0 --消息的读写权限
(4)获取消息:读取消息
①Msgrcv(msqid,struct msgbuf *buf,mtext_size,long mtype,0)
②参数:buf -->放数据的空间 消息的大小
③Mtype
1)0 mtype 最早的消息
2)>0 ==mtype的第一个消息
3)<0 === |mtype| >>mtype 的第一个消息
4)返回值:消息的大小 error -1
(5)消息的控制:
①Msgctl(msqid,IPC_RMID,NULL)

3、优缺点
(1)消息队列能解决进程间对资源的竞争的关系
(2)对于数据有大小的限制
4、Linux系统中有两个宏定义
(1)MSGMAX 以字节为单位,定义了一条信息的最大长度
(2)MSGMNb 以字节为单位,定义了一个队列的最大长度

信号
在内核中产生,作用于内核 ----------signal(信号)
中断(interrupt):打断当前运行的状态,去执行中断的函数,结束后返回,继续执行原来的状态
1、信号的概念:携带特定的信息,速度快,执行固定的功能。
(1)信号四要素:信号编号(前31种给内核用的 剩下的给嵌入式设备留的) 信号名称 特定功能 执行动作
2、信号的分类:
(1)按键产生:Ctrl +c (2 SIGINT) ctrl +z (20 SIGTSTP) ctrl +(3 SIGQUIT)
(2)系统调用产生:kill( 9 SIGKILL) raise abort(6 SIGABRT)
(3)软件条件产生:alarm ( 14 SIGALRM) setitimer()
(4)硬件异常:段错误(11 SIGSEGV),浮点型错误,总线错误(7 SIGBUS),管道异常(13 SIGPIPE)
(5)命令产生:kill -9 (9 SIGKILL) pid
3、信号的作用效果
(1)不可捕捉信号 9 SIGKILL 19 SIGSTOP
(2)可以捕捉信号
(3)忽略信号

4、信号的函数:
(1)abort() ---------段错误信号
(2)alarm() ---------定时器
(3)Kill() ---------杀死
(4)sig_t signal(int signum,sig_t handler); --------------信号的装载函数
①Signum:只能是信号编号
②Handler
(5)raise() --------自己产生一个信号
5、信号的优缺点:
(1)速度快,内核产生作用内核
(2)携带信息少

线程
1、线程的概念:
(1)为什么提出线程的?
①进程完全复制父进程所有的数据
②占用内存大
③创建进程的时候实现数据的共享
(2)线程的提出:依赖于进程的产生,不同于进程
(3)线程中没有父子关系,主线程 新线程
(4)如果在一个进程中没有创建线程,那么进程也是线程
(5)线程:LWP(轻量级进程)、进程的实体,程序执行流的最小单元,系统调度和资源分配的基本单元,并行执行的过程
(6)线程的特点:
①并发性
②异步性
③动态性
④结构性(数据共享,栈段独立)
(7)线程的状态:6种:就绪、运行、阻塞(io结束)、休眠(解除休眠)、等待(signal唤醒)、结束
2、进程和线程的区别
(1)内存的问题:进程空间独立 线程数据共享
(2)通信的过程:进程的ipc通信 线程直接访问
3、线程的创建
(1)Pthread_create(pid,NULL,) fork()
①参数:
1)Prthread_t pid &pid(存放的新线程的pid)
2)NULL:新线程的属性 一般选择默认
3)线程的入口函数:函数指针类型 void*(*hander)(void *arg)
4)函数参数 void *data 任意类型的值
②返回值:success 0 error ---- 错误码 可以用strerror()打印出来
(2)Pthread_join() wait()
①等待新线程的退出
②参数:
1)Pid
2)Void **data 二级指针 为了得到值
③返回值:0 success error ---------错误码
(3)Pthread_exit() exit()
①新的线程退出 带回来的值 ---------join
②参数:void data 任意类型的值 -------join
③没有返回值
(4)Pthread_cancel() abort()

(5)Pthread_self() getpid()
①获取线程的id号 返回值unsigned long int
4、通过创建线程---------------->新线程的传值:
(1)数值型 float int double long
(2)字符型 char

(3)结构体类型

多线程
1、多线程的创建:
(1)避免阻塞(异步调用)
(2)避免cpu空转
(3)提升代码的性能:同时完成多个任务
(4)创建的过程:for循环创建。多个线程的等待

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值